import { Body, Controller, Post, UseGuards } from '@nestjs/common'; import { ApiBearerAuth, ApiBody, ApiHeader, ApiOperation, ApiTags } from '@nestjs/swagger'; import { AiService } from '../providers/ai.service'; import { ChatDto } from '../dto/chat.dto'; import { GenerateFoodDescriptionDto } from '../dto/generate-food-description.dto'; import { GenerateFoodContentDto } from '../dto/generate-food-content.dto'; import { OptionalAuthGuard } from '../../auth/guards/optinalAuth.guard'; import { AdminAuthGuard } from '../../auth/guards/adminAuth.guard'; import { RestId } from 'src/common/decorators/rest-id.decorator'; import { UserId } from 'src/common/decorators/user-id.decorator'; import { RestSlug } from 'src/common/decorators/rest-slug.decorator'; import { Permissions } from 'src/common/decorators/permissions.decorator'; import { Permission } from 'src/common/enums/permission.enum'; import { API_HEADER_SLUG } from 'src/common/constants'; @ApiTags('ai') @Controller() export class AiController { constructor(private readonly aiService: AiService) {} @UseGuards(OptionalAuthGuard) @Post('public/ai/chat') @ApiOperation({ summary: 'Ask the restaurant AI assistant about the menu' }) @ApiHeader(API_HEADER_SLUG) @ApiHeader({ name: 'Authorization', required: false, description: 'Bearer token (optional authentication)', }) @ApiBearerAuth() @ApiBody({ type: ChatDto }) async chat( @Body() dto: ChatDto, @RestSlug() slug: string, @RestId() restId?: string, @UserId() userId?: string, ) { return this.aiService.chat(dto, { restId: restId || undefined, userId: userId || undefined, slug, }); } @UseGuards(AdminAuthGuard) @Permissions(Permission.MANAGE_FOODS) @Post('admin/ai/food-description') @ApiBearerAuth() @ApiOperation({ summary: 'Generate a two-line food description from a food name' }) @ApiBody({ type: GenerateFoodDescriptionDto }) async generateFoodDescription(@Body() dto: GenerateFoodDescriptionDto, @RestId() restId: string) { return this.aiService.generateFoodDescription(dto, restId); } @UseGuards(AdminAuthGuard) @Permissions(Permission.MANAGE_FOODS) @Post('admin/ai/food-content') @ApiBearerAuth() @ApiOperation({ summary: 'Generate food ingredients/contents from a food name' }) @ApiBody({ type: GenerateFoodContentDto }) async generateFoodContent(@Body() dto: GenerateFoodContentDto, @RestId() restId: string) { return this.aiService.generateFoodContent(dto, restId); } }