import { Body, Controller, Delete, Get, Param, Patch, Post, UseGuards, } from '@nestjs/common'; import { ApiBody, ApiCreatedResponse, ApiOkResponse, ApiTags, } from '@nestjs/swagger'; import { AdminOnlyMessage } from '../auth/admin-only-message.decorator'; import { AuthGuard } from '../auth/auth.guard'; import { AuthenticatedUser } from '../auth/auth.types'; import { CurrentUser } from '../auth/current-user.decorator'; import { PasswordChangeGuard } from '../auth/password-change.guard'; import { SuperAdminGuard } from '../auth/super-admin.guard'; import { ZodValidationPipe } from '../common/pipes/zod-validation.pipe'; import { CreateMemberDto, CreateMemberDtoInput, UpdateMemberPermissionsDto, UpdateMemberPermissionsInput, UpdateMemberStatusDto, UpdateMemberStatusInput, createMemberSchema, updateMemberPermissionsSchema, updateMemberStatusSchema, } from './member.dto'; import { MemberSummary } from './member.types'; import { MembersService } from './members.service'; @ApiTags('成员管理') @Controller('members') @UseGuards(AuthGuard, PasswordChangeGuard, SuperAdminGuard) @AdminOnlyMessage('无权限访问成员管理') export class MembersController { constructor(private readonly membersService: MembersService) {} @Get() @ApiOkResponse({ description: '查询成员列表和项目权限。' }) async listMembers(): Promise { return this.membersService.listMembers(); } @Post() @ApiBody({ type: CreateMemberDto }) @ApiCreatedResponse({ description: '创建普通成员,初始密码固定为 111111。' }) async createMember( @CurrentUser() user: AuthenticatedUser, @Body(new ZodValidationPipe(createMemberSchema)) body: CreateMemberDtoInput, ): Promise { return this.membersService.createMember(body, user); } @Patch(':id/permissions') @ApiBody({ type: UpdateMemberPermissionsDto }) @ApiOkResponse({ description: '更新普通成员的项目权限。' }) async updatePermissions( @Param('id') id: string, @CurrentUser() user: AuthenticatedUser, @Body(new ZodValidationPipe(updateMemberPermissionsSchema)) body: UpdateMemberPermissionsInput, ): Promise { return this.membersService.updatePermissions(id, body, user); } @Post(':id/reset-password') @ApiOkResponse({ description: '将普通成员密码重置为 111111,并要求下次登录改密。', }) async resetPassword( @Param('id') id: string, @CurrentUser() user: AuthenticatedUser, ): Promise { return this.membersService.resetPassword(id, user); } @Patch(':id/status') @ApiBody({ type: UpdateMemberStatusDto }) @ApiOkResponse({ description: '启用或禁用普通成员账号。' }) async updateStatus( @Param('id') id: string, @CurrentUser() user: AuthenticatedUser, @Body(new ZodValidationPipe(updateMemberStatusSchema)) body: UpdateMemberStatusInput, ): Promise { return this.membersService.updateStatus(id, body, user); } @Delete(':id') @ApiOkResponse({ description: '删除普通成员账号。' }) async deleteMember( @Param('id') id: string, @CurrentUser() user: AuthenticatedUser, ): Promise<{ message: string }> { return this.membersService.deleteMember(id, user); } }