[offers][feat] Add get offers analysis API

pull/380/head
BryannYeap 2 years ago
parent 56632892ce
commit e99e580d5e

@ -2,7 +2,7 @@ import React from 'react';
import { trpc } from '~/utils/trpc'; import { trpc } from '~/utils/trpc';
function profileAnalysis() { function GenerateAnalysis() {
const analysis = trpc.useQuery([ const analysis = trpc.useQuery([
'offers.analysis.generate', 'offers.analysis.generate',
{ profileId: 'cl98yxuei002htx1s8lrmwzmy' }, { profileId: 'cl98yxuei002htx1s8lrmwzmy' },
@ -11,4 +11,4 @@ function profileAnalysis() {
return <div>{JSON.stringify(analysis.data)}</div>; return <div>{JSON.stringify(analysis.data)}</div>;
} }
export default profileAnalysis; export default GenerateAnalysis;

@ -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 = ( const highestOfferDtoMapper = (
offer: OffersOffer & { offer: OffersOffer & {
OffersFullTime: OffersFullTime:
| (OffersFullTime & { | (OffersFullTime & { totalCompensation: OffersCurrency })
baseSalary: OffersCurrency;
bonus: OffersCurrency;
stocks: OffersCurrency;
totalCompensation: OffersCurrency;
})
| null; | null;
OffersIntern: (OffersIntern & { monthlySalary: OffersCurrency }) | null; OffersIntern: (OffersIntern & { monthlySalary: OffersCurrency }) | null;
company: Company; 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({ input: z.object({
profileId: z.string(), profileId: z.string(),
}), }),
@ -458,20 +489,125 @@ export const offersAnalysisRouter = createRouter().query('generate', {
}, },
}); });
return { return profileAnalysisDtoMapper(
companyAnalysis: specificAnalysisDtoMapper( analysis.id,
noOfSimilarCompanyOffers, analysis.profileId,
companyPercentile, overallHighestOffer,
topPercentileCompanyOffers,
),
id: analysis.id,
overallAnalysis: specificAnalysisDtoMapper(
noOfSimilarOffers, noOfSimilarOffers,
overallPercentile, overallPercentile,
topPercentileOffers, topPercentileOffers,
), noOfSimilarCompanyOffers,
overallHighestOffer: highestOfferDtoMapper(overallHighestOffer), companyPercentile,
profileId: analysis.profileId, 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,
);
}, },
}); });

Loading…
Cancel
Save