refactor(preferences & modules): changed type from boolean to Int so each preferences can have more than 2 options.

Also cleaned-up module imports/providers
This commit is contained in:
Matthieu Haineault 2025-10-10 09:27:57 -04:00
parent 6a4fbeb2c4
commit 9efdafb20f
31 changed files with 201 additions and 138 deletions

View File

@ -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}": { "/schedule-presets/{email}": {
"put": { "put": {
"operationId": "SchedulePresetsController_upsert", "operationId": "SchedulePresetsController_upsert",
@ -1666,6 +1699,10 @@
"employees_overview" "employees_overview"
] ]
}, },
"PreferencesDto": {
"type": "object",
"properties": {}
},
"SchedulePresetsDto": { "SchedulePresetsDto": {
"type": "object", "type": "object",
"properties": {} "properties": {}

64
package-lock.json generated
View File

@ -51,7 +51,7 @@
"globals": "^16.0.0", "globals": "^16.0.0",
"jest": "^29.7.0", "jest": "^29.7.0",
"prettier": "^3.4.2", "prettier": "^3.4.2",
"prisma": "^6.16.3", "prisma": "^6.17.0",
"source-map-support": "^0.5.21", "source-map-support": "^0.5.21",
"supertest": "^7.0.0", "supertest": "^7.0.0",
"ts-jest": "^29.2.5", "ts-jest": "^29.2.5",
@ -3148,9 +3148,9 @@
} }
}, },
"node_modules/@prisma/config": { "node_modules/@prisma/config": {
"version": "6.16.3", "version": "6.17.0",
"resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.16.3.tgz", "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.17.0.tgz",
"integrity": "sha512-VlsLnG4oOuKGGMToEeVaRhoTBZu5H3q51jTQXb/diRags3WV0+BQK5MolJTtP6G7COlzoXmWeS11rNBtvg+qFQ==", "integrity": "sha512-k8tuChKpkO/Vj7ZEzaQMNflNGbaW4X0r8+PC+W2JaqVRdiS2+ORSv1SrDwNxsb8YyzIQJucXqLGZbgxD97ZhsQ==",
"devOptional": true, "devOptional": true,
"dependencies": { "dependencies": {
"c12": "3.1.0", "c12": "3.1.0",
@ -3160,48 +3160,48 @@
} }
}, },
"node_modules/@prisma/debug": { "node_modules/@prisma/debug": {
"version": "6.16.3", "version": "6.17.0",
"resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.16.3.tgz", "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.17.0.tgz",
"integrity": "sha512-89DdqWtdKd7qoc9/qJCKLTazj3W3zPEiz0hc7HfZdpjzm21c7orOUB5oHWJsG+4KbV4cWU5pefq3CuDVYF9vgA==", "integrity": "sha512-eE2CB32nr1hRqyLVnOAVY6c//iSJ/PN+Yfoa/2sEzLGpORaCg61d+nvdAkYSh+6Y2B8L4BVyzkRMANLD6nnC2g==",
"devOptional": true "devOptional": true
}, },
"node_modules/@prisma/engines": { "node_modules/@prisma/engines": {
"version": "6.16.3", "version": "6.17.0",
"resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.16.3.tgz", "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.17.0.tgz",
"integrity": "sha512-b+Rl4nzQDcoqe6RIpSHv8f5lLnwdDGvXhHjGDiokObguAAv/O1KaX1Oc69mBW/GFWKQpCkOraobLjU6s1h8HGg==", "integrity": "sha512-XhE9v3hDQTNgCYMjogcCYKi7HCEkZf9WwTGuXy8cmY8JUijvU0ap4M7pGLx4pBblkp5EwUsYzw1YLtH7yi0GZw==",
"devOptional": true, "devOptional": true,
"hasInstallScript": true, "hasInstallScript": true,
"dependencies": { "dependencies": {
"@prisma/debug": "6.16.3", "@prisma/debug": "6.17.0",
"@prisma/engines-version": "6.16.1-1.bb420e667c1820a8c05a38023385f6cc7ef8e83a", "@prisma/engines-version": "6.17.0-16.c0aafc03b8ef6cdced8654b9a817999e02457d6a",
"@prisma/fetch-engine": "6.16.3", "@prisma/fetch-engine": "6.17.0",
"@prisma/get-platform": "6.16.3" "@prisma/get-platform": "6.17.0"
} }
}, },
"node_modules/@prisma/engines-version": { "node_modules/@prisma/engines-version": {
"version": "6.16.1-1.bb420e667c1820a8c05a38023385f6cc7ef8e83a", "version": "6.17.0-16.c0aafc03b8ef6cdced8654b9a817999e02457d6a",
"resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.16.1-1.bb420e667c1820a8c05a38023385f6cc7ef8e83a.tgz", "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.17.0-16.c0aafc03b8ef6cdced8654b9a817999e02457d6a.tgz",
"integrity": "sha512-fftRmosBex48Ph1v2ll1FrPpirwtPZpNkE5CDCY1Lw2SD2ctyrLlVlHiuxDAAlALwWBOkPbAll4+EaqdGuMhJw==", "integrity": "sha512-G0VU4uFDreATgTz4sh3dTtU2C+jn+J6c060ixavWZaUaSRZsNQhSPW26lbfez7GHzR02RGCdqs5UcSuGBC3yLw==",
"devOptional": true "devOptional": true
}, },
"node_modules/@prisma/fetch-engine": { "node_modules/@prisma/fetch-engine": {
"version": "6.16.3", "version": "6.17.0",
"resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.16.3.tgz", "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.17.0.tgz",
"integrity": "sha512-bUoRIkVaI+CCaVGrSfcKev0/Mk4ateubqWqGZvQ9uCqFv2ENwWIR3OeNuGin96nZn5+SkebcD7RGgKr/+mJelw==", "integrity": "sha512-YSl5R3WIAPrmshYPkaaszOsBIWRAovOCHn3y7gkTNGG51LjYW4pi6PFNkGouW6CA06qeTjTbGrDRCgFjnmVWDg==",
"devOptional": true, "devOptional": true,
"dependencies": { "dependencies": {
"@prisma/debug": "6.16.3", "@prisma/debug": "6.17.0",
"@prisma/engines-version": "6.16.1-1.bb420e667c1820a8c05a38023385f6cc7ef8e83a", "@prisma/engines-version": "6.17.0-16.c0aafc03b8ef6cdced8654b9a817999e02457d6a",
"@prisma/get-platform": "6.16.3" "@prisma/get-platform": "6.17.0"
} }
}, },
"node_modules/@prisma/get-platform": { "node_modules/@prisma/get-platform": {
"version": "6.16.3", "version": "6.17.0",
"resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.16.3.tgz", "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.17.0.tgz",
"integrity": "sha512-X1LxiFXinJ4iQehrodGp0f66Dv6cDL0GbRlcCoLtSu6f4Wi+hgo7eND/afIs5029GQLgNWKZ46vn8hjyXTsHLA==", "integrity": "sha512-3tEKChrnlmLXPd870oiVfRvj7vVKuxqP349hYaMDsbV4TZd3+lFqw8KTI2Tbq5DopamfNuNqhVCj+R6ZxKKYGQ==",
"devOptional": true, "devOptional": true,
"dependencies": { "dependencies": {
"@prisma/debug": "6.16.3" "@prisma/debug": "6.17.0"
} }
}, },
"node_modules/@scarf/scarf": { "node_modules/@scarf/scarf": {
@ -10049,14 +10049,14 @@
} }
}, },
"node_modules/prisma": { "node_modules/prisma": {
"version": "6.16.3", "version": "6.17.0",
"resolved": "https://registry.npmjs.org/prisma/-/prisma-6.16.3.tgz", "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.17.0.tgz",
"integrity": "sha512-4tJq3KB9WRshH5+QmzOLV54YMkNlKOtLKaSdvraI5kC/axF47HuOw6zDM8xrxJ6s9o2WodY654On4XKkrobQdQ==", "integrity": "sha512-rcvldz98r+2bVCs0MldQCBaaVJRCj9Ew4IqphLATF89OJcSzwRQpwnKXR+W2+2VjK7/o2x3ffu5+2N3Muu6Dbw==",
"devOptional": true, "devOptional": true,
"hasInstallScript": true, "hasInstallScript": true,
"dependencies": { "dependencies": {
"@prisma/config": "6.16.3", "@prisma/config": "6.17.0",
"@prisma/engines": "6.16.3" "@prisma/engines": "6.17.0"
}, },
"bin": { "bin": {
"prisma": "build/index.js" "prisma": "build/index.js"

View File

@ -82,7 +82,7 @@
"globals": "^16.0.0", "globals": "^16.0.0",
"jest": "^29.7.0", "jest": "^29.7.0",
"prettier": "^3.4.2", "prettier": "^3.4.2",
"prisma": "^6.16.3", "prisma": "^6.17.0",
"source-map-support": "^0.5.21", "source-map-support": "^0.5.21",
"supertest": "^7.0.0", "supertest": "^7.0.0",
"ts-jest": "^29.2.5", "ts-jest": "^29.2.5",

View File

@ -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;

View File

@ -376,11 +376,11 @@ model Preferences {
user Users @relation("UserPreferences", fields: [user_id], references: [id]) user Users @relation("UserPreferences", fields: [user_id], references: [id])
user_id String @unique @db.Uuid user_id String @unique @db.Uuid
notifications Boolean @default(false) notifications Int @default(0)
dark_mode Boolean @default(false) dark_mode Int @default(0)
lang_switch Boolean @default(false) lang_switch Int @default(0)
lefty_mode Boolean @default(false) lefty_mode Int @default(0)
// TODO: change BOOLEAN to use 0 or 1 in case there is more than 2 options for each preferences
@@map("preferences") @@map("preferences")
} }

View File

@ -16,6 +16,7 @@ import { NotificationsModule } from './modules/notifications/notifications.modul
import { OauthSessionsModule } from './modules/oauth-sessions/oauth-sessions.module'; import { OauthSessionsModule } from './modules/oauth-sessions/oauth-sessions.module';
import { OvertimeService } from './modules/business-logics/services/overtime.service'; import { OvertimeService } from './modules/business-logics/services/overtime.service';
import { PayperiodsModule } from './modules/pay-periods/pay-periods.module'; import { PayperiodsModule } from './modules/pay-periods/pay-periods.module';
import { PreferencesModule } from './modules/preferences/preferences.module';
import { PrismaModule } from './prisma/prisma.module'; import { PrismaModule } from './prisma/prisma.module';
import { ScheduleModule } from '@nestjs/schedule'; import { ScheduleModule } from '@nestjs/schedule';
import { ShiftsModule } from './modules/shifts/shifts.module'; import { ShiftsModule } from './modules/shifts/shifts.module';
@ -43,6 +44,7 @@ import { SchedulePresetsModule } from './modules/schedule-presets/schedule-prese
NotificationsModule, NotificationsModule,
OauthSessionsModule, OauthSessionsModule,
PayperiodsModule, PayperiodsModule,
PreferencesModule,
PrismaModule, PrismaModule,
ScheduleModule.forRoot(), //cronjobs ScheduleModule.forRoot(), //cronjobs
SchedulePresetsModule, SchedulePresetsModule,

View File

@ -2,9 +2,10 @@ import { Module } from '@nestjs/common';
import { EmployeesController } from './controllers/employees.controller'; import { EmployeesController } from './controllers/employees.controller';
import { EmployeesService } from './services/employees.service'; import { EmployeesService } from './services/employees.service';
import { EmployeesArchivalService } from './services/employees-archival.service'; import { EmployeesArchivalService } from './services/employees-archival.service';
import { SharedModule } from '../shared/shared.module';
@Module({ @Module({
controllers: [EmployeesController], controllers: [EmployeesController, SharedModule],
providers: [EmployeesService, EmployeesArchivalService], providers: [EmployeesService, EmployeesArchivalService],
exports: [EmployeesService, EmployeesArchivalService], exports: [EmployeesService, EmployeesArchivalService],
}) })

View File

@ -4,7 +4,7 @@ import { PrismaService } from "src/prisma/prisma.service";
import { UpsertExpenseDto } from "../dtos/upsert-expense.dto"; import { UpsertExpenseDto } from "../dtos/upsert-expense.dto";
import { BankCodesResolver } from "src/modules/shared/utils/resolve-bank-type-id.utils"; import { BankCodesResolver } from "src/modules/shared/utils/resolve-bank-type-id.utils";
import { ExpenseResponse, UpsertAction } from "../types and interfaces/expenses.types.interfaces"; 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 { EmployeeTimesheetResolver } from "src/modules/shared/utils/resolve-employee-timesheet.utils";
import { import {
BadRequestException, BadRequestException,
@ -27,7 +27,7 @@ export class ExpensesCommandService extends BaseApprovalService<Expenses> {
prisma: PrismaService, prisma: PrismaService,
private readonly bankCodesResolver: BankCodesResolver, private readonly bankCodesResolver: BankCodesResolver,
private readonly timesheetsResolver: EmployeeTimesheetResolver, private readonly timesheetsResolver: EmployeeTimesheetResolver,
private readonly emailResolver: EmployeeIdEmailResolver, private readonly emailResolver: EmailToIdResolver,
) { super(prisma); } ) { super(prisma); }
//_____________________________________________________________________________________________ //_____________________________________________________________________________________________

View File

@ -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 { DayExpensesDto as ExpenseListResponseDto, ExpenseDto } from "src/modules/timesheets/dtos/timesheet-period.dto";
import { round2, toUTCDateOnly } from "src/modules/timesheets/utils/timesheet.helpers"; import { round2, toUTCDateOnly } from "src/modules/timesheets/utils/timesheet.helpers";
import { EXPENSE_TYPES } from "src/modules/timesheets/types/timesheet.types"; 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() @Injectable()
export class ExpensesQueryService { export class ExpensesQueryService {
constructor( constructor(
private readonly prisma: PrismaService, private readonly prisma: PrismaService,
private readonly employeeRepo: EmployeeIdEmailResolver, private readonly employeeRepo: EmailToIdResolver,
) {} ) {}

View File

@ -1,9 +1,10 @@
import { Module } from "@nestjs/common"; import { Module } from "@nestjs/common";
import { CsvExportController } from "./controllers/csv-exports.controller"; import { CsvExportController } from "./controllers/csv-exports.controller";
import { CsvExportService } from "./services/csv-exports.service"; import { CsvExportService } from "./services/csv-exports.service";
import { SharedModule } from "../shared/shared.module";
@Module({ @Module({
providers:[CsvExportService], providers:[CsvExportService, SharedModule],
controllers: [CsvExportController], controllers: [CsvExportController],
}) })
export class CsvExportModule {} export class CsvExportModule {}

View File

@ -8,9 +8,10 @@ import { SickLeaveRequestsService } from "./services/sick-leave-requests.service
import { LeaveRequestsService } from "./services/leave-request.service"; import { LeaveRequestsService } from "./services/leave-request.service";
import { ShiftsModule } from "../shifts/shifts.module"; import { ShiftsModule } from "../shifts/shifts.module";
import { LeaveRequestsUtils } from "./utils/leave-request.util"; import { LeaveRequestsUtils } from "./utils/leave-request.util";
import { SharedModule } from "../shared/shared.module";
@Module({ @Module({
imports: [BusinessLogicsModule, ShiftsModule], imports: [BusinessLogicsModule, ShiftsModule, SharedModule],
controllers: [LeaveRequestController], controllers: [LeaveRequestController],
providers: [ providers: [
VacationLeaveRequestsService, VacationLeaveRequestsService,

View File

@ -9,7 +9,7 @@ import { leaveRequestsSelect } from '../utils/leave-requests.select';
import { LeaveRequestsUtils} from '../utils/leave-request.util'; import { LeaveRequestsUtils} from '../utils/leave-request.util';
import { normalizeDates, toDateOnly } from 'src/modules/shared/helpers/date-time.helpers'; import { normalizeDates, toDateOnly } from 'src/modules/shared/helpers/date-time.helpers';
import { BankCodesResolver } from 'src/modules/shared/utils/resolve-bank-type-id.utils'; 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() @Injectable()
@ -18,7 +18,7 @@ export class HolidayLeaveRequestsService {
private readonly prisma: PrismaService, private readonly prisma: PrismaService,
private readonly holidayService: HolidayService, private readonly holidayService: HolidayService,
private readonly leaveUtils: LeaveRequestsUtils, private readonly leaveUtils: LeaveRequestsUtils,
private readonly emailResolver: EmployeeIdEmailResolver, private readonly emailResolver: EmailToIdResolver,
private readonly typeResolver: BankCodesResolver, private readonly typeResolver: BankCodesResolver,
) {} ) {}

View File

@ -14,7 +14,7 @@ import { VacationService } from "src/modules/business-logics/services/vacation.s
import { PrismaService } from "src/prisma/prisma.service"; import { PrismaService } from "src/prisma/prisma.service";
import { LeaveRequestsUtils } from "../utils/leave-request.util"; import { LeaveRequestsUtils } from "../utils/leave-request.util";
import { normalizeDates, toDateOnly, toISODateKey } from "src/modules/shared/helpers/date-time.helpers"; 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"; import { BankCodesResolver } from "src/modules/shared/utils/resolve-bank-type-id.utils";
@Injectable() @Injectable()
@ -28,7 +28,7 @@ export class LeaveRequestsService {
private readonly vacationLeaveService: VacationLeaveRequestsService, private readonly vacationLeaveService: VacationLeaveRequestsService,
private readonly vacationLogic: VacationService, private readonly vacationLogic: VacationService,
private readonly leaveUtils: LeaveRequestsUtils, private readonly leaveUtils: LeaveRequestsUtils,
private readonly emailResolver: EmployeeIdEmailResolver, private readonly emailResolver: EmailToIdResolver,
private readonly typeResolver: BankCodesResolver, private readonly typeResolver: BankCodesResolver,
) {} ) {}

View File

@ -9,7 +9,7 @@ import { SickLeaveService } from "src/modules/business-logics/services/sick-le
import { roundToQuarterHour } from "src/common/utils/date-utils"; import { roundToQuarterHour } from "src/common/utils/date-utils";
import { LeaveRequestsUtils } from "../utils/leave-request.util"; import { LeaveRequestsUtils } from "../utils/leave-request.util";
import { normalizeDates, toDateOnly } from "src/modules/shared/helpers/date-time.helpers"; 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"; import { BankCodesResolver } from "src/modules/shared/utils/resolve-bank-type-id.utils";
@Injectable() @Injectable()
@ -18,7 +18,7 @@ export class SickLeaveRequestsService {
private readonly prisma: PrismaService, private readonly prisma: PrismaService,
private readonly sickService: SickLeaveService, private readonly sickService: SickLeaveService,
private readonly leaveUtils: LeaveRequestsUtils, private readonly leaveUtils: LeaveRequestsUtils,
private readonly emailResolver: EmployeeIdEmailResolver, private readonly emailResolver: EmailToIdResolver,
private readonly typeResolver: BankCodesResolver, private readonly typeResolver: BankCodesResolver,
) {} ) {}

View File

@ -10,7 +10,7 @@ import { leaveRequestsSelect } from "../utils/leave-requests.select";
import { roundToQuarterHour } from "src/common/utils/date-utils"; import { roundToQuarterHour } from "src/common/utils/date-utils";
import { LeaveRequestsUtils } from "../utils/leave-request.util"; import { LeaveRequestsUtils } from "../utils/leave-request.util";
import { normalizeDates, toDateOnly } from "src/modules/shared/helpers/date-time.helpers"; 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"; import { BankCodesResolver } from "src/modules/shared/utils/resolve-bank-type-id.utils";
@Injectable() @Injectable()
@ -19,7 +19,7 @@ export class VacationLeaveRequestsService {
private readonly prisma: PrismaService, private readonly prisma: PrismaService,
private readonly vacationService: VacationService, private readonly vacationService: VacationService,
private readonly leaveUtils: LeaveRequestsUtils, private readonly leaveUtils: LeaveRequestsUtils,
private readonly emailResolver: EmployeeIdEmailResolver, private readonly emailResolver: EmailToIdResolver,
private readonly typeResolver: BankCodesResolver, private readonly typeResolver: BankCodesResolver,
) {} ) {}

View File

@ -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 { 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 { ShiftsCommandService } from "src/modules/shifts/services/shifts-command.service";
import { PrismaService } from "src/prisma/prisma.service"; import { PrismaService } from "src/prisma/prisma.service";
import { LeaveTypes } from "@prisma/client";
@Injectable() @Injectable()
export class LeaveRequestsUtils { export class LeaveRequestsUtils {

View File

@ -8,23 +8,18 @@ import { TimesheetsCommandService } from "../timesheets/services/timesheets-comm
import { ExpensesCommandService } from "../expenses/services/expenses-command.service"; import { ExpensesCommandService } from "../expenses/services/expenses-command.service";
import { ShiftsCommandService } from "../shifts/services/shifts-command.service"; import { ShiftsCommandService } from "../shifts/services/shifts-command.service";
import { SharedModule } from "../shared/shared.module"; 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 { PrismaService } from "src/prisma/prisma.service";
import { OvertimeService } from "../business-logics/services/overtime.service"; import { BusinessLogicsModule } from "../business-logics/business-logics.module";
@Module({ @Module({
imports: [PrismaModule, TimesheetsModule, SharedModule], imports: [PrismaModule, TimesheetsModule, SharedModule, BusinessLogicsModule],
providers: [ providers: [
PayPeriodsQueryService, PayPeriodsQueryService,
PayPeriodsCommandService, PayPeriodsCommandService,
TimesheetsCommandService, TimesheetsCommandService,
ExpensesCommandService, ExpensesCommandService,
ShiftsCommandService, ShiftsCommandService,
EmployeeIdEmailResolver,
BankCodesResolver,
PrismaService, PrismaService,
OvertimeService,
], ],
controllers: [PayPeriodsController], controllers: [PayPeriodsController],
exports: [ exports: [

View File

@ -1,16 +1,16 @@
import { IsBoolean, IsEmail, IsString } from "class-validator"; import { IsInt } from "class-validator";
export class PreferencesDto { export class PreferencesDto {
@IsBoolean() @IsInt()
notifications: boolean; notifications: number;
@IsBoolean() @IsInt()
dark_mode: boolean; dark_mode: number;
@IsBoolean() @IsInt()
lang_switch: boolean; lang_switch: number;
@IsBoolean() @IsInt()
lefty_mode: boolean; lefty_mode: number;
} }

View File

@ -1,11 +1,13 @@
import { Module } from "@nestjs/common"; import { Module } from "@nestjs/common";
import { PreferencesController } from "./controllers/preferences.controller"; import { PreferencesController } from "./controllers/preferences.controller";
import { PreferencesService } from "./services/preferences.service"; import { PreferencesService } from "./services/preferences.service";
import { SharedModule } from "../shared/shared.module";
@Module({ @Module({
controllers: [ PreferencesController ], imports: [SharedModule],
providers: [ PreferencesService ], controllers: [ PreferencesController ],
exports: [ PreferencesService ], providers: [ PreferencesService ],
exports: [ PreferencesService ],
}) })
export class PreferencesModule {} export class PreferencesModule {}

View File

@ -2,22 +2,17 @@ import { Injectable, NotFoundException } from "@nestjs/common";
import { Preferences } from "@prisma/client"; import { Preferences } from "@prisma/client";
import { PrismaService } from "src/prisma/prisma.service"; import { PrismaService } from "src/prisma/prisma.service";
import { PreferencesDto } from "../dtos/preferences.dto"; import { PreferencesDto } from "../dtos/preferences.dto";
import { EmailToIdResolver } from "src/modules/shared/utils/resolve-email-id.utils";
@Injectable() @Injectable()
export class PreferencesService { export class PreferencesService {
constructor(private readonly prisma: PrismaService){} constructor(
private readonly prisma: PrismaService,
async resolveUserIdWithEmail(email: string): Promise<string> { private readonly emailResolver: EmailToIdResolver ,
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;
}
async updatePreferences(email: string, dto: PreferencesDto ): Promise<Preferences> { async updatePreferences(email: string, dto: PreferencesDto ): Promise<Preferences> {
const user_id = await this.resolveUserIdWithEmail(email); const user_id = await this.emailResolver.resolveUserIdWithEmail(email);
return this.prisma.preferences.update({ return this.prisma.preferences.update({
where: { user_id }, where: { user_id },
data: { data: {

View File

@ -2,21 +2,18 @@ import { Module } from "@nestjs/common";
import { SchedulePresetsCommandService } from "./services/schedule-presets-command.service"; import { SchedulePresetsCommandService } from "./services/schedule-presets-command.service";
import { SchedulePresetsQueryService } from "./services/schedule-presets-query.service"; import { SchedulePresetsQueryService } from "./services/schedule-presets-query.service";
import { SchedulePresetsController } from "./controller/schedule-presets.controller"; 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 { PrismaService } from "src/prisma/prisma.service";
import { SchedulePresetsApplyService } from "./services/schedule-presets-apply.service"; import { SchedulePresetsApplyService } from "./services/schedule-presets-apply.service";
import { SharedModule } from "../shared/shared.module";
@Module({ @Module({
imports: [], imports: [SharedModule],
controllers: [SchedulePresetsController], controllers: [SchedulePresetsController],
providers: [ providers: [
PrismaService, PrismaService,
SchedulePresetsCommandService, SchedulePresetsCommandService,
SchedulePresetsQueryService, SchedulePresetsQueryService,
SchedulePresetsApplyService, SchedulePresetsApplyService,
EmployeeIdEmailResolver,
BankCodesResolver,
], ],
exports:[ exports:[
SchedulePresetsCommandService, SchedulePresetsCommandService,

View File

@ -1,5 +1,5 @@
import { BadRequestException, ConflictException, Injectable, NotFoundException } from "@nestjs/common"; 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 { PrismaService } from "src/prisma/prisma.service";
import { ApplyResult } from "../types/schedule-presets.types"; import { ApplyResult } from "../types/schedule-presets.types";
import { Prisma, Weekday } from "@prisma/client"; import { Prisma, Weekday } from "@prisma/client";
@ -9,7 +9,7 @@ import { WEEKDAY } from "../mappers/schedule-presets.mappers";
export class SchedulePresetsApplyService { export class SchedulePresetsApplyService {
constructor( constructor(
private readonly prisma: PrismaService, private readonly prisma: PrismaService,
private readonly emailResolver: EmployeeIdEmailResolver, private readonly emailResolver: EmailToIdResolver,
) {} ) {}
async applyToTimesheet( async applyToTimesheet(

View File

@ -1,6 +1,6 @@
import { BadRequestException, ConflictException, Injectable, NotFoundException } from "@nestjs/common"; import { BadRequestException, ConflictException, Injectable, NotFoundException } from "@nestjs/common";
import { BankCodesResolver } from "src/modules/shared/utils/resolve-bank-type-id.utils"; 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 { UpsertAction } from "src/modules/shared/types/upsert-actions.types";
import { PrismaService } from "src/prisma/prisma.service"; import { PrismaService } from "src/prisma/prisma.service";
import { SchedulePresetsDto } from "../dtos/create-schedule-presets.dto"; import { SchedulePresetsDto } from "../dtos/create-schedule-presets.dto";
@ -10,7 +10,7 @@ import { Prisma, Weekday } from "@prisma/client";
export class SchedulePresetsCommandService { export class SchedulePresetsCommandService {
constructor( constructor(
private readonly prisma: PrismaService, private readonly prisma: PrismaService,
private readonly emailResolver: EmployeeIdEmailResolver, private readonly emailResolver: EmailToIdResolver,
private readonly typeResolver : BankCodesResolver, private readonly typeResolver : BankCodesResolver,
){} ){}

View File

@ -1,5 +1,5 @@
import { Injectable, NotFoundException } from "@nestjs/common"; 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 { PrismaService } from "src/prisma/prisma.service";
import { PresetResponse, ShiftResponse } from "../types/schedule-presets.types"; import { PresetResponse, ShiftResponse } from "../types/schedule-presets.types";
import { Prisma } from "@prisma/client"; import { Prisma } from "@prisma/client";
@ -8,7 +8,7 @@ import { Prisma } from "@prisma/client";
export class SchedulePresetsQueryService { export class SchedulePresetsQueryService {
constructor( constructor(
private readonly prisma: PrismaService, private readonly prisma: PrismaService,
private readonly emailResolver: EmployeeIdEmailResolver, private readonly emailResolver: EmailToIdResolver,
){} ){}
async findSchedulePresetsByEmail(email:string): Promise<PresetResponse[]> { async findSchedulePresetsByEmail(email:string): Promise<PresetResponse[]> {

View File

@ -1,5 +1,5 @@
import { Module } from "@nestjs/common"; 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 { EmployeeTimesheetResolver } from "./utils/resolve-employee-timesheet.utils";
import { FullNameResolver } from "./utils/resolve-full-name.utils"; import { FullNameResolver } from "./utils/resolve-full-name.utils";
import { BankCodesResolver } from "./utils/resolve-bank-type-id.utils"; import { BankCodesResolver } from "./utils/resolve-bank-type-id.utils";
@ -9,13 +9,13 @@ import { PrismaModule } from "src/prisma/prisma.module";
imports: [PrismaModule], imports: [PrismaModule],
providers: [ providers: [
FullNameResolver, FullNameResolver,
EmployeeIdEmailResolver, EmailToIdResolver,
BankCodesResolver, BankCodesResolver,
EmployeeTimesheetResolver, EmployeeTimesheetResolver,
], ],
exports: [ exports: [
FullNameResolver, FullNameResolver,
EmployeeIdEmailResolver, EmailToIdResolver,
BankCodesResolver, BankCodesResolver,
EmployeeTimesheetResolver, EmployeeTimesheetResolver,
], ],

View File

@ -5,7 +5,7 @@ import { PrismaService } from "src/prisma/prisma.service";
type Tx = Prisma.TransactionClient | PrismaClient; type Tx = Prisma.TransactionClient | PrismaClient;
@Injectable() @Injectable()
export class EmployeeIdEmailResolver { export class EmailToIdResolver {
constructor(private readonly prisma: PrismaService) {} constructor(private readonly prisma: PrismaService) {}
@ -20,4 +20,16 @@ export class EmployeeIdEmailResolver {
if(!employee)throw new NotFoundException(`Employee with email: ${email} not found`); if(!employee)throw new NotFoundException(`Employee with email: ${email} not found`);
return employee.id; return employee.id;
} }
// find user_id using email
readonly resolveUserIdWithEmail = async (email: string, client?: Tx
): Promise<string> => {
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;
}
} }

View File

@ -1,7 +1,7 @@
import { BadRequestException, ConflictException, Injectable, Logger, NotFoundException, UnprocessableEntityException } from "@nestjs/common"; import { BadRequestException, ConflictException, Injectable, Logger, NotFoundException, UnprocessableEntityException } from "@nestjs/common";
import { normalizeShiftPayload, overlaps } from "../utils/shifts.utils"; import { normalizeShiftPayload, overlaps } from "../utils/shifts.utils";
import { DayShiftResponse, UpsertAction } from "../types-and-interfaces/shifts-upsert.types"; 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 { BankCodesResolver } from "src/modules/shared/utils/resolve-bank-type-id.utils";
import { Prisma, Shifts } from "@prisma/client"; import { Prisma, Shifts } from "@prisma/client";
import { UpsertShiftDto } from "../dtos/upsert-shift.dto"; import { UpsertShiftDto } from "../dtos/upsert-shift.dto";
@ -16,7 +16,7 @@ export class ShiftsCommandService extends BaseApprovalService<Shifts> {
constructor( constructor(
prisma: PrismaService, prisma: PrismaService,
private readonly emailResolver: EmployeeIdEmailResolver, private readonly emailResolver: EmailToIdResolver,
private readonly bankTypeResolver: BankCodesResolver, private readonly bankTypeResolver: BankCodesResolver,
private readonly overtimeService: OvertimeService, private readonly overtimeService: OvertimeService,
) { super(prisma); } ) { super(prisma); }

View File

@ -5,24 +5,24 @@ import { ShiftsCommandService } from './services/shifts-command.service';
import { NotificationsModule } from '../notifications/notifications.module'; import { NotificationsModule } from '../notifications/notifications.module';
import { ShiftsQueryService } from './services/shifts-query.service'; import { ShiftsQueryService } from './services/shifts-query.service';
import { ShiftsArchivalService } from './services/shifts-archival.service'; import { ShiftsArchivalService } from './services/shifts-archival.service';
import { BankCodesResolver } from '../shared/utils/resolve-bank-type-id.utils'; import { SharedModule } from '../shared/shared.module';
import { EmployeeIdEmailResolver } from '../shared/utils/resolve-email-id.utils';
@Module({ @Module({
imports: [BusinessLogicsModule, NotificationsModule], imports: [
BusinessLogicsModule,
NotificationsModule,
SharedModule
],
controllers: [ShiftsController], controllers: [ShiftsController],
providers: [ providers: [
ShiftsQueryService, ShiftsQueryService,
ShiftsCommandService, ShiftsCommandService,
ShiftsArchivalService, ShiftsArchivalService,
BankCodesResolver, ],
EmployeeIdEmailResolver],
exports: [ exports: [
ShiftsQueryService, ShiftsQueryService,
ShiftsCommandService, ShiftsCommandService,
ShiftsArchivalService, ShiftsArchivalService,
BankCodesResolver,
EmployeeIdEmailResolver
], ],
}) })
export class ShiftsModule {} export class ShiftsModule {}

View File

@ -7,7 +7,7 @@ import { CreateTimesheetDto } from "../dtos/create-timesheet.dto";
import { getWeekEnd, getWeekStart } from "src/common/utils/date-utils"; import { getWeekEnd, getWeekStart } from "src/common/utils/date-utils";
import { parseISODate, parseHHmm } from "../utils/timesheet.helpers"; import { parseISODate, parseHHmm } from "../utils/timesheet.helpers";
import { TimesheetDto } from "../dtos/timesheet-period.dto"; 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 { EmployeeTimesheetResolver } from "src/modules/shared/utils/resolve-employee-timesheet.utils";
import { BankCodesResolver } from "src/modules/shared/utils/resolve-bank-type-id.utils"; import { BankCodesResolver } from "src/modules/shared/utils/resolve-bank-type-id.utils";
@ -16,7 +16,7 @@ export class TimesheetsCommandService extends BaseApprovalService<Timesheets>{
constructor( constructor(
prisma: PrismaService, prisma: PrismaService,
private readonly query: TimesheetsQueryService, private readonly query: TimesheetsQueryService,
private readonly emailResolver: EmployeeIdEmailResolver, private readonly emailResolver: EmailToIdResolver,
private readonly timesheetResolver: EmployeeTimesheetResolver, private readonly timesheetResolver: EmployeeTimesheetResolver,
private readonly bankTypeResolver: BankCodesResolver, private readonly bankTypeResolver: BankCodesResolver,
) {super(prisma);} ) {super(prisma);}

View File

@ -5,7 +5,7 @@ import { PrismaService } from 'src/prisma/prisma.service';
import { TimesheetDto, TimesheetPeriodDto } from '../dtos/timesheet-period.dto'; import { TimesheetDto, TimesheetPeriodDto } from '../dtos/timesheet-period.dto';
import { ShiftRow, ExpenseRow } from '../types/timesheet.types'; import { ShiftRow, ExpenseRow } from '../types/timesheet.types';
import { buildPeriod } from '../utils/timesheet.utils'; 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'; 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 { export class TimesheetsQueryService {
constructor( constructor(
private readonly prisma: PrismaService, private readonly prisma: PrismaService,
private readonly emailResolver: EmployeeIdEmailResolver, private readonly emailResolver: EmailToIdResolver,
private readonly fullNameResolver: FullNameResolver private readonly fullNameResolver: FullNameResolver
) {} ) {}

View File

@ -9,7 +9,10 @@ import { SharedModule } from '../shared/shared.module';
import { Module } from '@nestjs/common'; import { Module } from '@nestjs/common';
@Module({ @Module({
imports: [BusinessLogicsModule, SharedModule], imports: [
BusinessLogicsModule,
SharedModule
],
controllers: [TimesheetsController], controllers: [TimesheetsController],
providers: [ providers: [
TimesheetsQueryService, TimesheetsQueryService,
@ -17,7 +20,6 @@ import { Module } from '@nestjs/common';
ShiftsCommandService, ShiftsCommandService,
ExpensesCommandService, ExpensesCommandService,
TimesheetArchiveService, TimesheetArchiveService,
], ],
exports: [ exports: [
TimesheetsQueryService, TimesheetsQueryService,