import { Get, Body, Post, Route, Tags, SuccessResponse, Response, Delete, Controller, Security, Request, Put, Path } from 'tsoa'; import { ValidationError } from '../middleware/errorHandler'; import { CategoryService } from '../services/categories.service'; import { createCategory, createCategoryResponse, deleteCategoryResponse, updateCategory, updateCategoryResponse, ListCategoriesResponse } from '../types/categories.type'; import { CreateCategoryValidator, UpdateCategoryValidator } from '../validators/categories.validator'; @Route('api/categories') @Tags('Categories') export class CategoriesController { private categoryService = new CategoryService(); @Get() @SuccessResponse('200', 'Categories fetched successfully') @Response('401', 'Invalid or expired token') public async listCategories(): Promise { return await this.categoryService.listCategories(); } } @Route('api/admin/categories') @Tags('Admin/Categories') export class CategoriesAdminController { private categoryService = new CategoryService(); @Post() @Security('jwt', ['admin']) @SuccessResponse('200', 'Category created successfully') @Response('401', 'Invalid or expired token') public async createCategory(@Request() request: any, @Body() body: createCategory): Promise { const token = request.headers.authorization?.replace('Bearer ', '') || ''; // Validate body const { error } = CreateCategoryValidator.validate(body); if (error) throw new ValidationError(error.details[0].message); return await this.categoryService.createCategory(token, body); } @Put('{id}') @Security('jwt', ['admin']) @SuccessResponse('200', 'Category updated successfully') @Response('401', 'Invalid or expired token') public async updateCategory(@Request() request: any, @Body() body: updateCategory): Promise { const token = request.headers.authorization?.replace('Bearer ', '') || ''; // Validate body const { error } = UpdateCategoryValidator.validate(body); if (error) throw new ValidationError(error.details[0].message); return await this.categoryService.updateCategory(token, body.id, body); } @Delete('{id}') @Security('jwt', ['admin']) @SuccessResponse('200', 'Category deleted successfully') @Response('401', 'Invalid or expired token') public async deleteCategory(@Request() request: any, @Path() id: number): Promise { const token = request.headers.authorization?.replace('Bearer ', '') || ''; return await this.categoryService.deleteCategory(token, id); } }