diff --git a/internal/server/server.go b/internal/server/server.go index b4f7a20..ab031f1 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -151,6 +151,7 @@ func (hs *HTTPServer) setupRoutes() { api.HandleFunc("/registry/firmware", hs.uploadRegistryFirmware).Methods("POST", "OPTIONS") api.HandleFunc("/registry/firmware/{name}/{version}", hs.downloadRegistryFirmware).Methods("GET") api.HandleFunc("/registry/firmware/{name}/{version}", hs.updateRegistryFirmware).Methods("PUT", "OPTIONS") + api.HandleFunc("/registry/firmware/{name}/{version}", hs.deleteRegistryFirmware).Methods("DELETE", "OPTIONS") // Test endpoints api.HandleFunc("/test/websocket", hs.testWebSocket).Methods("POST", "OPTIONS") @@ -1234,3 +1235,25 @@ func (hs *HTTPServer) updateRegistryFirmware(w http.ResponseWriter, r *http.Requ w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(result) } + +func (hs *HTTPServer) deleteRegistryFirmware(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + name := vars["name"] + version := vars["version"] + + if name == "" || version == "" { + http.Error(w, `{"error": "Missing parameters", "message": "Name and version are required"}`, http.StatusBadRequest) + return + } + + // Delete firmware from registry + result, err := hs.registryClient.DeleteFirmware(name, version) + if err != nil { + log.WithError(err).Error("Failed to delete firmware from registry") + http.Error(w, fmt.Sprintf(`{"error": "Delete failed", "message": "%s"}`, err.Error()), http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(result) +} diff --git a/pkg/registry/registry.go b/pkg/registry/registry.go index 1f1a5ae..41516ed 100644 --- a/pkg/registry/registry.go +++ b/pkg/registry/registry.go @@ -267,6 +267,39 @@ func (c *RegistryClient) DownloadFirmware(name, version string) ([]byte, error) return data, nil } +// DeleteFirmware deletes firmware from the registry +func (c *RegistryClient) DeleteFirmware(name, version string) (map[string]interface{}, error) { + url := fmt.Sprintf("%s/firmware/%s/%s", c.BaseURL, name, version) + + req, err := http.NewRequest(http.MethodDelete, url, nil) + if err != nil { + return nil, fmt.Errorf("failed to create delete request: %w", err) + } + + resp, err := c.HTTPClient.Do(req) + if err != nil { + return nil, fmt.Errorf("failed to delete firmware: %w", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + body, _ := io.ReadAll(resp.Body) + return nil, fmt.Errorf("firmware delete request failed with status %d: %s", resp.StatusCode, string(body)) + } + + var result map[string]interface{} + if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { + return nil, fmt.Errorf("failed to decode delete response: %w", err) + } + + log.WithFields(log.Fields{ + "name": name, + "version": version, + }).Info("Deleted firmware from registry") + + return result, nil +} + // HealthCheck checks if the registry is healthy func (c *RegistryClient) HealthCheck() error { url := fmt.Sprintf("%s/health", c.BaseURL)