UNPKG

powr-sdk-api

Version:

Shared API core library for PowrStack projects. Zero dependencies - works with Express, Next.js API routes, and other frameworks. All features are optional and install only what you need.

330 lines (314 loc) 9.36 kB
"use strict"; const express = require("express"); const router = express.Router(); const tasksManager = require("../managers/tasks"); const toolsManager = require("../managers/tools"); // GET /tasks - Get all tasks router.get("/", async (req, res) => { try { const isAdmin = req.user.access === 100; const result = await tasksManager.getUserTasks(req.user.powrId, req.projectId, isAdmin); if (result.success) { return res.status(200).json({ success: true, tasks: result.tasks }); } else { return res.status(400).json({ success: false, message: result.message }); } } catch (error) { console.error("Error retrieving tasks:", error); return res.status(500).json({ success: false, message: "Failed to retrieve tasks." }); } }); // GET /tasks/:taskId - Get specific task router.get("/:taskId", async (req, res) => { try { const isAdmin = req.user.access === 100; const result = await tasksManager.getTask(req.params.taskId, req.user.powrId, req.projectId, isAdmin); if (result.success) { return res.status(200).json({ success: true, task: result.task }); } else { return res.status(404).json({ success: false, message: result.message }); } } catch (error) { console.error("Error retrieving task:", error); return res.status(500).json({ success: false, message: "Failed to retrieve task." }); } }); // POST /tasks - Create new task router.post("/", async (req, res) => { try { var _tool$actions; const { name, description, scheduledFor, toolId, actionId, params, isActive } = req.body; // Validate required fields if (!name || !toolId || !actionId) { return res.status(400).json({ success: false, message: "Missing required fields: name, toolId, actionId" }); } // Validate tool exists const tool = toolsManager.getTool(toolId); if (!tool) { return res.status(400).json({ success: false, message: `Tool not found: ${toolId}` }); } // Validate action exists const action = (_tool$actions = tool.actions) === null || _tool$actions === void 0 ? void 0 : _tool$actions.find(a => a.id === actionId); if (!action) { return res.status(400).json({ success: false, message: `Action not found: ${actionId} for tool ${toolId}` }); } const taskData = { name, description, scheduledFor, // null, timestamp, or cron expression toolId, actionId, params: params || {}, userId: req.user.powrId, projectId: req.projectId, isActive: isActive !== false // Default to true }; const result = await tasksManager.createTask(taskData); if (result.success) { res.status(201).json({ success: true, message: "Task created successfully", task: result.task }); } else { res.status(400).json({ success: false, message: result.message }); } } catch (error) { console.error("❌ Error creating scheduled task:", error); res.status(500).json({ success: false, message: "Failed to create scheduled task" }); } }); // PUT /tasks/:taskId - Update task router.put("/:taskId", async (req, res) => { try { const { name, description, scheduledFor, toolId, actionId, params, isActive } = req.body; // Validate tool exists if toolId is being updated if (toolId) { const tool = toolsManager.getTool(toolId); if (!tool) { return res.status(400).json({ success: false, message: `Tool not found: ${toolId}` }); } // Validate action exists if actionId is being updated if (actionId) { var _tool$actions2; const action = (_tool$actions2 = tool.actions) === null || _tool$actions2 === void 0 ? void 0 : _tool$actions2.find(a => a.id === actionId); if (!action) { return res.status(400).json({ success: false, message: `Action not found: ${actionId} for tool ${toolId}` }); } } } const updateData = {}; if (name !== undefined) updateData.name = name; if (description !== undefined) updateData.description = description; if (scheduledFor !== undefined) updateData.scheduledFor = scheduledFor; if (toolId !== undefined) updateData.toolId = toolId; if (actionId !== undefined) updateData.actionId = actionId; if (params !== undefined) updateData.params = params; if (isActive !== undefined) updateData.isActive = isActive; const isAdmin = req.user.access === 100; const result = await tasksManager.updateTask(req.params.taskId, req.user.powrId, req.projectId, updateData, isAdmin); if (result.success) { res.status(200).json({ success: true, message: "Task updated successfully" }); } else { res.status(400).json({ success: false, message: result.message }); } } catch (error) { console.error("❌ Error updating scheduled task:", error); res.status(500).json({ success: false, message: "Failed to update scheduled task" }); } }); // POST /tasks/:taskId/execute - Execute task manually router.post("/:taskId/execute", async (req, res) => { try { const taskId = req.params.taskId; const isAdmin = req.user.access === 100; const result = await tasksManager.executeTask(taskId, req.user.powrId, req.projectId, isAdmin); if (result.success) { res.json({ success: true, message: "Task executed successfully", result: result.result }); } else { res.status(400).json({ success: false, message: result.message }); } } catch (error) { console.error("❌ Error executing scheduled task:", error); res.status(500).json({ success: false, message: "Failed to execute scheduled task" }); } }); // POST /tasks/:taskId/toggle - Toggle task active status router.post("/:taskId/toggle", async (req, res) => { try { const taskId = req.params.taskId; const { isActive } = req.body; const isAdmin = req.user.access === 100; const result = await tasksManager.toggleTask(taskId, req.user.powrId, req.projectId, isActive, isAdmin); if (result.success) { res.json({ success: true, message: `Task ${isActive ? 'activated' : 'deactivated'} successfully` }); } else { res.status(400).json({ success: false, message: result.message }); } } catch (error) { console.error("❌ Error toggling scheduled task:", error); res.status(500).json({ success: false, message: "Failed to toggle scheduled task" }); } }); // DELETE /tasks/:taskId - Delete task router.delete("/:taskId", async (req, res) => { try { const taskId = req.params.taskId; const isAdmin = req.user.access === 100; const result = await tasksManager.deleteTask(taskId, req.user.powrId, req.projectId, isAdmin); if (result.success) { res.json({ success: true, message: "Task deleted successfully" }); } else { res.status(400).json({ success: false, message: result.message }); } } catch (error) { console.error("❌ Error deleting scheduled task:", error); res.status(500).json({ success: false, message: "Failed to delete scheduled task" }); } }); // GET /tasks/:taskId/executions - Get execution history for a task router.get("/:taskId/executions", async (req, res) => { try { const taskId = req.params.taskId; const isAdmin = req.user.access === 100; const result = await tasksManager.getTaskExecutions(taskId, req.user.powrId, req.projectId, isAdmin); if (result.success) { res.json({ success: true, executions: result.executions }); } else { res.status(400).json({ success: false, message: result.message }); } } catch (error) { console.error("❌ Error retrieving task executions:", error); res.status(500).json({ success: false, message: "Failed to retrieve task executions" }); } }); // POST /tasks/execute-scheduled - Execute all scheduled tasks (called by Atlas) router.post("/execute-scheduled", async (req, res) => { try { const projectId = req.projectId; console.log(`🔍 API: Executing scheduled tasks for project: ${projectId}`); // Execute all scheduled tasks for this project const result = await tasksManager.executeScheduledTasks({ projectId }); console.log(`✅ API: Scheduled tasks execution completed for project: ${projectId}`); res.json({ success: true, message: "Scheduled tasks executed successfully", projectId: projectId, result: result }); } catch (error) { console.error("❌ API: Error executing scheduled tasks:", error); res.status(500).json({ success: false, message: "Failed to execute scheduled tasks", error: error.message }); } }); module.exports = router;