From 8c137229b8e1ae37aca68cbb5d139303df4feb07 Mon Sep 17 00:00:00 2001 From: vchikalkin Date: Tue, 11 Jul 2023 14:28:07 +0300 Subject: [PATCH] api/core, api/crm: try/catch improvements --- apps/web/api/core/query.ts | 22 +++--- apps/web/api/crm/query.ts | 10 +-- apps/web/api/crm/types.ts | 24 +++---- apps/web/api/user/query.ts | 13 +--- apps/web/process/fingap/reactions/common.ts | 20 +++--- apps/web/server/middleware.ts | 2 +- apps/web/server/routers/calculate/index.ts | 40 +++++------ apps/web/server/routers/quote/index.ts | 75 ++++++++++----------- apps/web/utils/axios.ts | 25 +++++++ 9 files changed, 122 insertions(+), 109 deletions(-) create mode 100644 apps/web/utils/axios.ts diff --git a/apps/web/api/core/query.ts b/apps/web/api/core/query.ts index d8e2aaa..66f1f38 100644 --- a/apps/web/api/core/query.ts +++ b/apps/web/api/core/query.ts @@ -1,21 +1,23 @@ import type { RequestCalculate, RequestFinGAP, ResponseCalculate, ResponseFinGAP } from './types'; import getUrls from '@/config/urls'; +import { withHandleError } from '@/utils/axios'; import type { QueryFunctionContext } from '@tanstack/react-query'; import axios from 'axios'; const { URL_CORE_FINGAP, URL_CORE_CALCULATE } = getUrls(); export async function calculateFinGAP(payload: RequestFinGAP, { signal }: QueryFunctionContext) { - const { data } = await axios.post(URL_CORE_FINGAP, payload, { - signal, - }); - - return data; + return withHandleError( + axios + .post(URL_CORE_FINGAP, payload, { + signal, + }) + .then(({ data }) => data) + ); } -export async function calculate(payload: RequestCalculate): Promise { - return await axios - .post(URL_CORE_CALCULATE, payload) - .then((response) => response.data) - .catch((error) => error.response.data); +export async function calculate(payload: RequestCalculate) { + return withHandleError( + axios.post(URL_CORE_CALCULATE, payload).then(({ data }) => data) + ); } diff --git a/apps/web/api/crm/query.ts b/apps/web/api/crm/query.ts index 94efb72..b4dd137 100644 --- a/apps/web/api/crm/query.ts +++ b/apps/web/api/crm/query.ts @@ -1,12 +1,12 @@ import type { RequestCreateKP, ResponseCreateKP } from './types'; import getUrls from '@/config/urls'; +import { withHandleError } from '@/utils/axios'; import axios from 'axios'; const { URL_CRM_CREATEKP } = getUrls(); -export async function createKP(payload: RequestCreateKP): Promise { - return await axios - .post(URL_CRM_CREATEKP, payload) - .then((response) => ({ ...response.data, success: true })) - .catch((error) => ({ ...error.response.data, success: false })); +export async function createKP(payload: RequestCreateKP) { + return withHandleError( + axios.post(URL_CRM_CREATEKP, payload).then(({ data }) => data) + ); } diff --git a/apps/web/api/crm/types.ts b/apps/web/api/crm/types.ts index 0f9e0ef..f3d5017 100644 --- a/apps/web/api/crm/types.ts +++ b/apps/web/api/crm/types.ts @@ -31,21 +31,13 @@ export const RequestCreateKPSchema = z.object({ export type RequestCreateKP = z.infer; -export const ResponseCreateKPSchema = z.union([ - z.object({ - evo_quotename: z.string(), - link: z.string(), - name: z.string(), - offerprintform: z.string(), - offerprintformapi: z.string(), - quoteid: z.string(), - success: z.literal(true), - }), - z.object({ - fullMessage: z.string(), - message: z.string(), - success: z.literal(false), - }), -]); +export const ResponseCreateKPSchema = z.object({ + evo_quotename: z.string(), + link: z.string(), + name: z.string(), + offerprintform: z.string(), + offerprintformapi: z.string(), + quoteid: z.string(), +}); export type ResponseCreateKP = z.infer; diff --git a/apps/web/api/user/query.ts b/apps/web/api/user/query.ts index af2e285..ff5841d 100644 --- a/apps/web/api/user/query.ts +++ b/apps/web/api/user/query.ts @@ -1,19 +1,12 @@ import { love } from './tools'; import type { User } from './types'; import getUrls from '@/config/urls'; -import type { AxiosError, AxiosRequestConfig } from 'axios'; +import { withHandleError } from '@/utils/axios'; +import type { AxiosRequestConfig } from 'axios'; import axios from 'axios'; const { URL_GET_USER } = getUrls(); export async function getUser(config?: AxiosRequestConfig) { - return axios - .get(URL_GET_USER, config) - .then((res) => love(res.data)) - .catch((error: AxiosError | Error) => { - if (axios.isAxiosError(error)) { - // TODO: track error - throw new Error(error.message); - } - }); + return withHandleError(axios.get(URL_GET_USER, config).then((res) => love(res.data))); } diff --git a/apps/web/process/fingap/reactions/common.ts b/apps/web/process/fingap/reactions/common.ts index ec8cce9..493454f 100644 --- a/apps/web/process/fingap/reactions/common.ts +++ b/apps/web/process/fingap/reactions/common.ts @@ -205,15 +205,19 @@ export default function reactions({ store, apolloClient, queryClient }: ProcessC risks .map((risk) => getFingapRequestDataFromRisk(risk)) .map((data) => makeRequestGetFinGAP(data)) - ).then((results) => { - const newRisks = risks.map((risk, i) => ({ - ...risk, - premium: results.at(i)?.premium || 0, - sum: results.at(i)?.sum || 0, - })); + ) + .then((results) => { + const newRisks = risks.map((risk, i) => ({ + ...risk, + premium: results.at(i)?.premium || 0, + sum: results.at(i)?.sum || 0, + })); - $tables.fingap.setRisks(newRisks); - }); + $tables.fingap.setRisks(newRisks); + }) + .catch(() => { + $tables.fingap.clear(); + }); }, { // Important: delay prohibits multiple reaction invocation diff --git a/apps/web/server/middleware.ts b/apps/web/server/middleware.ts index ac633b1..e1cbcb8 100644 --- a/apps/web/server/middleware.ts +++ b/apps/web/server/middleware.ts @@ -8,7 +8,7 @@ import { TRPCError } from '@trpc/server'; * @see https://trpc.io/docs/v10/middlewares */ export const userMiddleware = t.middleware(async ({ ctx, next }) => { - if (process.env.NODE_ENV !== 'development' && !ctx.user) { + if (!ctx.user) { throw new TRPCError({ code: 'UNAUTHORIZED', }); diff --git a/apps/web/server/routers/calculate/index.ts b/apps/web/server/routers/calculate/index.ts index 2f206f5..ea3de3f 100644 --- a/apps/web/server/routers/calculate/index.ts +++ b/apps/web/server/routers/calculate/index.ts @@ -50,29 +50,31 @@ export const calculateRouter = router({ input, }); - const calculateResult = await calculate(requestData); + try { + const calculateResult = await calculate(requestData); + + const result = transformCalculateResults({ + calculateInput: input, + requestCalculate: requestData, + responseCalculate: calculateResult, + }); + + // TEMP + if (ctx.unlimited) { + result.__calculateResult = calculateResult; + } - if (calculateResult.errors?.length > 0) { return { - error: calculateResult.errors[0], + data: result, + success: true, + }; + } catch (error_) { + const error = (error_ as Error).message; + + return { + error, success: false, }; } - - const result = transformCalculateResults({ - calculateInput: input, - requestCalculate: requestData, - responseCalculate: calculateResult, - }); - - // TEMP - if (ctx.unlimited) { - result.__calculateResult = calculateResult; - } - - return { - data: result, - success: true, - }; }), }); diff --git a/apps/web/server/routers/quote/index.ts b/apps/web/server/routers/quote/index.ts index e900b2d..120f29b 100644 --- a/apps/web/server/routers/quote/index.ts +++ b/apps/web/server/routers/quote/index.ts @@ -129,51 +129,46 @@ export const quoteRouter = router({ input, }); - const calculateResult = await calculate(requestData); + try { + const calculateResult = await calculate(requestData); + + const requestCreateKP = compatRequestCreateKP({ + domainName: user.domainName, + finGAP: input.fingap, + insurance: Object.values(input.insurance.values), + calculation: { + calculationValues: await compatValues(input.values, { apolloClient }), + ...calculateResult, + preparedPayments: requestData.preparedPayments, + additionalData: requestData.additionalData, + }, + elt: input.elt, + }); + + const createKPResult = await createKP(requestCreateKP); + + const result = transformCalculateResults({ + calculateInput: input, + requestCalculate: requestData, + responseCalculate: calculateResult, + }); + + if (URL_CRM_DOWNLOADKP) { + result.values.downloadKp = URL_CRM_DOWNLOADKP?.concat(createKPResult.offerprintformapi); + } - if (calculateResult.errors?.length > 0) { return { - error: calculateResult.errors[0], + data: result, + success: true, + }; + } catch (error_) { + const error = (error_ as Error).message; + + return { + error, success: false, }; } - - const requestCreateKP = compatRequestCreateKP({ - domainName: user.domainName, - finGAP: input.fingap, - insurance: Object.values(input.insurance.values), - calculation: { - calculationValues: await compatValues(input.values, { apolloClient }), - ...calculateResult, - preparedPayments: requestData.preparedPayments, - additionalData: requestData.additionalData, - }, - elt: input.elt, - }); - - const createKPResult = await createKP(requestCreateKP); - - if (createKPResult.success === false) { - return { - success: false, - error: createKPResult.message || createKPResult.fullMessage, - }; - } - - const result = transformCalculateResults({ - calculateInput: input, - requestCalculate: requestData, - responseCalculate: calculateResult, - }); - - if (URL_CRM_DOWNLOADKP) { - result.values.downloadKp = URL_CRM_DOWNLOADKP?.concat(createKPResult.offerprintformapi); - } - - return { - data: result, - success: true, - }; }), }); diff --git a/apps/web/utils/axios.ts b/apps/web/utils/axios.ts new file mode 100644 index 0000000..e44b33f --- /dev/null +++ b/apps/web/utils/axios.ts @@ -0,0 +1,25 @@ +import type { AxiosError } from 'axios'; +import { isAxiosError } from 'axios'; + +function getErrorMessage( + error: AxiosError +) { + return ( + error.response?.data?.error || + error.response?.data?.errors?.[0] || + error.response?.data?.message || + error.message + ); +} + +export async function withHandleError(fn: Promise) { + return fn.catch((error_: AxiosError | Error) => { + if (isAxiosError(error_)) { + // TODO: track error + const errorMessage = getErrorMessage(error_); + throw new Error(errorMessage); + } + + return null as unknown as T; + }); +}