package handler import ( "database/sql" "encoding/json" "fmt" "io" "net/http" "time" "vctp/db/queries" models "vctp/server/models" ) // VmDeleteEvent records a VM deletion CloudEvent in the inventory. // @Summary Record VM delete event (deprecated) // @Description Deprecated: Parses a VM delete CloudEvent and marks the VM as deleted in inventory. // @Tags events // @Deprecated // @Accept json // @Produce json // @Param event body models.CloudEventReceived true "CloudEvent payload" // @Success 200 {object} models.StatusMessageResponse "Delete event processed" // @Failure 400 {object} models.ErrorResponse "Invalid request" // @Failure 500 {object} models.ErrorResponse "Server error" // @Router /api/event/vm/delete [post] func (h *Handler) VmDeleteEvent(w http.ResponseWriter, r *http.Request) { if h.denyLegacyAPI(w, "/api/event/vm/delete") { return } ctx, cancel := withRequestTimeout(r, defaultRequestTimeout) defer cancel() var ( deletedTimestamp int64 ) reqBody, err := io.ReadAll(r.Body) if err != nil { h.Logger.Error("Invalid data received", "error", err) writeJSONError(w, http.StatusInternalServerError, "Invalid data received") return } else { //h.Logger.Debug("received input data", "length", len(reqBody)) } // Decode the JSON body into CloudEventReceived struct var event models.CloudEventReceived if err := json.Unmarshal(reqBody, &event); err != nil { h.Logger.Error("unable to decode json", "error", err) prettyPrint(event) writeJSONError(w, http.StatusBadRequest, "Invalid JSON body") return } else { h.Logger.Debug("successfully decoded deletion type cloud event", "vm_id", event.CloudEvent.Data.VM.VM.Value) } // Use the event CreatedTime to update the DeletionTime column in the VM inventory table // Parse the datetime string to a time.Time object eventTime, err := time.Parse(time.RFC3339, event.CloudEvent.Data.CreatedTime) if err != nil { h.Logger.Warn("unable to convert cloud event time to timestamp", "error", err) deletedTimestamp = time.Now().Unix() } else { // Convert to Unix timestamp deletedTimestamp = eventTime.Unix() } // create the database parameters params := queries.InventoryMarkDeletedParams{ DeletionTime: sql.NullInt64{Int64: deletedTimestamp, Valid: deletedTimestamp > 0}, VmId: sql.NullString{String: event.CloudEvent.Data.VM.VM.Value, Valid: event.CloudEvent.Data.VM.VM.Value != ""}, DatacenterName: sql.NullString{String: event.CloudEvent.Data.Datacenter.Name, Valid: event.CloudEvent.Data.Datacenter.Name != ""}, } h.Logger.Debug("database params", "params", params) err = h.Database.Queries().InventoryMarkDeleted(ctx, params) if err != nil { h.Logger.Error("Error received marking VM as deleted", "error", err) writeJSONError(w, http.StatusInternalServerError, fmt.Sprintf("Delete Request unsuccessful %s", err)) } else { h.Logger.Debug("Processed VM Deletion event successfully") writeJSONOKMessage(w, "Processed VM Deletion event successfully") } //h.Logger.Debug("received delete request", "body", string(reqBody)) //w.WriteHeader(http.StatusOK) //fmt.Fprintf(w, "Delete Request (%d): %v\n", len(reqBody), string(reqBody)) }