Files
devops-platform-api/src/members/members.controller.ts
T
湛兮 bc3aa31289 feat: 接入真实登录与成员权限
- auth/members/messages: 新增超级管理员登录、成员权限和密码消息流程
- agent-config/agent: 支持服务端保存 Agent 配置并取消未配置 mock 成功结果
- projects/deploy-runs/settings: 按当前用户权限保护真实接口
- prisma: 新增用户、项目权限和平台消息表结构
2026-06-12 00:38:23 +08:00

106 lines
3.3 KiB
TypeScript

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<MemberSummary[]> {
return this.membersService.listMembers();
}
@Post()
@ApiBody({ type: CreateMemberDto })
@ApiCreatedResponse({ description: '创建普通成员,初始密码固定为 111111。' })
async createMember(
@CurrentUser() user: AuthenticatedUser,
@Body(new ZodValidationPipe(createMemberSchema))
body: CreateMemberDtoInput,
): Promise<MemberSummary> {
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<MemberSummary> {
return this.membersService.updatePermissions(id, body, user);
}
@Post(':id/reset-password')
@ApiOkResponse({
description: '将普通成员密码重置为 111111,并要求下次登录改密。',
})
async resetPassword(
@Param('id') id: string,
@CurrentUser() user: AuthenticatedUser,
): Promise<MemberSummary> {
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<MemberSummary> {
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);
}
}