import { Controller, Get, Post, Patch, Delete, Body, Param, Query, UseGuards, Request, UnauthorizedException, } from "@nestjs/common"; import { IdeasService } from "./ideas.service"; import { CreateIdeaDto, CaptureIdeaDto, UpdateIdeaDto, QueryIdeasDto } from "./dto"; import { AuthGuard } from "../auth/guards/auth.guard"; import type { AuthenticatedRequest } from "../common/types/user.types"; /** * Controller for idea endpoints * All endpoints require authentication */ @Controller("ideas") @UseGuards(AuthGuard) export class IdeasController { constructor(private readonly ideasService: IdeasService) {} /** * POST /api/ideas/capture * Quick capture endpoint for rapid idea capture * Requires minimal fields: content only (title optional) */ @Post("capture") async capture(@Body() captureIdeaDto: CaptureIdeaDto, @Request() req: AuthenticatedRequest) { const workspaceId = req.user?.workspaceId; const userId = req.user?.id; if (!workspaceId || !userId) { throw new UnauthorizedException("Authentication required"); } return this.ideasService.capture(workspaceId, userId, captureIdeaDto); } /** * POST /api/ideas * Create a new idea with full categorization options */ @Post() async create(@Body() createIdeaDto: CreateIdeaDto, @Request() req: AuthenticatedRequest) { const workspaceId = req.user?.workspaceId; const userId = req.user?.id; if (!workspaceId || !userId) { throw new UnauthorizedException("Authentication required"); } return this.ideasService.create(workspaceId, userId, createIdeaDto); } /** * GET /api/ideas * Get paginated ideas with optional filters * Supports status, domain, project, category, and search filters */ @Get() async findAll(@Query() query: QueryIdeasDto, @Request() req: AuthenticatedRequest) { const workspaceId = req.user?.workspaceId; if (!workspaceId) { throw new UnauthorizedException("Authentication required"); } return this.ideasService.findAll(Object.assign({}, query, { workspaceId })); } /** * GET /api/ideas/:id * Get a single idea by ID */ @Get(":id") async findOne(@Param("id") id: string, @Request() req: AuthenticatedRequest) { const workspaceId = req.user?.workspaceId; if (!workspaceId) { throw new UnauthorizedException("Authentication required"); } return this.ideasService.findOne(id, workspaceId); } /** * PATCH /api/ideas/:id * Update an idea */ @Patch(":id") async update( @Param("id") id: string, @Body() updateIdeaDto: UpdateIdeaDto, @Request() req: AuthenticatedRequest ) { const workspaceId = req.user?.workspaceId; const userId = req.user?.id; if (!workspaceId || !userId) { throw new UnauthorizedException("Authentication required"); } return this.ideasService.update(id, workspaceId, userId, updateIdeaDto); } /** * DELETE /api/ideas/:id * Delete an idea */ @Delete(":id") async remove(@Param("id") id: string, @Request() req: AuthenticatedRequest) { const workspaceId = req.user?.workspaceId; const userId = req.user?.id; if (!workspaceId || !userId) { throw new UnauthorizedException("Authentication required"); } return this.ideasService.remove(id, workspaceId, userId); } }