From e8e2a4a01e558de18024765c6d02fffd57fb6e45 Mon Sep 17 00:00:00 2001 From: Blomios Date: Sun, 18 Jan 2026 22:22:00 +0100 Subject: [PATCH] add process with node API key added --- backend/handlers/service_handler.go | 32 +++ backend/main.go | 1 + backend/models/service.go | 7 + backend/repositories/node_repo.go | 63 ++++++ .../src/components/admin/AddServiceDialog.tsx | 92 +++++++++ .../src/components/admin/NodeAdminCard.tsx | 40 +++- frontend/src/pages/Admin.tsx | 65 +++--- frontend/src/types/monitoring.ts | 7 + node/config.json | 2 +- node/node.log | 35 +--- node/processes.json | 4 +- node/target/.rustc_info.json | 2 +- node/target/flycheck0/stderr | 2 +- node/target/flycheck0/stdout | 190 +++++++++--------- .../node-f12992bfd5fdd350/output-bin-nodecli | 4 +- .../release/deps/nodecli-f12992bfd5fdd350 | Bin 7074592 -> 7074480 bytes node/target/release/nodecli | Bin 7074592 -> 7074480 bytes 17 files changed, 390 insertions(+), 156 deletions(-) create mode 100644 frontend/src/components/admin/AddServiceDialog.tsx diff --git a/backend/handlers/service_handler.go b/backend/handlers/service_handler.go index de911bf1..adf2c8ab 100644 --- a/backend/handlers/service_handler.go +++ b/backend/handlers/service_handler.go @@ -66,3 +66,35 @@ func (h *NodeHandler) HandleDeleteService(c *gin.Context) { c.Status(http.StatusNoContent) } + +func (h *NodeHandler) HandleAddService(c *gin.Context) { + + var addService models.AddServiceRequest + if err := c.ShouldBindJSON(&addService); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + + node, err := h.Repo.RetriveNode(addService.NodeId) + if err != nil { + log.Printf("Node not found %v error : %v", addService.NodeId, err) + c.JSON(http.StatusNotFound, gin.H{"error": "Node not found"}) + return + } + + var service models.Service + service.Command = addService.Command + service.Name = addService.Name + service.Id = 0 + + log.Printf("Node api key: %v", addService.NodeApiKey) + + err = h.Repo.AddServiceToNode(&service, &node, addService.NodeApiKey) + if err != nil { + log.Printf("Error add service: %v", err) + c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to add service"}) + return + } + + c.Status(http.StatusNoContent) +} diff --git a/backend/main.go b/backend/main.go index e0885819..d5cfa26a 100644 --- a/backend/main.go +++ b/backend/main.go @@ -119,6 +119,7 @@ func main() { protected.DELETE("/deleteService", nodeHandler.HandleDeleteService) protected.POST("/createApiKey", nodeHandler.CreateApiKeyHandler) + protected.POST("/addProcess", nodeHandler.HandleAddService) protected.GET("/retrieveNodeList", nodeHandler.HandleRetrieveNodeList) protected.GET("/retrieveApiKeys", nodeHandler.HandleRetrieveApiKeys) diff --git a/backend/models/service.go b/backend/models/service.go index b863e13a..755c5114 100644 --- a/backend/models/service.go +++ b/backend/models/service.go @@ -46,3 +46,10 @@ type ServiceMinimal struct { NodeId int `json:"node_id"` ServiceId int `json:"service_id"` } + +type AddServiceRequest struct { + NodeId int `json:"node_id"` + Name string `json:"name"` + Command string `json:"command"` + NodeApiKey string `json:"node_api_key"` +} diff --git a/backend/repositories/node_repo.go b/backend/repositories/node_repo.go index 21b974b8..c9363afd 100644 --- a/backend/repositories/node_repo.go +++ b/backend/repositories/node_repo.go @@ -234,3 +234,66 @@ func (r *NodeRepository) RetriveApiKeyList() ([]models.ApiKey, error) { return apiKeys, nil } + +func addServiceToNode(node *models.NodeInfo, service *models.Service, nodeApiKey string) error { + + apiURL := node.Address + "/add" + + bodyData := map[string]string{ + "name": service.Name, + "command": service.Command, + } + + jsonData, err := json.Marshal(bodyData) + if err != nil { + return err + } + + log.Printf("Node api key: %v", nodeApiKey) + + req, err := http.NewRequest(http.MethodPost, apiURL, bytes.NewBuffer(jsonData)) + req.Header.Set("Content-Type", "application/json") + req.Header.Set("X-Node-API-Key", nodeApiKey) + + if err != nil { + return fmt.Errorf("Erreur lors de la création de la requête POST : %v", err) + } + + client := http.Client{ + Timeout: 10 * time.Second, + } + + resp, err := client.Do(req) + + if err != nil { + return fmt.Errorf("Erreur lors de l'exécution de la requête POST : %v", err) + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusNoContent && resp.StatusCode != http.StatusOK { + return fmt.Errorf("Requête POST échouée pour %s. Statut : %s", apiURL, resp.Status) + } + + log.Printf("Service %v ajouté avec succès. Réponse : %s", service.Name, resp.Status) + + return nil +} + +func (r *NodeRepository) AddServiceToNode(service *models.Service, node *models.NodeInfo, nodeApiKey string) error { + + //tx, err := r.DB.Begin() + + //r.RegisterService(*service, node.Id) + + log.Printf("add service name %v, on nodeId %v", service.Name, node.Id) + + err := addServiceToNode(node, service, nodeApiKey) + if err != nil { + //tx.Rollback() + return fmt.Errorf("échec sur le node, annulation du changement en base de données : %w", err) + } + + //return tx.Commit() + return err +} diff --git a/frontend/src/components/admin/AddServiceDialog.tsx b/frontend/src/components/admin/AddServiceDialog.tsx new file mode 100644 index 00000000..9bb21edb --- /dev/null +++ b/frontend/src/components/admin/AddServiceDialog.tsx @@ -0,0 +1,92 @@ +import { useState } from 'react'; +import { Button } from '@/components/ui/button'; +import { Input } from '@/components/ui/input'; +import { Label } from '@/components/ui/label'; +import { Plus, Terminal } from 'lucide-react'; +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogTrigger, + DialogFooter, +} from '@/components/ui/dialog'; + +interface AddServiceDialogProps { + onAdd: (name: string, command: string) => void; +} + +export function AddServiceDialog({ onAdd }: AddServiceDialogProps) { + const [open, setOpen] = useState(false); + const [name, setName] = useState(''); + const [command, setCommand] = useState(''); + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + if (name.trim() && command.trim()) { + onAdd(name.trim(), command.trim()); + setName(''); + setCommand(''); + setOpen(false); + } + }; + + return ( + + + + + + + + + Ajouter un service + + +
+
+ + setName(e.target.value)} + className="bg-background" + /> +
+
+ +
+
+ $ +
+