Merge branch 'main' of git.targo.ca:Targo/targo_backend into dev/setup/modules/MatthieuH

This commit is contained in:
Matthieu Haineault 2025-08-08 14:48:44 -04:00
commit 91ef6685b4
20 changed files with 17 additions and 150 deletions

View File

@ -545,34 +545,6 @@
] ]
} }
}, },
"/timesheets/{id}/approval": {
"patch": {
"operationId": "TimesheetsController_approve",
"parameters": [
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "number"
}
}
],
"responses": {
"200": {
"description": ""
}
},
"security": [
{
"access-token": []
}
],
"tags": [
"Timesheets"
]
}
},
"/Expenses": { "/Expenses": {
"post": { "post": {
"operationId": "ExpensesController_create", "operationId": "ExpensesController_create",
@ -1225,34 +1197,6 @@
] ]
} }
}, },
"/leave-requests/{id}/approval": {
"patch": {
"operationId": "LeaveRequestController_updateApproval",
"parameters": [
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "number"
}
}
],
"responses": {
"200": {
"description": ""
}
},
"security": [
{
"access-token": []
}
],
"tags": [
"Leave Requests"
]
}
},
"/auth/v1/login": { "/auth/v1/login": {
"get": { "get": {
"operationId": "AuthController_login", "operationId": "AuthController_login",

View File

@ -7,12 +7,12 @@ import {
import { Reflector } from '@nestjs/core'; import { Reflector } from '@nestjs/core';
import { ROLES_KEY } from '../decorators/roles.decorators'; import { ROLES_KEY } from '../decorators/roles.decorators';
import { Roles } from '.prisma/client'; import { Roles } from '.prisma/client';
import { JwtPayload } from 'src/modules/authentication/strategies/jwt.strategy';
interface RequestWithUser extends Request { interface RequestWithUser extends Request {
user: JwtPayload; // TODO: Create an actual user model based on OAuth signin
user: any;
} }
@Injectable() @Injectable()

View File

@ -2,11 +2,10 @@ import { Controller, Get, NotFoundException, Param, ParseIntPipe, UseGuards } fr
import { ApiOperation, ApiResponse, ApiTags } from "@nestjs/swagger"; import { ApiOperation, ApiResponse, ApiTags } from "@nestjs/swagger";
import { RolesAllowed } from "src/common/decorators/roles.decorators"; import { RolesAllowed } from "src/common/decorators/roles.decorators";
import { EmployeesArchive, Roles as RoleEnum } from '@prisma/client'; import { EmployeesArchive, Roles as RoleEnum } from '@prisma/client';
import { JwtAuthGuard } from "src/modules/authentication/guards/jwt-auth.guard";
import { EmployeesService } from "src/modules/employees/services/employees.service"; import { EmployeesService } from "src/modules/employees/services/employees.service";
@ApiTags('Employee Archives') @ApiTags('Employee Archives')
@UseGuards(JwtAuthGuard) // @UseGuards()
@Controller('archives/employees') @Controller('archives/employees')
export class EmployeesArchiveController { export class EmployeesArchiveController {
constructor(private readonly employeesService: EmployeesService) {} constructor(private readonly employeesService: EmployeesService) {}

View File

@ -2,11 +2,10 @@ import { UseGuards, Controller, Get, Param, ParseIntPipe, NotFoundException } fr
import { ApiTags, ApiOperation, ApiResponse } from "@nestjs/swagger"; import { ApiTags, ApiOperation, ApiResponse } from "@nestjs/swagger";
import { ExpensesArchive,Roles as RoleEnum } from "@prisma/client"; import { ExpensesArchive,Roles as RoleEnum } from "@prisma/client";
import { RolesAllowed } from "src/common/decorators/roles.decorators"; import { RolesAllowed } from "src/common/decorators/roles.decorators";
import { JwtAuthGuard } from "src/modules/authentication/guards/jwt-auth.guard";
import { ExpensesService } from "src/modules/expenses/services/expenses.service"; import { ExpensesService } from "src/modules/expenses/services/expenses.service";
@ApiTags('Expense Archives') @ApiTags('Expense Archives')
@UseGuards(JwtAuthGuard) // @UseGuards()
@Controller('archives/expenses') @Controller('archives/expenses')
export class ExpensesArchiveController { export class ExpensesArchiveController {
constructor(private readonly expensesService: ExpensesService) {} constructor(private readonly expensesService: ExpensesService) {}

View File

@ -2,11 +2,10 @@ import { Get, Param, ParseIntPipe, NotFoundException, Controller, UseGuards } fr
import { ApiOperation, ApiResponse, ApiTags } from "@nestjs/swagger"; import { ApiOperation, ApiResponse, ApiTags } from "@nestjs/swagger";
import { LeaveRequestsArchive, Roles as RoleEnum } from "@prisma/client"; import { LeaveRequestsArchive, Roles as RoleEnum } from "@prisma/client";
import { RolesAllowed } from "src/common/decorators/roles.decorators"; import { RolesAllowed } from "src/common/decorators/roles.decorators";
import { JwtAuthGuard } from "src/modules/authentication/guards/jwt-auth.guard";
import { LeaveRequestsService } from "src/modules/leave-requests/services/leave-requests.service"; import { LeaveRequestsService } from "src/modules/leave-requests/services/leave-requests.service";
@ApiTags('LeaveRequests Archives') @ApiTags('LeaveRequests Archives')
@UseGuards(JwtAuthGuard) // @UseGuards()
@Controller('archives/leaveRequests') @Controller('archives/leaveRequests')
export class LeaveRequestsArchiveController { export class LeaveRequestsArchiveController {
constructor(private readonly leaveRequestsService: LeaveRequestsService) {} constructor(private readonly leaveRequestsService: LeaveRequestsService) {}

View File

@ -2,11 +2,10 @@ import { Get, Param, ParseIntPipe, NotFoundException, Controller, UseGuards } fr
import { ApiOperation, ApiResponse, ApiTags } from "@nestjs/swagger"; import { ApiOperation, ApiResponse, ApiTags } from "@nestjs/swagger";
import { ShiftsArchive, Roles as RoleEnum } from "@prisma/client"; import { ShiftsArchive, Roles as RoleEnum } from "@prisma/client";
import { RolesAllowed } from "src/common/decorators/roles.decorators"; import { RolesAllowed } from "src/common/decorators/roles.decorators";
import { JwtAuthGuard } from "src/modules/authentication/guards/jwt-auth.guard";
import { ShiftsService } from "src/modules/shifts/services/shifts.service"; import { ShiftsService } from "src/modules/shifts/services/shifts.service";
@ApiTags('Shift Archives') @ApiTags('Shift Archives')
@UseGuards(JwtAuthGuard) // @UseGuards()
@Controller('archives/shifts') @Controller('archives/shifts')
export class ShiftsArchiveController { export class ShiftsArchiveController {
constructor(private readonly shiftsService:ShiftsService) {} constructor(private readonly shiftsService:ShiftsService) {}

View File

@ -3,10 +3,9 @@ import { ApiOperation, ApiResponse, ApiTags } from "@nestjs/swagger";
import { RolesAllowed } from "src/common/decorators/roles.decorators"; import { RolesAllowed } from "src/common/decorators/roles.decorators";
import { TimesheetsArchive, Roles as RoleEnum } from '@prisma/client'; import { TimesheetsArchive, Roles as RoleEnum } from '@prisma/client';
import { TimesheetsService } from "src/modules/timesheets/services/timesheets.service"; import { TimesheetsService } from "src/modules/timesheets/services/timesheets.service";
import { JwtAuthGuard } from "src/modules/authentication/guards/jwt-auth.guard";
@ApiTags('Timesheet Archives') @ApiTags('Timesheet Archives')
@UseGuards(JwtAuthGuard) // @UseGuards()
@Controller('archives/timesheets') @Controller('archives/timesheets')
export class TimesheetsArchiveController { export class TimesheetsArchiveController {
constructor(private readonly timesheetsService: TimesheetsService) {} constructor(private readonly timesheetsService: TimesheetsService) {}

View File

@ -1,11 +1,10 @@
import { Module } from '@nestjs/common'; import { Module } from '@nestjs/common';
import { JwtModule } from '@nestjs/jwt';
import { PassportModule } from '@nestjs/passport'; import { PassportModule } from '@nestjs/passport';
import { AuthentikAuthService } from './services/authentik-auth.service'; import { AuthentikAuthService } from './services/authentik-auth.service';
import { UsersModule } from '../users-management/users.module'; import { UsersModule } from '../users-management/users.module';
import { AuthController } from './controllers/auth.controller'; import { AuthController } from './controllers/auth.controller';
import { AuthentikStrategy } from './strategies/authentik.strategy'; import { AuthentikStrategy } from './strategies/authentik.strategy';
import { SessionSerializer } from './session.serializer'; import { ExpressSessionSerializer } from './services/express-session.serializer';
@Module({ @Module({
@ -16,7 +15,7 @@ import { SessionSerializer } from './session.serializer';
providers: [ providers: [
AuthentikAuthService, AuthentikAuthService,
AuthentikStrategy, AuthentikStrategy,
SessionSerializer, ExpressSessionSerializer,
], ],
exports: [ AuthentikAuthService ], exports: [ AuthentikAuthService ],
controllers: [AuthController], controllers: [AuthController],

View File

@ -1 +0,0 @@
POST http://localhost:3000/auth/login

View File

@ -1,18 +0,0 @@
import { ExecutionContext, Injectable, UnauthorizedException } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { Observable } from 'rxjs';
@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {
canActivate(context: ExecutionContext) {
return super.canActivate(context);
}
handleRequest(err, user, info) {
if(err || !user) {
throw err || new UnauthorizedException();
}
return user;
}
}

View File

@ -2,7 +2,7 @@ import { PassportSerializer } from '@nestjs/passport';
import { Injectable, UnauthorizedException } from '@nestjs/common'; import { Injectable, UnauthorizedException } from '@nestjs/common';
@Injectable() @Injectable()
export class SessionSerializer extends PassportSerializer { export class ExpressSessionSerializer extends PassportSerializer {
serializeUser(user: any, done: (err: any, user: any) => void): any { serializeUser(user: any, done: (err: any, user: any) => void): any {
if (!user){ if (!user){
done(new UnauthorizedException('Serialize user error'), user); done(new UnauthorizedException('Serialize user error'), user);

View File

@ -1,20 +0,0 @@
import { Injectable } from '@nestjs/common';
import { UUID } from 'crypto';
import { UsersService } from 'src/modules/users-management/services/users.service';
import { JwtService } from '@nestjs/jwt';
@Injectable()
export class AuthService {
constructor(
private usersService: UsersService,
private jwtService: JwtService
) {}
async validateUser(user_id: UUID): Promise<any> {
const user = await this.usersService.findOne( user_id );
if (user) {
return user;
}
return null;
}
}

View File

@ -1,25 +0,0 @@
import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { Roles } from '@prisma/client';
import { ExtractJwt, Strategy } from 'passport-jwt';
export interface JwtPayload {
sub: number;
email: string;
role: Roles;
}
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor() {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: process.env.JWT_SECRET || 'CHANGE_ME',
});
}
validate(payload: JwtPayload): JwtPayload {
return payload;
}
}

View File

@ -6,12 +6,11 @@ import { UpdateCustomerDto } from '../dtos/update-customer.dto';
import { RolesAllowed } from "src/common/decorators/roles.decorators"; import { RolesAllowed } from "src/common/decorators/roles.decorators";
import { Roles as RoleEnum } from '.prisma/client'; import { Roles as RoleEnum } from '.prisma/client';
import { ApiBearerAuth, ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; import { ApiBearerAuth, ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
import { JwtAuthGuard } from 'src/modules/authentication/guards/jwt-auth.guard';
import { CustomerEntity } from '../dtos/swagger-entities/customers.entity'; import { CustomerEntity } from '../dtos/swagger-entities/customers.entity';
@ApiTags('Customers') @ApiTags('Customers')
@ApiBearerAuth('access-token') @ApiBearerAuth('access-token')
@UseGuards(JwtAuthGuard) // @UseGuards()
@Controller('customers') @Controller('customers')
export class CustomersController { export class CustomersController {
constructor(private readonly customersService: CustomersService) {} constructor(private readonly customersService: CustomersService) {}

View File

@ -5,12 +5,11 @@ import { CreateEmployeeDto } from '../dtos/create-employee.dto';
import { UpdateEmployeeDto } from '../dtos/update-employee.dto'; import { UpdateEmployeeDto } from '../dtos/update-employee.dto';
import { RolesAllowed } from '../../../common/decorators/roles.decorators'; import { RolesAllowed } from '../../../common/decorators/roles.decorators';
import { ApiBearerAuth, ApiOperation, ApiParam, ApiResponse, ApiTags } from '@nestjs/swagger'; import { ApiBearerAuth, ApiOperation, ApiParam, ApiResponse, ApiTags } from '@nestjs/swagger';
import { JwtAuthGuard } from 'src/modules/authentication/guards/jwt-auth.guard';
import { EmployeeEntity } from '../dtos/swagger-entities/employees.entity'; import { EmployeeEntity } from '../dtos/swagger-entities/employees.entity';
@ApiTags('Employees') @ApiTags('Employees')
@ApiBearerAuth('access-token') @ApiBearerAuth('access-token')
@UseGuards(JwtAuthGuard) // @UseGuards()
@Controller('employees') @Controller('employees')
export class EmployeesController { export class EmployeesController {
constructor(private readonly employeesService: EmployeesService) {} constructor(private readonly employeesService: EmployeesService) {}

View File

@ -6,14 +6,13 @@ import { Roles as RoleEnum } from '.prisma/client';
import { UpdateExpenseDto } from "../dtos/update-expense.dto"; import { UpdateExpenseDto } from "../dtos/update-expense.dto";
import { ApiBearerAuth, ApiOperation, ApiResponse, ApiTags } from "@nestjs/swagger"; import { ApiBearerAuth, ApiOperation, ApiResponse, ApiTags } from "@nestjs/swagger";
import { RolesAllowed } from "src/common/decorators/roles.decorators"; import { RolesAllowed } from "src/common/decorators/roles.decorators";
import { JwtAuthGuard } from "src/modules/authentication/guards/jwt-auth.guard";
import { ExpenseEntity } from "../dtos/swagger-entities/expenses.entity"; import { ExpenseEntity } from "../dtos/swagger-entities/expenses.entity";
import { ExpensesApprovalService } from "../services/expenses-approval.service"; import { ExpensesApprovalService } from "../services/expenses-approval.service";
import { SearchExpensesDto } from "../dtos/search-expense.dto"; import { SearchExpensesDto } from "../dtos/search-expense.dto";
@ApiTags('Expenses') @ApiTags('Expenses')
@ApiBearerAuth('access-token') @ApiBearerAuth('access-token')
@UseGuards(JwtAuthGuard) // @UseGuards()
@Controller('Expenses') @Controller('Expenses')
export class ExpensesController { export class ExpensesController {
constructor( constructor(

View File

@ -6,13 +6,12 @@ import { UpdateLeaveRequestsDto } from "../dtos/update-leave-requests.dto";
import { RolesAllowed } from "src/common/decorators/roles.decorators"; import { RolesAllowed } from "src/common/decorators/roles.decorators";
import { LeaveApprovalStatus, Roles as RoleEnum } from '.prisma/client'; import { LeaveApprovalStatus, Roles as RoleEnum } from '.prisma/client';
import { ApiBearerAuth, ApiOperation, ApiResponse, ApiTags } from "@nestjs/swagger"; import { ApiBearerAuth, ApiOperation, ApiResponse, ApiTags } from "@nestjs/swagger";
import { JwtAuthGuard } from "src/modules/authentication/guards/jwt-auth.guard";
import { LeaveRequestEntity } from "../dtos/swagger-entities/leave-requests.entity"; import { LeaveRequestEntity } from "../dtos/swagger-entities/leave-requests.entity";
import { SearchLeaveRequestsDto } from "../dtos/search-leave-requests.dto"; import { SearchLeaveRequestsDto } from "../dtos/search-leave-requests.dto";
@ApiTags('Leave Requests') @ApiTags('Leave Requests')
@ApiBearerAuth('access-token') @ApiBearerAuth('access-token')
@UseGuards(JwtAuthGuard) // @UseGuards()
@Controller('leave-requests') @Controller('leave-requests')
export class LeaveRequestController { export class LeaveRequestController {
constructor(private readonly leaveRequetsService: LeaveRequestsService){} constructor(private readonly leaveRequetsService: LeaveRequestsService){}

View File

@ -3,7 +3,6 @@ import { OAuthSessions } from '@prisma/client';
import { RolesAllowed } from "src/common/decorators/roles.decorators"; import { RolesAllowed } from "src/common/decorators/roles.decorators";
import { Roles as RoleEnum } from '.prisma/client'; import { Roles as RoleEnum } from '.prisma/client';
import { ApiBearerAuth, ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; import { ApiBearerAuth, ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
import { JwtAuthGuard } from 'src/modules/authentication/guards/jwt-auth.guard';
import { CreateOauthSessionDto } from '../dtos/create-oauth-sessions.dto'; import { CreateOauthSessionDto } from '../dtos/create-oauth-sessions.dto';
import { OauthSessionsService } from '../services/oauth-sessions.service'; import { OauthSessionsService } from '../services/oauth-sessions.service';
import { OAuthSessionEntity } from '../dtos/swagger-entities/oauth-sessions.entity'; import { OAuthSessionEntity } from '../dtos/swagger-entities/oauth-sessions.entity';
@ -11,7 +10,7 @@ import { UpdateOauthSessionDto } from '../dtos/update-oauth-sessions.dto';
@ApiTags('OAuth Sessions') @ApiTags('OAuth Sessions')
@ApiBearerAuth('sessions') @ApiBearerAuth('sessions')
@UseGuards(JwtAuthGuard) //@UseGuards(JwtAuthGuard)
@Controller('oauth-sessions') @Controller('oauth-sessions')
export class OauthSessionsController { export class OauthSessionsController {
constructor(private readonly oauthSessionsService: OauthSessionsService){} constructor(private readonly oauthSessionsService: OauthSessionsService){}

View File

@ -6,14 +6,13 @@ import { UpdateShiftsDto } from "../dtos/update-shift.dto";
import { RolesAllowed } from "src/common/decorators/roles.decorators"; import { RolesAllowed } from "src/common/decorators/roles.decorators";
import { Roles as RoleEnum } from '.prisma/client'; import { Roles as RoleEnum } from '.prisma/client';
import { ApiBearerAuth, ApiOperation, ApiResponse, ApiTags } from "@nestjs/swagger"; import { ApiBearerAuth, ApiOperation, ApiResponse, ApiTags } from "@nestjs/swagger";
import { JwtAuthGuard } from "src/modules/authentication/guards/jwt-auth.guard";
import { ShiftEntity } from "../dtos/swagger-entities/shift.entity"; import { ShiftEntity } from "../dtos/swagger-entities/shift.entity";
import { ShiftsApprovalService } from "../services/shifts-approval.service"; import { ShiftsApprovalService } from "../services/shifts-approval.service";
import { SearchShiftsDto } from "../dtos/search-shifts.dto"; import { SearchShiftsDto } from "../dtos/search-shifts.dto";
@ApiTags('Shifts') @ApiTags('Shifts')
@ApiBearerAuth('access-token') @ApiBearerAuth('access-token')
@UseGuards(JwtAuthGuard) // @UseGuards()
@Controller('shifts') @Controller('shifts')
export class ShiftsController { export class ShiftsController {
constructor( constructor(

View File

@ -6,14 +6,13 @@ import { UpdateTimesheetDto } from '../dtos/update-timesheet.dto';
import { RolesAllowed } from "src/common/decorators/roles.decorators"; import { RolesAllowed } from "src/common/decorators/roles.decorators";
import { Roles as RoleEnum } from '.prisma/client'; import { Roles as RoleEnum } from '.prisma/client';
import { ApiBearerAuth, ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; import { ApiBearerAuth, ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
import { JwtAuthGuard } from 'src/modules/authentication/guards/jwt-auth.guard';
import { TimesheetEntity } from '../dtos/swagger-entities/timesheet.entity'; import { TimesheetEntity } from '../dtos/swagger-entities/timesheet.entity';
import { TimesheetsApprovalService } from '../services/timesheets-approval.service'; import { TimesheetsApprovalService } from '../services/timesheets-approval.service';
import { SearchTimesheetDto } from '../dtos/search-timesheets.dto'; import { SearchTimesheetDto } from '../dtos/search-timesheets.dto';
@ApiTags('Timesheets') @ApiTags('Timesheets')
@ApiBearerAuth('access-token') @ApiBearerAuth('access-token')
@UseGuards(JwtAuthGuard) // @UseGuards()
@Controller('timesheets') @Controller('timesheets')
export class TimesheetsController { export class TimesheetsController {
constructor( constructor(