@@ -264,6 +264,94 @@ async def update_model_ws_mapping_by_id(
264264 return [str (ws_id ) for ws_id in ws_ids ]
265265
266266
267+ # 新增映射(在已有基础上追加)
268+ @router .post ("/{id}/ws_mapping" , response_model = List [str ], summary = f"{ PLACEHOLDER_PREFIX } system_model_ws_mapping_add" ,
269+ description = f"{ PLACEHOLDER_PREFIX } system_model_ws_mapping_add" )
270+ @require_permissions (permission = SqlbotPermission (role = ['admin' ]))
271+ async def add_model_ws_mapping_by_id (
272+ session : SessionDep ,
273+ id : int = Path (description = "ID" ),
274+ ws_ids : List [str ] = Body (description = "workspace id list" ),
275+ ):
276+ if ws_ids is None :
277+ ws_ids = []
278+ ws_ids = list ({int (ws_id ) for ws_id in ws_ids })
279+
280+ db_model = session .get (AiModelDetail , id )
281+ if not db_model :
282+ raise ValueError (f"AiModelDetail with id { id } not found" )
283+
284+ # 查询已存在的映射,过滤掉重复的
285+ existing_stmt = (
286+ select (AiModelWorkspaceMapping .workspace_id )
287+ .where (
288+ AiModelWorkspaceMapping .ai_model_id == id ,
289+ AiModelWorkspaceMapping .workspace_id .in_ (ws_ids ),
290+ )
291+ )
292+ existing_ws_ids = set (session .exec (existing_stmt ).all ())
293+
294+ # 只插入不存在的映射
295+ new_ws_ids = [ws_id for ws_id in ws_ids if ws_id not in existing_ws_ids ]
296+ for ws_id in new_ws_ids :
297+ session .add (
298+ AiModelWorkspaceMapping (ai_model_id = id , workspace_id = ws_id )
299+ )
300+
301+ session .commit ()
302+
303+ # 返回完整的映射列表
304+ all_stmt = (
305+ select (AiModelWorkspaceMapping .workspace_id )
306+ .where (AiModelWorkspaceMapping .ai_model_id == id )
307+ .distinct ()
308+ )
309+ all_ws_ids : List [int ] = session .exec (all_stmt ).all ()
310+
311+ return [str (ws_id ) for ws_id in all_ws_ids ]
312+
313+
314+ # 删除指定映射
315+ @router .delete ("/{id}/ws_mapping" , response_model = List [str ],
316+ summary = f"{ PLACEHOLDER_PREFIX } system_model_ws_mapping_delete" ,
317+ description = f"{ PLACEHOLDER_PREFIX } system_model_ws_mapping_delete" )
318+ @require_permissions (permission = SqlbotPermission (role = ['admin' ]))
319+ async def delete_model_ws_mapping_by_id (
320+ session : SessionDep ,
321+ id : int = Path (description = "ID" ),
322+ ws_ids : List [str ] = Body (description = "workspace id list" ),
323+ ):
324+ if ws_ids is None :
325+ ws_ids = []
326+ ws_ids = list ({int (ws_id ) for ws_id in ws_ids })
327+
328+ db_model = session .get (AiModelDetail , id )
329+ if not db_model :
330+ raise ValueError (f"AiModelDetail with id { id } not found" )
331+
332+ # 只删除指定的映射
333+ if ws_ids :
334+ session .execute (
335+ delete (AiModelWorkspaceMapping )
336+ .where (
337+ AiModelWorkspaceMapping .ai_model_id == id ,
338+ AiModelWorkspaceMapping .workspace_id .in_ (ws_ids ),
339+ )
340+ )
341+
342+ session .commit ()
343+
344+ # 返回剩余的映射列表
345+ stmt = (
346+ select (AiModelWorkspaceMapping .workspace_id )
347+ .where (AiModelWorkspaceMapping .ai_model_id == id )
348+ .distinct ()
349+ )
350+ remaining_ws_ids : List [int ] = session .exec (stmt ).all ()
351+
352+ return [str (ws_id ) for ws_id in remaining_ws_ids ]
353+
354+
267355@router .get ("/list/by_ws" , response_model = List [AiModelBrief ], summary = f"{ PLACEHOLDER_PREFIX } system_model_list_by_ws" ,
268356 description = f"{ PLACEHOLDER_PREFIX } system_model_list_by_ws" )
269357@require_permissions (permission = SqlbotPermission (role = ['ws_admin' ]))
0 commit comments