diff --git a/pkg/environments/production/services.go b/pkg/environments/production/services.go index 20c7336..4f0641b 100644 --- a/pkg/environments/production/services.go +++ b/pkg/environments/production/services.go @@ -387,7 +387,7 @@ Description=Caddy HTTP/2 Server Documentation=https://caddyserver.com/docs/ After=network-online.target debros-node.service coredns.service Wants=network-online.target -Requires=debros-node.service +Wants=debros-node.service [Service] Type=simple diff --git a/pkg/gateway/gateway.go b/pkg/gateway/gateway.go index 65aa0c1..b509a83 100644 --- a/pkg/gateway/gateway.go +++ b/pkg/gateway/gateway.go @@ -308,7 +308,10 @@ func New(logger *logging.ColoredLogger, cfg *Config) (*Gateway, error) { gw.listHandler = deploymentshandlers.NewListHandler( gw.deploymentService, + gw.processManager, + deps.IPFSClient, logger.Logger, + baseDeployPath, ) gw.updateHandler = deploymentshandlers.NewUpdateHandler( diff --git a/pkg/gateway/handlers/deployments/list_handler.go b/pkg/gateway/handlers/deployments/list_handler.go index 73978fb..b5bf24e 100644 --- a/pkg/gateway/handlers/deployments/list_handler.go +++ b/pkg/gateway/handlers/deployments/list_handler.go @@ -3,23 +3,33 @@ package deployments import ( "encoding/json" "net/http" + "os" + "path/filepath" "time" "github.com/DeBrosOfficial/network/pkg/deployments" + "github.com/DeBrosOfficial/network/pkg/deployments/process" + "github.com/DeBrosOfficial/network/pkg/ipfs" "go.uber.org/zap" ) // ListHandler handles listing deployments type ListHandler struct { - service *DeploymentService - logger *zap.Logger + service *DeploymentService + processManager *process.Manager + ipfsClient ipfs.IPFSClient + logger *zap.Logger + baseDeployPath string } // NewListHandler creates a new list handler -func NewListHandler(service *DeploymentService, logger *zap.Logger) *ListHandler { +func NewListHandler(service *DeploymentService, processManager *process.Manager, ipfsClient ipfs.IPFSClient, logger *zap.Logger, baseDeployPath string) *ListHandler { return &ListHandler{ - service: service, - logger: logger, + service: service, + processManager: processManager, + ipfsClient: ipfsClient, + logger: logger, + baseDeployPath: baseDeployPath, } } @@ -209,19 +219,43 @@ func (h *ListHandler) HandleDelete(w http.ResponseWriter, r *http.Request) { return } - // Delete deployment record + // 1. Stop systemd service + if err := h.processManager.Stop(ctx, deployment); err != nil { + h.logger.Warn("Failed to stop deployment service (may not exist)", zap.Error(err), zap.String("name", deployment.Name)) + } + + // 2. Remove deployment files from disk + if h.baseDeployPath != "" { + deployDir := filepath.Join(h.baseDeployPath, deployment.Namespace, deployment.Name) + if err := os.RemoveAll(deployDir); err != nil { + h.logger.Warn("Failed to remove deployment files", zap.Error(err), zap.String("path", deployDir)) + } + } + + // 3. Unpin IPFS content + if deployment.ContentCID != "" { + if err := h.ipfsClient.Unpin(ctx, deployment.ContentCID); err != nil { + h.logger.Warn("Failed to unpin IPFS content", zap.Error(err), zap.String("cid", deployment.ContentCID)) + } + } + + // 4. Delete subdomain registry + subdomainQuery := `DELETE FROM global_deployment_subdomains WHERE deployment_id = ?` + _, _ = h.service.db.Exec(ctx, subdomainQuery, deployment.ID) + + // 5. Delete DNS records + dnsQuery := `DELETE FROM dns_records WHERE deployment_id = ?` + _, _ = h.service.db.Exec(ctx, dnsQuery, deployment.ID) + + // 6. Delete deployment record query := `DELETE FROM deployments WHERE namespace = ? AND name = ?` - _, err = h.service.db.Exec(ctx, query, namespace, name) + _, err = h.service.db.Exec(ctx, query, namespace, deployment.Name) if err != nil { h.logger.Error("Failed to delete deployment", zap.Error(err)) http.Error(w, "Failed to delete deployment", http.StatusInternalServerError) return } - // Delete DNS records - query = `DELETE FROM dns_records WHERE deployment_id = ?` - _, _ = h.service.db.Exec(ctx, query, deployment.ID) - h.logger.Info("Deployment deleted", zap.String("id", deployment.ID), zap.String("namespace", namespace),