get all tickets

This commit is contained in:
2026-01-21 18:54:13 +03:30
parent 6888717d58
commit 6c7dfbef1f
4 changed files with 76 additions and 45 deletions
@@ -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;
}
+16 -11
View File
@@ -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 };
// }
// //******************************** */
@@ -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<Ticket> {
@@ -10,4 +16,39 @@ export class TicketRepository extends EntityRepository<Ticket> {
super(em, Ticket);
}
async findAllPaginated(opts: FindOrdersOpts): Promise<PaginatedResult<Ticket>> {
const {
page = 1,
limit = 10,
orderId
} = opts;
const offset = (page - 1) * limit;
const where: FilterQuery<Ticket> = {
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,
},
};
}
}
+16 -18
View File
@@ -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)