refactor(Oauth-sessions): refactor OAuth-Access-Token to OAuth-sessions

This commit is contained in:
Matthieu Haineault 2025-08-05 09:44:43 -04:00
parent 5aac046356
commit b0406b3a4c
11 changed files with 157 additions and 138 deletions

View File

@ -3,7 +3,7 @@
"paths": { "paths": {
"/": { "/": {
"get": { "get": {
"operationId": "AppController_getHello", "operationId": "ShiftsValidationController_getSummary",
"parameters": [], "parameters": [],
"responses": { "responses": {
"200": { "200": {
@ -11,7 +11,7 @@
} }
}, },
"tags": [ "tags": [
"App" "ShiftsValidation"
] ]
} }
}, },
@ -933,6 +933,20 @@
] ]
} }
}, },
"/export.csv": {
"get": {
"operationId": "ShiftsValidationController_exportCsv",
"parameters": [],
"responses": {
"200": {
"description": ""
}
},
"tags": [
"ShiftsValidation"
]
}
},
"/leave-requests": { "/leave-requests": {
"post": { "post": {
"operationId": "LeaveRequestController_create", "operationId": "LeaveRequestController_create",
@ -1468,27 +1482,27 @@
] ]
} }
}, },
"/oauth-access-tokens": { "/oauth-sessions": {
"post": { "post": {
"operationId": "OauthAccessTokensController_create", "operationId": "OauthSessionsController_create",
"parameters": [], "parameters": [],
"requestBody": { "requestBody": {
"required": true, "required": true,
"content": { "content": {
"application/json": { "application/json": {
"schema": { "schema": {
"$ref": "#/components/schemas/CreateOauthAccessTokenDto" "$ref": "#/components/schemas/CreateOauthSessionDto"
} }
} }
} }
}, },
"responses": { "responses": {
"201": { "201": {
"description": "OAuth access token created", "description": "OAuth session created",
"content": { "content": {
"application/json": { "application/json": {
"schema": { "schema": {
"$ref": "#/components/schemas/OAuthAccessTokenEntity" "$ref": "#/components/schemas/OAuthSessionEntity"
} }
} }
} }
@ -1499,49 +1513,49 @@
}, },
"security": [ "security": [
{ {
"access-token": [] "sessions": []
} }
], ],
"summary": "Create OAuth access token", "summary": "Create OAuth session",
"tags": [ "tags": [
"OAuth Access Tokens" "OAuth Sessions"
] ]
}, },
"get": { "get": {
"operationId": "OauthAccessTokensController_findAll", "operationId": "OauthSessionsController_findAll",
"parameters": [], "parameters": [],
"responses": { "responses": {
"201": { "201": {
"description": "List of OAuth access token found", "description": "List of OAuth session found",
"content": { "content": {
"application/json": { "application/json": {
"schema": { "schema": {
"type": "array", "type": "array",
"items": { "items": {
"$ref": "#/components/schemas/OAuthAccessTokenEntity" "$ref": "#/components/schemas/OAuthSessionEntity"
} }
} }
} }
} }
}, },
"400": { "400": {
"description": "List of OAuth access token not found" "description": "List of OAuth session not found"
} }
}, },
"security": [ "security": [
{ {
"access-token": [] "sessions": []
} }
], ],
"summary": "Find all OAuth access token", "summary": "Find all OAuth session",
"tags": [ "tags": [
"OAuth Access Tokens" "OAuth Sessions"
] ]
} }
}, },
"/oauth-access-tokens/{id}": { "/oauth-sessions/{id}": {
"get": { "get": {
"operationId": "OauthAccessTokensController_findOne", "operationId": "OauthSessionsController_findOne",
"parameters": [ "parameters": [
{ {
"name": "id", "name": "id",
@ -1554,31 +1568,31 @@
], ],
"responses": { "responses": {
"201": { "201": {
"description": "OAuth access token found", "description": "OAuth session found",
"content": { "content": {
"application/json": { "application/json": {
"schema": { "schema": {
"$ref": "#/components/schemas/OAuthAccessTokenEntity" "$ref": "#/components/schemas/OAuthSessionEntity"
} }
} }
} }
}, },
"400": { "400": {
"description": "OAuth access token not found" "description": "OAuth session not found"
} }
}, },
"security": [ "security": [
{ {
"access-token": [] "sessions": []
} }
], ],
"summary": "Find OAuth access token", "summary": "Find OAuth session",
"tags": [ "tags": [
"OAuth Access Tokens" "OAuth Sessions"
] ]
}, },
"patch": { "patch": {
"operationId": "OauthAccessTokensController_update", "operationId": "OauthSessionsController_update",
"parameters": [ "parameters": [
{ {
"name": "id", "name": "id",
@ -1594,38 +1608,38 @@
"content": { "content": {
"application/json": { "application/json": {
"schema": { "schema": {
"$ref": "#/components/schemas/UpdateOauthAccessTokenDto" "$ref": "#/components/schemas/UpdateOauthSessionDto"
} }
} }
} }
}, },
"responses": { "responses": {
"201": { "201": {
"description": "OAuth access token updated", "description": "OAuth session updated",
"content": { "content": {
"application/json": { "application/json": {
"schema": { "schema": {
"$ref": "#/components/schemas/OAuthAccessTokenEntity" "$ref": "#/components/schemas/OAuthSessionEntity"
} }
} }
} }
}, },
"400": { "400": {
"description": "OAuth access token not found" "description": "OAuth session not found"
} }
}, },
"security": [ "security": [
{ {
"access-token": [] "sessions": []
} }
], ],
"summary": "Update OAuth access token", "summary": "Update OAuth session",
"tags": [ "tags": [
"OAuth Access Tokens" "OAuth Sessions"
] ]
}, },
"delete": { "delete": {
"operationId": "OauthAccessTokensController_remove", "operationId": "OauthSessionsController_remove",
"parameters": [ "parameters": [
{ {
"name": "id", "name": "id",
@ -1638,27 +1652,27 @@
], ],
"responses": { "responses": {
"201": { "201": {
"description": "OAuth access token deleted", "description": "OAuth session deleted",
"content": { "content": {
"application/json": { "application/json": {
"schema": { "schema": {
"$ref": "#/components/schemas/OAuthAccessTokenEntity" "$ref": "#/components/schemas/OAuthSessionEntity"
} }
} }
} }
}, },
"400": { "400": {
"description": "OAuth access token not found" "description": "OAuth session not found"
} }
}, },
"security": [ "security": [
{ {
"access-token": [] "sessions": []
} }
], ],
"summary": "Delete OAuth access token", "summary": "Delete OAuth session",
"tags": [ "tags": [
"OAuth Access Tokens" "OAuth Sessions"
] ]
} }
}, },
@ -2453,7 +2467,7 @@
} }
} }
}, },
"CreateOauthAccessTokenDto": { "CreateOauthSessionDto": {
"type": "object", "type": "object",
"properties": { "properties": {
"user_id": { "user_id": {
@ -2505,7 +2519,7 @@
"access_token_expiry" "access_token_expiry"
] ]
}, },
"OAuthAccessTokenEntity": { "OAuthSessionEntity": {
"type": "object", "type": "object",
"properties": { "properties": {
"id": { "id": {
@ -2586,7 +2600,7 @@
"created_at" "created_at"
] ]
}, },
"UpdateOauthAccessTokenDto": { "UpdateOauthSessionDto": {
"type": "object", "type": "object",
"properties": { "properties": {
"user_id": { "user_id": {

View File

@ -5,7 +5,6 @@ import { PrismaModule } from './prisma/prisma.module';
import { HealthModule } from './health/health.module'; import { HealthModule } from './health/health.module';
import { HealthController } from './health/health.controller'; import { HealthController } from './health/health.controller';
import { UsersModule } from './modules/users-management/users.module'; import { UsersModule } from './modules/users-management/users.module';
import { OauthAccessTokensModule } from './modules/oauth-access-tokens/oauth-access-tokens.module';
import { CustomersModule } from './modules/customers/customers.module'; import { CustomersModule } from './modules/customers/customers.module';
import { EmployeesModule } from './modules/employees/employees.module'; import { EmployeesModule } from './modules/employees/employees.module';
import { LeaveRequestsModule } from './modules/leave-requests/leave-requests.module'; import { LeaveRequestsModule } from './modules/leave-requests/leave-requests.module';
@ -20,6 +19,7 @@ import { BankCodesModule } from './modules/bank-codes/bank-codes.module';
import { OvertimeService } from './modules/business-logics/services/overtime.service'; import { OvertimeService } from './modules/business-logics/services/overtime.service';
import { BusinessLogicsModule } from './modules/business-logics/business-logics.module'; import { BusinessLogicsModule } from './modules/business-logics/business-logics.module';
import { ShiftsValidationModule } from './modules/shifts/validation/shifts-validation.module'; import { ShiftsValidationModule } from './modules/shifts/validation/shifts-validation.module';
import { OauthSessionsModule } from './modules/oauth-sessions/oauth-sessions.module';
@Module({ @Module({
imports: [ imports: [
@ -33,7 +33,7 @@ import { ShiftsValidationModule } from './modules/shifts/validation/shifts-valid
ExpensesModule, ExpensesModule,
HealthModule, HealthModule,
LeaveRequestsModule, LeaveRequestsModule,
OauthAccessTokensModule, OauthSessionsModule,
PayperiodsModule, PayperiodsModule,
PrismaModule, PrismaModule,
ShiftsModule, ShiftsModule,

View File

@ -1,63 +0,0 @@
import { Body, Controller, Delete, Get, Param, Patch, Post, UseGuards } from '@nestjs/common';
import { OauthAccessTokensService } from '../services/oauth-access-tokens.service';
import { CreateOauthAccessTokenDto } from '../dtos/create-oauth-access-token.dto';
import { OAuthAccessTokens } from '@prisma/client';
import { UpdateOauthAccessTokenDto } from '../dtos/update-oauth-access-token.dto';
import { RolesAllowed } from "src/common/decorators/roles.decorators";
import { Roles as RoleEnum } from '.prisma/client';
import { ApiBearerAuth, ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
import { JwtAuthGuard } from 'src/modules/authentication/guards/jwt-auth.guard';
import { OAuthAccessTokenEntity } from '../dtos/swagger-entities/oauth-access-token.entity';
@ApiTags('OAuth Access Tokens')
@ApiBearerAuth('access-token')
@UseGuards(JwtAuthGuard)
@Controller('oauth-access-tokens')
export class OauthAccessTokensController {
constructor(private readonly oauthAccessTokensService: OauthAccessTokensService){}
@Post()
@RolesAllowed(RoleEnum.ADMIN)
@ApiOperation({summary: 'Create OAuth access token' })
@ApiResponse({ status: 201, description: 'OAuth access token created', type: OAuthAccessTokenEntity })
@ApiResponse({ status: 400, description: 'Incomplete task or invalid data' })
create(@Body()dto: CreateOauthAccessTokenDto): Promise<OAuthAccessTokens> {
return this.oauthAccessTokensService.create(dto);
}
@Get()
@RolesAllowed(RoleEnum.ADMIN)
@ApiOperation({summary: 'Find all OAuth access token' })
@ApiResponse({ status: 201, description: 'List of OAuth access token found', type: OAuthAccessTokenEntity, isArray: true })
@ApiResponse({ status: 400, description: 'List of OAuth access token not found' })
findAll(): Promise<OAuthAccessTokens[]> {
return this.oauthAccessTokensService.findAll();
}
@Get(':id')
@RolesAllowed(RoleEnum.ADMIN)
@ApiOperation({summary: 'Find OAuth access token' })
@ApiResponse({ status: 201, description: 'OAuth access token found', type: OAuthAccessTokenEntity })
@ApiResponse({ status: 400, description: 'OAuth access token not found' })
findOne(@Param('id') id: string): Promise<OAuthAccessTokens> {
return this.oauthAccessTokensService.findOne(id);
}
@Patch(':id')
@RolesAllowed(RoleEnum.ADMIN)
@ApiOperation({summary: 'Update OAuth access token' })
@ApiResponse({ status: 201, description: 'OAuth access token updated', type: OAuthAccessTokenEntity })
@ApiResponse({ status: 400, description: 'OAuth access token not found' })
update(@Param('id') id: string, @Body() dto: UpdateOauthAccessTokenDto): Promise<OAuthAccessTokens> {
return this.oauthAccessTokensService.update(id,dto);
}
@Delete(':id')
@RolesAllowed(RoleEnum.ADMIN)
@ApiOperation({summary: 'Delete OAuth access token' })
@ApiResponse({ status: 201, description: 'OAuth access token deleted', type: OAuthAccessTokenEntity })
@ApiResponse({ status: 400, description: 'OAuth access token not found' })
remove(@Param('id') id: string): Promise<OAuthAccessTokens> {
return this.oauthAccessTokensService.remove(id);
}
}

View File

@ -1,4 +0,0 @@
import { PartialType } from "@nestjs/swagger";
import { CreateOauthAccessTokenDto } from "./create-oauth-access-token.dto";
export class UpdateOauthAccessTokenDto extends PartialType(CreateOauthAccessTokenDto) {}

View File

@ -1,10 +0,0 @@
import { Module } from '@nestjs/common';
import { OauthAccessTokensController } from './controllers/oauth-access-tokens.controller';
import { OauthAccessTokensService } from './services/oauth-access-tokens.service';
import { PrismaService } from 'src/prisma/prisma.service';
@Module({
controllers: [OauthAccessTokensController],
providers: [OauthAccessTokensService, PrismaService]
})
export class OauthAccessTokensModule {}

View File

@ -0,0 +1,63 @@
import { Body, Controller, Delete, Get, Param, Patch, Post, UseGuards } from '@nestjs/common';
import { OAuthSessions } from '@prisma/client';
import { RolesAllowed } from "src/common/decorators/roles.decorators";
import { Roles as RoleEnum } from '.prisma/client';
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 { OauthSessionsService } from '../services/oauth-sessions.service';
import { OAuthSessionEntity } from '../dtos/swagger-entities/oauth-sessions.entity';
import { UpdateOauthSessionDto } from '../dtos/update-oauth-sessions.dto';
@ApiTags('OAuth Sessions')
@ApiBearerAuth('sessions')
@UseGuards(JwtAuthGuard)
@Controller('oauth-sessions')
export class OauthSessionsController {
constructor(private readonly oauthSessionsService: OauthSessionsService){}
@Post()
@RolesAllowed(RoleEnum.ADMIN)
@ApiOperation({summary: 'Create OAuth session' })
@ApiResponse({ status: 201, description: 'OAuth session created', type: OAuthSessionEntity })
@ApiResponse({ status: 400, description: 'Incomplete task or invalid data' })
create(@Body()dto: CreateOauthSessionDto): Promise<OAuthSessions> {
return this.oauthSessionsService.create(dto);
}
@Get()
@RolesAllowed(RoleEnum.ADMIN)
@ApiOperation({summary: 'Find all OAuth session' })
@ApiResponse({ status: 201, description: 'List of OAuth session found', type: OAuthSessionEntity, isArray: true })
@ApiResponse({ status: 400, description: 'List of OAuth session not found' })
findAll(): Promise<OAuthSessions[]> {
return this.oauthSessionsService.findAll();
}
@Get(':id')
@RolesAllowed(RoleEnum.ADMIN)
@ApiOperation({summary: 'Find OAuth session' })
@ApiResponse({ status: 201, description: 'OAuth session found', type: OAuthSessionEntity })
@ApiResponse({ status: 400, description: 'OAuth session not found' })
findOne(@Param('id') id: string): Promise<OAuthSessions> {
return this.oauthSessionsService.findOne(id);
}
@Patch(':id')
@RolesAllowed(RoleEnum.ADMIN)
@ApiOperation({summary: 'Update OAuth session' })
@ApiResponse({ status: 201, description: 'OAuth session updated', type: OAuthSessionEntity })
@ApiResponse({ status: 400, description: 'OAuth session not found' })
update(@Param('id') id: string, @Body() dto: UpdateOauthSessionDto): Promise<OAuthSessions> {
return this.oauthSessionsService.update(id,dto);
}
@Delete(':id')
@RolesAllowed(RoleEnum.ADMIN)
@ApiOperation({summary: 'Delete OAuth session' })
@ApiResponse({ status: 201, description: 'OAuth session deleted', type: OAuthSessionEntity })
@ApiResponse({ status: 400, description: 'OAuth session not found' })
remove(@Param('id') id: string): Promise<OAuthSessions> {
return this.oauthSessionsService.remove(id);
}
}

View File

@ -2,7 +2,7 @@ import { ApiProperty } from "@nestjs/swagger";
import { Type } from "class-transformer"; import { Type } from "class-transformer";
import { IsArray, IsDate, IsOptional, IsString, IsUUID } from "class-validator"; import { IsArray, IsDate, IsOptional, IsString, IsUUID } from "class-validator";
export class CreateOauthAccessTokenDto { export class CreateOauthSessionDto {
@ApiProperty({ @ApiProperty({
example: 'S7A2U8R7O6N6', example: 'S7A2U8R7O6N6',
@ -18,6 +18,9 @@ export class CreateOauthAccessTokenDto {
@IsString() @IsString()
application: string; application: string;
@IsString()
sid: string;
@ApiProperty({ @ApiProperty({
example: 'L5O6R4D3/O6F3#T8H4E3&R6I4N6G4S7 ...', example: 'L5O6R4D3/O6F3#T8H4E3&R6I4N6G4S7 ...',
description: 'Access token', description: 'Access token',

View File

@ -1,6 +1,6 @@
import { ApiProperty } from '@nestjs/swagger'; import { ApiProperty } from '@nestjs/swagger';
export class OAuthAccessTokenEntity { export class OAuthSessionEntity {
@ApiProperty({ @ApiProperty({
example: 'cklwi0vb70000z2z20q6f19qk', example: 'cklwi0vb70000z2z20q6f19qk',
description: 'Unique ID of an OAuth token (auto-generated)', description: 'Unique ID of an OAuth token (auto-generated)',

View File

@ -0,0 +1,4 @@
import { PartialType } from "@nestjs/swagger";
import { CreateOauthSessionDto } from "./create-oauth-sessions.dto";
export class UpdateOauthSessionDto extends PartialType(CreateOauthSessionDto) {}

View File

@ -0,0 +1,10 @@
import { Module } from '@nestjs/common';
import { PrismaService } from 'src/prisma/prisma.service';
import { OauthSessionsController } from './controllers/oauth-sessions.controller';
import { OauthSessionsService } from './services/oauth-sessions.service';
@Module({
controllers: [OauthSessionsController],
providers: [OauthSessionsService, PrismaService]
})
export class OauthSessionsModule {}

View File

@ -1,30 +1,32 @@
import { Injectable, NotFoundException } from '@nestjs/common'; import { Injectable, NotFoundException } from '@nestjs/common';
import { PrismaService } from 'src/prisma/prisma.service'; import { PrismaService } from 'src/prisma/prisma.service';
import { CreateOauthAccessTokenDto } from '../dtos/create-oauth-access-token.dto'; import { CreateOauthSessionDto } from '../dtos/create-oauth-sessions.dto';
import { OAuthAccessTokens } from '@prisma/client'; import { OAuthSessions } from '@prisma/client';
import { UpdateOauthAccessTokenDto } from '../dtos/update-oauth-access-token.dto'; import { UpdateOauthSessionDto } from '../dtos/update-oauth-sessions.dto';
@Injectable() @Injectable()
export class OauthAccessTokensService { export class OauthSessionsService {
constructor(private readonly prisma: PrismaService) {} constructor(private readonly prisma: PrismaService) {}
async create(dto: CreateOauthAccessTokenDto): Promise<OAuthAccessTokens> { async create(dto: CreateOauthSessionDto): Promise<OAuthSessions> {
const { const {
user_id, user_id,
application, application,
access_token, access_token,
refresh_token, refresh_token,
sid,
access_token_expiry, access_token_expiry,
refresh_token_expiry, refresh_token_expiry,
scopes, scopes,
} = dto; } = dto;
return this.prisma.oAuthAccessTokens.create({ return this.prisma.oAuthSessions.create({
data: { data: {
user_id, user_id,
application, application,
access_token, access_token,
refresh_token, refresh_token,
sid,
access_token_expiry, access_token_expiry,
refresh_token_expiry, refresh_token_expiry,
scopes, scopes,
@ -33,14 +35,14 @@ export class OauthAccessTokensService {
}); });
} }
findAll(): Promise<OAuthAccessTokens[]> { findAll(): Promise<OAuthSessions[]> {
return this.prisma.oAuthAccessTokens.findMany({ return this.prisma.oAuthSessions.findMany({
include: { user: true }, include: { user: true },
}); });
} }
async findOne(id: string): Promise<OAuthAccessTokens> { async findOne(id: string): Promise<OAuthSessions> {
const token = await this.prisma.oAuthAccessTokens.findUnique({ const token = await this.prisma.oAuthSessions.findUnique({
where: { id }, where: { id },
include: { user: true }, include: { user: true },
}); });
@ -50,7 +52,7 @@ export class OauthAccessTokensService {
return token; return token;
} }
async update(id: string, dto: UpdateOauthAccessTokenDto): Promise<OAuthAccessTokens> { async update(id: string, dto: UpdateOauthSessionDto): Promise<OAuthSessions> {
await this.findOne(id); await this.findOne(id);
const { const {
user_id, user_id,
@ -62,7 +64,7 @@ export class OauthAccessTokensService {
scopes, scopes,
} = dto; } = dto;
return this.prisma.oAuthAccessTokens.update({ return this.prisma.oAuthSessions.update({
where: { id }, where: { id },
data: { data: {
...(user_id !== undefined && { user_id }), ...(user_id !== undefined && { user_id }),
@ -77,8 +79,8 @@ export class OauthAccessTokensService {
}); });
} }
async remove(id: string): Promise<OAuthAccessTokens> { async remove(id: string): Promise<OAuthSessions> {
await this.findOne(id); await this.findOne(id);
return this.prisma.oAuthAccessTokens.delete({ where: { id }}); return this.prisma.oAuthSessions.delete({ where: { id }});
} }
} }