From 7bd2b59cb1879e0b6543bc634a177a8e03ca7de4 Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Mon, 17 Nov 2025 23:04:28 +0330 Subject: [PATCH] Refactor admin module structure: moved services and controllers to providers and controllers directories, added PermissionService and PermissionController, updated Admin entity relationships, and created AdminRole entity. --- src/modules/admin/admin.module.ts | 12 +++++++----- .../{ => controllers}/admin.controller.ts | 4 ++-- .../controllers/permission.controller.ts | 17 +++++++++++++++++ src/modules/admin/entities/admin.entity.ts | 10 +++++----- .../admin/entities/adminRole.entity.ts | 19 +++++++++++++++++++ src/modules/admin/entities/role.entity.ts | 10 +++++++--- .../admin/{ => providers}/admin.service.ts | 6 +++--- .../admin/providers/permission.service.ts | 18 ++++++++++++++++++ 8 files changed, 78 insertions(+), 18 deletions(-) rename src/modules/admin/{ => controllers}/admin.controller.ts (89%) create mode 100644 src/modules/admin/controllers/permission.controller.ts create mode 100644 src/modules/admin/entities/adminRole.entity.ts rename src/modules/admin/{ => providers}/admin.service.ts (89%) create mode 100644 src/modules/admin/providers/permission.service.ts diff --git a/src/modules/admin/admin.module.ts b/src/modules/admin/admin.module.ts index 9c48732..5f8f3d5 100644 --- a/src/modules/admin/admin.module.ts +++ b/src/modules/admin/admin.module.ts @@ -1,5 +1,5 @@ import { Module } from '@nestjs/common'; -import { AdminService } from './admin.service'; +import { AdminService } from './providers/admin.service'; import { MikroOrmModule } from '@mikro-orm/nestjs'; import { Admin } from './entities/admin.entity'; import { JwtModule } from '@nestjs/jwt'; @@ -7,14 +7,16 @@ import { AdminRepository } from './repositories/rest.repository'; import { Role } from './entities/role.entity'; import { Permission } from './entities/permission.entity'; import { RolePermission } from './entities/rolePermission.entity'; -import { AdminController } from './admin.controller'; +import { AdminController } from './controllers/admin.controller'; import { RoleService } from './providers/role.service'; import { RoleController } from './controllers/role.controller'; +import { PermissionService } from './providers/permission.service'; +import { PermissionController } from './controllers/permission.controller'; @Module({ - providers: [AdminService, AdminRepository, RoleService], - controllers: [AdminController, RoleController], + providers: [AdminService, AdminRepository, RoleService, PermissionService], + controllers: [AdminController, RoleController, PermissionController], imports: [MikroOrmModule.forFeature([Admin, Role, Permission, RolePermission]), JwtModule], - exports: [AdminService, AdminRepository, RoleService], + exports: [AdminService, AdminRepository, RoleService, PermissionService], }) export class AdminModule {} diff --git a/src/modules/admin/admin.controller.ts b/src/modules/admin/controllers/admin.controller.ts similarity index 89% rename from src/modules/admin/admin.controller.ts rename to src/modules/admin/controllers/admin.controller.ts index 3e2b1e0..151cd44 100644 --- a/src/modules/admin/admin.controller.ts +++ b/src/modules/admin/controllers/admin.controller.ts @@ -1,6 +1,6 @@ import { Controller, Post, Body, HttpCode, HttpStatus, Get } from '@nestjs/common'; -import { AdminService } from './admin.service'; -import { CreateAdminDto } from './dto/create-admin.dto'; +import { AdminService } from '../providers/admin.service'; +import { CreateAdminDto } from '../dto/create-admin.dto'; import { ApiTags, ApiOperation, ApiBody, ApiResponse } from '@nestjs/swagger'; @ApiTags('admin') diff --git a/src/modules/admin/controllers/permission.controller.ts b/src/modules/admin/controllers/permission.controller.ts new file mode 100644 index 0000000..29136e7 --- /dev/null +++ b/src/modules/admin/controllers/permission.controller.ts @@ -0,0 +1,17 @@ +import { Controller, Get } from '@nestjs/common'; +import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger'; +import { PermissionService } from '../providers/permission.service'; + +@ApiTags('admin/permissions') +@Controller('admin/permissions') +export class PermissionController { + constructor(private readonly permissionService: PermissionService) {} + + @Get() + @ApiOperation({ summary: 'Get all permissions' }) + @ApiResponse({ status: 200, description: 'Permissions retrieved successfully' }) + async findAll() { + return this.permissionService.findAll(); + } +} + diff --git a/src/modules/admin/entities/admin.entity.ts b/src/modules/admin/entities/admin.entity.ts index 8173c81..f1e350c 100644 --- a/src/modules/admin/entities/admin.entity.ts +++ b/src/modules/admin/entities/admin.entity.ts @@ -1,7 +1,7 @@ -import { Entity, ManyToOne, OneToOne, Property } from '@mikro-orm/core'; +import { Entity, ManyToOne, Property } from '@mikro-orm/core'; import { BaseEntity } from '../../../common/entities/base.entity'; -import { Restaurant } from '../../../modules/restaurants/entities/restaurant.entity'; import { Role } from './role.entity'; +import { Restaurant } from '../../restaurants/entities/restaurant.entity'; @Entity({ tableName: 'admins' }) // Add the Unique constraint for the combination of 'phone' and 'restaurant' @@ -13,13 +13,13 @@ export class Admin extends BaseEntity { @Property({ nullable: true }) lastName?: string; - @Property() + @Property({ unique: true }) phone!: string; // Add the new role property @ManyToOne(() => Role) role!: Role; - @OneToOne(() => Restaurant, { owner: true }) - restaurant!: Restaurant; + @ManyToOne(() => Restaurant, { nullable: true }) + restaurant?: Restaurant; } diff --git a/src/modules/admin/entities/adminRole.entity.ts b/src/modules/admin/entities/adminRole.entity.ts new file mode 100644 index 0000000..59de879 --- /dev/null +++ b/src/modules/admin/entities/adminRole.entity.ts @@ -0,0 +1,19 @@ +import { Entity, ManyToOne } from '@mikro-orm/core'; +import { BaseEntity } from '../../../common/entities/base.entity'; +import { Role } from './role.entity'; +import { Restaurant } from 'src/modules/restaurants/entities/restaurant.entity'; +import { Admin } from './admin.entity'; + +@Entity({ tableName: 'admin_roles' }) +// Add the Unique constraint for the combination of 'phone' and 'restaurant' +// @Unique({ properties: ['phone', 'restaurant'] }) +export class AdminRole extends BaseEntity { + @ManyToOne(() => Admin) + admin!: Admin; + + @ManyToOne(() => Role) + role!: Role; + + @ManyToOne(() => Restaurant, { nullable: true }) + restaurant?: Restaurant; +} diff --git a/src/modules/admin/entities/role.entity.ts b/src/modules/admin/entities/role.entity.ts index d532241..8e482d6 100755 --- a/src/modules/admin/entities/role.entity.ts +++ b/src/modules/admin/entities/role.entity.ts @@ -1,12 +1,13 @@ // role.entity.ts -import { Collection, Entity, ManyToMany, OneToMany, OneToOne, Property } from '@mikro-orm/core'; +import { Collection, Entity, ManyToMany, OneToMany, ManyToOne, Property } from '@mikro-orm/core'; import { BaseEntity } from '../../../common/entities/base.entity'; import { Admin } from './admin.entity'; import { Permission } from './permission.entity'; import { Restaurant } from '../../../modules/restaurants/entities/restaurant.entity'; import { RolePermission } from './rolePermission.entity'; +import { AdminRole } from './adminRole.entity'; -@Entity() +@Entity({ tableName: 'roles' }) export class Role extends BaseEntity { @Property() name!: string; @@ -17,6 +18,9 @@ export class Role extends BaseEntity { @OneToMany(() => Admin, admin => admin.role) admins = new Collection(this); - @OneToOne(() => Restaurant, { owner: true, nullable: true }) + @ManyToOne(() => Restaurant, { nullable: true }) restaurant?: Restaurant; + + @OneToMany(() => AdminRole, adminRoleRestaurant => adminRoleRestaurant.role) + adminRoles = new Collection(this); } diff --git a/src/modules/admin/admin.service.ts b/src/modules/admin/providers/admin.service.ts similarity index 89% rename from src/modules/admin/admin.service.ts rename to src/modules/admin/providers/admin.service.ts index 50ced73..1242f46 100644 --- a/src/modules/admin/admin.service.ts +++ b/src/modules/admin/providers/admin.service.ts @@ -1,9 +1,9 @@ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@mikro-orm/nestjs'; import { EntityRepository } from '@mikro-orm/core'; -import { Admin } from './entities/admin.entity'; -import { Role } from './entities/role.entity'; -import { Restaurant } from '../restaurants/entities/restaurant.entity'; +import { Admin } from '../entities/admin.entity'; +import { Role } from '../entities/role.entity'; +import { Restaurant } from '../../restaurants/entities/restaurant.entity'; import { EntityManager } from '@mikro-orm/postgresql'; @Injectable() diff --git a/src/modules/admin/providers/permission.service.ts b/src/modules/admin/providers/permission.service.ts new file mode 100644 index 0000000..a561dd5 --- /dev/null +++ b/src/modules/admin/providers/permission.service.ts @@ -0,0 +1,18 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@mikro-orm/nestjs'; +import { EntityRepository } from '@mikro-orm/core'; +import { Permission } from '../entities/permission.entity'; + +@Injectable() +export class PermissionService { + constructor( + @InjectRepository(Permission) + private readonly permissionRepository: EntityRepository, + ) {} + + async findAll() { + const permissions = await this.permissionRepository.findAll(); + return permissions; + } +} +