import { Body, Controller, Delete, Get, Param, ParseUUIDPipe, Patch, Post, Req, } from '@nestjs/common'; import type { FastifyRequest } from 'fastify'; import { RequirePermissions } from '../common/decorators/permissions.decorator'; import { CurrentUser } from '../common/decorators/current-user.decorator'; import type { AuthenticatedUser } from '../common/guards/auth.guard'; import { ExtensionsService } from './extensions.service'; import { CreateExtensionDto } from './dto/create-extension.dto'; import { UpdateExtensionDto } from './dto/update-extension.dto'; @Controller('extensions') export class ExtensionsController { constructor(private readonly extensionsService: ExtensionsService) {} @Get() @RequirePermissions('extensions.view') list() { return this.extensionsService.list(); } @Get(':id') @RequirePermissions('extensions.view') findOne(@Param('id', ParseUUIDPipe) id: string) { return this.extensionsService.findByIdOrThrow(id); } @Post() @RequirePermissions('extensions.create') create( @Body() dto: CreateExtensionDto, @CurrentUser() actor: AuthenticatedUser, @Req() request: FastifyRequest, ) { return this.extensionsService.create(dto, actor, { ip: request.ip, userAgent: request.headers['user-agent'], }); } @Patch(':id') @RequirePermissions('extensions.update') update( @Param('id', ParseUUIDPipe) id: string, @Body() dto: UpdateExtensionDto, @CurrentUser() actor: AuthenticatedUser, @Req() request: FastifyRequest, ) { return this.extensionsService.update(id, dto, actor, { ip: request.ip, userAgent: request.headers['user-agent'], }); } @Post(':id/reset-password') @RequirePermissions('extensions.update') resetPassword( @Param('id', ParseUUIDPipe) id: string, @CurrentUser() actor: AuthenticatedUser, @Req() request: FastifyRequest, ) { return this.extensionsService.resetPassword(id, actor, { ip: request.ip, userAgent: request.headers['user-agent'], }); } @Delete(':id') @RequirePermissions('extensions.delete') remove( @Param('id', ParseUUIDPipe) id: string, @CurrentUser() actor: AuthenticatedUser, @Req() request: FastifyRequest, ) { return this.extensionsService.delete(id, actor, { ip: request.ip, userAgent: request.headers['user-agent'], }); } }