package httpapi import ( "net/http" "strings" "time" ) type playerStatusRequest struct { ScreenID string `json:"screen_id"` Timestamp string `json:"ts"` Status string `json:"status"` ServerURL string `json:"server_url"` MQTTBroker string `json:"mqtt_broker"` HeartbeatEverySeconds int `json:"heartbeat_every_seconds"` StartedAt string `json:"started_at"` LastHeartbeatAt string `json:"last_heartbeat_at"` } func handlePlayerStatus(w http.ResponseWriter, r *http.Request) { var request playerStatusRequest if err := decodeJSON(r, &request); err != nil { writeError(w, http.StatusBadRequest, "invalid_json", "ungueltiger JSON-Body", nil) return } if strings.TrimSpace(request.ScreenID) == "" { writeError(w, http.StatusBadRequest, "screen_id_required", "screen_id ist erforderlich", nil) return } if strings.TrimSpace(request.Timestamp) == "" { writeError(w, http.StatusBadRequest, "timestamp_required", "ts ist erforderlich", nil) return } if strings.TrimSpace(request.Status) == "" { writeError(w, http.StatusBadRequest, "status_required", "status ist erforderlich", nil) return } if err := validateOptionalRFC3339(request.Timestamp); err != nil { writeError(w, http.StatusBadRequest, "invalid_timestamp", "ts ist kein gueltiger RFC3339-Zeitstempel", nil) return } if err := validateOptionalRFC3339(request.StartedAt); err != nil { writeError(w, http.StatusBadRequest, "invalid_started_at", "started_at ist kein gueltiger RFC3339-Zeitstempel", nil) return } if err := validateOptionalRFC3339(request.LastHeartbeatAt); err != nil { writeError(w, http.StatusBadRequest, "invalid_last_heartbeat_at", "last_heartbeat_at ist kein gueltiger RFC3339-Zeitstempel", nil) return } writeJSON(w, http.StatusOK, map[string]string{ "status": "accepted", }) } func validateOptionalRFC3339(value string) error { if strings.TrimSpace(value) == "" { return nil } _, err := time.Parse(time.RFC3339, value) return err }