diff --git a/src/modules/ticket/DTO/search-ticket-query.dto.ts b/src/modules/ticket/DTO/search-ticket-query.dto.ts index 6f8c461..51277c8 100755 --- a/src/modules/ticket/DTO/search-ticket-query.dto.ts +++ b/src/modules/ticket/DTO/search-ticket-query.dto.ts @@ -1,18 +1,5 @@ -import { ApiPropertyOptional } from "@nestjs/swagger"; -import { IsEnum, IsOptional, IsUUID } from "class-validator"; - import { PaginationDto } from "../../../common/DTO/pagination.dto"; -import { UserMessage } from "../../../common/enums/message.enum"; -import { TicketStatus } from "../enums/ticket-status.enum"; -export class SearchTicketQueryDto extends PaginationDto { - @IsOptional() - @IsEnum(TicketStatus) - @ApiPropertyOptional({ enum: TicketStatus, description: "ticket status", example: TicketStatus.PENDING }) - status?: TicketStatus; +export class FindTicketQueryDto extends PaginationDto { - @IsOptional() - @IsUUID("4", { message:" UserMessage.USER_ID_SHOULD_BE_A_UUID" }) - @ApiPropertyOptional({ description: "user id", example: "123e4567-e89b-12d3-a456-426614174000" }) - userId?: string; } diff --git a/src/modules/ticket/providers/tickets.service.ts b/src/modules/ticket/providers/tickets.service.ts index 9ea5819..8fb0d96 100755 --- a/src/modules/ticket/providers/tickets.service.ts +++ b/src/modules/ticket/providers/tickets.service.ts @@ -9,6 +9,7 @@ import { User } from "src/modules/user/entities/user.entity"; import { UserRepository } from "src/modules/user/repositories/user.repository"; import { AdminRepository } from "src/modules/admin/repositories/admin.repository"; import { Admin } from "src/modules/admin/entities/admin.entity"; +import { FindTicketQueryDto } from "../DTO/search-ticket-query.dto"; @Injectable() @@ -35,7 +36,7 @@ export class TicketService { let user: null | User = null let admin: null | Admin = null - + if (userId) { user = await this.userRepository.findOne({ id: userId }) if (!user) { @@ -334,19 +335,23 @@ export class TicketService { // //******************************** */ - // async getTickets(queryDto: SearchTicketQueryDto, userId: string) { - // const [tickets, count] = await this.ticketsRepository.findTicketsList(queryDto, userId); + async getTickets(orderId: string, queryDto: FindTicketQueryDto, userId?: string) { - // return { tickets, count, paginate: true }; - // } - // //******************************** */ - // async getTicketForAdmin(queryDto: SearchTicketQueryDto, adminId: string) { - // const isSuperAdmin = await this.usersService.isSuperAdmin(adminId); + const order = await this.orderRepository.findOne({ id: orderId }) + if (!order) { + throw new BadRequestException("order not found!") + } + if(userId){ + if (order.user.id !== userId) { + throw new BadRequestException("This ticket doenst belongs to You !") + } + } + const data = await this.ticketsRepository.findAllPaginated({ ...queryDto, orderId }); - // const [tickets, count] = await this.ticketsRepository.findTicketsListForAdmin(queryDto, adminId, isSuperAdmin); + return data + } + //******************************** */ - // return { tickets, count, paginate: true }; - // } // //******************************** */ diff --git a/src/modules/ticket/repositories/tickets.repository.ts b/src/modules/ticket/repositories/tickets.repository.ts index 76c7ab1..d47d7ce 100755 --- a/src/modules/ticket/repositories/tickets.repository.ts +++ b/src/modules/ticket/repositories/tickets.repository.ts @@ -1,6 +1,12 @@ -import { EntityManager, EntityRepository } from '@mikro-orm/postgresql'; - import { Injectable } from '@nestjs/common'; +import { EntityManager, EntityRepository, FilterQuery } from '@mikro-orm/postgresql'; +import { Injectable } from '@nestjs/common'; import { Ticket } from '../entities/ticket.entity'; +import { FindTicketQueryDto } from '../DTO/search-ticket-query.dto'; +import { PaginatedResult } from 'src/common/interfaces/pagination.interface'; + +class FindOrdersOpts extends FindTicketQueryDto { + orderId: string; +}; @Injectable() export class TicketRepository extends EntityRepository { @@ -10,4 +16,39 @@ export class TicketRepository extends EntityRepository { super(em, Ticket); } + async findAllPaginated(opts: FindOrdersOpts): Promise> { + const { + page = 1, + limit = 10, + orderId + } = opts; + + const offset = (page - 1) * limit; + + const where: FilterQuery = { + order: { id: orderId } + }; + + + const [data, total] = await this.findAndCount(where, { + limit, + offset, + orderBy: { createdAt: 'desc' }, + + }); + + + const totalPages = Math.ceil(total / limit); + + return { + data, + meta: { + total, + page, + limit, + totalPages, + }, + }; + } + } diff --git a/src/modules/ticket/tickets.controller.ts b/src/modules/ticket/tickets.controller.ts index f91fe62..33c489e 100755 --- a/src/modules/ticket/tickets.controller.ts +++ b/src/modules/ticket/tickets.controller.ts @@ -1,11 +1,7 @@ import { Body, Controller, Get, HttpCode, HttpStatus, Param, Patch, Post, Query } from "@nestjs/common"; import { ApiOperation, ApiTags } from "@nestjs/swagger"; - -import { CreateTicketCategoryDto } from "./DTO/create-ticket-category.dto"; -import { CreateTicketMessageDto } from "./DTO/create-ticket-message.dto"; -import { CreateTicketByAdminDto, CreateTicketDto } from "./DTO/create-ticket.dto"; -import { SearchTicketCategoryDto } from "./DTO/search-ticket-category.dto"; -import { SearchTicketQueryDto } from "./DTO/search-ticket-query.dto"; +import { CreateTicketDto } from "./DTO/create-ticket.dto"; +import { FindTicketQueryDto } from "./DTO/search-ticket-query.dto"; import { TicketService } from "./providers/tickets.service"; @@ -70,25 +66,27 @@ export class TicketsController { return this.ticketsService.createTicket(orderId, createDto, userId); } + + @ApiOperation({ summary: "Get all order tickets ==> user route" }) + @Get('public/ticket/order/:orderId') + getTickets(@Query() queryDto: FindTicketQueryDto, @Param('orderId') orderId: string, @UserId() userId: string) { + return this.ticketsService.getTickets(orderId, queryDto, userId); + } + + /*=========================== Admin ============================== */ + @Post('admin/ticket/order/:orderId') @ApiOperation({ summary: "create ticket ==> admin route" }) createTicketAsAdmin(@Param('orderId') orderId: string, @Body() createDto: CreateTicketDto, @AdminId() adminId: string) { return this.ticketsService.createTicket(orderId, createDto, undefined, adminId); } - // @ApiOperation({ summary: "create ticket by admin" }) - // @AdminRoute() - // @PermissionsDec(PermissionEnum.TICKETS) - // @Post("admin") - // createTicketByAdmin(@Body() createDto: CreateTicketByAdminDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { - // return this.ticketsService.createTicketByAdmin(createDto, userIpAndHeaders); - // } - // @ApiOperation({ summary: "Get all tickets of user ==> user route" }) - // @Get() - // getTickets(@Query() queryDto: SearchTicketQueryDto, @UserDec("id") userId: string) { - // return this.ticketsService.getTickets(queryDto, userId); - // } + @ApiOperation({ summary: "Get all order tickets ==> admin route" }) + @Get('admin/ticket/order/:orderId') + getTicketsAsAdmin(@Query() queryDto: FindTicketQueryDto, @Param('orderId') orderId: string) { + return this.ticketsService.getTickets(orderId, queryDto); + } // @ApiOperation({ summary: "Get all tickets ==> admin route" }) // @AdminRoute() // @PermissionsDec(PermissionEnum.TICKETS)