65 lines
2.5 KiB
TypeScript
65 lines
2.5 KiB
TypeScript
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);
|
|
}
|
|
}
|