package api import ( "net/http" "strconv" "browser.local/platform/domain" "browser.local/platform/dto" ) func (h *coreHandlers) serverSCUMPlayers(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodGet { writeMethodNotAllowed(w, http.MethodGet) return } items, err := h.core.ListSCUMPlayerLiveStatesForSession(bearerToken(r), scumProjectionFilterFromRequest(r, r.PathValue("id"))) if err != nil { writeServiceError(w, err) return } writeJSON(w, http.StatusOK, dto.SCUMPlayerLiveStatesFromDomain(items)) } func (h *coreHandlers) serverSCUMSquads(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodGet { writeMethodNotAllowed(w, http.MethodGet) return } items, err := h.core.ListSCUMSquadsForSession(bearerToken(r), scumProjectionFilterFromRequest(r, r.PathValue("id"))) if err != nil { writeServiceError(w, err) return } writeJSON(w, http.StatusOK, dto.SCUMSquadsFromDomain(items)) } func (h *coreHandlers) serverSCUMSquadMembers(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodGet { writeMethodNotAllowed(w, http.MethodGet) return } items, err := h.core.ListSCUMSquadMembersForSession(bearerToken(r), scumProjectionFilterFromRequest(r, r.PathValue("id"))) if err != nil { writeServiceError(w, err) return } writeJSON(w, http.StatusOK, dto.SCUMSquadMembersFromDomain(items)) } func (h *coreHandlers) serverSCUMVehicles(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodGet { writeMethodNotAllowed(w, http.MethodGet) return } items, err := h.core.ListSCUMVehiclesForSession(bearerToken(r), scumProjectionFilterFromRequest(r, r.PathValue("id"))) if err != nil { writeServiceError(w, err) return } writeJSON(w, http.StatusOK, dto.SCUMVehiclesFromDomain(items)) } func (h *coreHandlers) serverSCUMFlags(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodGet { writeMethodNotAllowed(w, http.MethodGet) return } items, err := h.core.ListSCUMFlagsForSession(bearerToken(r), scumProjectionFilterFromRequest(r, r.PathValue("id"))) if err != nil { writeServiceError(w, err) return } writeJSON(w, http.StatusOK, dto.SCUMFlagsFromDomain(items)) } func (h *coreHandlers) serverSCUMPositions(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodGet { writeMethodNotAllowed(w, http.MethodGet) return } items, err := h.core.ListSCUMCurrentPositionsForSession(bearerToken(r), scumProjectionFilterFromRequest(r, r.PathValue("id"))) if err != nil { writeServiceError(w, err) return } writeJSON(w, http.StatusOK, dto.SCUMCurrentPositionsFromDomain(items)) } func (h *coreHandlers) serverSCUMOperations(w http.ResponseWriter, r *http.Request) { switch r.Method { case http.MethodGet, http.MethodPost: writeRemovedSCUMEndpoint(w) default: writeMethodNotAllowed(w, "GET, POST") } } func (h *coreHandlers) serverSCUMOperationApprove(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodPost { writeMethodNotAllowed(w, http.MethodPost) return } writeRemovedSCUMEndpoint(w) } func (h *coreHandlers) serverSCUMWorkflows(w http.ResponseWriter, r *http.Request) { switch r.Method { case http.MethodGet, http.MethodPost: writeRemovedSCUMEndpoint(w) default: writeMethodNotAllowed(w, "GET, POST") } } func (h *coreHandlers) serverSCUMWorkflowSteps(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodGet { writeMethodNotAllowed(w, http.MethodGet) return } writeRemovedSCUMEndpoint(w) } func writeRemovedSCUMEndpoint(w http.ResponseWriter) { writeAPIError(w, http.StatusNotFound, errorCodeNotFound, "legacy SCUM endpoint removed; use the local SCUM management APIs", nil) } func scumProjectionFilterFromRequest(r *http.Request, serverID string) domain.SCUMProjectionFilter { query := r.URL.Query() return domain.SCUMProjectionFilter{ServerInstanceID: serverID, GamePlayerID: query.Get("gamePlayerId"), GamePlayerRecordID: query.Get("gamePlayerRecordId"), UserProfileID: query.Get("userProfileId"), SteamID: query.Get("steamId"), SquadID: query.Get("squadId"), VehicleID: query.Get("vehicleId"), FlagID: query.Get("flagId"), SubjectType: domain.SCUMProjectionSubject(query.Get("subjectType")), QueryKey: query.Get("queryKey"), Freshness: domain.SCUMProjectionFreshness(query.Get("freshness")), Search: query.Get("search"), Limit: boundedQueryLimit(query.Get("limit"), 200)} } func boundedQueryLimit(raw string, fallback int) int { if raw == "" { return fallback } parsed, err := strconv.Atoi(raw) if err != nil || parsed < 1 { return fallback } if parsed > 500 { return 500 } return parsed }