From 7d24a8b6c5a82d4d7a6749a103c5ff7400b86e1c Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Tue, 10 Mar 2026 13:02:01 +0330 Subject: [PATCH] bsuiness --- src/common/decorators/admin-id.decorator.ts | 12 +--- .../decorators/business-id.decorator.ts | 8 +++ src/common/decorators/index.ts | 6 +- src/common/decorators/rest-id.decorator.ts | 18 ------ src/common/decorators/rest-slug.decorator.ts | 2 +- src/common/decorators/user-id.decorator.ts | 18 ------ .../admin/controllers/admin.controller.ts | 58 +++++++++---------- src/modules/business/business.service.ts | 10 +++- src/modules/catalogue/catalogue.controller.ts | 39 ++++++++++--- src/modules/catalogue/catalogue.service.ts | 16 ++--- 10 files changed, 90 insertions(+), 97 deletions(-) create mode 100644 src/common/decorators/business-id.decorator.ts delete mode 100644 src/common/decorators/rest-id.decorator.ts delete mode 100644 src/common/decorators/user-id.decorator.ts diff --git a/src/common/decorators/admin-id.decorator.ts b/src/common/decorators/admin-id.decorator.ts index 2d6d601..e560603 100644 --- a/src/common/decorators/admin-id.decorator.ts +++ b/src/common/decorators/admin-id.decorator.ts @@ -1,17 +1,7 @@ import { createParamDecorator, type ExecutionContext } from '@nestjs/common'; import type { Request } from 'express'; -/** - * Decorator to extract userId from the authenticated request. - * Must be used after AdminAuthGuard or AuthGuard that sets request.userId. - * - * @example - * @Get('/profile') - * @UseGuards(AdminAuthGuard) - * getProfile(@UserId() userId: string) { - * return this.userService.findById(userId); - * } - */ + export const AdminId = createParamDecorator((data: unknown, ctx: ExecutionContext): string => { const request = ctx.switchToHttp().getRequest(); return request.adminId || ''; diff --git a/src/common/decorators/business-id.decorator.ts b/src/common/decorators/business-id.decorator.ts new file mode 100644 index 0000000..e4262f6 --- /dev/null +++ b/src/common/decorators/business-id.decorator.ts @@ -0,0 +1,8 @@ +import { createParamDecorator, type ExecutionContext } from '@nestjs/common'; +import type { Request } from 'express'; + + +export const BusinessId = createParamDecorator((data: unknown, ctx: ExecutionContext): string => { + const request = ctx.switchToHttp().getRequest(); + return request.busId || ''; +}); diff --git a/src/common/decorators/index.ts b/src/common/decorators/index.ts index 6a12fec..350ced3 100644 --- a/src/common/decorators/index.ts +++ b/src/common/decorators/index.ts @@ -1,3 +1,5 @@ -export { UserId } from './user-id.decorator'; -export { RestId } from './rest-id.decorator'; +export { BusinessSlug } from './rest-slug.decorator'; +export { AdminId } from './admin-id.decorator'; +export { BusinessId } from './business-id.decorator'; export { RateLimit } from './rate-limit.decorator'; + \ No newline at end of file diff --git a/src/common/decorators/rest-id.decorator.ts b/src/common/decorators/rest-id.decorator.ts deleted file mode 100644 index afebf8c..0000000 --- a/src/common/decorators/rest-id.decorator.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { createParamDecorator, type ExecutionContext } from '@nestjs/common'; -import type { Request } from 'express'; - -/** - * Decorator to extract restId from the authenticated request. - * Must be used after AdminAuthGuard or AuthGuard that sets request.restId. - * - * @example - * @Get('/restaurants') - * @UseGuards(AdminAuthGuard) - * getRestaurants(@RestId() restId: string) { - * return this.restaurantService.findById(restId); - * } - */ -export const RestId = createParamDecorator((data: unknown, ctx: ExecutionContext): string => { - const request = ctx.switchToHttp().getRequest(); - return request.restId || ''; -}); diff --git a/src/common/decorators/rest-slug.decorator.ts b/src/common/decorators/rest-slug.decorator.ts index 16296d0..5b7484c 100644 --- a/src/common/decorators/rest-slug.decorator.ts +++ b/src/common/decorators/rest-slug.decorator.ts @@ -1,7 +1,7 @@ import { createParamDecorator, type ExecutionContext } from '@nestjs/common'; import type { Request } from 'express'; -export const RestSlug = createParamDecorator((data: unknown, ctx: ExecutionContext): string => { +export const BusinessSlug = createParamDecorator((data: unknown, ctx: ExecutionContext): string => { const request = ctx.switchToHttp().getRequest(); return request.slug || ''; }); diff --git a/src/common/decorators/user-id.decorator.ts b/src/common/decorators/user-id.decorator.ts deleted file mode 100644 index eb0c551..0000000 --- a/src/common/decorators/user-id.decorator.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { createParamDecorator, type ExecutionContext } from '@nestjs/common'; -import type { Request } from 'express'; - -/** - * Decorator to extract userId from the authenticated request. - * Must be used after AdminAuthGuard or AuthGuard that sets request.userId. - * - * @example - * @Get('/profile') - * @UseGuards(AdminAuthGuard) - * getProfile(@UserId() userId: string) { - * return this.userService.findById(userId); - * } - */ -export const UserId = createParamDecorator((data: unknown, ctx: ExecutionContext): string => { - const request = ctx.switchToHttp().getRequest(); - return request.userId || ''; -}); diff --git a/src/modules/admin/controllers/admin.controller.ts b/src/modules/admin/controllers/admin.controller.ts index 2d2d00e..77c4a1c 100644 --- a/src/modules/admin/controllers/admin.controller.ts +++ b/src/modules/admin/controllers/admin.controller.ts @@ -4,7 +4,7 @@ import { UpdateAdminDto } from '../dto/update-admin.dto'; import { ApiTags, ApiOperation, ApiBody, ApiBearerAuth, ApiParam } from '@nestjs/swagger'; import { AdminAuthGuard } from 'src/modules/auth/guards/adminAuth.guard'; import { SuperAdminAuthGuard } from 'src/modules/auth/guards/superAdminAuth.guard'; -import { RestId } from 'src/common/decorators'; +import { BusinessId } from 'src/common/decorators'; import { AdminId } from 'src/common/decorators/admin-id.decorator'; import { Permission } from 'src/common/enums/permission.enum'; import { Permissions } from 'src/common/decorators/permissions.decorator'; @@ -15,44 +15,44 @@ import { Permissions } from 'src/common/decorators/permissions.decorator'; export class AdminController { constructor(private readonly adminService: AdminService) { } - @Get('admin/admins') - @UseGuards(AdminAuthGuard) - @Permissions(Permission.MANAGE_ADMINS) - getAll(@RestId() restId: string) { - return this.adminService.findAllByRestaurantId(restId); - } + // @Get('admin/admins') + // @UseGuards(AdminAuthGuard) + // @Permissions(Permission.MANAGE_ADMINS) + // getAll(@BusinessId() restId: string) { + // return this.adminService.findAllByRestaurantId(restId); + // } - @Get('admin/admins/profile') - @UseGuards(AdminAuthGuard) - @Permissions(Permission.MANAGE_ADMINS) - getMe(@AdminId() adminId: string, @RestId() restId: string) { - return this.adminService.finAdminById(adminId, restId); - } + // @Get('admin/admins/profile') + // @UseGuards(AdminAuthGuard) + // @Permissions(Permission.MANAGE_ADMINS) + // getMe(@AdminId() adminId: string, @BusinessId() restId: string) { + // return this.adminService.finAdminById(adminId, restId); + // } - @Patch('admin/admins/:adminId') - @UseGuards(AdminAuthGuard) - @Permissions(Permission.MANAGE_ADMINS) - @ApiOperation({ summary: 'Update an admin' }) - @ApiParam({ name: 'adminId', description: 'Admin ID' }) - update(@Param('adminId') adminId: string, @Body() dto: UpdateAdminDto, - @RestId() restId: string) { - return this.adminService.update(adminId, restId, dto); - } + // @Patch('admin/admins/:adminId') + // @UseGuards(AdminAuthGuard) + // @Permissions(Permission.MANAGE_ADMINS) + // @ApiOperation({ summary: 'Update an admin' }) + // @ApiParam({ name: 'adminId', description: 'Admin ID' }) + // update(@Param('adminId') adminId: string, @Body() dto: UpdateAdminDto, + // @BusinessId() restId: string) { + // return this.adminService.update(adminId, restId, dto); + // } - @Get('admin/admins/:adminId') - @UseGuards(AdminAuthGuard) - @Permissions(Permission.MANAGE_ADMINS) - getById(@Param('adminId') adminId: string, @RestId() restId: string) { - return this.adminService.finAdminById(adminId, restId); - } + // @Get('admin/admins/:adminId') + // @UseGuards(AdminAuthGuard) + // @Permissions(Permission.MANAGE_ADMINS) + // getById(@Param('adminId') adminId: string, @BusinessId() restId: string) { + // return this.adminService.finAdminById(adminId, restId); + // } // @Delete('admin/admins/:adminId') // @UseGuards(AdminAuthGuard) // @Permissions(Permission.MANAGE_ADMINS) // @ApiOperation({ summary: 'Delete an admin by ID' }) // @ApiParam({ name: 'id', description: 'Admin ID' }) - // deleteById(@Param('adminId') adminId: string, @RestId() restId: string) { + // deleteById(@Param('adminId') adminId: string, @BusinessId() restId: string) { // return this.adminService.remove(adminId, restId); // } diff --git a/src/modules/business/business.service.ts b/src/modules/business/business.service.ts index b1e6997..48413f6 100644 --- a/src/modules/business/business.service.ts +++ b/src/modules/business/business.service.ts @@ -1,4 +1,4 @@ -import { BadRequestException, Injectable, NotFoundException } from '@nestjs/common'; +import { Injectable, NotFoundException } from '@nestjs/common'; import { SetupBusinessDto } from './dto/create-business.dto'; import { UpdateBusinessDto } from './dto/update-business.dto'; import { EntityManager } from '@mikro-orm/postgresql'; @@ -50,6 +50,14 @@ export class BusinessService { return business } + async findByIdOrFail(businessId: string) { + const business = await this.businessRepository.findOne({ id:businessId }, { populate: ['admin'] }) + if (!business) { + throw new NotFoundException("Business not found") + } + return business + } + update(id: number, updateBusinessDto: UpdateBusinessDto) { return `This action updates a #${id} business`; } diff --git a/src/modules/catalogue/catalogue.controller.ts b/src/modules/catalogue/catalogue.controller.ts index 24994a8..36135ff 100644 --- a/src/modules/catalogue/catalogue.controller.ts +++ b/src/modules/catalogue/catalogue.controller.ts @@ -1,34 +1,55 @@ -import { Controller, Get, Post, Body, Patch, Param, Delete, Query } from '@nestjs/common'; +import { Controller, Get, Post, Body, Patch, Param, Delete, Query, UseGuards } from '@nestjs/common'; import { CatalogueService } from './catalogue.service'; import { CreateCatalogueDto } from './dto/create-catalogue.dto'; import { UpdateCatalogueDto } from './dto/update-catalogue.dto'; import { FindCataloguesDto } from './dto/find-catalogues.dto'; +import { AdminAuthGuard } from '../auth/guards/adminAuth.guard'; +import { BusinessId } from 'src/common/decorators'; -@Controller('catalogue') +@Controller() export class CatalogueController { constructor(private readonly catalogueService: CatalogueService) { } - @Post() - create(@Body() dto: CreateCatalogueDto) { - return this.catalogueService.create(dto); + // ============= Public Routes ============== + + @Get('public/catalogue') + findAllAsPublic(@Query() queryDto: FindCataloguesDto) { + return this.catalogueService.findAll(queryDto); } - @Get() + @Get('admin/catalogue/:id') + findOneAsPublic(@Param('id') id: string) { + return this.catalogueService.findOne(id); + } + + // ============= Admin Routes ============== + + @Post('admin/catalogue') + @UseGuards(AdminAuthGuard) + create(@Body() dto: CreateCatalogueDto, @BusinessId() busId: string) { + return this.catalogueService.create(dto, busId); + } + + @Get('admin/catalogue') + @UseGuards(AdminAuthGuard) findAll(@Query() queryDto: FindCataloguesDto) { return this.catalogueService.findAll(queryDto); } - @Get(':id') + @Get('admin/catalogue/:id') + @UseGuards(AdminAuthGuard) findOne(@Param('id') id: string) { return this.catalogueService.findOne(id); } - @Patch(':id') + @Patch('admin/catalogue/:id') + @UseGuards(AdminAuthGuard) update(@Param('id') id: string, @Body() dto: UpdateCatalogueDto) { return this.catalogueService.update(id, dto); } - @Delete(':id') + @Delete('admin/catalogue/:id') + @UseGuards(AdminAuthGuard) remove(@Param('id') id: string) { return this.catalogueService.remove(id); } diff --git a/src/modules/catalogue/catalogue.service.ts b/src/modules/catalogue/catalogue.service.ts index de35671..9d42f8b 100644 --- a/src/modules/catalogue/catalogue.service.ts +++ b/src/modules/catalogue/catalogue.service.ts @@ -1,29 +1,29 @@ -import { BadRequestException, Injectable, NotFoundException } from '@nestjs/common'; +import { Injectable, NotFoundException } from '@nestjs/common'; import { CreateCatalogueDto } from './dto/create-catalogue.dto'; import { UpdateCatalogueDto } from './dto/update-catalogue.dto'; import { EntityManager } from '@mikro-orm/postgresql'; import { Catalogue } from './entities/catalogue.entity'; -import { Business } from '../business/entities/business.entity'; import { CatalogueStatus } from './enums/company-status.enum'; import { CatalogueRepository } from './repositories/catalogue.repository'; import { FindCataloguesDto } from './dto/find-catalogues.dto'; +import { BusinessService } from '../business/business.service'; @Injectable() export class CatalogueService { constructor( private readonly em: EntityManager, - private readonly catalogueRepository: CatalogueRepository + private readonly catalogueRepository: CatalogueRepository, + private readonly businessService: BusinessService, ) { } - async create(dto: CreateCatalogueDto) { - const business = await this.em.findOne(Business, {}) - if (!business) { - throw new BadRequestException() - } + async create(dto: CreateCatalogueDto, businessId: string) { + const business = await this.businessService.findByIdOrFail(businessId) + const catalogue = this.em.create(Catalogue, { ...dto, business, status: CatalogueStatus.PENDING }) await this.em.persistAndFlush(catalogue) + return catalogue }