diff --git a/apps/web/next.config.js b/apps/web/next.config.js index 5039d8c..692cd63 100644 --- a/apps/web/next.config.js +++ b/apps/web/next.config.js @@ -104,6 +104,5 @@ module.exports = withSentryConfig( hideSourceMaps: true, transpileClientSDK: false, tunnelRoute: '/track-error', - widenClientFileUpload: true, } ); diff --git a/apps/web/pages/500.jsx b/apps/web/pages/500.jsx index 9fab1e8..e3dc4da 100644 --- a/apps/web/pages/500.jsx +++ b/apps/web/pages/500.jsx @@ -1,6 +1,6 @@ /* eslint-disable canonical/filename-match-regex */ import { Result } from 'ui/elements'; -export default function ServerError() { - return ; +export default function ServerError({ statusCode = '500' }) { + return ; } diff --git a/apps/web/pages/_error.jsx b/apps/web/pages/_error.jsx index 22b583e..2eca54c 100644 --- a/apps/web/pages/_error.jsx +++ b/apps/web/pages/_error.jsx @@ -1,9 +1,10 @@ /* eslint-disable canonical/no-use-extend-native */ +import ServerError from './500'; import { captureUnderscoreErrorException } from '@sentry/nextjs'; import Error from 'next/error'; function CustomErrorComponent(props) { - return ; + return ; } CustomErrorComponent.getInitialProps = async (contextData) => { diff --git a/apps/web/pages/api/trpc/[trpc].ts b/apps/web/pages/api/trpc/[trpc].ts index 3e78ce9..44effd2 100644 --- a/apps/web/pages/api/trpc/[trpc].ts +++ b/apps/web/pages/api/trpc/[trpc].ts @@ -1,7 +1,6 @@ /* eslint-disable canonical/filename-match-regex */ import { createContext } from '@/server/context'; import { appRouter } from '@/server/routers/_app'; -import { captureException, withScope } from '@sentry/nextjs'; import * as trpcNext from '@trpc/server/adapters/next'; export default trpcNext.createNextApiHandler({ @@ -23,17 +22,7 @@ export default trpcNext.createNextApiHandler({ onError(opts) { const { error } = opts; // send to bug reporting - if (!['BAD_REQUEST', 'UNAUTHORIZED', 'FORBIDDEN'].includes(error.code)) - withScope((scope) => { - (Object.keys(opts) as Array).forEach((key) => { - if (key !== 'req') { - let extra = opts[key]; - if (key === 'input') extra = JSON.stringify(extra); - scope.setExtra(key, extra); - } - }); - captureException(error); - }); + // eslint-disable-next-line no-console console.error('Something went wrong', error); }, diff --git a/apps/web/sentry.edge.config.js b/apps/web/sentry.edge.config.js index 686cfd6..164af84 100644 --- a/apps/web/sentry.edge.config.js +++ b/apps/web/sentry.edge.config.js @@ -3,12 +3,18 @@ // https://docs.sentry.io/platforms/javascript/guides/nextjs/ import getUrls from './config/urls'; +import { publicRuntimeConfigSchema } from '@/config/schema/runtime-config'; import { init } from '@sentry/nextjs'; +import getConfig from 'next/config'; const { SENTRY_DSN } = getUrls(); +const { publicRuntimeConfig } = getConfig(); +const { SENTRY_ENVIRONMENT } = publicRuntimeConfigSchema.parse(publicRuntimeConfig); + init({ debug: false, dsn: SENTRY_DSN, + environment: SENTRY_ENVIRONMENT, tracesSampleRate: 1, }); diff --git a/apps/web/sentry.server.config.js b/apps/web/sentry.server.config.js index b284cc6..5e27f6a 100644 --- a/apps/web/sentry.server.config.js +++ b/apps/web/sentry.server.config.js @@ -3,13 +3,18 @@ // https://docs.sentry.io/platforms/javascript/guides/nextjs/ import getUrls from './config/urls'; +import { publicRuntimeConfigSchema } from '@/config/schema/runtime-config'; import { init } from '@sentry/nextjs'; +import getConfig from 'next/config'; const { SENTRY_DSN } = getUrls(); +const { publicRuntimeConfig } = getConfig(); +const { SENTRY_ENVIRONMENT } = publicRuntimeConfigSchema.parse(publicRuntimeConfig); + init({ debug: false, - dsn: SENTRY_DSN, + environment: SENTRY_ENVIRONMENT, tracesSampleRate: 1, }); diff --git a/apps/web/server/context.ts b/apps/web/server/context.ts index dd45e20..8b16df3 100644 --- a/apps/web/server/context.ts +++ b/apps/web/server/context.ts @@ -1,4 +1,5 @@ import { getUser } from '@/api/user/query'; +import { getCurrentScope } from '@sentry/node'; import type { inferAsyncReturnType } from '@trpc/server'; import type { CreateNextContextOptions } from '@trpc/server/adapters/next'; @@ -11,6 +12,9 @@ export async function createContext({ req }: CreateNextContextOptions) { }, }); + const scope = getCurrentScope(); + scope.setUser(user); + return { user, }; diff --git a/apps/web/server/routers/quote/index.ts b/apps/web/server/routers/quote/index.ts index c109c0d..07711e1 100644 --- a/apps/web/server/routers/quote/index.ts +++ b/apps/web/server/routers/quote/index.ts @@ -1,5 +1,5 @@ /* eslint-disable canonical/sort-keys */ -import { protectedProcedure, publicProcedure } from '../../procedure'; +import { protectedProcedure } from '../../procedure'; import { router } from '../../trpc'; import { createRequestData } from '../calculate/lib/request'; import { transformCalculateResults } from '../calculate/lib/transform'; @@ -54,7 +54,7 @@ const defaultPayments = { values: [], sums: [] }; const { URL_CRM_DOWNLOADKP } = getUrls(); export const quoteRouter = router({ - getQuote: publicProcedure + getQuote: protectedProcedure .input(GetQuoteInputDataSchema) .output(GetQuoteOutputDataSchema) .query(async ({ input }) => { diff --git a/apps/web/server/routers/tarif/index.ts b/apps/web/server/routers/tarif/index.ts index 8eb4820..aef7080 100644 --- a/apps/web/server/routers/tarif/index.ts +++ b/apps/web/server/routers/tarif/index.ts @@ -1,14 +1,19 @@ -import { publicProcedure } from '../../procedure'; +import { protectedProcedure } from '../../procedure'; import { router } from '../../trpc'; import { GetTarifInputSchema } from './types'; import initializeApollo from '@/apollo/client'; import configuratorHelper from '@/process/configurator/lib/helper'; +import { createTRPCError } from '@/utils/trpc'; export const tarifRouter = router({ - getTarif: publicProcedure.input(GetTarifInputSchema).query(async ({ input }) => { - const apolloClient = initializeApollo(); - const { getTarifs } = configuratorHelper({ apolloClient }); + getTarif: protectedProcedure.input(GetTarifInputSchema).query(async ({ input }) => { + try { + const apolloClient = initializeApollo(); + const { getTarifs } = configuratorHelper({ apolloClient }); - return getTarifs(input); + return getTarifs(input); + } catch (error) { + throw createTRPCError(error); + } }), }); diff --git a/apps/web/server/trpc.ts b/apps/web/server/trpc.ts index ed449a8..8321ec7 100644 --- a/apps/web/server/trpc.ts +++ b/apps/web/server/trpc.ts @@ -11,7 +11,7 @@ import type { Context } from './context'; import { initTRPC } from '@trpc/server'; -import SuperJSON from 'superjson'; +import { SuperJSON } from 'superjson'; export const t = initTRPC.context().create({ /** diff --git a/apps/web/trpc/client.ts b/apps/web/trpc/client.ts index b54a096..59ad1f9 100644 --- a/apps/web/trpc/client.ts +++ b/apps/web/trpc/client.ts @@ -3,7 +3,7 @@ import type { AppRouter } from '@/server/routers/_app'; import { createTRPCProxyClient, httpBatchLink, loggerLink } from '@trpc/client'; import { createTRPCNext } from '@trpc/next'; import type { NextPageContext } from 'next'; -import SuperJSON from 'superjson'; +import { SuperJSON } from 'superjson'; import { isServer } from 'tools/common'; export type SSRContext = NextPageContext & { @@ -60,6 +60,7 @@ export const trpcClient = createTRPCNext({ const { // If you're using Node 18 before 18.15.0, omit the "connection" header + // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-unused-vars connection: _connection, ...headers } = ctx.req.headers; diff --git a/apps/web/utils/axios.ts b/apps/web/utils/axios.ts index ef5d05f..51d7272 100644 --- a/apps/web/utils/axios.ts +++ b/apps/web/utils/axios.ts @@ -1,8 +1,7 @@ import { HttpError } from './error'; -import { captureException, withScope } from '@sentry/nextjs'; +import { captureException } from '@sentry/nextjs'; import type { AxiosError } from 'axios'; import { isAxiosError } from 'axios'; -import { pick } from 'radash'; function getErrorMessage( error: AxiosError @@ -21,22 +20,9 @@ export async function withHandleError(fn: Promise) { const message = getErrorMessage(error_); if (error_.response?.status && error_.response?.status >= 500) { - const err = pick(error_, ['code', 'message', 'status', 'cause']); - const data = error_.config?.data; - const params = error_.config?.params; - - const opts = { ...err, data, message, params }; - error_.message += ` | ${message}`; - withScope((scope) => { - (Object.keys(opts) as Array).forEach((key) => { - let extra = opts[key]; - if (key === 'data') extra = JSON.stringify(extra); - scope.setExtra(key, extra); - }); - captureException(error_); - }); + captureException(error_); } throw new HttpError(message, error_.status || error_.response?.status);