From de34d7709b010695cddff2abeab872ff74f4e528 Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Mon, 9 Feb 2026 11:20:55 +0330 Subject: [PATCH] auth --- src/modules/auth/guards/adminAuth.guard.ts | 12 ++++++------ src/modules/auth/guards/auth.guard.ts | 6 +++--- src/modules/auth/guards/optinalAuth.guard.ts | 6 +++--- src/modules/auth/interfaces/IToken-payload.ts | 4 ++-- src/modules/auth/services/tokens.service.ts | 8 ++++---- .../notifications/guards/ws-admin-auth.guard.ts | 6 +++--- src/modules/roles/controllers/roles.controller.ts | 5 +++-- src/modules/roles/providers/permissions.service.ts | 13 ++----------- 8 files changed, 26 insertions(+), 34 deletions(-) diff --git a/src/modules/auth/guards/adminAuth.guard.ts b/src/modules/auth/guards/adminAuth.guard.ts index 1683ea9..9e48cf8 100644 --- a/src/modules/auth/guards/adminAuth.guard.ts +++ b/src/modules/auth/guards/adminAuth.guard.ts @@ -17,7 +17,7 @@ import { PermissionsService } from 'src/modules/roles/providers/permissions.serv export interface AdminAuthRequest extends Request { adminId: string; - restId: string; + shopId: string; } @Injectable() @@ -55,13 +55,13 @@ export class AdminAuthGuard implements CanActivate { secret, }); - if (!payload.adminId || !payload.restId) { + if (!payload.adminId || !payload.shopId) { this.logger.error('Invalid token payload structure', payload); throw new UnauthorizedException('Invalid token payload'); } request['adminId'] = payload.adminId; - request['restId'] = payload.restId; + request['shopId'] = payload.shopId; // check if the user has the required permissions const requiredPermissions = @@ -71,9 +71,9 @@ export class AdminAuthGuard implements CanActivate { return true; } - const adminPermission = await this.permissionsService.getAdminPermissions(payload.adminId, payload.restId); + const adminPermission = await this.permissionsService.getAdminPermissions(payload.adminId, payload.shopId); if (!adminPermission || !Array.isArray(adminPermission)) { - this.logger.error('No permissions found', { adminId: payload.adminId, restId: payload.restId }); + this.logger.error('No permissions found', { adminId: payload.adminId, shopId: payload.shopId }); throw new ForbiddenException('No permissions found'); } @@ -82,7 +82,7 @@ export class AdminAuthGuard implements CanActivate { if (!hasPermission) { this.logger.warn('Insufficient permissions', { adminId: payload.adminId, - restId: payload.restId, + restId: payload.shopId, required: requiredPermissions, has: adminPermission, }); diff --git a/src/modules/auth/guards/auth.guard.ts b/src/modules/auth/guards/auth.guard.ts index c600f6d..717d0a9 100644 --- a/src/modules/auth/guards/auth.guard.ts +++ b/src/modules/auth/guards/auth.guard.ts @@ -6,7 +6,7 @@ import { ITokenPayload } from '../interfaces/IToken-payload'; export interface UserAuthRequest extends Request { userId: string; - restId: string; + shopId: string; } @Injectable() @@ -38,7 +38,7 @@ export class AuthGuard implements CanActivate { const payload = await this.jwtService.verifyAsync(token, { secret, }); - if (!payload.userId || !payload.restId) { + if (!payload.userId || !payload.shopId) { this.logger.error('Invalid token payload structure', payload); throw new UnauthorizedException('Invalid token payload'); } @@ -46,7 +46,7 @@ export class AuthGuard implements CanActivate { throw new UnauthorizedException('Invalid slug'); } request['userId'] = payload.userId; - request['restId'] = payload.restId; + request['shopId'] = payload.shopId; } catch { throw new UnauthorizedException(); } diff --git a/src/modules/auth/guards/optinalAuth.guard.ts b/src/modules/auth/guards/optinalAuth.guard.ts index 2cb712b..94eaf69 100644 --- a/src/modules/auth/guards/optinalAuth.guard.ts +++ b/src/modules/auth/guards/optinalAuth.guard.ts @@ -6,7 +6,7 @@ import { ITokenPayload } from '../interfaces/IToken-payload'; export interface UserOptionalAuthRequest extends Request { userId?: string; - restId?: string; + shopId?: string; slug?: string; } @@ -45,7 +45,7 @@ export class OptionalAuthGuard implements CanActivate { }); // Validate payload structure - if (!payload.userId || !payload.restId) { + if (!payload.userId || !payload.shopId) { this.logger.warn('Invalid token payload structure', payload); // Allow request but don't set user info request['slug'] = slug; @@ -65,7 +65,7 @@ export class OptionalAuthGuard implements CanActivate { // Token is valid, set user info request['userId'] = payload.userId; - request['restId'] = payload.restId; + request['shopId'] = payload.shopId; request['slug'] = slug; return true; } catch (err) { diff --git a/src/modules/auth/interfaces/IToken-payload.ts b/src/modules/auth/interfaces/IToken-payload.ts index 457b2ca..7d7da0e 100755 --- a/src/modules/auth/interfaces/IToken-payload.ts +++ b/src/modules/auth/interfaces/IToken-payload.ts @@ -1,10 +1,10 @@ export interface ITokenPayload { userId: string; - restId: string; + shopId: string; slug: string; } export interface IAdminTokenPayload { adminId: string; - restId: string; + shopId: string; } diff --git a/src/modules/auth/services/tokens.service.ts b/src/modules/auth/services/tokens.service.ts index a59dfb7..36b9a6c 100755 --- a/src/modules/auth/services/tokens.service.ts +++ b/src/modules/auth/services/tokens.service.ts @@ -22,7 +22,7 @@ export class TokensService { async generateAccessAndRefreshToken( ownerId: string, - restaurantId: string, + shopId: string, isAdmin: boolean, slug: string, em?: EntityManager, @@ -31,15 +31,15 @@ export class TokensService { const accessExpire = this.configService.getOrThrow('JWT_EXPIRATION_TIME'); const payload: ITokenPayload | IAdminTokenPayload = isAdmin - ? { adminId: ownerId, restId: restaurantId } - : { userId: ownerId, restId: restaurantId, slug }; + ? { adminId: ownerId, shopId: shopId } + : { userId: ownerId, shopId: shopId, slug }; const accessToken = await this.generateAccessToken(payload, accessExpire); const refreshToken = this.generateRefreshToken(); const type = isAdmin ? RefreshTokenType.ADMIN : RefreshTokenType.USER; // Only pass em if it's a transaction manager (not this.em), otherwise pass undefined to trigger flush - await this.storeRefreshToken(ownerId, restaurantId, refreshToken, type, em); + await this.storeRefreshToken(ownerId, shopId, refreshToken, type, em); return { accessToken: { token: accessToken, expire: dayjs().add(accessExpire, 'seconds').valueOf() }, diff --git a/src/modules/notifications/guards/ws-admin-auth.guard.ts b/src/modules/notifications/guards/ws-admin-auth.guard.ts index 296e004..e13c6b8 100644 --- a/src/modules/notifications/guards/ws-admin-auth.guard.ts +++ b/src/modules/notifications/guards/ws-admin-auth.guard.ts @@ -41,16 +41,16 @@ export class WsAdminAuthGuard implements CanActivate { secret, }); - if (!payload.adminId || !payload.restId) { + if (!payload.adminId || !payload.shopId) { this.logger.error('Invalid token payload structure', payload); throw new WsException('Invalid token payload'); } // Attach admin info to socket (client as AuthenticatedSocket).adminId = payload.adminId; - (client as AuthenticatedSocket).restId = payload.restId; + (client as AuthenticatedSocket).restId = payload.shopId; - this.logger.log(`Admin authenticated via WebSocket: ${payload.adminId}, restId: ${payload.restId}`); + this.logger.log(`Admin authenticated via WebSocket: ${payload.adminId}, restId: ${payload.shopId}`); return true; } catch (error) { diff --git a/src/modules/roles/controllers/roles.controller.ts b/src/modules/roles/controllers/roles.controller.ts index 0ee8815..dbfe4a0 100644 --- a/src/modules/roles/controllers/roles.controller.ts +++ b/src/modules/roles/controllers/roles.controller.ts @@ -32,10 +32,11 @@ export class RolesController { @Get('admin/roles/permissions') @UseGuards(AdminAuthGuard) - @Permissions(Permission.MANAGE_ROLES) + // @Permissions(Permission.MANAGE_ROLES) @ApiBearerAuth() - @ApiOperation({ summary: 'Get all permissions that the admin has' }) + @ApiOperation({ summary: 'Get all Admin permissions ' }) async findAllPermissions(@AdminId() adminId: string, @ShopId() restId: string) { + console.log(adminId, restId) const adminPermissionNames = await this.permissionService.getAdminFullPermissions(adminId, restId); return adminPermissionNames; diff --git a/src/modules/roles/providers/permissions.service.ts b/src/modules/roles/providers/permissions.service.ts index 42b54d5..1556924 100644 --- a/src/modules/roles/providers/permissions.service.ts +++ b/src/modules/roles/providers/permissions.service.ts @@ -23,12 +23,7 @@ export class PermissionsService { return permissions; } - /** - * Get admin permissions from cache or database - * @param adminId - The admin ID - * @param restId - The shop ID - * @returns Array of permission names (string[]) - */ + async getAdminPermissions(adminId: string, restId: string): Promise { const cacheKey = `${this.ADMIN_PERMISSIONS_KEY}:${adminId}:${restId}`; @@ -93,11 +88,7 @@ export class PermissionsService { return listOfPermissions.map(permission => permission); } - /** - * Invalidate admin permissions cache - * @param adminId - The admin ID - * @param restId - The shop ID - */ + async invalidateAdminPermissionsCache(adminId: string, restId: string): Promise { const cacheKey = `${this.ADMIN_PERMISSIONS_KEY}:${adminId}:${restId}`; await this.cacheService.del(cacheKey);