From 9efdafb20fd89f2796395b3adb9c534b8f732ba6 Mon Sep 17 00:00:00 2001 From: Matthieu Haineault Date: Fri, 10 Oct 2025 09:27:57 -0400 Subject: [PATCH] refactor(preferences & modules): changed type from boolean to Int so each preferences can have more than 2 options. Also cleaned-up module imports/providers --- docs/swagger/swagger-spec.json | 37 +++++++++++ package-lock.json | 64 +++++++++---------- package.json | 2 +- .../migration.sql | 18 ++++++ prisma/schema.prisma | 10 +-- src/app.module.ts | 2 + src/modules/employees/employees.module.ts | 3 +- .../services/expenses-command.service.ts | 4 +- .../services/expenses-query.service.ts | 4 +- src/modules/exports/csv-exports.module.ts | 3 +- .../leave-requests/leave-requests.module.ts | 3 +- .../holiday-leave-requests.service.ts | 4 +- .../services/leave-request.service.ts | 4 +- .../services/sick-leave-requests.service.ts | 4 +- .../vacation-leave-requests.service.ts | 4 +- .../utils/leave-request.util.ts | 4 +- src/modules/pay-periods/pay-periods.module.ts | 9 +-- .../preferences/dtos/preferences.dto.ts | 18 +++--- src/modules/preferences/preferences.module.ts | 8 ++- .../services/preferences.service.ts | 17 ++--- .../schedule-presets.module.ts | 7 +- .../schedule-presets-apply.service.ts | 4 +- .../schedule-presets-command.service.ts | 4 +- .../schedule-presets-query.service.ts | 4 +- src/modules/shared/shared.module.ts | 6 +- .../shared/utils/resolve-email-id.utils.ts | 14 +++- .../shifts/services/shifts-command.service.ts | 4 +- src/modules/shifts/shifts.module.ts | 34 +++++----- .../services/timesheets-command.service.ts | 4 +- .../services/timesheets-query.service.ts | 4 +- src/modules/timesheets/timesheets.module.ts | 32 +++++----- 31 files changed, 201 insertions(+), 138 deletions(-) create mode 100644 prisma/migrations/20251010124650_changed_boolean_to_int_for_table_preferences/migration.sql diff --git a/docs/swagger/swagger-spec.json b/docs/swagger/swagger-spec.json index 01dbbcf..0cf1209 100644 --- a/docs/swagger/swagger-spec.json +++ b/docs/swagger/swagger-spec.json @@ -1065,6 +1065,39 @@ ] } }, + "/preferences/{email}": { + "patch": { + "operationId": "PreferencesController_updatePreferences", + "parameters": [ + { + "name": "email", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PreferencesDto" + } + } + } + }, + "responses": { + "200": { + "description": "" + } + }, + "tags": [ + "Preferences" + ] + } + }, "/schedule-presets/{email}": { "put": { "operationId": "SchedulePresetsController_upsert", @@ -1666,6 +1699,10 @@ "employees_overview" ] }, + "PreferencesDto": { + "type": "object", + "properties": {} + }, "SchedulePresetsDto": { "type": "object", "properties": {} diff --git a/package-lock.json b/package-lock.json index 0622bea..1166ca0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -51,7 +51,7 @@ "globals": "^16.0.0", "jest": "^29.7.0", "prettier": "^3.4.2", - "prisma": "^6.16.3", + "prisma": "^6.17.0", "source-map-support": "^0.5.21", "supertest": "^7.0.0", "ts-jest": "^29.2.5", @@ -3148,9 +3148,9 @@ } }, "node_modules/@prisma/config": { - "version": "6.16.3", - "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.16.3.tgz", - "integrity": "sha512-VlsLnG4oOuKGGMToEeVaRhoTBZu5H3q51jTQXb/diRags3WV0+BQK5MolJTtP6G7COlzoXmWeS11rNBtvg+qFQ==", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.17.0.tgz", + "integrity": "sha512-k8tuChKpkO/Vj7ZEzaQMNflNGbaW4X0r8+PC+W2JaqVRdiS2+ORSv1SrDwNxsb8YyzIQJucXqLGZbgxD97ZhsQ==", "devOptional": true, "dependencies": { "c12": "3.1.0", @@ -3160,48 +3160,48 @@ } }, "node_modules/@prisma/debug": { - "version": "6.16.3", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.16.3.tgz", - "integrity": "sha512-89DdqWtdKd7qoc9/qJCKLTazj3W3zPEiz0hc7HfZdpjzm21c7orOUB5oHWJsG+4KbV4cWU5pefq3CuDVYF9vgA==", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.17.0.tgz", + "integrity": "sha512-eE2CB32nr1hRqyLVnOAVY6c//iSJ/PN+Yfoa/2sEzLGpORaCg61d+nvdAkYSh+6Y2B8L4BVyzkRMANLD6nnC2g==", "devOptional": true }, "node_modules/@prisma/engines": { - "version": "6.16.3", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.16.3.tgz", - "integrity": "sha512-b+Rl4nzQDcoqe6RIpSHv8f5lLnwdDGvXhHjGDiokObguAAv/O1KaX1Oc69mBW/GFWKQpCkOraobLjU6s1h8HGg==", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.17.0.tgz", + "integrity": "sha512-XhE9v3hDQTNgCYMjogcCYKi7HCEkZf9WwTGuXy8cmY8JUijvU0ap4M7pGLx4pBblkp5EwUsYzw1YLtH7yi0GZw==", "devOptional": true, "hasInstallScript": true, "dependencies": { - "@prisma/debug": "6.16.3", - "@prisma/engines-version": "6.16.1-1.bb420e667c1820a8c05a38023385f6cc7ef8e83a", - "@prisma/fetch-engine": "6.16.3", - "@prisma/get-platform": "6.16.3" + "@prisma/debug": "6.17.0", + "@prisma/engines-version": "6.17.0-16.c0aafc03b8ef6cdced8654b9a817999e02457d6a", + "@prisma/fetch-engine": "6.17.0", + "@prisma/get-platform": "6.17.0" } }, "node_modules/@prisma/engines-version": { - "version": "6.16.1-1.bb420e667c1820a8c05a38023385f6cc7ef8e83a", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.16.1-1.bb420e667c1820a8c05a38023385f6cc7ef8e83a.tgz", - "integrity": "sha512-fftRmosBex48Ph1v2ll1FrPpirwtPZpNkE5CDCY1Lw2SD2ctyrLlVlHiuxDAAlALwWBOkPbAll4+EaqdGuMhJw==", + "version": "6.17.0-16.c0aafc03b8ef6cdced8654b9a817999e02457d6a", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.17.0-16.c0aafc03b8ef6cdced8654b9a817999e02457d6a.tgz", + "integrity": "sha512-G0VU4uFDreATgTz4sh3dTtU2C+jn+J6c060ixavWZaUaSRZsNQhSPW26lbfez7GHzR02RGCdqs5UcSuGBC3yLw==", "devOptional": true }, "node_modules/@prisma/fetch-engine": { - "version": "6.16.3", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.16.3.tgz", - "integrity": "sha512-bUoRIkVaI+CCaVGrSfcKev0/Mk4ateubqWqGZvQ9uCqFv2ENwWIR3OeNuGin96nZn5+SkebcD7RGgKr/+mJelw==", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.17.0.tgz", + "integrity": "sha512-YSl5R3WIAPrmshYPkaaszOsBIWRAovOCHn3y7gkTNGG51LjYW4pi6PFNkGouW6CA06qeTjTbGrDRCgFjnmVWDg==", "devOptional": true, "dependencies": { - "@prisma/debug": "6.16.3", - "@prisma/engines-version": "6.16.1-1.bb420e667c1820a8c05a38023385f6cc7ef8e83a", - "@prisma/get-platform": "6.16.3" + "@prisma/debug": "6.17.0", + "@prisma/engines-version": "6.17.0-16.c0aafc03b8ef6cdced8654b9a817999e02457d6a", + "@prisma/get-platform": "6.17.0" } }, "node_modules/@prisma/get-platform": { - "version": "6.16.3", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.16.3.tgz", - "integrity": "sha512-X1LxiFXinJ4iQehrodGp0f66Dv6cDL0GbRlcCoLtSu6f4Wi+hgo7eND/afIs5029GQLgNWKZ46vn8hjyXTsHLA==", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.17.0.tgz", + "integrity": "sha512-3tEKChrnlmLXPd870oiVfRvj7vVKuxqP349hYaMDsbV4TZd3+lFqw8KTI2Tbq5DopamfNuNqhVCj+R6ZxKKYGQ==", "devOptional": true, "dependencies": { - "@prisma/debug": "6.16.3" + "@prisma/debug": "6.17.0" } }, "node_modules/@scarf/scarf": { @@ -10049,14 +10049,14 @@ } }, "node_modules/prisma": { - "version": "6.16.3", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.16.3.tgz", - "integrity": "sha512-4tJq3KB9WRshH5+QmzOLV54YMkNlKOtLKaSdvraI5kC/axF47HuOw6zDM8xrxJ6s9o2WodY654On4XKkrobQdQ==", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.17.0.tgz", + "integrity": "sha512-rcvldz98r+2bVCs0MldQCBaaVJRCj9Ew4IqphLATF89OJcSzwRQpwnKXR+W2+2VjK7/o2x3ffu5+2N3Muu6Dbw==", "devOptional": true, "hasInstallScript": true, "dependencies": { - "@prisma/config": "6.16.3", - "@prisma/engines": "6.16.3" + "@prisma/config": "6.17.0", + "@prisma/engines": "6.17.0" }, "bin": { "prisma": "build/index.js" diff --git a/package.json b/package.json index 68eb03f..76aac8f 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "globals": "^16.0.0", "jest": "^29.7.0", "prettier": "^3.4.2", - "prisma": "^6.16.3", + "prisma": "^6.17.0", "source-map-support": "^0.5.21", "supertest": "^7.0.0", "ts-jest": "^29.2.5", diff --git a/prisma/migrations/20251010124650_changed_boolean_to_int_for_table_preferences/migration.sql b/prisma/migrations/20251010124650_changed_boolean_to_int_for_table_preferences/migration.sql new file mode 100644 index 0000000..bf8f7c6 --- /dev/null +++ b/prisma/migrations/20251010124650_changed_boolean_to_int_for_table_preferences/migration.sql @@ -0,0 +1,18 @@ +/* + Warnings: + + - The `notifications` column on the `preferences` table would be dropped and recreated. This will lead to data loss if there is data in the column. + - The `dark_mode` column on the `preferences` table would be dropped and recreated. This will lead to data loss if there is data in the column. + - The `lang_switch` column on the `preferences` table would be dropped and recreated. This will lead to data loss if there is data in the column. + - The `lefty_mode` column on the `preferences` table would be dropped and recreated. This will lead to data loss if there is data in the column. + +*/ +-- AlterTable +ALTER TABLE "preferences" DROP COLUMN "notifications", +ADD COLUMN "notifications" INTEGER NOT NULL DEFAULT 0, +DROP COLUMN "dark_mode", +ADD COLUMN "dark_mode" INTEGER NOT NULL DEFAULT 0, +DROP COLUMN "lang_switch", +ADD COLUMN "lang_switch" INTEGER NOT NULL DEFAULT 0, +DROP COLUMN "lefty_mode", +ADD COLUMN "lefty_mode" INTEGER NOT NULL DEFAULT 0; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index dd489c2..abb8fae 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -376,11 +376,11 @@ model Preferences { user Users @relation("UserPreferences", fields: [user_id], references: [id]) user_id String @unique @db.Uuid - notifications Boolean @default(false) - dark_mode Boolean @default(false) - lang_switch Boolean @default(false) - lefty_mode Boolean @default(false) -// TODO: change BOOLEAN to use 0 or 1 in case there is more than 2 options for each preferences + notifications Int @default(0) + dark_mode Int @default(0) + lang_switch Int @default(0) + lefty_mode Int @default(0) + @@map("preferences") } diff --git a/src/app.module.ts b/src/app.module.ts index 74eb167..daf8229 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -16,6 +16,7 @@ import { NotificationsModule } from './modules/notifications/notifications.modul import { OauthSessionsModule } from './modules/oauth-sessions/oauth-sessions.module'; import { OvertimeService } from './modules/business-logics/services/overtime.service'; import { PayperiodsModule } from './modules/pay-periods/pay-periods.module'; +import { PreferencesModule } from './modules/preferences/preferences.module'; import { PrismaModule } from './prisma/prisma.module'; import { ScheduleModule } from '@nestjs/schedule'; import { ShiftsModule } from './modules/shifts/shifts.module'; @@ -43,6 +44,7 @@ import { SchedulePresetsModule } from './modules/schedule-presets/schedule-prese NotificationsModule, OauthSessionsModule, PayperiodsModule, + PreferencesModule, PrismaModule, ScheduleModule.forRoot(), //cronjobs SchedulePresetsModule, diff --git a/src/modules/employees/employees.module.ts b/src/modules/employees/employees.module.ts index b362663..66a14a7 100644 --- a/src/modules/employees/employees.module.ts +++ b/src/modules/employees/employees.module.ts @@ -2,9 +2,10 @@ import { Module } from '@nestjs/common'; import { EmployeesController } from './controllers/employees.controller'; import { EmployeesService } from './services/employees.service'; import { EmployeesArchivalService } from './services/employees-archival.service'; +import { SharedModule } from '../shared/shared.module'; @Module({ - controllers: [EmployeesController], + controllers: [EmployeesController, SharedModule], providers: [EmployeesService, EmployeesArchivalService], exports: [EmployeesService, EmployeesArchivalService], }) diff --git a/src/modules/expenses/services/expenses-command.service.ts b/src/modules/expenses/services/expenses-command.service.ts index 8cc64f3..bda3c90 100644 --- a/src/modules/expenses/services/expenses-command.service.ts +++ b/src/modules/expenses/services/expenses-command.service.ts @@ -4,7 +4,7 @@ import { PrismaService } from "src/prisma/prisma.service"; import { UpsertExpenseDto } from "../dtos/upsert-expense.dto"; import { BankCodesResolver } from "src/modules/shared/utils/resolve-bank-type-id.utils"; import { ExpenseResponse, UpsertAction } from "../types and interfaces/expenses.types.interfaces"; -import { EmployeeIdEmailResolver } from "src/modules/shared/utils/resolve-email-id.utils"; +import { EmailToIdResolver } from "src/modules/shared/utils/resolve-email-id.utils"; import { EmployeeTimesheetResolver } from "src/modules/shared/utils/resolve-employee-timesheet.utils"; import { BadRequestException, @@ -27,7 +27,7 @@ export class ExpensesCommandService extends BaseApprovalService { prisma: PrismaService, private readonly bankCodesResolver: BankCodesResolver, private readonly timesheetsResolver: EmployeeTimesheetResolver, - private readonly emailResolver: EmployeeIdEmailResolver, + private readonly emailResolver: EmailToIdResolver, ) { super(prisma); } //_____________________________________________________________________________________________ diff --git a/src/modules/expenses/services/expenses-query.service.ts b/src/modules/expenses/services/expenses-query.service.ts index 46aba80..35cdde5 100644 --- a/src/modules/expenses/services/expenses-query.service.ts +++ b/src/modules/expenses/services/expenses-query.service.ts @@ -3,13 +3,13 @@ import { PrismaService } from "src/prisma/prisma.service"; import { DayExpensesDto as ExpenseListResponseDto, ExpenseDto } from "src/modules/timesheets/dtos/timesheet-period.dto"; import { round2, toUTCDateOnly } from "src/modules/timesheets/utils/timesheet.helpers"; import { EXPENSE_TYPES } from "src/modules/timesheets/types/timesheet.types"; -import { EmployeeIdEmailResolver } from "src/modules/shared/utils/resolve-email-id.utils"; +import { EmailToIdResolver } from "src/modules/shared/utils/resolve-email-id.utils"; @Injectable() export class ExpensesQueryService { constructor( private readonly prisma: PrismaService, - private readonly employeeRepo: EmployeeIdEmailResolver, + private readonly employeeRepo: EmailToIdResolver, ) {} diff --git a/src/modules/exports/csv-exports.module.ts b/src/modules/exports/csv-exports.module.ts index 92a5a96..e034c9e 100644 --- a/src/modules/exports/csv-exports.module.ts +++ b/src/modules/exports/csv-exports.module.ts @@ -1,9 +1,10 @@ import { Module } from "@nestjs/common"; import { CsvExportController } from "./controllers/csv-exports.controller"; import { CsvExportService } from "./services/csv-exports.service"; +import { SharedModule } from "../shared/shared.module"; @Module({ - providers:[CsvExportService], + providers:[CsvExportService, SharedModule], controllers: [CsvExportController], }) export class CsvExportModule {} diff --git a/src/modules/leave-requests/leave-requests.module.ts b/src/modules/leave-requests/leave-requests.module.ts index 8959e30..714dad8 100644 --- a/src/modules/leave-requests/leave-requests.module.ts +++ b/src/modules/leave-requests/leave-requests.module.ts @@ -8,9 +8,10 @@ import { SickLeaveRequestsService } from "./services/sick-leave-requests.service import { LeaveRequestsService } from "./services/leave-request.service"; import { ShiftsModule } from "../shifts/shifts.module"; import { LeaveRequestsUtils } from "./utils/leave-request.util"; +import { SharedModule } from "../shared/shared.module"; @Module({ - imports: [BusinessLogicsModule, ShiftsModule], + imports: [BusinessLogicsModule, ShiftsModule, SharedModule], controllers: [LeaveRequestController], providers: [ VacationLeaveRequestsService, diff --git a/src/modules/leave-requests/services/holiday-leave-requests.service.ts b/src/modules/leave-requests/services/holiday-leave-requests.service.ts index a6d17c2..309bfbb 100644 --- a/src/modules/leave-requests/services/holiday-leave-requests.service.ts +++ b/src/modules/leave-requests/services/holiday-leave-requests.service.ts @@ -9,7 +9,7 @@ import { leaveRequestsSelect } from '../utils/leave-requests.select'; import { LeaveRequestsUtils} from '../utils/leave-request.util'; import { normalizeDates, toDateOnly } from 'src/modules/shared/helpers/date-time.helpers'; import { BankCodesResolver } from 'src/modules/shared/utils/resolve-bank-type-id.utils'; -import { EmployeeIdEmailResolver } from 'src/modules/shared/utils/resolve-email-id.utils'; +import { EmailToIdResolver } from 'src/modules/shared/utils/resolve-email-id.utils'; @Injectable() @@ -18,7 +18,7 @@ export class HolidayLeaveRequestsService { private readonly prisma: PrismaService, private readonly holidayService: HolidayService, private readonly leaveUtils: LeaveRequestsUtils, - private readonly emailResolver: EmployeeIdEmailResolver, + private readonly emailResolver: EmailToIdResolver, private readonly typeResolver: BankCodesResolver, ) {} diff --git a/src/modules/leave-requests/services/leave-request.service.ts b/src/modules/leave-requests/services/leave-request.service.ts index f46ab5c..d5e3eb7 100644 --- a/src/modules/leave-requests/services/leave-request.service.ts +++ b/src/modules/leave-requests/services/leave-request.service.ts @@ -14,7 +14,7 @@ import { VacationService } from "src/modules/business-logics/services/vacation.s import { PrismaService } from "src/prisma/prisma.service"; import { LeaveRequestsUtils } from "../utils/leave-request.util"; import { normalizeDates, toDateOnly, toISODateKey } from "src/modules/shared/helpers/date-time.helpers"; -import { EmployeeIdEmailResolver } from "src/modules/shared/utils/resolve-email-id.utils"; +import { EmailToIdResolver } from "src/modules/shared/utils/resolve-email-id.utils"; import { BankCodesResolver } from "src/modules/shared/utils/resolve-bank-type-id.utils"; @Injectable() @@ -28,7 +28,7 @@ export class LeaveRequestsService { private readonly vacationLeaveService: VacationLeaveRequestsService, private readonly vacationLogic: VacationService, private readonly leaveUtils: LeaveRequestsUtils, - private readonly emailResolver: EmployeeIdEmailResolver, + private readonly emailResolver: EmailToIdResolver, private readonly typeResolver: BankCodesResolver, ) {} diff --git a/src/modules/leave-requests/services/sick-leave-requests.service.ts b/src/modules/leave-requests/services/sick-leave-requests.service.ts index a99488c..dc513fa 100644 --- a/src/modules/leave-requests/services/sick-leave-requests.service.ts +++ b/src/modules/leave-requests/services/sick-leave-requests.service.ts @@ -9,7 +9,7 @@ import { SickLeaveService } from "src/modules/business-logics/services/sick-le import { roundToQuarterHour } from "src/common/utils/date-utils"; import { LeaveRequestsUtils } from "../utils/leave-request.util"; import { normalizeDates, toDateOnly } from "src/modules/shared/helpers/date-time.helpers"; -import { EmployeeIdEmailResolver } from "src/modules/shared/utils/resolve-email-id.utils"; +import { EmailToIdResolver } from "src/modules/shared/utils/resolve-email-id.utils"; import { BankCodesResolver } from "src/modules/shared/utils/resolve-bank-type-id.utils"; @Injectable() @@ -18,7 +18,7 @@ export class SickLeaveRequestsService { private readonly prisma: PrismaService, private readonly sickService: SickLeaveService, private readonly leaveUtils: LeaveRequestsUtils, - private readonly emailResolver: EmployeeIdEmailResolver, + private readonly emailResolver: EmailToIdResolver, private readonly typeResolver: BankCodesResolver, ) {} diff --git a/src/modules/leave-requests/services/vacation-leave-requests.service.ts b/src/modules/leave-requests/services/vacation-leave-requests.service.ts index d1bce32..8d90b6f 100644 --- a/src/modules/leave-requests/services/vacation-leave-requests.service.ts +++ b/src/modules/leave-requests/services/vacation-leave-requests.service.ts @@ -10,7 +10,7 @@ import { leaveRequestsSelect } from "../utils/leave-requests.select"; import { roundToQuarterHour } from "src/common/utils/date-utils"; import { LeaveRequestsUtils } from "../utils/leave-request.util"; import { normalizeDates, toDateOnly } from "src/modules/shared/helpers/date-time.helpers"; -import { EmployeeIdEmailResolver } from "src/modules/shared/utils/resolve-email-id.utils"; +import { EmailToIdResolver } from "src/modules/shared/utils/resolve-email-id.utils"; import { BankCodesResolver } from "src/modules/shared/utils/resolve-bank-type-id.utils"; @Injectable() @@ -19,7 +19,7 @@ export class VacationLeaveRequestsService { private readonly prisma: PrismaService, private readonly vacationService: VacationService, private readonly leaveUtils: LeaveRequestsUtils, - private readonly emailResolver: EmployeeIdEmailResolver, + private readonly emailResolver: EmailToIdResolver, private readonly typeResolver: BankCodesResolver, ) {} diff --git a/src/modules/leave-requests/utils/leave-request.util.ts b/src/modules/leave-requests/utils/leave-request.util.ts index 7cd41de..11e0c9b 100644 --- a/src/modules/leave-requests/utils/leave-request.util.ts +++ b/src/modules/leave-requests/utils/leave-request.util.ts @@ -1,8 +1,8 @@ -import { BadRequestException, Injectable, NotFoundException } from "@nestjs/common"; -import { LeaveTypes } from "@prisma/client"; import { hhmmFromLocal, toDateOnly, toStringFromDate } from "src/modules/shared/helpers/date-time.helpers"; +import { BadRequestException, Injectable } from "@nestjs/common"; import { ShiftsCommandService } from "src/modules/shifts/services/shifts-command.service"; import { PrismaService } from "src/prisma/prisma.service"; +import { LeaveTypes } from "@prisma/client"; @Injectable() export class LeaveRequestsUtils { diff --git a/src/modules/pay-periods/pay-periods.module.ts b/src/modules/pay-periods/pay-periods.module.ts index fc5ce6d..c5606db 100644 --- a/src/modules/pay-periods/pay-periods.module.ts +++ b/src/modules/pay-periods/pay-periods.module.ts @@ -8,23 +8,18 @@ import { TimesheetsCommandService } from "../timesheets/services/timesheets-comm import { ExpensesCommandService } from "../expenses/services/expenses-command.service"; import { ShiftsCommandService } from "../shifts/services/shifts-command.service"; import { SharedModule } from "../shared/shared.module"; -import { EmployeeIdEmailResolver } from "../shared/utils/resolve-email-id.utils"; -import { BankCodesResolver } from "../shared/utils/resolve-bank-type-id.utils"; import { PrismaService } from "src/prisma/prisma.service"; -import { OvertimeService } from "../business-logics/services/overtime.service"; +import { BusinessLogicsModule } from "../business-logics/business-logics.module"; @Module({ - imports: [PrismaModule, TimesheetsModule, SharedModule], + imports: [PrismaModule, TimesheetsModule, SharedModule, BusinessLogicsModule], providers: [ PayPeriodsQueryService, PayPeriodsCommandService, TimesheetsCommandService, ExpensesCommandService, ShiftsCommandService, - EmployeeIdEmailResolver, - BankCodesResolver, PrismaService, - OvertimeService, ], controllers: [PayPeriodsController], exports: [ diff --git a/src/modules/preferences/dtos/preferences.dto.ts b/src/modules/preferences/dtos/preferences.dto.ts index 2bfa3e3..5b1377e 100644 --- a/src/modules/preferences/dtos/preferences.dto.ts +++ b/src/modules/preferences/dtos/preferences.dto.ts @@ -1,16 +1,16 @@ -import { IsBoolean, IsEmail, IsString } from "class-validator"; +import { IsInt } from "class-validator"; export class PreferencesDto { - @IsBoolean() - notifications: boolean; + @IsInt() + notifications: number; - @IsBoolean() - dark_mode: boolean; + @IsInt() + dark_mode: number; - @IsBoolean() - lang_switch: boolean; + @IsInt() + lang_switch: number; - @IsBoolean() - lefty_mode: boolean; + @IsInt() + lefty_mode: number; } \ No newline at end of file diff --git a/src/modules/preferences/preferences.module.ts b/src/modules/preferences/preferences.module.ts index 94161cb..4fe0227 100644 --- a/src/modules/preferences/preferences.module.ts +++ b/src/modules/preferences/preferences.module.ts @@ -1,11 +1,13 @@ import { Module } from "@nestjs/common"; import { PreferencesController } from "./controllers/preferences.controller"; import { PreferencesService } from "./services/preferences.service"; +import { SharedModule } from "../shared/shared.module"; @Module({ -controllers: [ PreferencesController ], -providers: [ PreferencesService ], -exports: [ PreferencesService ], + imports: [SharedModule], + controllers: [ PreferencesController ], + providers: [ PreferencesService ], + exports: [ PreferencesService ], }) export class PreferencesModule {} \ No newline at end of file diff --git a/src/modules/preferences/services/preferences.service.ts b/src/modules/preferences/services/preferences.service.ts index cafac84..89d6484 100644 --- a/src/modules/preferences/services/preferences.service.ts +++ b/src/modules/preferences/services/preferences.service.ts @@ -2,22 +2,17 @@ import { Injectable, NotFoundException } from "@nestjs/common"; import { Preferences } from "@prisma/client"; import { PrismaService } from "src/prisma/prisma.service"; import { PreferencesDto } from "../dtos/preferences.dto"; +import { EmailToIdResolver } from "src/modules/shared/utils/resolve-email-id.utils"; @Injectable() export class PreferencesService { - constructor(private readonly prisma: PrismaService){} - - async resolveUserIdWithEmail(email: string): Promise { - const user = await this.prisma.users.findFirst({ - where: { email }, - select: { id: true }, - }); - if(!user) throw new NotFoundException(`User with email ${ email } not found`); - return user.id; - } + constructor( + private readonly prisma: PrismaService, + private readonly emailResolver: EmailToIdResolver , + ){} async updatePreferences(email: string, dto: PreferencesDto ): Promise { - const user_id = await this.resolveUserIdWithEmail(email); + const user_id = await this.emailResolver.resolveUserIdWithEmail(email); return this.prisma.preferences.update({ where: { user_id }, data: { diff --git a/src/modules/schedule-presets/schedule-presets.module.ts b/src/modules/schedule-presets/schedule-presets.module.ts index 1973e1a..2e25a6d 100644 --- a/src/modules/schedule-presets/schedule-presets.module.ts +++ b/src/modules/schedule-presets/schedule-presets.module.ts @@ -2,21 +2,18 @@ import { Module } from "@nestjs/common"; import { SchedulePresetsCommandService } from "./services/schedule-presets-command.service"; import { SchedulePresetsQueryService } from "./services/schedule-presets-query.service"; import { SchedulePresetsController } from "./controller/schedule-presets.controller"; -import { EmployeeIdEmailResolver } from "../shared/utils/resolve-email-id.utils"; -import { BankCodesResolver } from "../shared/utils/resolve-bank-type-id.utils"; import { PrismaService } from "src/prisma/prisma.service"; import { SchedulePresetsApplyService } from "./services/schedule-presets-apply.service"; +import { SharedModule } from "../shared/shared.module"; @Module({ - imports: [], + imports: [SharedModule], controllers: [SchedulePresetsController], providers: [ PrismaService, SchedulePresetsCommandService, SchedulePresetsQueryService, SchedulePresetsApplyService, - EmployeeIdEmailResolver, - BankCodesResolver, ], exports:[ SchedulePresetsCommandService, diff --git a/src/modules/schedule-presets/services/schedule-presets-apply.service.ts b/src/modules/schedule-presets/services/schedule-presets-apply.service.ts index 99ef799..fa2bce1 100644 --- a/src/modules/schedule-presets/services/schedule-presets-apply.service.ts +++ b/src/modules/schedule-presets/services/schedule-presets-apply.service.ts @@ -1,5 +1,5 @@ import { BadRequestException, ConflictException, Injectable, NotFoundException } from "@nestjs/common"; -import { EmployeeIdEmailResolver } from "src/modules/shared/utils/resolve-email-id.utils"; +import { EmailToIdResolver } from "src/modules/shared/utils/resolve-email-id.utils"; import { PrismaService } from "src/prisma/prisma.service"; import { ApplyResult } from "../types/schedule-presets.types"; import { Prisma, Weekday } from "@prisma/client"; @@ -9,7 +9,7 @@ import { WEEKDAY } from "../mappers/schedule-presets.mappers"; export class SchedulePresetsApplyService { constructor( private readonly prisma: PrismaService, - private readonly emailResolver: EmployeeIdEmailResolver, + private readonly emailResolver: EmailToIdResolver, ) {} async applyToTimesheet( diff --git a/src/modules/schedule-presets/services/schedule-presets-command.service.ts b/src/modules/schedule-presets/services/schedule-presets-command.service.ts index b3c9e91..0c2a8bb 100644 --- a/src/modules/schedule-presets/services/schedule-presets-command.service.ts +++ b/src/modules/schedule-presets/services/schedule-presets-command.service.ts @@ -1,6 +1,6 @@ import { BadRequestException, ConflictException, Injectable, NotFoundException } from "@nestjs/common"; import { BankCodesResolver } from "src/modules/shared/utils/resolve-bank-type-id.utils"; -import { EmployeeIdEmailResolver } from "src/modules/shared/utils/resolve-email-id.utils"; +import { EmailToIdResolver } from "src/modules/shared/utils/resolve-email-id.utils"; import { UpsertAction } from "src/modules/shared/types/upsert-actions.types"; import { PrismaService } from "src/prisma/prisma.service"; import { SchedulePresetsDto } from "../dtos/create-schedule-presets.dto"; @@ -10,7 +10,7 @@ import { Prisma, Weekday } from "@prisma/client"; export class SchedulePresetsCommandService { constructor( private readonly prisma: PrismaService, - private readonly emailResolver: EmployeeIdEmailResolver, + private readonly emailResolver: EmailToIdResolver, private readonly typeResolver : BankCodesResolver, ){} diff --git a/src/modules/schedule-presets/services/schedule-presets-query.service.ts b/src/modules/schedule-presets/services/schedule-presets-query.service.ts index 665fe47..7ccb0f0 100644 --- a/src/modules/schedule-presets/services/schedule-presets-query.service.ts +++ b/src/modules/schedule-presets/services/schedule-presets-query.service.ts @@ -1,5 +1,5 @@ import { Injectable, NotFoundException } from "@nestjs/common"; -import { EmployeeIdEmailResolver } from "src/modules/shared/utils/resolve-email-id.utils"; +import { EmailToIdResolver } from "src/modules/shared/utils/resolve-email-id.utils"; import { PrismaService } from "src/prisma/prisma.service"; import { PresetResponse, ShiftResponse } from "../types/schedule-presets.types"; import { Prisma } from "@prisma/client"; @@ -8,7 +8,7 @@ import { Prisma } from "@prisma/client"; export class SchedulePresetsQueryService { constructor( private readonly prisma: PrismaService, - private readonly emailResolver: EmployeeIdEmailResolver, + private readonly emailResolver: EmailToIdResolver, ){} async findSchedulePresetsByEmail(email:string): Promise { diff --git a/src/modules/shared/shared.module.ts b/src/modules/shared/shared.module.ts index 4e71c92..adf0b68 100644 --- a/src/modules/shared/shared.module.ts +++ b/src/modules/shared/shared.module.ts @@ -1,5 +1,5 @@ import { Module } from "@nestjs/common"; -import { EmployeeIdEmailResolver } from "./utils/resolve-email-id.utils"; +import { EmailToIdResolver } from "./utils/resolve-email-id.utils"; import { EmployeeTimesheetResolver } from "./utils/resolve-employee-timesheet.utils"; import { FullNameResolver } from "./utils/resolve-full-name.utils"; import { BankCodesResolver } from "./utils/resolve-bank-type-id.utils"; @@ -9,13 +9,13 @@ import { PrismaModule } from "src/prisma/prisma.module"; imports: [PrismaModule], providers: [ FullNameResolver, - EmployeeIdEmailResolver, + EmailToIdResolver, BankCodesResolver, EmployeeTimesheetResolver, ], exports: [ FullNameResolver, - EmployeeIdEmailResolver, + EmailToIdResolver, BankCodesResolver, EmployeeTimesheetResolver, ], diff --git a/src/modules/shared/utils/resolve-email-id.utils.ts b/src/modules/shared/utils/resolve-email-id.utils.ts index c232fbe..543f377 100644 --- a/src/modules/shared/utils/resolve-email-id.utils.ts +++ b/src/modules/shared/utils/resolve-email-id.utils.ts @@ -5,7 +5,7 @@ import { PrismaService } from "src/prisma/prisma.service"; type Tx = Prisma.TransactionClient | PrismaClient; @Injectable() -export class EmployeeIdEmailResolver { +export class EmailToIdResolver { constructor(private readonly prisma: PrismaService) {} @@ -20,4 +20,16 @@ export class EmployeeIdEmailResolver { if(!employee)throw new NotFoundException(`Employee with email: ${email} not found`); return employee.id; } + + // find user_id using email + readonly resolveUserIdWithEmail = async (email: string, client?: Tx + ): Promise => { + const db = client ?? this.prisma; + const user = await db.users.findFirst({ + where: { email }, + select: { id: true }, + }); + if(!user) throw new NotFoundException(`User with email ${ email } not found`); + return user.id; + } } \ No newline at end of file diff --git a/src/modules/shifts/services/shifts-command.service.ts b/src/modules/shifts/services/shifts-command.service.ts index ddbff29..85e79a1 100644 --- a/src/modules/shifts/services/shifts-command.service.ts +++ b/src/modules/shifts/services/shifts-command.service.ts @@ -1,7 +1,7 @@ import { BadRequestException, ConflictException, Injectable, Logger, NotFoundException, UnprocessableEntityException } from "@nestjs/common"; import { normalizeShiftPayload, overlaps } from "../utils/shifts.utils"; import { DayShiftResponse, UpsertAction } from "../types-and-interfaces/shifts-upsert.types"; -import { EmployeeIdEmailResolver } from "src/modules/shared/utils/resolve-email-id.utils"; +import { EmailToIdResolver } from "src/modules/shared/utils/resolve-email-id.utils"; import { BankCodesResolver } from "src/modules/shared/utils/resolve-bank-type-id.utils"; import { Prisma, Shifts } from "@prisma/client"; import { UpsertShiftDto } from "../dtos/upsert-shift.dto"; @@ -16,7 +16,7 @@ export class ShiftsCommandService extends BaseApprovalService { constructor( prisma: PrismaService, - private readonly emailResolver: EmployeeIdEmailResolver, + private readonly emailResolver: EmailToIdResolver, private readonly bankTypeResolver: BankCodesResolver, private readonly overtimeService: OvertimeService, ) { super(prisma); } diff --git a/src/modules/shifts/shifts.module.ts b/src/modules/shifts/shifts.module.ts index 2e507e2..8d1346c 100644 --- a/src/modules/shifts/shifts.module.ts +++ b/src/modules/shifts/shifts.module.ts @@ -5,24 +5,24 @@ import { ShiftsCommandService } from './services/shifts-command.service'; import { NotificationsModule } from '../notifications/notifications.module'; import { ShiftsQueryService } from './services/shifts-query.service'; import { ShiftsArchivalService } from './services/shifts-archival.service'; -import { BankCodesResolver } from '../shared/utils/resolve-bank-type-id.utils'; -import { EmployeeIdEmailResolver } from '../shared/utils/resolve-email-id.utils'; +import { SharedModule } from '../shared/shared.module'; @Module({ - imports: [BusinessLogicsModule, NotificationsModule], - controllers: [ShiftsController], - providers: [ - ShiftsQueryService, - ShiftsCommandService, - ShiftsArchivalService, - BankCodesResolver, - EmployeeIdEmailResolver], - exports: [ - ShiftsQueryService, - ShiftsCommandService, - ShiftsArchivalService, - BankCodesResolver, - EmployeeIdEmailResolver - ], + imports: [ + BusinessLogicsModule, + NotificationsModule, + SharedModule + ], + controllers: [ShiftsController], + providers: [ + ShiftsQueryService, + ShiftsCommandService, + ShiftsArchivalService, + ], + exports: [ + ShiftsQueryService, + ShiftsCommandService, + ShiftsArchivalService, + ], }) export class ShiftsModule {} diff --git a/src/modules/timesheets/services/timesheets-command.service.ts b/src/modules/timesheets/services/timesheets-command.service.ts index 59652e5..b6de4cb 100644 --- a/src/modules/timesheets/services/timesheets-command.service.ts +++ b/src/modules/timesheets/services/timesheets-command.service.ts @@ -7,7 +7,7 @@ import { CreateTimesheetDto } from "../dtos/create-timesheet.dto"; import { getWeekEnd, getWeekStart } from "src/common/utils/date-utils"; import { parseISODate, parseHHmm } from "../utils/timesheet.helpers"; import { TimesheetDto } from "../dtos/timesheet-period.dto"; -import { EmployeeIdEmailResolver } from "src/modules/shared/utils/resolve-email-id.utils"; +import { EmailToIdResolver } from "src/modules/shared/utils/resolve-email-id.utils"; import { EmployeeTimesheetResolver } from "src/modules/shared/utils/resolve-employee-timesheet.utils"; import { BankCodesResolver } from "src/modules/shared/utils/resolve-bank-type-id.utils"; @@ -16,7 +16,7 @@ export class TimesheetsCommandService extends BaseApprovalService{ constructor( prisma: PrismaService, private readonly query: TimesheetsQueryService, - private readonly emailResolver: EmployeeIdEmailResolver, + private readonly emailResolver: EmailToIdResolver, private readonly timesheetResolver: EmployeeTimesheetResolver, private readonly bankTypeResolver: BankCodesResolver, ) {super(prisma);} diff --git a/src/modules/timesheets/services/timesheets-query.service.ts b/src/modules/timesheets/services/timesheets-query.service.ts index c14387f..1092c3b 100644 --- a/src/modules/timesheets/services/timesheets-query.service.ts +++ b/src/modules/timesheets/services/timesheets-query.service.ts @@ -5,7 +5,7 @@ import { PrismaService } from 'src/prisma/prisma.service'; import { TimesheetDto, TimesheetPeriodDto } from '../dtos/timesheet-period.dto'; import { ShiftRow, ExpenseRow } from '../types/timesheet.types'; import { buildPeriod } from '../utils/timesheet.utils'; -import { EmployeeIdEmailResolver } from 'src/modules/shared/utils/resolve-email-id.utils'; +import { EmailToIdResolver } from 'src/modules/shared/utils/resolve-email-id.utils'; import { FullNameResolver } from 'src/modules/shared/utils/resolve-full-name.utils'; @@ -13,7 +13,7 @@ import { FullNameResolver } from 'src/modules/shared/utils/resolve-full-name.uti export class TimesheetsQueryService { constructor( private readonly prisma: PrismaService, - private readonly emailResolver: EmployeeIdEmailResolver, + private readonly emailResolver: EmailToIdResolver, private readonly fullNameResolver: FullNameResolver ) {} diff --git a/src/modules/timesheets/timesheets.module.ts b/src/modules/timesheets/timesheets.module.ts index c7636ba..7824aa4 100644 --- a/src/modules/timesheets/timesheets.module.ts +++ b/src/modules/timesheets/timesheets.module.ts @@ -9,20 +9,22 @@ import { SharedModule } from '../shared/shared.module'; import { Module } from '@nestjs/common'; @Module({ - imports: [BusinessLogicsModule, SharedModule], - controllers: [TimesheetsController], - providers: [ - TimesheetsQueryService, - TimesheetsCommandService, - ShiftsCommandService, - ExpensesCommandService, - TimesheetArchiveService, - - ], - exports: [ - TimesheetsQueryService, - TimesheetArchiveService, - TimesheetsCommandService - ], + imports: [ + BusinessLogicsModule, + SharedModule + ], + controllers: [TimesheetsController], + providers: [ + TimesheetsQueryService, + TimesheetsCommandService, + ShiftsCommandService, + ExpensesCommandService, + TimesheetArchiveService, + ], + exports: [ + TimesheetsQueryService, + TimesheetArchiveService, + TimesheetsCommandService + ], }) export class TimesheetsModule {}