Spaces:
Sleeping
Sleeping
| import { Request, Response } from 'express'; | |
| import { ApiResponse } from '../types/index.js'; | |
| import { | |
| getAllGroups, | |
| getGroupByIdOrName, | |
| createGroup, | |
| updateGroup, | |
| updateGroupServers, | |
| deleteGroup, | |
| addServerToGroup, | |
| removeServerFromGroup, | |
| getServerConfigInGroup, | |
| getServerConfigsInGroup, | |
| updateServerToolsInGroup, | |
| } from '../services/groupService.js'; | |
| // Get all groups | |
| export const getGroups = (_: Request, res: Response): void => { | |
| try { | |
| const groups = getAllGroups(); | |
| const response: ApiResponse = { | |
| success: true, | |
| data: groups, | |
| }; | |
| res.json(response); | |
| } catch (error) { | |
| res.status(500).json({ | |
| success: false, | |
| message: 'Failed to get groups information', | |
| }); | |
| } | |
| }; | |
| // Get a specific group by ID | |
| export const getGroup = (req: Request, res: Response): void => { | |
| try { | |
| const { id } = req.params; | |
| if (!id) { | |
| res.status(400).json({ | |
| success: false, | |
| message: 'Group ID is required', | |
| }); | |
| return; | |
| } | |
| const group = getGroupByIdOrName(id); | |
| if (!group) { | |
| res.status(404).json({ | |
| success: false, | |
| message: 'Group not found', | |
| }); | |
| return; | |
| } | |
| const response: ApiResponse = { | |
| success: true, | |
| data: group, | |
| }; | |
| res.json(response); | |
| } catch (error) { | |
| res.status(500).json({ | |
| success: false, | |
| message: 'Failed to get group information', | |
| }); | |
| } | |
| }; | |
| // Create a new group | |
| export const createNewGroup = (req: Request, res: Response): void => { | |
| try { | |
| const { name, description, servers } = req.body; | |
| if (!name) { | |
| res.status(400).json({ | |
| success: false, | |
| message: 'Group name is required', | |
| }); | |
| return; | |
| } | |
| const serverList = Array.isArray(servers) ? servers : []; | |
| // Set owner property - use current user's username, default to 'admin' | |
| const currentUser = (req as any).user; | |
| const owner = currentUser?.username || 'admin'; | |
| const newGroup = createGroup(name, description, serverList, owner); | |
| if (!newGroup) { | |
| res.status(400).json({ | |
| success: false, | |
| message: 'Failed to create group or group name already exists', | |
| }); | |
| return; | |
| } | |
| const response: ApiResponse = { | |
| success: true, | |
| data: newGroup, | |
| message: 'Group created successfully', | |
| }; | |
| res.status(201).json(response); | |
| } catch (error) { | |
| res.status(500).json({ | |
| success: false, | |
| message: 'Internal server error', | |
| }); | |
| } | |
| }; | |
| // Update an existing group | |
| export const updateExistingGroup = (req: Request, res: Response): void => { | |
| try { | |
| const { id } = req.params; | |
| const { name, description, servers } = req.body; | |
| if (!id) { | |
| res.status(400).json({ | |
| success: false, | |
| message: 'Group ID is required', | |
| }); | |
| return; | |
| } | |
| // Allow updating servers along with other fields | |
| const updateData: any = {}; | |
| if (name !== undefined) updateData.name = name; | |
| if (description !== undefined) updateData.description = description; | |
| if (servers !== undefined) updateData.servers = servers; | |
| if (Object.keys(updateData).length === 0) { | |
| res.status(400).json({ | |
| success: false, | |
| message: 'At least one field (name, description, or servers) is required to update', | |
| }); | |
| return; | |
| } | |
| const updatedGroup = updateGroup(id, updateData); | |
| if (!updatedGroup) { | |
| res.status(404).json({ | |
| success: false, | |
| message: 'Group not found or name already exists', | |
| }); | |
| return; | |
| } | |
| const response: ApiResponse = { | |
| success: true, | |
| data: updatedGroup, | |
| message: 'Group updated successfully', | |
| }; | |
| res.json(response); | |
| } catch (error) { | |
| res.status(500).json({ | |
| success: false, | |
| message: 'Internal server error', | |
| }); | |
| } | |
| }; | |
| // Update servers in a group (batch update) - supports both string[] and server config format | |
| export const updateGroupServersBatch = (req: Request, res: Response): void => { | |
| try { | |
| const { id } = req.params; | |
| const { servers } = req.body; | |
| if (!id) { | |
| res.status(400).json({ | |
| success: false, | |
| message: 'Group ID is required', | |
| }); | |
| return; | |
| } | |
| if (!Array.isArray(servers)) { | |
| res.status(400).json({ | |
| success: false, | |
| message: 'Servers must be an array of server names or server configurations', | |
| }); | |
| return; | |
| } | |
| // Validate server configurations if provided in new format | |
| for (const server of servers) { | |
| if (typeof server === 'object' && server !== null) { | |
| if (!server.name || typeof server.name !== 'string') { | |
| res.status(400).json({ | |
| success: false, | |
| message: 'Each server configuration must have a valid name', | |
| }); | |
| return; | |
| } | |
| if ( | |
| server.tools && | |
| server.tools !== 'all' && | |
| (!Array.isArray(server.tools) || | |
| !server.tools.every((tool: any) => typeof tool === 'string')) | |
| ) { | |
| res.status(400).json({ | |
| success: false, | |
| message: 'Tools must be "all" or an array of strings', | |
| }); | |
| return; | |
| } | |
| } | |
| } | |
| const updatedGroup = updateGroupServers(id, servers); | |
| if (!updatedGroup) { | |
| res.status(404).json({ | |
| success: false, | |
| message: 'Group not found', | |
| }); | |
| return; | |
| } | |
| const response: ApiResponse = { | |
| success: true, | |
| data: updatedGroup, | |
| message: 'Group servers updated successfully', | |
| }; | |
| res.json(response); | |
| } catch (error) { | |
| res.status(500).json({ | |
| success: false, | |
| message: 'Internal server error', | |
| }); | |
| } | |
| }; | |
| // Delete a group | |
| export const deleteExistingGroup = (req: Request, res: Response): void => { | |
| try { | |
| const { id } = req.params; | |
| if (!id) { | |
| res.status(400).json({ | |
| success: false, | |
| message: 'Group ID is required', | |
| }); | |
| return; | |
| } | |
| const success = deleteGroup(id); | |
| if (!success) { | |
| res.status(404).json({ | |
| success: false, | |
| message: 'Group not found or failed to delete', | |
| }); | |
| return; | |
| } | |
| res.json({ | |
| success: true, | |
| message: 'Group deleted successfully', | |
| }); | |
| } catch (error) { | |
| res.status(500).json({ | |
| success: false, | |
| message: 'Internal server error', | |
| }); | |
| } | |
| }; | |
| // Add server to a group | |
| export const addServerToExistingGroup = (req: Request, res: Response): void => { | |
| try { | |
| const { id } = req.params; | |
| const { serverName } = req.body; | |
| if (!id) { | |
| res.status(400).json({ | |
| success: false, | |
| message: 'Group ID is required', | |
| }); | |
| return; | |
| } | |
| if (!serverName) { | |
| res.status(400).json({ | |
| success: false, | |
| message: 'Server name is required', | |
| }); | |
| return; | |
| } | |
| const updatedGroup = addServerToGroup(id, serverName); | |
| if (!updatedGroup) { | |
| res.status(404).json({ | |
| success: false, | |
| message: 'Group or server not found', | |
| }); | |
| return; | |
| } | |
| const response: ApiResponse = { | |
| success: true, | |
| data: updatedGroup, | |
| message: 'Server added to group successfully', | |
| }; | |
| res.json(response); | |
| } catch (error) { | |
| res.status(500).json({ | |
| success: false, | |
| message: 'Internal server error', | |
| }); | |
| } | |
| }; | |
| // Remove server from a group | |
| export const removeServerFromExistingGroup = (req: Request, res: Response): void => { | |
| try { | |
| const { id, serverName } = req.params; | |
| if (!id || !serverName) { | |
| res.status(400).json({ | |
| success: false, | |
| message: 'Group ID and server name are required', | |
| }); | |
| return; | |
| } | |
| const updatedGroup = removeServerFromGroup(id, serverName); | |
| if (!updatedGroup) { | |
| res.status(404).json({ | |
| success: false, | |
| message: 'Group not found', | |
| }); | |
| return; | |
| } | |
| const response: ApiResponse = { | |
| success: true, | |
| data: updatedGroup, | |
| message: 'Server removed from group successfully', | |
| }; | |
| res.json(response); | |
| } catch (error) { | |
| res.status(500).json({ | |
| success: false, | |
| message: 'Internal server error', | |
| }); | |
| } | |
| }; | |
| // Get servers in a group | |
| export const getGroupServers = (req: Request, res: Response): void => { | |
| try { | |
| const { id } = req.params; | |
| if (!id) { | |
| res.status(400).json({ | |
| success: false, | |
| message: 'Group ID is required', | |
| }); | |
| return; | |
| } | |
| const group = getGroupByIdOrName(id); | |
| if (!group) { | |
| res.status(404).json({ | |
| success: false, | |
| message: 'Group not found', | |
| }); | |
| return; | |
| } | |
| const response: ApiResponse = { | |
| success: true, | |
| data: group.servers, | |
| }; | |
| res.json(response); | |
| } catch (error) { | |
| res.status(500).json({ | |
| success: false, | |
| message: 'Failed to get group servers', | |
| }); | |
| } | |
| }; | |
| // Get server configurations in a group (including tool selections) | |
| export const getGroupServerConfigs = (req: Request, res: Response): void => { | |
| try { | |
| const { id } = req.params; | |
| if (!id) { | |
| res.status(400).json({ | |
| success: false, | |
| message: 'Group ID is required', | |
| }); | |
| return; | |
| } | |
| const serverConfigs = getServerConfigsInGroup(id); | |
| const response: ApiResponse = { | |
| success: true, | |
| data: serverConfigs, | |
| }; | |
| res.json(response); | |
| } catch (error) { | |
| res.status(500).json({ | |
| success: false, | |
| message: 'Failed to get group server configurations', | |
| }); | |
| } | |
| }; | |
| // Get specific server configuration in a group | |
| export const getGroupServerConfig = (req: Request, res: Response): void => { | |
| try { | |
| const { id, serverName } = req.params; | |
| if (!id || !serverName) { | |
| res.status(400).json({ | |
| success: false, | |
| message: 'Group ID and server name are required', | |
| }); | |
| return; | |
| } | |
| const serverConfig = getServerConfigInGroup(id, serverName); | |
| if (!serverConfig) { | |
| res.status(404).json({ | |
| success: false, | |
| message: 'Server not found in group', | |
| }); | |
| return; | |
| } | |
| const response: ApiResponse = { | |
| success: true, | |
| data: serverConfig, | |
| }; | |
| res.json(response); | |
| } catch (error) { | |
| res.status(500).json({ | |
| success: false, | |
| message: 'Failed to get server configuration', | |
| }); | |
| } | |
| }; | |
| // Update tools for a specific server in a group | |
| export const updateGroupServerTools = (req: Request, res: Response): void => { | |
| try { | |
| const { id, serverName } = req.params; | |
| const { tools } = req.body; | |
| if (!id || !serverName) { | |
| res.status(400).json({ | |
| success: false, | |
| message: 'Group ID and server name are required', | |
| }); | |
| return; | |
| } | |
| // Validate tools parameter | |
| if ( | |
| tools !== 'all' && | |
| (!Array.isArray(tools) || !tools.every((tool) => typeof tool === 'string')) | |
| ) { | |
| res.status(400).json({ | |
| success: false, | |
| message: 'Tools must be "all" or an array of strings', | |
| }); | |
| return; | |
| } | |
| const updatedGroup = updateServerToolsInGroup(id, serverName, tools); | |
| if (!updatedGroup) { | |
| res.status(404).json({ | |
| success: false, | |
| message: 'Group or server not found', | |
| }); | |
| return; | |
| } | |
| const response: ApiResponse = { | |
| success: true, | |
| data: updatedGroup, | |
| message: 'Server tools updated successfully', | |
| }; | |
| res.json(response); | |
| } catch (error) { | |
| res.status(500).json({ | |
| success: false, | |
| message: 'Internal server error', | |
| }); | |
| } | |
| }; | |