mirror of
https://github.com/yangshun/tech-interview-handbook.git
synced 2025-07-28 12:43:12 +08:00
[offers][feat] Add get offers analysis API
This commit is contained in:
@ -2,7 +2,7 @@ import React from 'react';
|
||||
|
||||
import { trpc } from '~/utils/trpc';
|
||||
|
||||
function profileAnalysis() {
|
||||
function GenerateAnalysis() {
|
||||
const analysis = trpc.useQuery([
|
||||
'offers.analysis.generate',
|
||||
{ profileId: 'cl98yxuei002htx1s8lrmwzmy' },
|
||||
@ -11,4 +11,4 @@ function profileAnalysis() {
|
||||
return <div>{JSON.stringify(analysis.data)}</div>;
|
||||
}
|
||||
|
||||
export default profileAnalysis;
|
||||
export default GenerateAnalysis;
|
14
apps/portal/src/pages/offers/test/getAnalysis.tsx
Normal file
14
apps/portal/src/pages/offers/test/getAnalysis.tsx
Normal file
@ -0,0 +1,14 @@
|
||||
import React from 'react';
|
||||
|
||||
import { trpc } from '~/utils/trpc';
|
||||
|
||||
function GetAnalysis() {
|
||||
const analysis = trpc.useQuery([
|
||||
'offers.analysis.get',
|
||||
{ profileId: 'cl98yxuei002htx1s8lrmwzmy' },
|
||||
]);
|
||||
|
||||
return <div>{JSON.stringify(analysis.data)}</div>;
|
||||
}
|
||||
|
||||
export default GetAnalysis;
|
@ -121,12 +121,7 @@ const specificAnalysisDtoMapper = (
|
||||
const highestOfferDtoMapper = (
|
||||
offer: OffersOffer & {
|
||||
OffersFullTime:
|
||||
| (OffersFullTime & {
|
||||
baseSalary: OffersCurrency;
|
||||
bonus: OffersCurrency;
|
||||
stocks: OffersCurrency;
|
||||
totalCompensation: OffersCurrency;
|
||||
})
|
||||
| (OffersFullTime & { totalCompensation: OffersCurrency })
|
||||
| null;
|
||||
OffersIntern: (OffersIntern & { monthlySalary: OffersCurrency }) | null;
|
||||
company: Company;
|
||||
@ -146,7 +141,43 @@ const highestOfferDtoMapper = (
|
||||
};
|
||||
};
|
||||
|
||||
export const offersAnalysisRouter = createRouter().query('generate', {
|
||||
const profileAnalysisDtoMapper = (
|
||||
analysisId: string,
|
||||
profileId: string,
|
||||
overallHighestOffer: OffersOffer & {
|
||||
OffersFullTime:
|
||||
| (OffersFullTime & { totalCompensation: OffersCurrency })
|
||||
| null;
|
||||
OffersIntern: (OffersIntern & { monthlySalary: OffersCurrency }) | null;
|
||||
company: Company;
|
||||
profile: OffersProfile & { background: OffersBackground | null };
|
||||
},
|
||||
noOfSimilarOffers: number,
|
||||
overallPercentile: number,
|
||||
topPercentileOffers: Array<any>,
|
||||
noOfSimilarCompanyOffers: number,
|
||||
companyPercentile: number,
|
||||
topPercentileCompanyOffers: Array<any>,
|
||||
) => {
|
||||
return {
|
||||
companyAnalysis: specificAnalysisDtoMapper(
|
||||
noOfSimilarCompanyOffers,
|
||||
companyPercentile,
|
||||
topPercentileCompanyOffers,
|
||||
),
|
||||
id: analysisId,
|
||||
overallAnalysis: specificAnalysisDtoMapper(
|
||||
noOfSimilarOffers,
|
||||
overallPercentile,
|
||||
topPercentileOffers,
|
||||
),
|
||||
overallHighestOffer: highestOfferDtoMapper(overallHighestOffer),
|
||||
profileId,
|
||||
};
|
||||
};
|
||||
|
||||
export const offersAnalysisRouter = createRouter()
|
||||
.query('generate', {
|
||||
input: z.object({
|
||||
profileId: z.string(),
|
||||
}),
|
||||
@ -458,20 +489,125 @@ export const offersAnalysisRouter = createRouter().query('generate', {
|
||||
},
|
||||
});
|
||||
|
||||
return {
|
||||
companyAnalysis: specificAnalysisDtoMapper(
|
||||
noOfSimilarCompanyOffers,
|
||||
companyPercentile,
|
||||
topPercentileCompanyOffers,
|
||||
),
|
||||
id: analysis.id,
|
||||
overallAnalysis: specificAnalysisDtoMapper(
|
||||
return profileAnalysisDtoMapper(
|
||||
analysis.id,
|
||||
analysis.profileId,
|
||||
overallHighestOffer,
|
||||
noOfSimilarOffers,
|
||||
overallPercentile,
|
||||
topPercentileOffers,
|
||||
),
|
||||
overallHighestOffer: highestOfferDtoMapper(overallHighestOffer),
|
||||
profileId: analysis.profileId,
|
||||
};
|
||||
noOfSimilarCompanyOffers,
|
||||
companyPercentile,
|
||||
topPercentileCompanyOffers,
|
||||
);
|
||||
},
|
||||
})
|
||||
.query('get', {
|
||||
input: z.object({
|
||||
profileId: z.string(),
|
||||
}),
|
||||
async resolve({ ctx, input }) {
|
||||
const analysis = await ctx.prisma.offersAnalysis.findFirst({
|
||||
include: {
|
||||
overallHighestOffer: {
|
||||
include: {
|
||||
OffersFullTime: {
|
||||
include: {
|
||||
totalCompensation: true,
|
||||
},
|
||||
},
|
||||
OffersIntern: {
|
||||
include: {
|
||||
monthlySalary: true,
|
||||
},
|
||||
},
|
||||
company: true,
|
||||
profile: {
|
||||
include: {
|
||||
background: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
topCompanyOffers: {
|
||||
include: {
|
||||
OffersFullTime: {
|
||||
include: {
|
||||
totalCompensation: true,
|
||||
},
|
||||
},
|
||||
OffersIntern: {
|
||||
include: {
|
||||
monthlySalary: true,
|
||||
},
|
||||
},
|
||||
company: true,
|
||||
profile: {
|
||||
include: {
|
||||
background: {
|
||||
include: {
|
||||
experiences: {
|
||||
include: {
|
||||
company: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
topOverallOffers: {
|
||||
include: {
|
||||
OffersFullTime: {
|
||||
include: {
|
||||
totalCompensation: true,
|
||||
},
|
||||
},
|
||||
OffersIntern: {
|
||||
include: {
|
||||
monthlySalary: true,
|
||||
},
|
||||
},
|
||||
company: true,
|
||||
profile: {
|
||||
include: {
|
||||
background: {
|
||||
include: {
|
||||
experiences: {
|
||||
include: {
|
||||
company: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
where: {
|
||||
profileId: input.profileId,
|
||||
},
|
||||
});
|
||||
|
||||
if (!analysis) {
|
||||
throw new TRPCError({
|
||||
code: 'NOT_FOUND',
|
||||
message: 'No analysis found on this profile',
|
||||
});
|
||||
}
|
||||
|
||||
return profileAnalysisDtoMapper(
|
||||
analysis.id,
|
||||
analysis.profileId,
|
||||
analysis.overallHighestOffer,
|
||||
analysis.noOfSimilarOffers,
|
||||
analysis.overallPercentile,
|
||||
analysis.topOverallOffers,
|
||||
analysis.noOfSimilarCompanyOffers,
|
||||
analysis.companyPercentile,
|
||||
analysis.topCompanyOffers,
|
||||
);
|
||||
},
|
||||
});
|
||||
|
Reference in New Issue
Block a user