From d4d10ed1b075d8f10a4bcf837373e199019f635f Mon Sep 17 00:00:00 2001 From: BryannYeap Date: Mon, 10 Oct 2022 16:31:06 +0800 Subject: [PATCH] [offers][feat] Add sorting functionality to list offers --- apps/portal/src/pages/offers/test.tsx | 1 + apps/portal/src/server/router/offers.ts | 72 ++++++++++++++++++++++++- 2 files changed, 71 insertions(+), 2 deletions(-) diff --git a/apps/portal/src/pages/offers/test.tsx b/apps/portal/src/pages/offers/test.tsx index df41ae88..5206935f 100644 --- a/apps/portal/src/pages/offers/test.tsx +++ b/apps/portal/src/pages/offers/test.tsx @@ -9,6 +9,7 @@ function test() { limit: 3, location: 'Singapore, Singapore', offset: 0, + sortBy: '-monthYearReceived', yoeCategory: 0, }, ]); diff --git a/apps/portal/src/server/router/offers.ts b/apps/portal/src/server/router/offers.ts index 17fe2a34..28e6c0eb 100644 --- a/apps/portal/src/server/router/offers.ts +++ b/apps/portal/src/server/router/offers.ts @@ -20,7 +20,9 @@ const getYoeRange = (yoeCategory: number) => { : null; }; -const sortingKeys = ['date', 'tc', 'yoe']; +const ascOrder = '+'; +const descOrder = '-'; +const sortingKeys = ['monthYearReceived', 'totalCompensation', 'yoe']; const createSortByValidationRegex = () => { const startsWithPlusOrMinusOnly = '^[+-]{1}'; @@ -38,7 +40,7 @@ export const offersRouter = createRouter().query('list', { offset: z.number().nonnegative(), salaryMax: z.number().nullish(), salaryMin: z.number().nonnegative().nullish(), - sortby: z.string().regex(createSortByValidationRegex()).nullish(), + sortBy: z.string().regex(createSortByValidationRegex()).nullish(), title: z.string().nullish(), yoeCategory: z.number().min(0).max(3), }), @@ -224,6 +226,72 @@ export const offersRouter = createRouter().query('list', { return validRecord; }); + data = data.sort((offer1, offer2) => { + const defaultReturn = + offer2.monthYearReceived.getTime() - offer1.monthYearReceived.getTime(); + + if (!input.sortBy) { + return defaultReturn; + } + + const order = input.sortBy.charAt(0); + const sortingKey = input.sortBy.substring(1); + + if (order === ascOrder) { + return (() => { + if (sortingKey === 'monthYearReceived') { + return ( + offer1.monthYearReceived.getTime() - + offer2.monthYearReceived.getTime() + ); + } + + if (sortingKey === 'totalCompensation') { + const salary1 = offer1.OffersFullTime?.totalCompensation.value + ? offer1.OffersFullTime?.totalCompensation.value + : offer1.OffersIntern?.monthlySalary.value; + + const salary2 = offer2.OffersFullTime?.totalCompensation.value + ? offer2.OffersFullTime?.totalCompensation.value + : offer2.OffersIntern?.monthlySalary.value; + + if (salary1 && salary2) { + return salary1 - salary2; + } + } + return defaultReturn; + })(); + } + + if (order === descOrder) { + return (() => { + if (sortingKey === 'monthYearReceived') { + return ( + offer2.monthYearReceived.getTime() - + offer1.monthYearReceived.getTime() + ); + } + + if (sortingKey === 'totalCompensation') { + const salary1 = offer1.OffersFullTime?.totalCompensation.value + ? offer1.OffersFullTime?.totalCompensation.value + : offer1.OffersIntern?.monthlySalary.value; + + const salary2 = offer2.OffersFullTime?.totalCompensation.value + ? offer2.OffersFullTime?.totalCompensation.value + : offer2.OffersIntern?.monthlySalary.value; + + if (salary1 && salary2) { + return salary2 - salary1; + } + } + + return defaultReturn; + })(); + } + return defaultReturn; + }); + return data; }, });