trpc: validation errors now throw 400 error

This commit is contained in:
vchikalkin 2023-10-04 17:09:00 +03:00
parent 240b92f84d
commit 3aea4c439f
6 changed files with 85 additions and 113 deletions

View File

@ -34,24 +34,15 @@ export async function action({ store, trpcClient }: ProcessContext) {
values,
})
.then((res) => {
if (res.success === false) {
notification.error({
description: res.error,
key,
message: errorMessage,
placement: 'bottomRight',
});
} else {
$results.setPayments(res.data.resultPayments);
$results.setValues(res.data.resultValues);
$calculation.$values.setValues(res.data.values);
$results.setPayments(res.data.resultPayments);
$results.setValues(res.data.resultValues);
$calculation.$values.setValues(res.data.values);
notification.success({
key,
message: successMessage,
placement: 'bottomRight',
});
}
notification.success({
key,
message: successMessage,
placement: 'bottomRight',
});
})
.catch((error_) => {
const error = error_ as Error;

View File

@ -42,42 +42,33 @@ export function action({ store, trpcClient, apolloClient }: ProcessContext) {
values,
})
.then(async (res) => {
if (res.success === false) {
notification.error({
description: res.error,
key,
message: errorMessage,
placement: 'bottomRight',
});
} else {
$results.setPayments(res.data.resultPayments);
$results.setValues(res.data.resultValues);
$calculation.$values.setValues({ ...res.data.values, recalcWithRevision: false });
$results.setPayments(res.data.resultPayments);
$results.setValues(res.data.resultValues);
$calculation.$values.setValues({ ...res.data.values, recalcWithRevision: false });
notification.success({
key,
message: successMessage,
placement: 'bottomRight',
notification.success({
key,
message: successMessage,
placement: 'bottomRight',
});
const leadid = $calculation.element('selectLead').getValue();
if (leadid) {
const {
data: { quotes },
} = await apolloClient.query({
fetchPolicy: 'network-only',
query: CRMTypes.GetQuotesDocument,
variables: {
leadid,
},
});
const leadid = $calculation.element('selectLead').getValue();
if (leadid) {
const {
data: { quotes },
} = await apolloClient.query({
fetchPolicy: 'network-only',
query: CRMTypes.GetQuotesDocument,
variables: {
leadid,
},
});
$calculation
.element('selectQuote')
.setOptions(normalizeOptions(quotes))
.setValue(values.quote);
}
$calculation
.element('selectQuote')
.setOptions(normalizeOptions(quotes))
.setValue(values.quote);
}
})
.catch((error_) => {

View File

@ -7,6 +7,7 @@ import { calculate } from '@/api/core/query';
import type { User } from '@/api/user/types';
import initializeApollo from '@/apollo/client';
import { protectedProcedure } from '@/server/procedure';
import { HttpError } from '@/utils/error';
import { createTRPCError } from '@/utils/trpc';
import { QueryClient } from '@tanstack/react-query';
@ -18,40 +19,37 @@ export const calculateRouter = router({
const apolloClient = initializeApollo();
const queryClient = new QueryClient();
if (!ctx.unlimited) {
const validationResult = await validate({
try {
if (!ctx.unlimited) {
const validationResult = await validate({
context: {
apolloClient,
queryClient,
user: ctx.user,
},
input,
});
if (validationResult.success === false) {
throw new HttpError(validationResult.message, 400);
}
}
let user: Pick<User, 'domainName'> = { domainName: ctx.user.domainName };
if (ctx.unlimited && input.values.user) {
user = { domainName: input.values.user };
}
const requestData = await createRequestData({
context: {
apolloClient,
queryClient,
user: ctx.user,
...ctx,
user,
},
input,
});
if (validationResult.success === false) {
return {
error: validationResult.error,
success: false,
};
}
}
let user: Pick<User, 'domainName'> = { domainName: ctx.user.domainName };
if (ctx.unlimited && input.values.user) {
user = { domainName: input.values.user };
}
const requestData = await createRequestData({
context: {
apolloClient,
queryClient,
...ctx,
user,
},
input,
});
try {
const calculateResult = await calculate(requestData);
const result = transformCalculateResults({

View File

@ -49,14 +49,14 @@ export async function validate({ input, context }: { context: Context; input: Ca
});
if (validationResult.success === false) {
const error = getMessage(validationResult.error.errors);
const message = getMessage(validationResult.error.errors);
return { error, success: false };
return { message, success: false };
}
}
return {
error: '',
message: '',
success: true,
};
}

View File

@ -34,15 +34,9 @@ export const OutputDataSchema = z.object({
export type OutputData = z.infer<typeof OutputDataSchema>;
export const CalculateOutputSchema = z.union([
z.object({
data: OutputDataSchema,
success: z.literal(true),
}),
z.object({
error: z.string(),
success: z.literal(false),
}),
]);
export const CalculateOutputSchema = z.object({
data: OutputDataSchema,
success: z.literal(true),
});
export type CalculateOutput = z.infer<typeof CalculateOutputSchema>;

View File

@ -34,6 +34,7 @@ import * as price from '@/process/price';
import * as subsidy from '@/process/subsidy';
import * as supplierAgent from '@/process/supplier-agent';
import type { CalculationValues } from '@/stores/calculation/values/types';
import { HttpError } from '@/utils/error';
import { createTRPCError } from '@/utils/trpc';
import { QueryClient } from '@tanstack/react-query';
@ -97,30 +98,27 @@ export const quoteRouter = router({
const apolloClient = initializeApollo();
const queryClient = new QueryClient();
if (!ctx.unlimited) {
const validationResult = await validate({
context: {
apolloClient,
queryClient,
user: ctx.user,
},
input,
});
if (validationResult.success === false) {
return {
error: validationResult.error,
success: false,
};
}
}
let user: Pick<User, 'domainName'> = { domainName: ctx.user.domainName };
if (ctx.unlimited && input.values.user) {
user = { domainName: input.values.user };
}
try {
if (!ctx.unlimited) {
const validationResult = await validate({
context: {
apolloClient,
queryClient,
user: ctx.user,
},
input,
});
if (validationResult.success === false) {
throw new HttpError(validationResult.message, 400);
}
}
let user: Pick<User, 'domainName'> = { domainName: ctx.user.domainName };
if (ctx.unlimited && input.values.user) {
user = { domainName: input.values.user };
}
const requestData = await createRequestData({
context: {
apolloClient,