diff --git a/src/modules/admin/controllers/role.controller.ts b/src/modules/admin/controllers/role.controller.ts index 9313d73..21e06f1 100644 --- a/src/modules/admin/controllers/role.controller.ts +++ b/src/modules/admin/controllers/role.controller.ts @@ -1,10 +1,13 @@ -import { Controller, Get, Post, Body, Param, Patch, Delete, Query } from '@nestjs/common'; -import { ApiTags, ApiOperation, ApiBody, ApiResponse } from '@nestjs/swagger'; +import { Controller, Get, Post, Body, Param, Patch, Delete, Query, UseGuards } from '@nestjs/common'; +import { ApiTags, ApiOperation, ApiBody, ApiResponse, ApiBearerAuth } from '@nestjs/swagger'; import { RoleService } from '../providers/role.service'; import { CreateRoleDto } from '../dto/create-role.dto'; import { UpdateRoleDto } from '../dto/update-role.dto'; import { FindRolesDto } from '../dto/find-roles.dto'; +import { AdminAuthGuard } from 'src/modules/auth/guards/adminAuth.guard'; +@UseGuards(AdminAuthGuard) +@ApiBearerAuth() @ApiTags('admin/roles') @Controller('admin/roles') export class RoleController { diff --git a/src/modules/auth/dto/request-otp.dto.ts b/src/modules/auth/dto/request-otp.dto.ts index 1c7e033..e2991b9 100644 --- a/src/modules/auth/dto/request-otp.dto.ts +++ b/src/modules/auth/dto/request-otp.dto.ts @@ -13,6 +13,6 @@ export class RequestOtpDto { @IsNotEmpty() @IsString() - @ApiProperty({ example: '', description: 'restaurant slug' }) + @ApiProperty({ example: 'zhivan', description: 'restaurant slug' }) slug: string; } diff --git a/src/modules/auth/dto/verify-otp.dto copy.ts b/src/modules/auth/dto/verify-otp.dto copy.ts index cf62671..d8de696 100644 --- a/src/modules/auth/dto/verify-otp.dto copy.ts +++ b/src/modules/auth/dto/verify-otp.dto copy.ts @@ -13,12 +13,12 @@ export class VerifyOtpDto { @IsNotEmpty() @IsString() - @ApiProperty({ example: '12345', description: 'Otp' }) + @ApiProperty({ example: '', description: 'Otp' }) @Length(5) otp: string; @IsNotEmpty() @IsString() - @ApiProperty({ example: '', description: 'restaurant slug' }) + @ApiProperty({ example: 'zhivan', description: 'restaurant slug' }) slug: string; } diff --git a/src/modules/auth/services/auth.service.ts b/src/modules/auth/services/auth.service.ts index 1875ba0..5ba9d00 100644 --- a/src/modules/auth/services/auth.service.ts +++ b/src/modules/auth/services/auth.service.ts @@ -8,6 +8,8 @@ import { TokensService } from './tokens.service'; import { RestRepository } from 'src/modules/restaurants/repositories/rest.repository'; import { AuthMessage, RestMessage } from 'src/common/enums/message.enum'; import { AdminRepository } from 'src/modules/admin/repositories/rest.repository'; +import { AdminLoginTransformer } from '../transformers/admin-login.transformer'; +import { UserLoginTransformer } from '../transformers/user-login.transformer'; @Injectable() export class AuthService { @@ -67,7 +69,9 @@ export class AuthService { const tokens = await this.tokensService.generateTokens(user.id, rest); - return { tokens, user }; + const userResponse = UserLoginTransformer.transform(user, rest); + + return { tokens, user: userResponse }; } async verifyOtpAdmin(phone: string, slug: string, code: string) { @@ -93,13 +97,9 @@ export class AuthService { const tokens = await this.tokensService.generateTokensAdmin(admin, rest); - await this.cacheService.set( - `${this.ADMIN_PERMISSIONS_KEY}:${admin.id}:${rest.id}`, - JSON.stringify(admin.role.permissions), - 3600, - ); + const adminResponse = await AdminLoginTransformer.transform(admin, rest); - return { tokens, admin }; + return { tokens, admin: adminResponse }; } private generateOtpCode(): string { diff --git a/src/modules/auth/transformers/admin-login.transformer.ts b/src/modules/auth/transformers/admin-login.transformer.ts new file mode 100644 index 0000000..d30216b --- /dev/null +++ b/src/modules/auth/transformers/admin-login.transformer.ts @@ -0,0 +1,50 @@ +import type { Admin } from '../../admin/entities/admin.entity'; +import type { Restaurant } from '../../restaurants/entities/restaurant.entity'; + +export interface AdminLoginResponse { + id: string; + firstName?: string; + lastName?: string; + phone: string; + role: string; + permissions: string[]; + restaurant?: { + id: string; + name: string; + slug: string; + }; +} + +export class AdminLoginTransformer { + static async transform(admin: Admin, restaurant?: Restaurant): Promise { + // Extract role name + const role = admin.role?.name || ''; + + // Extract permissions - ensure collection is loaded if needed + let permissions: string[] = []; + if (admin.role?.permissions) { + if (admin.role.permissions.isInitialized()) { + permissions = admin.role.permissions.getItems().map(p => p.name); + } else { + await admin.role.permissions.loadItems(); + permissions = admin.role.permissions.getItems().map(p => p.name); + } + } + + return { + id: admin.id, + firstName: admin.firstName, + lastName: admin.lastName, + phone: admin.phone, + role, + permissions, + restaurant: restaurant + ? { + id: restaurant.id, + name: restaurant.name, + slug: restaurant.slug, + } + : undefined, + }; + } +} diff --git a/src/modules/auth/transformers/user-login.transformer.ts b/src/modules/auth/transformers/user-login.transformer.ts new file mode 100644 index 0000000..9b83791 --- /dev/null +++ b/src/modules/auth/transformers/user-login.transformer.ts @@ -0,0 +1,37 @@ +import { User } from '../../users/entities/user.entity'; +import { Restaurant } from '../../restaurants/entities/restaurant.entity'; + +export interface UserLoginResponse { + id: string; + firstName: string; + lastName?: string; + phone: string; + wallet: number; + points: number; + isActive?: boolean; + restaurant: { + id: string; + name: string; + slug: string; + }; +} + +export class UserLoginTransformer { + static transform(user: User, restaurant: Restaurant): UserLoginResponse { + return { + id: user.id, + firstName: user.firstName, + lastName: user.lastName, + phone: user.phone, + wallet: user.wallet, + points: user.points, + isActive: user.isActive, + restaurant: { + id: restaurant.id, + name: restaurant.name, + slug: restaurant.slug, + }, + }; + } +} +