瀏覽代碼

Refactor AI assistant interfaces and service implementation

Shun Miyazawa 1 年之前
父節點
當前提交
7c5e43f373

+ 17 - 0
apps/app/src/features/openai/interfaces/ai-assistant.ts

@@ -1,3 +1,7 @@
+import type { IGrantedGroup, IUser, Ref } from '^/../../packages/core/dist';
+
+import type { VectorStore } from '../server/models/vector-store';
+
 /*
 /*
 *  Objects
 *  Objects
 */
 */
@@ -19,3 +23,16 @@ export const AiAssistantOwnerAccessScope = {
 */
 */
 export type AiAssistantShareScope = typeof AiAssistantShareScope[keyof typeof AiAssistantShareScope];
 export type AiAssistantShareScope = typeof AiAssistantShareScope[keyof typeof AiAssistantShareScope];
 export type AiAssistantOwnerAccessScope = typeof AiAssistantOwnerAccessScope[keyof typeof AiAssistantOwnerAccessScope];
 export type AiAssistantOwnerAccessScope = typeof AiAssistantOwnerAccessScope[keyof typeof AiAssistantOwnerAccessScope];
+
+export interface AiAssistant {
+  name: string;
+  description: string
+  additionalInstruction: string
+  pagePathPatterns: string[],
+  vectorStore: Ref<VectorStore>
+  owner: Ref<IUser>
+  grantedUsers?: IUser[]
+  grantedGroups?: IGrantedGroup[]
+  shareScope: AiAssistantShareScope
+  ownerAccessScope: AiAssistantOwnerAccessScope
+}

+ 3 - 21
apps/app/src/features/openai/server/models/ai-assistant.ts

@@ -1,29 +1,11 @@
-import {
-  type IGrantedGroup, GroupType, type IUser, type Ref,
-} from '@growi/core';
+import { type IGrantedGroup, GroupType } from '@growi/core';
 import { type Model, type Document, Schema } from 'mongoose';
 import { type Model, type Document, Schema } from 'mongoose';
 
 
 import { getOrCreateModel } from '~/server/util/mongoose-utils';
 import { getOrCreateModel } from '~/server/util/mongoose-utils';
 
 
-import { AiAssistantShareScope, AiAssistantOwnerAccessScope } from '../../interfaces/ai-assistant';
+import { type AiAssistant, AiAssistantShareScope, AiAssistantOwnerAccessScope } from '../../interfaces/ai-assistant';
 
 
-import type { VectorStore } from './vector-store';
-
-
-interface AiAssistant {
-  name: string;
-  description: string
-  additionalInstruction: string
-  pagePathPatterns: string[],
-  vectorStore: Ref<VectorStore>
-  owner: Ref<IUser>
-  grantedUsers?: IUser[]
-  grantedGroups?: IGrantedGroup[]
-  shareScope: AiAssistantShareScope
-  ownerAccessScope: AiAssistantOwnerAccessScope
-}
-
-interface AiAssistantDocument extends AiAssistant, Document {}
+export interface AiAssistantDocument extends AiAssistant, Document {}
 
 
 type AiAssistantModel = Model<AiAssistantDocument>
 type AiAssistantModel = Model<AiAssistantDocument>
 
 

+ 12 - 3
apps/app/src/features/openai/server/routes/create-ai-assistant.ts

@@ -1,4 +1,5 @@
 import { ErrorV3 } from '@growi/core/dist/models';
 import { ErrorV3 } from '@growi/core/dist/models';
+import type { IUserHasId } from '^/../../packages/core/dist';
 import type { Request, RequestHandler } from 'express';
 import type { Request, RequestHandler } from 'express';
 import { type ValidationChain, body } from 'express-validator';
 import { type ValidationChain, body } from 'express-validator';
 
 
@@ -8,7 +9,8 @@ import { apiV3FormValidator } from '~/server/middlewares/apiv3-form-validator';
 import type { ApiV3Response } from '~/server/routes/apiv3/interfaces/apiv3-response';
 import type { ApiV3Response } from '~/server/routes/apiv3/interfaces/apiv3-response';
 import loggerFactory from '~/utils/logger';
 import loggerFactory from '~/utils/logger';
 
 
-import { AiAssistantShareScope, AiAssistantOwnerAccessScope } from '../../interfaces/ai-assistant';
+import { type AiAssistant, AiAssistantShareScope, AiAssistantOwnerAccessScope } from '../../interfaces/ai-assistant';
+import { aiAssistantService } from '../services/ai-assistant';
 
 
 import { certifyAiService } from './middlewares/certify-ai-service';
 import { certifyAiService } from './middlewares/certify-ai-service';
 
 
@@ -16,6 +18,12 @@ const logger = loggerFactory('growi:routes:apiv3:openai:create-assistant');
 
 
 type CreateAssistantFactory = (crowi: Crowi) => RequestHandler[];
 type CreateAssistantFactory = (crowi: Crowi) => RequestHandler[];
 
 
+type ReqBody = Omit<AiAssistant, 'vectorStore' | 'owner'>
+
+type Req = Request<undefined, Response, ReqBody> & {
+  user: IUserHasId,
+}
+
 export const createAiAssistantFactory: CreateAssistantFactory = (crowi) => {
 export const createAiAssistantFactory: CreateAssistantFactory = (crowi) => {
   const loginRequiredStrictly = require('~/server/middlewares/login-required')(crowi);
   const loginRequiredStrictly = require('~/server/middlewares/login-required')(crowi);
   const adminRequired = require('~/server/middlewares/admin-required')(crowi);
   const adminRequired = require('~/server/middlewares/admin-required')(crowi);
@@ -84,9 +92,10 @@ export const createAiAssistantFactory: CreateAssistantFactory = (crowi) => {
 
 
   return [
   return [
     accessTokenParser, loginRequiredStrictly, adminRequired, certifyAiService, validator, apiV3FormValidator,
     accessTokenParser, loginRequiredStrictly, adminRequired, certifyAiService, validator, apiV3FormValidator,
-    async(req: Request, res: ApiV3Response) => {
-
+    async(req: Req, res: ApiV3Response) => {
       try {
       try {
+        const aiAssistantData = { ...req.body, owner: req.user._id };
+        aiAssistantService.createAiAssistant(aiAssistantData);
         return res.apiv3({});
         return res.apiv3({});
 
 
       }
       }

+ 18 - 0
apps/app/src/features/openai/server/services/ai-assistant.ts

@@ -0,0 +1,18 @@
+import { type AiAssistant } from '../../interfaces/ai-assistant';
+import AiAssistantModal, { type AiAssistantDocument } from '../models/ai-assistant';
+
+interface IAiAssisntantService {
+  createAiAssistant(data: Omit<AiAssistant, 'vectorStore'>): Promise<AiAssistantDocument>;
+}
+
+class AiAssistantService implements IAiAssisntantService {
+
+  async createAiAssistant(data: Omit<AiAssistant, 'vectorStore'>): Promise<AiAssistantDocument> {
+    const dumyVectorStoreId = '676e0d9863442b736e7ecf09';
+    const aiAssistant = await AiAssistantModal.create({ ...data, vectorStore: dumyVectorStoreId });
+    return aiAssistant;
+  }
+
+}
+
+export const aiAssistantService = new AiAssistantService();