1import { Body, Controller, Delete, Get, Inject, Param, Patch, Post, Query, Req, Res } from "@nestjs/common";
2import type { Request, Response } from "express";
3import { AiChatService } from "./ai-chat.service.js";
4import { AiService } from "./ai.service.js";
5import { ZodValidate } from "../../common/pipes/zod-validation.pipe.js";
6import { requireActor, requireUser } from "../../common/types.js";
7import { ChatDto, type ChatInput, CreateConversationDto, type CreateConversationInput, ListMessagesQuery, type ListMessagesInput } from "./dto.js";
8import { RenameConversationDto, type RenameConversationInput, SendMessageDto, type SendMessageInput } from "./dto.js";
9
10@Controller()
11export class AiController {
12
13
14
15
16 constructor(
17 @Inject(AiService) private readonly ai: AiService,
18 @Inject(AiChatService) private readonly aiChat: AiChatService
19 ) {}
20
21
27 @Post("workspaces/:workspaceId/ai/ping")
28 ping(@Param("workspaceId") workspaceId: string, @Req() req: Request) {
29 return this.ai.ping(workspaceId, requireActor(req));
30 }
31
32
33
34
35
36
37
38 @Get("workspaces/:workspaceId/ai/conversations")
39 list(
40 @Param("workspaceId") workspaceId: string,
41 @Req() req: Request
42 ) {
43 return this.ai.listConversations(workspaceId, requireUser(req));
44 }
45
46 @Post("workspaces/:workspaceId/ai/conversations")
47 create(
48 @Param("workspaceId") workspaceId: string,
49 @Body(ZodValidate(CreateConversationDto)) body: CreateConversationInput,
50 @Req() req: Request
51 ) {
52 return this.ai.createConversation(workspaceId, requireUser(req), body, req);
53 }
54
55 @Get("ai/conversations/:id")
56 get(@Param("id") id: string, @Req() req: Request) {
57 return this.ai.getConversation(id, requireUser(req));
58 }
59
60 @Patch("ai/conversations/:id")
61 rename(
62 @Param("id") id: string,
63 @Body(ZodValidate(RenameConversationDto)) body: RenameConversationInput,
64 @Req() req: Request
65 ) {
66 return this.ai.renameConversation(id, requireUser(req), body.title);
67 }
68
69 @Delete("ai/conversations/:id")
70 remove(@Param("id") id: string, @Req() req: Request) {
71 return this.ai.deleteConversation(id, requireUser(req));
72 }
73
74 @Get("ai/conversations/:id/messages")
75 messages(
76 @Param("id") id: string,
77 @Query(ZodValidate(ListMessagesQuery)) query: ListMessagesInput,
78 @Req() req: Request
79 ) {
80 return this.ai.listMessages(id, requireUser(req), query);
81 }
82
83
89 @Post("workspaces/:workspaceId/ai/chat")
90 chat(
91 @Param("workspaceId") workspaceId: string,
92 @Body(ZodValidate(ChatDto)) body: ChatInput,
93 @Req() req: Request
94 ) {
95 return this.ai.chat(workspaceId, requireUser(req), body, req);
96 }
97
98
106 @Post("workspaces/:workspaceId/ai/conversations/:conversationId/messages")
107 sendMessage(
108 @Param("workspaceId") workspaceId: string,
109 @Param("conversationId") conversationId: string,
110 @Body(ZodValidate(SendMessageDto)) body: SendMessageInput,
111 @Req() req: Request,
112 @Res() res: Response
113 ) {
114 return this.aiChat.sendMessage(workspaceId, requireUser(req), conversationId, body, req, res);
115 }
116}
117