package httpapi import ( "log/slog" "net/http" "github.com/google/uuid" "github.com/syncova/syncova/packages/platform/logging" "github.com/syncova/syncova/packages/ransomware" ) // ransomwareHandler bedient die Auffaelligkeitsbewertung eines Laufs. // // Ohne diesen Endpunkt bliebe die Meldung „4 von 6 Signalen sind auffaellig" // eine Behauptung: Ihre Empfehlung lautet „Pruefen Sie die Quelle" — wer aber // nicht sehen kann, **welche** vier Signale gemeint sind, hat keinen Anfang. type ransomwareHandler struct { // detector bewertet einen Lauf gegen den Basiswert seiner Kette. detector *ransomware.Detector // logger protokolliert technische Fehler. logger *slog.Logger } // handleGetAssessment bedient GET /backups/{id}/ransomware-assessment. // // Die Bewertung wird bei jedem Aufruf neu berechnet, nicht gespeichert. Der // Basiswert wandert mit den letzten Laeufen; eine eingefrorene Bewertung // beschriebe einen Vergleich, den es so nicht mehr gibt. Dieselbe Entscheidung // wie bei der Recovery Assurance (Phase 10). func (handler *ransomwareHandler) handleGetAssessment(responseWriter http.ResponseWriter, request *http.Request) { requestLogger := logging.WithContext(request.Context(), handler.logger) backupIdentifier, parseError := uuid.Parse(request.PathValue("id")) if parseError != nil { WriteError(responseWriter, request, requestLogger, NewBadRequestError("Die Backupkennung ist keine gueltige UUID.")) return } assessment, assessError := handler.detector.AssessBackup(request.Context(), backupIdentifier) if assessError != nil { WriteError(responseWriter, request, requestLogger, NewNotFoundError("Das Backup wurde nicht gefunden.")) return } WriteSuccess(responseWriter, request, http.StatusOK, assessment) }