Files
negareh-api/src/modules/ticket/ticket.controller.ts
T
2026-02-24 16:34:28 +03:30

129 lines
4.5 KiB
TypeScript

import {
Controller,
Get,
Post,
Body,
Patch,
Param,
Delete,
Query,
UseGuards,
} from '@nestjs/common';
import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger';
import { TicketService } from './ticket.service';
import { CreateTicketDto } from './dto/create-ticket.dto';
import { UpdateTicketDto } from './dto/update-ticket.dto';
import { UpdateTicketStatusDto } from './dto/update-ticket-status.dto';
import { CreateTicketUserDto } from './dto/create-ticket-user.dto';
import { UpdateTicketUserDto } from './dto/update-ticket-user.dto';
import { UpdateTicketStatusUserDto } from './dto/update-ticket-status-user.dto';
import { SearchTicketQueryDto } from './dto/search-ticket-query.dto';
import { AdminAuthGuard } from '../auth/guards/adminAuth.guard';
import { AuthGuard } from '../auth/guards/auth.guard';
import { Permissions } from 'src/common/decorators/permissions.decorator';
import { PermissionEnum } from 'src/common/enums/permission.enum';
import { UserId } from 'src/common/decorators/user-id.decorator';
import { AdminId } from 'src/common/decorators/admin-id.decorator';
@ApiTags('Ticket')
@ApiBearerAuth()
@Controller()
export class TicketController {
constructor(private readonly ticketService: TicketService) { }
// ================== User routes ===================
@Post('public/tickets')
@UseGuards(AuthGuard)
@ApiOperation({ summary: 'Create a ticket (as user)' })
createAsUser(@Body() createTicketUserDto: CreateTicketUserDto, @UserId() userId: string) {
return this.ticketService.createAsUser(createTicketUserDto, userId);
}
@Get('public/tickets')
@UseGuards(AuthGuard)
@ApiOperation({ summary: 'Get my tickets with pagination' })
findMyTickets(@Query() queryDto: SearchTicketQueryDto, @UserId() userId: string) {
return this.ticketService.findMyTickets(userId, queryDto);
}
@Get('public/tickets/:id')
@UseGuards(AuthGuard)
@ApiOperation({ summary: 'Get one of my tickets by id' })
findOneAsUser(@Param('id') id: string, @UserId() userId: string) {
return this.ticketService.findOneAsUser(id, userId);
}
@Patch('public/tickets/:id')
@UseGuards(AuthGuard)
@ApiOperation({ summary: 'Update a ticket (as user, own tickets only)' })
updateAsUser(
@Param('id') id: string,
@Body() updateTicketUserDto: UpdateTicketUserDto,
@UserId() userId: string,
) {
return this.ticketService.updateAsUser(id, updateTicketUserDto, userId);
}
@Patch('public/tickets/:id/status')
@UseGuards(AuthGuard)
@ApiOperation({ summary: 'Update ticket status (user can only set to closed)' })
updateStatusAsUser(
@Param('id') id: string,
@Body() dto: UpdateTicketStatusUserDto,
@UserId() userId: string,
) {
return this.ticketService.updateStatusAsUser(id, dto, userId);
}
// ================== Admin routes ===================
@Post('admin/tickets')
@UseGuards(AdminAuthGuard)
@Permissions(PermissionEnum.MANAGE_TICKETS)
@ApiOperation({ summary: 'Create a ticket (as admin)' })
createAsAdmin(@Body() dto: CreateTicketDto, @AdminId() adminId: string) {
return this.ticketService.createAsAdmin(dto, adminId);
}
@Get('admin/tickets')
@UseGuards(AdminAuthGuard)
@Permissions(PermissionEnum.MANAGE_TICKETS)
@ApiOperation({ summary: 'Get all tickets with pagination' })
findAllAsAdmin(@Query() queryDto: SearchTicketQueryDto) {
return this.ticketService.findAll(queryDto);
}
@Get('admin/tickets/:id')
@UseGuards(AdminAuthGuard)
@Permissions(PermissionEnum.MANAGE_TICKETS)
@ApiOperation({ summary: 'Get one ticket by id' })
findOneAsAdmin(@Param('id') id: string) {
return this.ticketService.findOne(id);
}
@Patch('admin/tickets/:id')
@UseGuards(AdminAuthGuard)
@Permissions(PermissionEnum.MANAGE_TICKETS)
@ApiOperation({ summary: 'Update a ticket (as admin)' })
updateAsAdmin(@Param('id') id: string, @Body() updateTicketDto: UpdateTicketDto) {
return this.ticketService.update(id, updateTicketDto);
}
@Patch('admin/tickets/:id/status')
@UseGuards(AdminAuthGuard)
@Permissions(PermissionEnum.MANAGE_TICKETS)
@ApiOperation({ summary: 'Update ticket status (admin can set any status)' })
updateStatusAsAdmin(@Param('id') id: string, @Body() dto: UpdateTicketStatusDto) {
return this.ticketService.updateStatusAsAdmin(id, dto);
}
@Delete('admin/tickets/:id')
@UseGuards(AdminAuthGuard)
@Permissions(PermissionEnum.MANAGE_TICKETS)
@ApiOperation({ summary: 'Soft delete a ticket' })
remove(@Param('id') id: string) {
return this.ticketService.remove(id);
}
}