[offers][refactor] Abstract generation of analysis unit into a function

pull/522/head
Bryann Yeap Kok Keong 2 years ago
parent 058765bf47
commit 5afb0506d2

@ -225,6 +225,55 @@ const getSalary = (offer: Offer | SimilarOffer, defaultSalary = 0) => {
: defaultSalary; : defaultSalary;
}; };
const getTopOffers = (
similarOffers: Array<SimilarOffer>,
noOfSimilarOffers: number,
) => {
const similarOffers90PercentileIndex = Math.ceil(noOfSimilarOffers * 0.1);
const topPercentileOffers =
noOfSimilarOffers > 2
? similarOffers.slice(
similarOffers90PercentileIndex,
similarOffers90PercentileIndex + 2,
)
: similarOffers;
return topPercentileOffers;
};
const generateAnalysisUnit = async (
prisma: PrismaClient<
Prisma.PrismaClientOptions,
never,
Prisma.RejectOnNotFound | Prisma.RejectPerOperation | undefined
>,
analysedOffer: Offer,
usersOfferIds: Array<string>,
isCompanyAnalysisUnit = false,
) => {
let similarOffers = await getSimilarOffers(
prisma,
analysedOffer,
isCompanyAnalysisUnit ? analysedOffer.companyId : undefined,
);
const percentile = calculatePercentile(similarOffers, analysedOffer);
similarOffers = similarOffers.filter(
(offer) => !usersOfferIds.includes(offer.id),
);
const noOfSimilarOffers = similarOffers.length;
const topSimilarOffers = getTopOffers(similarOffers, noOfSimilarOffers);
return {
analysedOfferId: analysedOffer.id,
noOfSimilarOffers,
percentile,
topSimilarOffers,
};
};
export const generateAnalysis = async (params: { export const generateAnalysis = async (params: {
ctx: { ctx: {
prisma: PrismaClient< prisma: PrismaClient<
@ -304,27 +353,15 @@ export const generateAnalysis = async (params: {
const overallHighestOffer = offers[0]; const overallHighestOffer = offers[0];
const offerIds = offers.map((offer) => offer.id); const usersOfferIds = offers.map((offer) => offer.id);
// OVERALL ANALYSIS // OVERALL ANALYSIS
let similarOffers = await getSimilarOffers(ctx.prisma, overallHighestOffer); const overallAnalysisUnit = await generateAnalysisUnit(
const overallPercentile = calculatePercentile( ctx.prisma,
similarOffers,
overallHighestOffer, overallHighestOffer,
usersOfferIds,
); );
// Get top offers (excluding user's offers)
similarOffers = similarOffers.filter((offer) => !offerIds.includes(offer.id));
const noOfSimilarOffers = similarOffers.length;
const similarOffers90PercentileIndex = Math.ceil(noOfSimilarOffers * 0.1);
const topPercentileOffers =
noOfSimilarOffers > 2
? similarOffers.slice(
similarOffers90PercentileIndex,
similarOffers90PercentileIndex + 2,
)
: similarOffers;
// COMPANY ANALYSIS // COMPANY ANALYSIS
const companyMap = new Map<string, Offer>(); const companyMap = new Map<string, Offer>();
offers.forEach((offer) => { offers.forEach((offer) => {
@ -335,39 +372,12 @@ export const generateAnalysis = async (params: {
const companyAnalysis = await Promise.all( const companyAnalysis = await Promise.all(
Array.from(companyMap.values()).map(async (companyOffer) => { Array.from(companyMap.values()).map(async (companyOffer) => {
// TODO: Refactor calculating analysis into a function return await generateAnalysisUnit(
let similarCompanyOffers = await getSimilarOffers(
ctx.prisma, ctx.prisma,
companyOffer, companyOffer,
companyOffer.companyId, usersOfferIds,
true,
); );
const companyPercentile = calculatePercentile(
similarCompanyOffers,
companyOffer,
);
// Get top offers (excluding user's offers)
similarCompanyOffers = similarCompanyOffers.filter(
(offer) => !offerIds.includes(offer.id),
);
const noOfSimilarCompanyOffers = similarCompanyOffers.length;
const similarCompanyOffers90PercentileIndex = Math.ceil(
noOfSimilarCompanyOffers * 0.1,
);
const topPercentileCompanyOffers =
noOfSimilarCompanyOffers > 2
? similarCompanyOffers.slice(
similarCompanyOffers90PercentileIndex,
similarCompanyOffers90PercentileIndex + 2,
)
: similarCompanyOffers;
return {
analysedOfferId: companyOffer.id,
noOfSimilarOffers: noOfSimilarCompanyOffers,
percentile: companyPercentile,
topSimilarOffers: topPercentileCompanyOffers,
};
}), }),
); );
@ -395,13 +405,13 @@ export const generateAnalysis = async (params: {
create: { create: {
analysedOffer: { analysedOffer: {
connect: { connect: {
id: overallHighestOffer.id, id: overallAnalysisUnit.analysedOfferId,
}, },
}, },
noOfSimilarOffers, noOfSimilarOffers: overallAnalysisUnit.noOfSimilarOffers,
percentile: overallPercentile, percentile: overallAnalysisUnit.percentile,
topSimilarOffers: { topSimilarOffers: {
connect: topPercentileOffers.map((offer) => { connect: overallAnalysisUnit.topSimilarOffers.map((offer) => {
return { id: offer.id }; return { id: offer.id };
}), }),
}, },

Loading…
Cancel
Save