diff --git a/tone-page-server/src/admin/admin.module.ts b/tone-page-server/src/admin/admin.module.ts index 776f7bc..c745417 100644 --- a/tone-page-server/src/admin/admin.module.ts +++ b/tone-page-server/src/admin/admin.module.ts @@ -5,10 +5,6 @@ import { TypeOrmModule } from '@nestjs/typeorm'; import { User } from 'src/user/entities/user.entity'; import { UserModule } from 'src/user/user.module'; import { RoleModule } from 'src/role/role.module'; -import { AdminRoleController } from './controller/admin-role.controller'; -import { AdminPermissionController } from './controller/admin-permission.controller'; -import { AdminRolePermissionController } from './controller/admin-role-permission.controller'; -import { AdminUserRoleController } from './controller/admin-user-role.controller'; import { AdminWebResourceController } from './controller/web/admin-web-resource.controller'; import { AdminWebBlogController } from './controller/web/admin-web-blog.controller'; import { ResourceModule } from 'src/resource/resource.module'; @@ -25,10 +21,6 @@ import { BlogModule } from 'src/blog/blog.module'; controllers: [ AdminController, AdminUserController, - AdminRoleController, - AdminPermissionController, - AdminRolePermissionController, - AdminUserRoleController, AdminWebResourceController, AdminWebBlogController, ], diff --git a/tone-page-server/src/admin/controller/admin-permission.controller.ts b/tone-page-server/src/admin/controller/admin-permission.controller.ts deleted file mode 100644 index eef3234..0000000 --- a/tone-page-server/src/admin/controller/admin-permission.controller.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { - Body, - Controller, - Delete, - Get, - Param, - ParseUUIDPipe, - Post, -} from '@nestjs/common'; -import { PermissionService } from 'src/role/services/permission.service'; -import { CreatePermissionDto } from '../dto/admin-permission/create-permission.dto'; - -@Controller('admin/permission') -export class AdminPermissionController { - constructor(private readonly permissionService: PermissionService) {} - - @Get() - async list() { - return this.permissionService.list(); - } - - @Post() - async create(@Body() dto: CreatePermissionDto) { - return this.permissionService.create(dto); - } - - @Delete(':id') - async delete(@Param('id', new ParseUUIDPipe({ version: '4' })) id: string) { - return this.permissionService.delete(id); - } -} diff --git a/tone-page-server/src/admin/controller/admin-role-permission.controller.ts b/tone-page-server/src/admin/controller/admin-role-permission.controller.ts deleted file mode 100644 index 3dc224c..0000000 --- a/tone-page-server/src/admin/controller/admin-role-permission.controller.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { - Body, - Controller, - Delete, - Get, - Param, - ParseUUIDPipe, - Post, -} from '@nestjs/common'; -import { PermissionService } from 'src/role/services/permission.service'; -import { RolePermissionService } from 'src/role/services/role-permission.service'; -import { SetRolePermissionsDto } from '../dto/admin-role-permission/set-role-permissions.dto'; - -@Controller('admin/roles/:roleId/permission') -export class AdminRolePermissionController { - constructor( - private readonly rolePermissionService: RolePermissionService, - private readonly permissionService: PermissionService, - ) {} - - @Get() - async getRolePermissions( - @Param('roleId', new ParseUUIDPipe({ version: '4' })) roleId: string, - ) { - const permissionIds = - await this.rolePermissionService.findPermissionIdsByRoleIds([roleId]); - return await this.permissionService.findPermissionByIds(permissionIds); - } - - @Post() - async setRolePermissions( - @Param('roleId', new ParseUUIDPipe({ version: '4' })) roleId: string, - @Body() dto: SetRolePermissionsDto, - ) { - return await this.rolePermissionService.addRolePermissions( - roleId, - dto.permissionIds, - ); - } - - @Delete() - async DeleteRolePermissionsDto( - @Param('roleId', new ParseUUIDPipe({ version: '4' })) roleId: string, - @Body() dto: SetRolePermissionsDto, - ) { - return await this.rolePermissionService.deleteRolePermissions( - roleId, - dto.permissionIds, - ); - } -} diff --git a/tone-page-server/src/admin/controller/admin-role.controller.ts b/tone-page-server/src/admin/controller/admin-role.controller.ts deleted file mode 100644 index 627975e..0000000 --- a/tone-page-server/src/admin/controller/admin-role.controller.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { - Body, - Controller, - Delete, - Get, - Param, - ParseUUIDPipe, - Post, -} from '@nestjs/common'; -import { RoleService } from 'src/role/services/role.service'; -import { CreateRoleDto } from '../dto/admin-role/create-role.dto'; - -@Controller('admin/role') -export class AdminRoleController { - constructor(private readonly roleService: RoleService) {} - - @Get() - async list() { - return this.roleService.list(); - } - - @Post() - async create(@Body() dto: CreateRoleDto) { - return this.roleService.create(dto); - } - - @Delete(':id') - async delete(@Param('id', new ParseUUIDPipe({ version: '4' })) id: string) { - return this.roleService.delete(id); - } -} diff --git a/tone-page-server/src/admin/controller/admin-user-role.controller.ts b/tone-page-server/src/admin/controller/admin-user-role.controller.ts deleted file mode 100644 index 2978913..0000000 --- a/tone-page-server/src/admin/controller/admin-user-role.controller.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { - Body, - Controller, - Delete, - Get, - Param, - ParseUUIDPipe, - Post, -} from '@nestjs/common'; -import { RoleService } from 'src/role/services/role.service'; -import { UserRoleService } from 'src/role/services/user-role.service'; -import { CreateUserRoleDto } from '../dto/admin-user-role/create-user-role.dto'; -import { DeleteUserRoleDto } from '../dto/admin-user-role/delete-user-role.dto'; - -@Controller('admin/users/:userId/role') -export class AdminUserRoleController { - constructor( - private readonly userRoleService: UserRoleService, - private readonly roleService: RoleService, - ) {} - - @Get() - async getUserRoles( - @Param('userId', new ParseUUIDPipe({ version: '4' })) userId: string, - ) { - const userRoleIds = await this.userRoleService.findRoleIdsByUserId(userId); - return await this.roleService.findRolesByRoleIds(userRoleIds); - } - - @Post() - async setUserRoles( - @Param('userId', new ParseUUIDPipe({ version: '4' })) userId: string, - @Body() dto: CreateUserRoleDto, - ) { - return this.userRoleService.addUserRole({ - userId, - roleId: dto.roleId, - isEnabled: dto.isEnabled, - expiredAt: dto.expiredAt, - }); - } - - @Delete() - async deleteUserRoles( - @Param('userId', new ParseUUIDPipe({ version: '4' })) userId: string, - @Body() dto: DeleteUserRoleDto, - ) { - return this.userRoleService.deleteUserRole(userId, dto.roleId); - } -} diff --git a/tone-page-server/src/common/guard/permission.guard.ts b/tone-page-server/src/common/guard/permission.guard.ts deleted file mode 100644 index eccf67c..0000000 --- a/tone-page-server/src/common/guard/permission.guard.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common'; -import { Reflector } from '@nestjs/core'; -import { PermissionService } from 'src/role/services/permission.service'; -import { RolePermissionService } from 'src/role/services/role-permission.service'; -import { UserRoleService } from 'src/role/services/user-role.service'; - -@Injectable() -export class PermissionGuard implements CanActivate { - constructor( - private reflector: Reflector, - private readonly userRoleService: UserRoleService, - private readonly rolePermissionService: RolePermissionService, - private readonly permissionService: PermissionService, - ) {} - - async canActivate(context: ExecutionContext): Promise { - const requiredPermissions = this.reflector.getAllAndOverride( - 'permissions', - [context.getHandler(), context.getClass()], - ); - - if (!requiredPermissions) return true; - - const request = context.switchToHttp().getRequest(); - const userId = request.user?.userId; - - if (!userId) return false; - - // 查询用户拥有的有效角色ID - const userRoleIds = - await this.userRoleService.findValidRoleIdsByUserId(userId); - - // 查询用户拥有的有效角色ID对应的权限ID - const userPermissionIds = - await this.rolePermissionService.findPermissionIdsByRoleIds(userRoleIds); - - // 查询用户拥有的权限ID对应的权限名 - const userPermissionNames = - await this.permissionService.findPermissionNamesByPermissionIds( - userPermissionIds, - ); - - return requiredPermissions.every((permission) => - userPermissionNames.includes(permission), - ); - } -} diff --git a/tone-page-server/src/common/guard/roles.guard.ts b/tone-page-server/src/common/guard/roles.guard.ts index 1fac9e6..648d866 100644 --- a/tone-page-server/src/common/guard/roles.guard.ts +++ b/tone-page-server/src/common/guard/roles.guard.ts @@ -1,15 +1,11 @@ -import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common'; +import { CanActivate, ExecutionContext, Injectable, RequestTimeoutException } from '@nestjs/common'; import { Reflector } from '@nestjs/core'; -import { RoleService } from 'src/role/services/role.service'; -import { UserRoleService } from 'src/role/services/user-role.service'; @Injectable() export class RolesGuard implements CanActivate { constructor( private reflector: Reflector, - private readonly userRoleService: UserRoleService, - private readonly roleService: RoleService, - ) {} + ) { } async canActivate(context: ExecutionContext): Promise { const requiredRoles = this.reflector.getAllAndOverride('roles', [ @@ -24,14 +20,9 @@ export class RolesGuard implements CanActivate { if (!userId) return false; - // 查询用户拥有的有效角色Id - const userRoleIds = - await this.userRoleService.findValidRoleIdsByUserId(userId); + // 查询用户拥有的有效角色Id TODO - // 查询用户角色Id对应的角色名 - const userRoleNames = - await this.roleService.findRoleNamesByRoleIds(userRoleIds); - - return requiredRoles.some((role) => userRoleNames.includes(role)); + // return requiredRoles.some((role) => userRoleNames.includes(role)); + return false; } } diff --git a/tone-page-server/src/role/entities/permission.entity.ts b/tone-page-server/src/role/entities/permission.entity.ts deleted file mode 100644 index 104d7fe..0000000 --- a/tone-page-server/src/role/entities/permission.entity.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'; - -@Entity() -export class Permission { - @PrimaryGeneratedColumn('uuid') - id: string; - - @Column({ unique: true }) - name: string; - - @Column() - description: string; -} diff --git a/tone-page-server/src/role/entities/role-permission.entity.ts b/tone-page-server/src/role/entities/role-permission.entity.ts deleted file mode 100644 index 4bab1ed..0000000 --- a/tone-page-server/src/role/entities/role-permission.entity.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Entity, Index, PrimaryColumn } from 'typeorm'; - -@Entity() -@Index(['roleId', 'permissionId'], { unique: true }) -export class RolePermission { - @PrimaryColumn('uuid') - roleId: string; - - @PrimaryColumn('uuid') - permissionId: string; -} diff --git a/tone-page-server/src/role/entities/role.entity.ts b/tone-page-server/src/role/entities/role.entity.ts deleted file mode 100644 index 60a5fe6..0000000 --- a/tone-page-server/src/role/entities/role.entity.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'; - -@Entity() -export class Role { - @PrimaryGeneratedColumn('uuid') - id: string; - - @Column({ unique: true }) - name: string; - - @Column() - localName: string; -} diff --git a/tone-page-server/src/role/entities/user-role.entity.ts b/tone-page-server/src/role/entities/user-role.entity.ts deleted file mode 100644 index 6b126b4..0000000 --- a/tone-page-server/src/role/entities/user-role.entity.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { - Column, - CreateDateColumn, - Entity, - Index, - PrimaryGeneratedColumn, -} from 'typeorm'; - -@Entity() -@Index(['userId', 'roleId']) -export class UserRole { - @PrimaryGeneratedColumn('uuid') - id: string; - - @Column('uuid') - roleId: string; - - @Column('uuid') - userId: string; - - @Column() - isEnabled: boolean; - - @CreateDateColumn({ precision: 3 }) - createdAt: Date; - - @Column({ nullable: true, precision: 3 }) - expiredAt?: Date; -} diff --git a/tone-page-server/src/role/role.module.ts b/tone-page-server/src/role/role.module.ts index e21a29d..947d777 100644 --- a/tone-page-server/src/role/role.module.ts +++ b/tone-page-server/src/role/role.module.ts @@ -1,29 +1,10 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { Role } from './entities/role.entity'; -import { Permission } from './entities/permission.entity'; -import { RolePermission } from './entities/role-permission.entity'; -import { RolePermissionService } from './services/role-permission.service'; -import { RoleService } from './services/role.service'; -import { UserRoleService } from './services/user-role.service'; -import { UserRole } from './entities/user-role.entity'; -import { PermissionService } from './services/permission.service'; - @Module({ imports: [ - TypeOrmModule.forFeature([Role, Permission, RolePermission, UserRole]), - ], - providers: [ - RolePermissionService, - RoleService, - UserRoleService, - PermissionService, - ], - exports: [ - RolePermissionService, - RoleService, - UserRoleService, - PermissionService, + TypeOrmModule.forFeature([]), ], + providers: [], + exports: [], }) export class RoleModule {} diff --git a/tone-page-server/src/role/services/permission.service.ts b/tone-page-server/src/role/services/permission.service.ts deleted file mode 100644 index 20dee22..0000000 --- a/tone-page-server/src/role/services/permission.service.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { BadRequestException, Injectable } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; -import { Permission } from '../entities/permission.entity'; -import { In, Repository } from 'typeorm'; - -@Injectable() -export class PermissionService { - constructor( - @InjectRepository(Permission) - private readonly permissionRepository: Repository, - ) {} - - async findPermissionNamesByPermissionIds( - permissionIds: string[], - ): Promise { - const permissions = - await this.findPermissionsByPermissionIds(permissionIds); - return permissions.map((permission) => permission.name); - } - - async findPermissionsByPermissionIds( - permissionIds: string[], - ): Promise { - return this.permissionRepository.find({ - where: { - id: In(permissionIds), - }, - }); - } - - async findPermissionByIds(permissionIds: string[]): Promise { - return this.permissionRepository.find({ - where: { - id: In(permissionIds), - }, - }); - } - - async list() { - return this.permissionRepository.find(); - } - - async create( - permission: Pick, - ): Promise { - const newPermission = this.permissionRepository.create(permission); - return this.permissionRepository.save(newPermission); - } - - async delete(permissionId: string): Promise { - const existingPermission = await this.permissionRepository.findOne({ - where: { id: permissionId }, - }); - if (!existingPermission) { - throw new BadRequestException('Permission not found'); - } - await this.permissionRepository.delete(existingPermission.id); - } -} diff --git a/tone-page-server/src/role/services/role-permission.service.ts b/tone-page-server/src/role/services/role-permission.service.ts deleted file mode 100644 index 8036e22..0000000 --- a/tone-page-server/src/role/services/role-permission.service.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; -import { RolePermission } from '../entities/role-permission.entity'; -import { In, Repository } from 'typeorm'; - -@Injectable() -export class RolePermissionService { - constructor( - @InjectRepository(RolePermission) - private readonly rolePermissionRepository: Repository, - ) {} - - async findPermissionIdsByRoleIds(roleIds: string[]): Promise { - const rolePermissions = await this.rolePermissionRepository.find({ - where: { - roleId: In(roleIds), - }, - }); - - return rolePermissions.map((rp) => rp.permissionId); - } - - async addRolePermissions( - roleId: string, - permissionIds: string[], - ): Promise { - const rolePermissions = permissionIds.map((permissionId) => { - const rolePermission = this.rolePermissionRepository.create({ - roleId, - permissionId, - }); - return rolePermission; - }); - - await this.rolePermissionRepository.save(rolePermissions); - } - - async deleteRolePermissions( - roleId: string, - permissionIds: string[], - ): Promise { - await this.rolePermissionRepository.delete({ - roleId, - permissionId: In(permissionIds), - }); - } -} diff --git a/tone-page-server/src/role/services/role.service.ts b/tone-page-server/src/role/services/role.service.ts deleted file mode 100644 index b1d807e..0000000 --- a/tone-page-server/src/role/services/role.service.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { BadRequestException, Injectable } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; -import { Role } from '../entities/role.entity'; -import { In, Repository } from 'typeorm'; - -@Injectable() -export class RoleService { - constructor( - @InjectRepository(Role) - private readonly roleRepository: Repository, - ) {} - - async findRoleNamesByRoleIds(roleIds: string[]): Promise { - const roles = await this.findRolesByRoleIds(roleIds); - return roles.map((role) => role.name); - } - - async findRolesByRoleIds(roleIds: string[]): Promise { - return this.roleRepository.find({ - where: { - id: In(roleIds), - }, - }); - } - - async create(role: Pick): Promise { - const newRole = this.roleRepository.create(role); - return this.roleRepository.save(newRole); - } - - async list(): Promise { - return this.roleRepository.find(); - } - - async delete(roleId: string): Promise { - const existingRole = await this.roleRepository.findOne({ - where: { id: roleId }, - }); - if (!existingRole) { - throw new BadRequestException('Role not found'); - } - await this.roleRepository.delete(existingRole.id); - } -} diff --git a/tone-page-server/src/role/services/user-role.service.ts b/tone-page-server/src/role/services/user-role.service.ts deleted file mode 100644 index b3317bc..0000000 --- a/tone-page-server/src/role/services/user-role.service.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; -import { UserRole } from 'src/role/entities/user-role.entity'; -import { IsNull, MoreThanOrEqual, Repository } from 'typeorm'; - -@Injectable() -export class UserRoleService { - constructor( - @InjectRepository(UserRole) - private readonly userRoleRepository: Repository, - ) {} - - async findRoleIdsByUserId(userId: string): Promise { - const userRoles = await this.userRoleRepository.find({ - where: { - userId, - }, - }); - - return userRoles.map((ur) => ur.roleId); - } - - async findValidRoleIdsByUserId(userId: string): Promise { - return (await this.findValidRolesByUserId(userId)).map((ur) => ur.roleId); - } - - async findValidRolesByUserId(userId: string) { - const now = new Date(); - - return this.userRoleRepository.find({ - where: [ - { - userId, - isEnabled: true, - expiredAt: MoreThanOrEqual(now), - }, - { - userId, - isEnabled: true, - expiredAt: IsNull(), - }, - ], - }); - } - - async addUserRole( - userRole: Pick, - ): Promise { - const newUserRole = this.userRoleRepository.create(userRole); - await this.userRoleRepository.save(newUserRole); - } - - async deleteUserRole(userId: string, roleId: string): Promise { - await this.userRoleRepository.delete({ - userId, - roleId, - }); - } -}