diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index 8ae70dd..512f1b4 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -32,6 +32,7 @@ export class UsersController { @ApiOperation({ summary: 'Get all users (Admin only)' }) @ApiQuery({ name: 'page', required: false, type: Number }) @ApiQuery({ name: 'limit', required: false, type: Number }) + @ApiQuery({ name: 'role', required: false, enum: UserRole, description: 'Filter by user role' }) @ApiResponse({ status: 200, description: 'List of users', @@ -73,11 +74,12 @@ export class UsersController { async findAll( @Query('page') page?: string, @Query('limit') limit?: string, + @Query('role') role?: UserRole, ) { const pageNum = page ? parseInt(page, 10) : 1; const limitNum = limit ? parseInt(limit, 10) : 10; - return this.usersService.findAll(pageNum, limitNum); + return this.usersService.findAll(pageNum, limitNum, role); } @Get(':id') diff --git a/src/users/users.service.ts b/src/users/users.service.ts index a24b14e..55fff6a 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -1,52 +1,62 @@ import { Injectable } from '@nestjs/common'; -import { UserStatus, Prisma } from '@prisma/client'; +import { UserStatus, UserRole, Prisma } from '@prisma/client'; import { PrismaService } from '../prisma/prisma.service'; -type UserWithProfile = Prisma.UserGetPayload<{ - include: { userProfile: true }; +type UserWithProfiles = Prisma.UserGetPayload<{ + include: { userProfile: true; agentProfile: true }; }>; @Injectable() export class UsersService { constructor(private readonly prisma: PrismaService) {} - async findAll(page = 1, limit = 10) { + async findAll(page = 1, limit = 10, role?: UserRole) { const skip = (page - 1) * limit; + // Build where clause for optional role filter + const where: Prisma.UserWhereInput = role ? { role } : {}; + const [users, total] = await Promise.all([ this.prisma.user.findMany({ + where, skip, take: limit, orderBy: { createdAt: 'desc' }, include: { userProfile: true, + agentProfile: true, }, - }) as Promise, - this.prisma.user.count(), + }) as Promise, + this.prisma.user.count({ where }), ]); return { - users: users.map((user) => ({ - id: user.id, - email: user.email, - role: user.role, - status: user.status, - emailVerified: user.emailVerified, - authProvider: user.authProvider, - createdAt: user.createdAt, - lastLoginAt: user.lastLoginAt, - profile: user.userProfile - ? { - firstName: user.userProfile.firstName, - lastName: user.userProfile.lastName, - avatar: user.userProfile.avatar, - phone: user.userProfile.phone, - city: user.userProfile.city, - state: user.userProfile.state, - country: user.userProfile.country, - } - : null, - })), + users: users.map((user) => { + // Get the appropriate profile based on role + const profile = user.role === UserRole.AGENT ? user.agentProfile : user.userProfile; + + return { + id: user.id, + email: user.email, + role: user.role, + status: user.status, + emailVerified: user.emailVerified, + authProvider: user.authProvider, + createdAt: user.createdAt, + lastLoginAt: user.lastLoginAt, + profile: profile + ? { + firstName: profile.firstName, + lastName: profile.lastName, + avatar: profile.avatar, + phone: profile.phone, + city: profile.city, + state: profile.state, + country: profile.country, + } + : null, + }; + }), total, page, limit, @@ -59,13 +69,17 @@ export class UsersService { where: { id }, include: { userProfile: true, + agentProfile: true, }, - })) as UserWithProfile | null; + })) as UserWithProfiles | null; if (!user) { return null; } + // Get the appropriate profile based on role + const profile = user.role === UserRole.AGENT ? user.agentProfile : user.userProfile; + return { id: user.id, email: user.email, @@ -75,7 +89,17 @@ export class UsersService { authProvider: user.authProvider, createdAt: user.createdAt, lastLoginAt: user.lastLoginAt, - profile: user.userProfile, + profile: profile + ? { + firstName: profile.firstName, + lastName: profile.lastName, + avatar: profile.avatar, + phone: profile.phone, + city: profile.city, + state: profile.state, + country: profile.country, + } + : null, }; }