diff --git a/backend/src/admin/admin.controller.ts b/backend/src/admin/admin.controller.ts index afb36de2..602ca29e 100644 --- a/backend/src/admin/admin.controller.ts +++ b/backend/src/admin/admin.controller.ts @@ -1,4 +1,4 @@ -import { Controller, Patch, Delete, Param, Body, ParseUUIDPipe, HttpCode, HttpStatus, UseGuards } from '@nestjs/common'; +import { Controller, Patch, Delete, Param, Body, ParseUUIDPipe, HttpCode, HttpStatus, UseGuards, Get } from '@nestjs/common'; import { UsersService } from '../users/providers/users.service'; import { UpdateUserDto } from '../users/dto/updateUser.dto'; import { RolesGuard } from '../auth/guards/roles.guard'; @@ -13,6 +13,30 @@ import { ApiTags, ApiBearerAuth } from '@nestjs/swagger'; export class AdminController { constructor(private readonly usersService: UsersService) {} + // GET /admin + @Get() + @Roles(UserRole.ADMIN) + async getAdmins() { + const admins = await this.usersService.findAllAdmins(); + return { + success: true, + message: 'Admins retrieved successfully', + data: admins, + }; + } + + // GET /admin/:id + @Get(':id') + @Roles(UserRole.ADMIN) + async getAdmin(@Param('id', ParseUUIDPipe) id: string) { + const admin = await this.usersService.findAdminById(id); + return { + success: true, + message: `Admin ${id} retrieved successfully`, + data: admin, + }; + } + // PATCH /admin/:id @Patch(':id') @Roles(UserRole.ADMIN) diff --git a/backend/src/users/providers/findAdminById.provider.ts b/backend/src/users/providers/findAdminById.provider.ts new file mode 100644 index 00000000..2f4019e8 --- /dev/null +++ b/backend/src/users/providers/findAdminById.provider.ts @@ -0,0 +1,33 @@ +import { Injectable, NotFoundException } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { User } from '../entities/user.entity'; +import { Repository } from 'typeorm'; +import { UserRole } from '../enums/userRoles.enum'; +import { ErrorCatch } from '../../utils/error'; + +@Injectable() +export class FindAdminByIdProvider { + constructor( + @InjectRepository(User) + private readonly usersRepository: Repository, + ) {} + + public async getAdmin(id: string): Promise { + try { + const admin = await this.usersRepository.findOne({ + where: { + id, + role: UserRole.ADMIN, + }, + }); + + if (!admin) { + throw new NotFoundException(`Admin with ID ${id} not found`); + } + + return admin; + } catch (error) { + ErrorCatch(error, 'Error retrieving admin details'); + } + } +} diff --git a/backend/src/users/providers/findAllAdmins.provider.ts b/backend/src/users/providers/findAllAdmins.provider.ts new file mode 100644 index 00000000..3361c9fe --- /dev/null +++ b/backend/src/users/providers/findAllAdmins.provider.ts @@ -0,0 +1,24 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { User } from '../entities/user.entity'; +import { UserRole } from '../enums/userRoles.enum'; +import { ErrorCatch } from '../../utils/error'; + +@Injectable() +export class FindAllAdminsProvider { + constructor( + @InjectRepository(User) + private readonly usersRepository: Repository, + ) {} + + async getAdmins(): Promise { + try { + return await this.usersRepository.find({ + where: { role: UserRole.ADMIN }, + }); + } catch (error) { + ErrorCatch(error, 'Error fetching admins'); + } + } +} diff --git a/backend/src/users/providers/users.service.ts b/backend/src/users/providers/users.service.ts index 1c374321..ce227417 100644 --- a/backend/src/users/providers/users.service.ts +++ b/backend/src/users/providers/users.service.ts @@ -18,6 +18,8 @@ import { UploadProfilePictureProvider } from './uploadProfilePicture.provider'; import { UserRole } from '../enums/userRoles.enum'; import { ForgotPasswordProvider } from './forgotPassword.provider'; import { ResetPasswordProvider } from './resetPassword.provider'; +import { FindAllAdminsProvider } from './findAllAdmins.provider'; +import { FindAdminByIdProvider } from './findAdminById.provider'; @Injectable() export class UsersService { @@ -38,6 +40,9 @@ export class UsersService { private readonly forgotPasswordProvider: ForgotPasswordProvider, private readonly resetPasswordProvider: ResetPasswordProvider, + + private readonly findAllAdminsProvider: FindAllAdminsProvider, + private readonly findAdminByIdProvider: FindAdminByIdProvider, ) {} // CREATE USER @@ -53,11 +58,21 @@ export class UsersService { return await this.findAllUsersProvider.getUsers(); } + // FIND ALL ADMINS + async findAllAdmins(): Promise { + return await this.findAllAdminsProvider.getAdmins(); + } + // FIND USER BY ID async findUserById(id: string): Promise { return await this.findOneUserByIdProvider.getUser(id); } + // FIND ADMIN BY ID + async findAdminById(id: string): Promise { + return await this.findAdminByIdProvider.getAdmin(id); + } + // FIND USER BY EMAIL async findUserByEmail(email: string): Promise { return await this.findOneUserByEmailProvider.getUser(email); diff --git a/backend/src/users/users.module.ts b/backend/src/users/users.module.ts index 1ef8e6cf..ea12f0fd 100644 --- a/backend/src/users/users.module.ts +++ b/backend/src/users/users.module.ts @@ -18,6 +18,8 @@ import { DeleteUserProvider } from './providers/deleteUser.provider'; import { UploadProfilePictureProvider } from './providers/uploadProfilePicture.provider'; import { ForgotPasswordProvider } from './providers/forgotPassword.provider'; import { ResetPasswordProvider } from './providers/resetPassword.provider'; +import { FindAllAdminsProvider } from './providers/findAllAdmins.provider'; +import { FindAdminByIdProvider } from './providers/findAdminById.provider'; @Module({ imports: [TypeOrmModule.forFeature([User]), forwardRef(() => AuthModule), CloudinaryModule, EmailModule], @@ -34,6 +36,8 @@ import { ResetPasswordProvider } from './providers/resetPassword.provider'; UploadProfilePictureProvider, ForgotPasswordProvider, ResetPasswordProvider, + FindAllAdminsProvider, + FindAdminByIdProvider, ], exports: [UsersService], })