import { Body, Controller, Get, Param, Post, Query, UseGuards } from '@nestjs/common'; import { HqAuthGuard } from '../../common/guards/hq-auth.guard'; import { JwtAuthGuard, AuthUser } from '../../common/guards/jwt-auth.guard'; import { PartnerPermissionGuard } from '../../common/guards/partner-permission.guard'; import { RequirePartnerPermissions } from '../../common/decorators/partner-permission.decorator'; import { CurrentUser } from '../../common/decorators/current-user.decorator'; import { HqOperation } from '../../common/hq-operation/hq-operation.decorator'; import { HqOperationAction } from '../../common/hq-operation/hq-operation.constants'; import { AdminTicketsService } from './admin-tickets.service'; import { TicketListQueryDto } from '../common/dto/common-query.dto'; import { AdminCreateTicketDto } from '../common/dto/common-mutate.dto'; @Controller('admin/tickets') @UseGuards(HqAuthGuard) export class AdminTicketsController { constructor(private readonly service: AdminTicketsService) {} @Get() list(@Query() query: TicketListQueryDto) { return this.service.list(query); } @Post() @HqOperation({ action: HqOperationAction.TICKET_CREATE, refType: 'TICKET', batch: true, includeBody: true, }) create(@Body() body: AdminCreateTicketDto) { return this.service.createByHq(body); } @Get(':id') detail(@Param('id') id: string) { return this.service.detail(BigInt(id)); } @Post(':id/approve') @HqOperation({ action: HqOperationAction.TICKET_APPROVE, refType: 'TICKET', refIdParam: 'id', includeBody: true, }) approve( @CurrentUser() user: AuthUser, @Param('id') id: string, @Body() body: { remark?: string }, ) { return this.service.approve(BigInt(id), body.remark, user.actorId.toString()); } @Post(':id/reject') @HqOperation({ action: HqOperationAction.TICKET_REJECT, refType: 'TICKET', refIdParam: 'id', includeBody: true, }) reject(@Param('id') id: string, @Body() body: { remark?: string }) { return this.service.reject(BigInt(id), body.remark); } @Post(':id/complete-collab') @HqOperation({ action: HqOperationAction.TICKET_APPROVE, refType: 'TICKET', refIdParam: 'id', includeBody: true, }) completeCollab(@CurrentUser() user: AuthUser, @Param('id') id: string) { return this.service.completeCollabByHq(BigInt(id), user.actorId.toString()); } } @Controller('partner/tickets') @UseGuards(JwtAuthGuard, PartnerPermissionGuard) @RequirePartnerPermissions('warehouse:manage', 'order:view') export class PartnerTicketsController { constructor(private readonly service: AdminTicketsService) {} @Get() list( @CurrentUser() user: AuthUser, @Query('page') page?: string, @Query('pageSize') pageSize?: string, ) { return this.service.listPartnerTickets( user.actorId, page ? Number(page) : 1, pageSize ? Number(pageSize) : 20, ); } @Get(':id') detail(@CurrentUser() user: AuthUser, @Param('id') id: string) { return this.service.getPartnerTicket(user.actorId, BigInt(id)); } @Post(':id/confirm-pickup') @RequirePartnerPermissions('warehouse:manage') confirmPickup(@CurrentUser() user: AuthUser, @Param('id') id: string) { return this.service.partnerConfirmPickup(user.actorId, BigInt(id)); } @Post(':id/confirm-reship') @RequirePartnerPermissions('warehouse:manage') confirmReship(@CurrentUser() user: AuthUser, @Param('id') id: string) { return this.service.partnerConfirmReship(user.actorId, BigInt(id)); } }