Remove pre-1.0 audit and protected request scaffolding

This commit is contained in:
npc0-hue
2026-08-20 23:42:02 +08:00
parent 40b35b05c7
commit a7e2e4c6c0
130 changed files with 526 additions and 3767 deletions
+2 -248
View File
@@ -47,12 +47,6 @@ func (h *coreHandlers) register(mux *http.ServeMux) {
mux.HandleFunc("/api/v1/game-plugins/{id}", h.gamePluginDetail)
mux.HandleFunc("/api/v1/metrics/platform", h.platformMetrics)
mux.HandleFunc("/api/v1/metrics/server-instances", h.serverInstanceMetrics)
mux.HandleFunc("/api/v1/production/capacity", h.productionCapacity)
mux.HandleFunc("/api/v1/production/capacity/admission", h.productionCapacityAdmission)
mux.HandleFunc("/api/v1/alerts", h.alerts)
mux.HandleFunc("/api/v1/alerts/{id}/acknowledge", h.alertAcknowledge)
mux.HandleFunc("/api/v1/alerts/{id}/resolve", h.alertResolve)
mux.HandleFunc("/api/v1/alerts/{id}/retry", h.alertRetry)
mux.HandleFunc("/api/v1/plugin-lifecycles", h.pluginLifecycles)
mux.HandleFunc("/api/v1/plugin-lifecycles/{pluginId}/actions", h.pluginLifecycleAction)
mux.HandleFunc("/api/v1/ai/config-diffs", h.aiConfigDiffs)
@@ -98,6 +92,7 @@ func (h *coreHandlers) register(mux *http.ServeMux) {
mux.HandleFunc("/api/v1/server-instances/{id}/dependencies/install", h.serverDependenciesInstall)
mux.HandleFunc("/api/v1/server-instances/{id}/dependencies", h.serverDependencies)
mux.HandleFunc("/api/v1/server-instances/{id}/logs/events", h.serverLogEvents)
mux.HandleFunc("/api/v1/server-instances/{id}/rcon/commands", h.sourceRCONCommands)
mux.HandleFunc("/api/v1/server-instances/{id}/administrators/candidates", h.serverAdministratorCandidates)
mux.HandleFunc("/api/v1/server-instances/{id}/administrators", h.serverAdministrators)
mux.HandleFunc("/api/v1/server-instances/{id}/administrators/{userId}", h.serverAdministratorDetail)
@@ -112,7 +107,6 @@ func (h *coreHandlers) register(mux *http.ServeMux) {
mux.HandleFunc("/api/v1/run/jobs/build-input", h.requireRunSignature(h.runJobBuildInput))
mux.HandleFunc("/api/v1/run/jobs/dependency-input", h.requireRunSignature(h.runJobDependencyInput))
mux.HandleFunc("/api/v1/run/jobs/source-rcon-input", h.requireRunSignature(h.runSourceRCONInput))
mux.HandleFunc("/api/v1/run/jobs/protected-request-input", h.requireRunSignature(h.runProtectedRequestInput))
mux.HandleFunc("/api/v1/run/jobs/update-input", h.requireRunSignature(h.runJobUpdateInput))
mux.HandleFunc("/api/v1/run/jobs/update-chunk", h.requireRunSignature(h.runJobUpdateChunk))
mux.HandleFunc("/api/v1/run/jobs/update-health", h.requireRunSignature(h.runJobUpdateHealth))
@@ -139,8 +133,6 @@ func (h *coreHandlers) register(mux *http.ServeMux) {
mux.HandleFunc("/api/v1/log-streams", h.logStreams)
mux.HandleFunc("/api/v1/log-streams/query", h.logStreamQuery)
mux.HandleFunc("/api/v1/log-streams/{id}", h.logStreamDetail)
mux.HandleFunc("/api/v1/audit-events", h.auditEvents)
mux.HandleFunc("/api/v1/audit-events/{id}", h.auditEventDetail)
mux.HandleFunc("/api/v1/client-managers/register", h.clientManagerRegister)
mux.HandleFunc("/api/v1/client-managers/heartbeat", h.clientManagerHeartbeat)
mux.HandleFunc("/api/v1/game-client-bridge/companion/commands/claim", h.gameClientBridgeCompanionClaim)
@@ -150,180 +142,9 @@ func (h *coreHandlers) register(mux *http.ServeMux) {
mux.HandleFunc("/api/v1/game-client-bridge/companion/diagnostics", h.gameClientBridgeCompanionDiagnostics)
}
// productionCapacity godoc
// @Summary Get production capacity governance state
// @Description Returns bounded Run endpoint capacity and durable pressure counts visible to the current operator.
// @Tags production-operations
// @Produce json
// @Success 200 {object} dto.ProductionCapacitySummaryResponse
// @Failure 401 {object} dto.ErrorResponse
// @Failure 405 {object} dto.ErrorResponse
// @Router /api/v1/production/capacity [get]
func (h *coreHandlers) productionCapacity(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet {
writeMethodNotAllowed(w, http.MethodGet)
return
}
summary, err := h.core.GetProductionCapacityForSession(bearerToken(r))
if err != nil {
writeServiceError(w, err)
return
}
writeJSON(w, http.StatusOK, dto.ProductionCapacityFromDomain(summary))
}
// productionCapacityAdmission godoc
// @Summary Check production capacity admission
// @Description Evaluates endpoint heartbeat, capability, durable jobs, and bounded backlog pressure without dispatching work.
// @Tags production-operations
// @Accept json
// @Produce json
// @Param body body dto.CapacityAdmissionRequest true "Capacity admission request"
// @Success 200 {object} dto.CapacityAdmissionDecisionResponse
// @Failure 400 {object} dto.ErrorResponse
// @Failure 401 {object} dto.ErrorResponse
// @Failure 403 {object} dto.ErrorResponse
// @Failure 405 {object} dto.ErrorResponse
// @Router /api/v1/production/capacity/admission [post]
func (h *coreHandlers) productionCapacityAdmission(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
writeMethodNotAllowed(w, http.MethodPost)
return
}
request, err := decodeJSON[dto.CapacityAdmissionRequest](r)
if err != nil {
writeDecodeError(w, err)
return
}
decision, err := h.core.CheckCapacityAdmissionForSession(bearerToken(r), request.ToDomain())
if err != nil {
writeServiceError(w, err)
return
}
writeJSON(w, http.StatusOK, dto.CapacityDecisionFromDomain(decision))
}
// alerts godoc
// @Summary List durable production alerts
// @Description Lists alerts visible to the current operator with optional safe state/source/severity filters.
// @Tags production-operations
// @Produce json
// @Success 200 {object} dto.AlertListResponse
// @Failure 401 {object} dto.ErrorResponse
// @Failure 405 {object} dto.ErrorResponse
// @Router /api/v1/alerts [get]
func (h *coreHandlers) alerts(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet {
writeMethodNotAllowed(w, http.MethodGet)
return
}
alerts, err := h.core.ListAlertsForSession(bearerToken(r), domain.AlertFilter{State: domain.AlertState(r.URL.Query().Get("state")), SourceKind: r.URL.Query().Get("sourceKind"), SourceID: r.URL.Query().Get("sourceId"), Severity: domain.AlertSeverity(r.URL.Query().Get("severity"))})
if err != nil {
writeServiceError(w, err)
return
}
writeJSON(w, http.StatusOK, dto.AlertListFromDomain(alerts))
}
// alertAcknowledge godoc
// @Summary Acknowledge a durable alert
// @Description Persists acknowledgement actor, timestamp, and linked audit evidence for one alert.
// @Tags production-operations
// @Accept json
// @Produce json
// @Param id path string true "Alert ID"
// @Param body body dto.AlertAcknowledgeRequest true "Acknowledgement request"
// @Success 200 {object} dto.AlertResponse
// @Failure 400 {object} dto.ErrorResponse
// @Failure 401 {object} dto.ErrorResponse
// @Failure 403 {object} dto.ErrorResponse
// @Failure 405 {object} dto.ErrorResponse
// @Router /api/v1/alerts/{id}/acknowledge [post]
func (h *coreHandlers) alertAcknowledge(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
writeMethodNotAllowed(w, http.MethodPost)
return
}
request, err := decodeJSON[dto.AlertAcknowledgeRequest](r)
if err != nil {
writeDecodeError(w, err)
return
}
alert, err := h.core.AcknowledgeAlertForSession(bearerToken(r), domain.AlertAcknowledgeRequest{AlertID: r.PathValue("id"), Note: request.Note})
if err != nil {
writeServiceError(w, err)
return
}
writeJSON(w, http.StatusOK, dto.AlertFromDomain(alert))
}
// alertResolve godoc
// @Summary Resolve a durable alert
// @Description Resolves one alert with a safe operator note and linked audit evidence.
// @Tags production-operations
// @Accept json
// @Produce json
// @Param id path string true "Alert ID"
// @Param body body dto.AlertResolveRequest true "Resolution request"
// @Success 200 {object} dto.AlertResponse
// @Failure 400 {object} dto.ErrorResponse
// @Failure 401 {object} dto.ErrorResponse
// @Failure 403 {object} dto.ErrorResponse
// @Failure 405 {object} dto.ErrorResponse
// @Router /api/v1/alerts/{id}/resolve [post]
func (h *coreHandlers) alertResolve(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
writeMethodNotAllowed(w, http.MethodPost)
return
}
request, err := decodeJSON[dto.AlertResolveRequest](r)
if err != nil {
writeDecodeError(w, err)
return
}
alert, err := h.core.ResolveAlertForSession(bearerToken(r), domain.AlertResolveRequest{AlertID: r.PathValue("id"), Note: request.Note})
if err != nil {
writeServiceError(w, err)
return
}
writeJSON(w, http.StatusOK, dto.AlertFromDomain(alert))
}
// alertRetry godoc
// @Summary Retry one durable alert source
// @Description Retries only the bounded source represented by an alert and preserves idempotency.
// @Tags production-operations
// @Accept json
// @Produce json
// @Param id path string true "Alert ID"
// @Param body body dto.AlertRetryRequest true "Scoped retry request"
// @Success 202 {object} dto.AlertRetryResponse
// @Failure 400 {object} dto.ErrorResponse
// @Failure 401 {object} dto.ErrorResponse
// @Failure 403 {object} dto.ErrorResponse
// @Failure 405 {object} dto.ErrorResponse
// @Router /api/v1/alerts/{id}/retry [post]
func (h *coreHandlers) alertRetry(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
writeMethodNotAllowed(w, http.MethodPost)
return
}
request, err := decodeJSON[dto.AlertRetryRequest](r)
if err != nil {
writeDecodeError(w, err)
return
}
result, err := h.core.RetryAlertForSession(bearerToken(r), domain.AlertRetryRequest{AlertID: r.PathValue("id"), IdempotencyKey: request.IdempotencyKey})
if err != nil {
writeServiceError(w, err)
return
}
writeJSON(w, http.StatusAccepted, dto.AlertRetryFromDomain(result))
}
// pluginLifecycles godoc
// @Summary List server-bound plugin lifecycle state
// @Description Lists durable plugin installation, desired/current state, compatibility, dependency, job, alert, and audit metadata.
// @Description Lists durable plugin installation, desired/current state, compatibility, dependency, and job metadata.
// @Tags production-operations
// @Produce json
// @Success 200 {object} dto.PluginLifecycleListResponse
@@ -2598,70 +2419,3 @@ func (h *coreHandlers) logStreamDetail(w http.ResponseWriter, r *http.Request) {
}
writeJSON(w, http.StatusOK, dto.LogStreamFromDomain(stream))
}
// auditEvents godoc
// @Summary Create or list audit events
// @Description Creates or lists audit event metadata.
// @Tags audit-events
// @Accept json
// @Produce json
// @Param body body dto.AuditEventCreateRequest false "Audit event create request"
// @Success 200 {object} dto.AuditEventListResponse
// @Success 201 {object} dto.AuditEventResponse
// @Failure 400 {object} dto.ErrorResponse
// @Failure 405 {object} dto.ErrorResponse
// @Router /api/v1/audit-events [get]
// @Router /api/v1/audit-events [post]
func (h *coreHandlers) auditEvents(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case http.MethodGet:
events, err := h.core.ListAuditEvents(domain.AuditEventFilter{
ActorID: r.URL.Query().Get("actorId"),
ResourceKind: r.URL.Query().Get("resourceKind"),
ResourceID: r.URL.Query().Get("resourceId"),
Result: domain.AuditResult(r.URL.Query().Get("result")),
})
if err != nil {
writeServiceError(w, err)
return
}
writeJSON(w, http.StatusOK, dto.AuditEventListFromDomain(events))
case http.MethodPost:
request, err := decodeJSON[dto.AuditEventCreateRequest](r)
if err != nil {
writeDecodeError(w, err)
return
}
event, err := h.core.CreateAuditEvent(request.ToDomain())
if err != nil {
writeServiceError(w, err)
return
}
writeJSON(w, http.StatusCreated, dto.AuditEventFromDomain(event))
default:
writeMethodNotAllowed(w, "GET, POST")
}
}
// auditEventDetail godoc
// @Summary Get audit event
// @Description Returns one audit event by ID.
// @Tags audit-events
// @Produce json
// @Param id path string true "Audit event ID"
// @Success 200 {object} dto.AuditEventResponse
// @Failure 404 {object} dto.ErrorResponse
// @Failure 405 {object} dto.ErrorResponse
// @Router /api/v1/audit-events/{id} [get]
func (h *coreHandlers) auditEventDetail(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet {
writeMethodNotAllowed(w, http.MethodGet)
return
}
event, err := h.core.GetAuditEvent(r.PathValue("id"))
if err != nil {
writeServiceError(w, err)
return
}
writeJSON(w, http.StatusOK, dto.AuditEventFromDomain(event))
}