import formatAxiosErrors, { formatMessageErrors, formatResponse, formatYupErrors, } from "../utils/formatResponse"; import { AxiosInstance } from "axios"; import transferMock from "../mocks/transfers"; import yup from "../config/yup"; export const TYPES = ["key", "bank_account"]; export interface Post { type: string; amount: number; key?: string; sender_account: number; receiver_account?: number; description?: string; } export type PostReturn = { id: any; status?: string; created_date: string; } & Post; const PayloadSchema = yup.object().shape({ type: yup.mixed().oneOf(TYPES).required(), amount: yup.number().required(), description: yup.string().notRequired(), key: yup.string().notRequired(), sender_account: yup.number().required(), receiver_account: yup.number().notRequired(), }); const initializeService = (fetcher: AxiosInstance, isMock: boolean) => { const get = async (id?: string | number) => { // MOCK TRUE if (isMock) { return formatResponse(transferMock, false, "Listado com sucesso"); } // MOCK FALSE try { const { data } = await fetcher.request({ url: id ? `/transfer/${id}` : "/transfer/", method: "get", }); if (!data) { return formatMessageErrors("Erro de api"); } return formatResponse(data, false, "Listado com sucesso"); } catch (err) { return formatAxiosErrors(err); } }; const post = async (payload: Post) => { // YUP VALIDATION if (!PayloadSchema.isValidSync(payload)) { const validationResult = await PayloadSchema.validate(payload, { abortEarly: false, }).catch((err) => err); return formatYupErrors(validationResult); } // MOCK TRUE if (isMock) { return formatResponse( { ...transferMock, ...payload, }, false, "Transferencia realizada com sucesso" ); } // MOCK FALSE try { const response = await fetcher.request({ url: `/transfer/`, method: "post", data: payload, }); if (!response.data) { return formatMessageErrors("Erro na chamada"); } if ( response.status === 401 || response.status === 400 || response.status === 500 ) { return formatResponse( response.data, true, "Erro na chamada" ); } return formatResponse( response.data, false, "Transferencia realizada com sucesso" ); } catch (err) { return formatAxiosErrors(err); } }; return { get, post, }; }; export default initializeService;