admin appPermissions
ci/woodpecker/push/woodpecker Pipeline was successful

This commit is contained in:
2026-07-09 09:07:03 +09:00
parent beb9dda8c6
commit eb79bddcc0
6 changed files with 127 additions and 2 deletions
+53
View File
@@ -9,6 +9,7 @@ import {
CreateAdminSshKeyDto,
CreateAdminDto,
ResetAdminPasswordDto,
UpdateAdminAppPermissionsDto,
UpdateAdminRoleDto,
UpdateAdminStatusDto,
} from './dto';
@@ -63,6 +64,9 @@ export class AdminsService {
orderBy: { createdAt: 'desc' },
select: adminSshKeySelect,
},
appPermissions: {
select: { appId: true },
},
},
});
}
@@ -132,6 +136,55 @@ export class AdminsService {
return { admin };
}
async listAppPermissions(id: string) {
await this.ensureExists(id);
const permissions = await this.prisma.adminAppPermission.findMany({
where: { adminId: id },
orderBy: { createdAt: 'asc' },
select: { appId: true },
});
return { appIds: permissions.map((permission) => permission.appId) };
}
async updateAppPermissions(id: string, body: UpdateAdminAppPermissionsDto) {
const admin = await this.prisma.admin.findUnique({
where: { id },
select: { id: true, role: true },
});
if (!admin) {
throw new NotFoundException('관리자를 찾을 수 없습니다.');
}
if (admin.role === AdminRole.OWNER) {
throw new BadRequestException('오너 권한은 앱 권한을 개별 설정하지 않습니다.');
}
const appIds = [...new Set(body.appIds.filter(Boolean))];
const existingApps = await this.prisma.app.findMany({
where: { id: { in: appIds } },
select: { id: true },
});
const existingAppIds = new Set(existingApps.map((app) => app.id));
const validAppIds = appIds.filter((appId) => existingAppIds.has(appId));
await this.prisma.$transaction([
this.prisma.adminAppPermission.deleteMany({ where: { adminId: id } }),
...(validAppIds.length
? [
this.prisma.adminAppPermission.createMany({
data: validAppIds.map((appId) => ({ adminId: id, appId })),
skipDuplicates: true,
}),
]
: []),
]);
return { appIds: validAppIds };
}
async createSshKey(adminId: string, body: CreateAdminSshKeyDto) {
await this.ensureExists(adminId);