From b4a0041fb5aae471b272b113395fbf58f7746f13 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Fri, 25 Jul 2025 23:07:46 -0700 Subject: [PATCH 1/3] openapi: remove migration operation --- openapi.yaml | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/openapi.yaml b/openapi.yaml index 5e58560..d233778 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -80,21 +80,6 @@ paths: application/json: schema: $ref: "#/components/schemas/Error" - /migrate-maps: - post: - summary: Perform maps migration - operationId: migrateMaps - tags: - - Maps - responses: - "200": - description: Successful response - default: - description: General Error - content: - application/json: - schema: - $ref: "#/components/schemas/Error" /maps: get: summary: Get list of maps -- 2.49.1 From 061b7b2a012d6a8e0d7bcb8e96a9811f79756cf4 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Fri, 25 Jul 2025 23:08:04 -0700 Subject: [PATCH 2/3] openapi: generate --- pkg/api/oas_client_gen.go | 111 -- pkg/api/oas_handlers_gen.go | 180 --- pkg/api/oas_operations_gen.go | 1 - pkg/api/oas_response_decoders_gen.go | 60 - pkg/api/oas_response_encoders_gen.go | 7 - pkg/api/oas_router_gen.go | 2052 +++++++++++++------------- pkg/api/oas_schemas_gen.go | 3 - pkg/api/oas_security_gen.go | 1 - pkg/api/oas_server_gen.go | 6 - pkg/api/oas_unimplemented_gen.go | 9 - 10 files changed, 990 insertions(+), 1440 deletions(-) diff --git a/pkg/api/oas_client_gen.go b/pkg/api/oas_client_gen.go index 67be7d2..bc9a36b 100644 --- a/pkg/api/oas_client_gen.go +++ b/pkg/api/oas_client_gen.go @@ -301,12 +301,6 @@ type Invoker interface { // // GET /submissions ListSubmissions(ctx context.Context, params ListSubmissionsParams) (*Submissions, error) - // MigrateMaps invokes migrateMaps operation. - // - // Perform maps migration. - // - // POST /migrate-maps - MigrateMaps(ctx context.Context) error // ReleaseSubmissions invokes releaseSubmissions operation. // // Release a set of uploaded maps. @@ -6127,111 +6121,6 @@ func (c *Client) sendListSubmissions(ctx context.Context, params ListSubmissions return result, nil } -// MigrateMaps invokes migrateMaps operation. -// -// Perform maps migration. -// -// POST /migrate-maps -func (c *Client) MigrateMaps(ctx context.Context) error { - _, err := c.sendMigrateMaps(ctx) - return err -} - -func (c *Client) sendMigrateMaps(ctx context.Context) (res *MigrateMapsOK, err error) { - otelAttrs := []attribute.KeyValue{ - otelogen.OperationID("migrateMaps"), - semconv.HTTPRequestMethodKey.String("POST"), - semconv.HTTPRouteKey.String("/migrate-maps"), - } - - // Run stopwatch. - startTime := time.Now() - defer func() { - // Use floating point division here for higher precision (instead of Millisecond method). - elapsedDuration := time.Since(startTime) - c.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), metric.WithAttributes(otelAttrs...)) - }() - - // Increment request counter. - c.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) - - // Start a span for this request. - ctx, span := c.cfg.Tracer.Start(ctx, MigrateMapsOperation, - trace.WithAttributes(otelAttrs...), - clientSpanKind, - ) - // Track stage for error reporting. - var stage string - defer func() { - if err != nil { - span.RecordError(err) - span.SetStatus(codes.Error, stage) - c.errors.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) - } - span.End() - }() - - stage = "BuildURL" - u := uri.Clone(c.requestURL(ctx)) - var pathParts [1]string - pathParts[0] = "/migrate-maps" - uri.AddPathParts(u, pathParts[:]...) - - stage = "EncodeRequest" - r, err := ht.NewRequest(ctx, "POST", u) - if err != nil { - return res, errors.Wrap(err, "create request") - } - - { - type bitset = [1]uint8 - var satisfied bitset - { - stage = "Security:CookieAuth" - switch err := c.securityCookieAuth(ctx, MigrateMapsOperation, r); { - case err == nil: // if NO error - satisfied[0] |= 1 << 0 - case errors.Is(err, ogenerrors.ErrSkipClientSecurity): - // Skip this security. - default: - return res, errors.Wrap(err, "security \"CookieAuth\"") - } - } - - if ok := func() bool { - nextRequirement: - for _, requirement := range []bitset{ - {0b00000001}, - } { - for i, mask := range requirement { - if satisfied[i]&mask != mask { - continue nextRequirement - } - } - return true - } - return false - }(); !ok { - return res, ogenerrors.ErrSecurityRequirementIsNotSatisfied - } - } - - stage = "SendRequest" - resp, err := c.cfg.Client.Do(r) - if err != nil { - return res, errors.Wrap(err, "do request") - } - defer resp.Body.Close() - - stage = "DecodeResponse" - result, err := decodeMigrateMapsResponse(resp) - if err != nil { - return res, errors.Wrap(err, "decode response") - } - - return result, nil -} - // ReleaseSubmissions invokes releaseSubmissions operation. // // Release a set of uploaded maps. diff --git a/pkg/api/oas_handlers_gen.go b/pkg/api/oas_handlers_gen.go index 1ed5ef0..197e414 100644 --- a/pkg/api/oas_handlers_gen.go +++ b/pkg/api/oas_handlers_gen.go @@ -8433,186 +8433,6 @@ func (s *Server) handleListSubmissionsRequest(args [0]string, argsEscaped bool, } } -// handleMigrateMapsRequest handles migrateMaps operation. -// -// Perform maps migration. -// -// POST /migrate-maps -func (s *Server) handleMigrateMapsRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { - statusWriter := &codeRecorder{ResponseWriter: w} - w = statusWriter - otelAttrs := []attribute.KeyValue{ - otelogen.OperationID("migrateMaps"), - semconv.HTTPRequestMethodKey.String("POST"), - semconv.HTTPRouteKey.String("/migrate-maps"), - } - - // Start a span for this request. - ctx, span := s.cfg.Tracer.Start(r.Context(), MigrateMapsOperation, - trace.WithAttributes(otelAttrs...), - serverSpanKind, - ) - defer span.End() - - // Add Labeler to context. - labeler := &Labeler{attrs: otelAttrs} - ctx = contextWithLabeler(ctx, labeler) - - // Run stopwatch. - startTime := time.Now() - defer func() { - elapsedDuration := time.Since(startTime) - - attrSet := labeler.AttributeSet() - attrs := attrSet.ToSlice() - code := statusWriter.status - if code != 0 { - codeAttr := semconv.HTTPResponseStatusCode(code) - attrs = append(attrs, codeAttr) - span.SetAttributes(codeAttr) - } - attrOpt := metric.WithAttributes(attrs...) - - // Increment request counter. - s.requests.Add(ctx, 1, attrOpt) - - // Use floating point division here for higher precision (instead of Millisecond method). - s.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), attrOpt) - }() - - var ( - recordError = func(stage string, err error) { - span.RecordError(err) - - // https://opentelemetry.io/docs/specs/semconv/http/http-spans/#status - // Span Status MUST be left unset if HTTP status code was in the 1xx, 2xx or 3xx ranges, - // unless there was another error (e.g., network error receiving the response body; or 3xx codes with - // max redirects exceeded), in which case status MUST be set to Error. - code := statusWriter.status - if code >= 100 && code < 500 { - span.SetStatus(codes.Error, stage) - } - - attrSet := labeler.AttributeSet() - attrs := attrSet.ToSlice() - if code != 0 { - attrs = append(attrs, semconv.HTTPResponseStatusCode(code)) - } - - s.errors.Add(ctx, 1, metric.WithAttributes(attrs...)) - } - err error - opErrContext = ogenerrors.OperationContext{ - Name: MigrateMapsOperation, - ID: "migrateMaps", - } - ) - { - type bitset = [1]uint8 - var satisfied bitset - { - sctx, ok, err := s.securityCookieAuth(ctx, MigrateMapsOperation, r) - if err != nil { - err = &ogenerrors.SecurityError{ - OperationContext: opErrContext, - Security: "CookieAuth", - Err: err, - } - if encodeErr := encodeErrorResponse(s.h.NewError(ctx, err), w, span); encodeErr != nil { - defer recordError("Security:CookieAuth", err) - } - return - } - if ok { - satisfied[0] |= 1 << 0 - ctx = sctx - } - } - - if ok := func() bool { - nextRequirement: - for _, requirement := range []bitset{ - {0b00000001}, - } { - for i, mask := range requirement { - if satisfied[i]&mask != mask { - continue nextRequirement - } - } - return true - } - return false - }(); !ok { - err = &ogenerrors.SecurityError{ - OperationContext: opErrContext, - Err: ogenerrors.ErrSecurityRequirementIsNotSatisfied, - } - if encodeErr := encodeErrorResponse(s.h.NewError(ctx, err), w, span); encodeErr != nil { - defer recordError("Security", err) - } - return - } - } - - var response *MigrateMapsOK - if m := s.cfg.Middleware; m != nil { - mreq := middleware.Request{ - Context: ctx, - OperationName: MigrateMapsOperation, - OperationSummary: "Perform maps migration", - OperationID: "migrateMaps", - Body: nil, - Params: middleware.Parameters{}, - Raw: r, - } - - type ( - Request = struct{} - Params = struct{} - Response = *MigrateMapsOK - ) - response, err = middleware.HookMiddleware[ - Request, - Params, - Response, - ]( - m, - mreq, - nil, - func(ctx context.Context, request Request, params Params) (response Response, err error) { - err = s.h.MigrateMaps(ctx) - return response, err - }, - ) - } else { - err = s.h.MigrateMaps(ctx) - } - if err != nil { - if errRes, ok := errors.Into[*ErrorStatusCode](err); ok { - if err := encodeErrorResponse(errRes, w, span); err != nil { - defer recordError("Internal", err) - } - return - } - if errors.Is(err, ht.ErrNotImplemented) { - s.cfg.ErrorHandler(ctx, w, r, err) - return - } - if err := encodeErrorResponse(s.h.NewError(ctx, err), w, span); err != nil { - defer recordError("Internal", err) - } - return - } - - if err := encodeMigrateMapsResponse(response, w, span); err != nil { - defer recordError("EncodeResponse", err) - if !errors.Is(err, ht.ErrInternalServerErrorResponse) { - s.cfg.ErrorHandler(ctx, w, r, err) - } - return - } -} - // handleReleaseSubmissionsRequest handles releaseSubmissions operation. // // Release a set of uploaded maps. diff --git a/pkg/api/oas_operations_gen.go b/pkg/api/oas_operations_gen.go index 066af28..b5a33a8 100644 --- a/pkg/api/oas_operations_gen.go +++ b/pkg/api/oas_operations_gen.go @@ -51,7 +51,6 @@ const ( ListScriptsOperation OperationName = "ListScripts" ListSubmissionAuditEventsOperation OperationName = "ListSubmissionAuditEvents" ListSubmissionsOperation OperationName = "ListSubmissions" - MigrateMapsOperation OperationName = "MigrateMaps" ReleaseSubmissionsOperation OperationName = "ReleaseSubmissions" SessionRolesOperation OperationName = "SessionRoles" SessionUserOperation OperationName = "SessionUser" diff --git a/pkg/api/oas_response_decoders_gen.go b/pkg/api/oas_response_decoders_gen.go index b39e901..958d0d9 100644 --- a/pkg/api/oas_response_decoders_gen.go +++ b/pkg/api/oas_response_decoders_gen.go @@ -3595,66 +3595,6 @@ func decodeListSubmissionsResponse(resp *http.Response) (res *Submissions, _ err return res, errors.Wrap(defRes, "error") } -func decodeMigrateMapsResponse(resp *http.Response) (res *MigrateMapsOK, _ error) { - switch resp.StatusCode { - case 200: - // Code 200. - return &MigrateMapsOK{}, nil - } - // Convenient error response. - defRes, err := func() (res *ErrorStatusCode, err error) { - ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) - if err != nil { - return res, errors.Wrap(err, "parse media type") - } - switch { - case ct == "application/json": - buf, err := io.ReadAll(resp.Body) - if err != nil { - return res, err - } - d := jx.DecodeBytes(buf) - - var response Error - if err := func() error { - if err := response.Decode(d); err != nil { - return err - } - if err := d.Skip(); err != io.EOF { - return errors.New("unexpected trailing data") - } - return nil - }(); err != nil { - err = &ogenerrors.DecodeBodyError{ - ContentType: ct, - Body: buf, - Err: err, - } - return res, err - } - // Validate response. - if err := func() error { - if err := response.Validate(); err != nil { - return err - } - return nil - }(); err != nil { - return res, errors.Wrap(err, "validate") - } - return &ErrorStatusCode{ - StatusCode: resp.StatusCode, - Response: response, - }, nil - default: - return res, validate.InvalidContentType(ct) - } - }() - if err != nil { - return res, errors.Wrapf(err, "default (code %d)", resp.StatusCode) - } - return res, errors.Wrap(defRes, "error") -} - func decodeReleaseSubmissionsResponse(resp *http.Response) (res *ReleaseSubmissionsCreated, _ error) { switch resp.StatusCode { case 201: diff --git a/pkg/api/oas_response_encoders_gen.go b/pkg/api/oas_response_encoders_gen.go index fb4db75..fb923c6 100644 --- a/pkg/api/oas_response_encoders_gen.go +++ b/pkg/api/oas_response_encoders_gen.go @@ -484,13 +484,6 @@ func encodeListSubmissionsResponse(response *Submissions, w http.ResponseWriter, return nil } -func encodeMigrateMapsResponse(response *MigrateMapsOK, w http.ResponseWriter, span trace.Span) error { - w.WriteHeader(200) - span.SetStatus(codes.Ok, http.StatusText(200)) - - return nil -} - func encodeReleaseSubmissionsResponse(response *ReleaseSubmissionsCreated, w http.ResponseWriter, span trace.Span) error { w.WriteHeader(201) span.SetStatus(codes.Ok, http.StatusText(201)) diff --git a/pkg/api/oas_router_gen.go b/pkg/api/oas_router_gen.go index aa62a2d..1dc226d 100644 --- a/pkg/api/oas_router_gen.go +++ b/pkg/api/oas_router_gen.go @@ -61,9 +61,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'm': // Prefix: "m" + case 'm': // Prefix: "map" - if l := len("m"); len(elem) >= l && elem[0:l] == "m" { + if l := len("map"); len(elem) >= l && elem[0:l] == "map" { elem = elem[l:] } else { break @@ -73,500 +73,50 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'a': // Prefix: "ap" + case 'f': // Prefix: "fixes" - if l := len("ap"); len(elem) >= l && elem[0:l] == "ap" { + if l := len("fixes"); len(elem) >= l && elem[0:l] == "fixes" { elem = elem[l:] } else { break } if len(elem) == 0 { - break + switch r.Method { + case "GET": + s.handleListMapfixesRequest([0]string{}, elemIsEscaped, w, r) + case "POST": + s.handleCreateMapfixRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "GET,POST") + } + + return } switch elem[0] { - case 'f': // Prefix: "fixes" + case '/': // Prefix: "/" - if l := len("fixes"); len(elem) >= l && elem[0:l] == "fixes" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break } - if len(elem) == 0 { - switch r.Method { - case "GET": - s.handleListMapfixesRequest([0]string{}, elemIsEscaped, w, r) - case "POST": - s.handleCreateMapfixRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, "GET,POST") - } - - return - } - switch elem[0] { - case '/': // Prefix: "/" - - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { - elem = elem[l:] - } else { - break - } - - // Param: "MapfixID" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - - if len(elem) == 0 { - switch r.Method { - case "GET": - s.handleGetMapfixRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, "GET") - } - - return - } - switch elem[0] { - case '/': // Prefix: "/" - - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'a': // Prefix: "audit-events" - - if l := len("audit-events"); len(elem) >= l && elem[0:l] == "audit-events" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleListMapfixAuditEventsRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, "GET") - } - - return - } - - case 'c': // Prefix: "com" - - if l := len("com"); len(elem) >= l && elem[0:l] == "com" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'm': // Prefix: "ment" - - if l := len("ment"); len(elem) >= l && elem[0:l] == "ment" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleCreateMapfixAuditCommentRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, "POST") - } - - return - } - - case 'p': // Prefix: "pleted" - - if l := len("pleted"); len(elem) >= l && elem[0:l] == "pleted" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleSetMapfixCompletedRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, "POST") - } - - return - } - - } - - case 'm': // Prefix: "model" - - if l := len("model"); len(elem) >= l && elem[0:l] == "model" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleUpdateMapfixModelRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, "POST") - } - - return - } - - case 's': // Prefix: "status/" - - if l := len("status/"); len(elem) >= l && elem[0:l] == "status/" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'r': // Prefix: "re" - - if l := len("re"); len(elem) >= l && elem[0:l] == "re" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'j': // Prefix: "ject" - - if l := len("ject"); len(elem) >= l && elem[0:l] == "ject" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleActionMapfixRejectRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, "POST") - } - - return - } - - case 'q': // Prefix: "quest-changes" - - if l := len("quest-changes"); len(elem) >= l && elem[0:l] == "quest-changes" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleActionMapfixRequestChangesRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, "POST") - } - - return - } - - case 's': // Prefix: "set-" - - if l := len("set-"); len(elem) >= l && elem[0:l] == "set-" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 's': // Prefix: "submitting" - - if l := len("submitting"); len(elem) >= l && elem[0:l] == "submitting" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleActionMapfixResetSubmittingRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, "POST") - } - - return - } - - case 'u': // Prefix: "uploading" - - if l := len("uploading"); len(elem) >= l && elem[0:l] == "uploading" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleActionMapfixValidatedRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, "POST") - } - - return - } - - case 'v': // Prefix: "validating" - - if l := len("validating"); len(elem) >= l && elem[0:l] == "validating" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleActionMapfixAcceptedRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, "POST") - } - - return - } - - } - - case 't': // Prefix: "try-validate" - - if l := len("try-validate"); len(elem) >= l && elem[0:l] == "try-validate" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleActionMapfixRetryValidateRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, "POST") - } - - return - } - - case 'v': // Prefix: "voke" - - if l := len("voke"); len(elem) >= l && elem[0:l] == "voke" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleActionMapfixRevokeRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, "POST") - } - - return - } - - } - - case 't': // Prefix: "trigger-" - - if l := len("trigger-"); len(elem) >= l && elem[0:l] == "trigger-" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 's': // Prefix: "submit" - - if l := len("submit"); len(elem) >= l && elem[0:l] == "submit" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - switch r.Method { - case "POST": - s.handleActionMapfixTriggerSubmitRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, "POST") - } - - return - } - switch elem[0] { - case '-': // Prefix: "-unchecked" - - if l := len("-unchecked"); len(elem) >= l && elem[0:l] == "-unchecked" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleActionMapfixTriggerSubmitUncheckedRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, "POST") - } - - return - } - - } - - case 'u': // Prefix: "upload" - - if l := len("upload"); len(elem) >= l && elem[0:l] == "upload" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleActionMapfixTriggerUploadRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, "POST") - } - - return - } - - case 'v': // Prefix: "validate" - - if l := len("validate"); len(elem) >= l && elem[0:l] == "validate" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleActionMapfixTriggerValidateRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, "POST") - } - - return - } - - } - - } - - } - - } - - } - - case 's': // Prefix: "s" - - if l := len("s"); len(elem) >= l && elem[0:l] == "s" { - elem = elem[l:] - } else { - break + // Param: "MapfixID" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) } + args[0] = elem[:idx] + elem = elem[idx:] if len(elem) == 0 { switch r.Method { case "GET": - s.handleListMapsRequest([0]string{}, elemIsEscaped, w, r) + s.handleGetMapfixRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) default: s.notAllowed(w, r, "GET") } @@ -582,31 +132,13 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } - // Param: "MapID" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - if len(elem) == 0 { - switch r.Method { - case "GET": - s.handleGetMapRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, "GET") - } - - return + break } switch elem[0] { - case '/': // Prefix: "/download" + case 'a': // Prefix: "audit-events" - if l := len("/download"); len(elem) >= l && elem[0:l] == "/download" { + if l := len("audit-events"); len(elem) >= l && elem[0:l] == "audit-events" { elem = elem[l:] } else { break @@ -616,7 +148,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleDownloadMapAssetRequest([1]string{ + s.handleListMapfixAuditEventsRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: @@ -626,31 +158,465 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } + case 'c': // Prefix: "com" + + if l := len("com"); len(elem) >= l && elem[0:l] == "com" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'm': // Prefix: "ment" + + if l := len("ment"); len(elem) >= l && elem[0:l] == "ment" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleCreateMapfixAuditCommentRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return + } + + case 'p': // Prefix: "pleted" + + if l := len("pleted"); len(elem) >= l && elem[0:l] == "pleted" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleSetMapfixCompletedRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return + } + + } + + case 'm': // Prefix: "model" + + if l := len("model"); len(elem) >= l && elem[0:l] == "model" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleUpdateMapfixModelRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return + } + + case 's': // Prefix: "status/" + + if l := len("status/"); len(elem) >= l && elem[0:l] == "status/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'r': // Prefix: "re" + + if l := len("re"); len(elem) >= l && elem[0:l] == "re" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'j': // Prefix: "ject" + + if l := len("ject"); len(elem) >= l && elem[0:l] == "ject" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleActionMapfixRejectRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return + } + + case 'q': // Prefix: "quest-changes" + + if l := len("quest-changes"); len(elem) >= l && elem[0:l] == "quest-changes" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleActionMapfixRequestChangesRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return + } + + case 's': // Prefix: "set-" + + if l := len("set-"); len(elem) >= l && elem[0:l] == "set-" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 's': // Prefix: "submitting" + + if l := len("submitting"); len(elem) >= l && elem[0:l] == "submitting" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleActionMapfixResetSubmittingRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return + } + + case 'u': // Prefix: "uploading" + + if l := len("uploading"); len(elem) >= l && elem[0:l] == "uploading" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleActionMapfixValidatedRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return + } + + case 'v': // Prefix: "validating" + + if l := len("validating"); len(elem) >= l && elem[0:l] == "validating" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleActionMapfixAcceptedRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return + } + + } + + case 't': // Prefix: "try-validate" + + if l := len("try-validate"); len(elem) >= l && elem[0:l] == "try-validate" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleActionMapfixRetryValidateRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return + } + + case 'v': // Prefix: "voke" + + if l := len("voke"); len(elem) >= l && elem[0:l] == "voke" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleActionMapfixRevokeRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return + } + + } + + case 't': // Prefix: "trigger-" + + if l := len("trigger-"); len(elem) >= l && elem[0:l] == "trigger-" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 's': // Prefix: "submit" + + if l := len("submit"); len(elem) >= l && elem[0:l] == "submit" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + switch r.Method { + case "POST": + s.handleActionMapfixTriggerSubmitRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return + } + switch elem[0] { + case '-': // Prefix: "-unchecked" + + if l := len("-unchecked"); len(elem) >= l && elem[0:l] == "-unchecked" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleActionMapfixTriggerSubmitUncheckedRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return + } + + } + + case 'u': // Prefix: "upload" + + if l := len("upload"); len(elem) >= l && elem[0:l] == "upload" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleActionMapfixTriggerUploadRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return + } + + case 'v': // Prefix: "validate" + + if l := len("validate"); len(elem) >= l && elem[0:l] == "validate" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleActionMapfixTriggerValidateRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return + } + + } + + } + } } } - case 'i': // Prefix: "igrate-maps" + case 's': // Prefix: "s" - if l := len("igrate-maps"); len(elem) >= l && elem[0:l] == "igrate-maps" { + if l := len("s"); len(elem) >= l && elem[0:l] == "s" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. switch r.Method { - case "POST": - s.handleMigrateMapsRequest([0]string{}, elemIsEscaped, w, r) + case "GET": + s.handleListMapsRequest([0]string{}, elemIsEscaped, w, r) default: - s.notAllowed(w, r, "POST") + s.notAllowed(w, r, "GET") } return } + switch elem[0] { + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } + + // Param: "MapID" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { + switch r.Method { + case "GET": + s.handleGetMapRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "GET") + } + + return + } + switch elem[0] { + case '/': // Prefix: "/download" + + if l := len("/download"); len(elem) >= l && elem[0:l] == "/download" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleDownloadMapAssetRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "GET") + } + + return + } + + } + + } } @@ -1515,9 +1481,9 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'm': // Prefix: "m" + case 'm': // Prefix: "map" - if l := len("m"); len(elem) >= l && elem[0:l] == "m" { + if l := len("map"); len(elem) >= l && elem[0:l] == "map" { elem = elem[l:] } else { break @@ -1527,43 +1493,63 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'a': // Prefix: "ap" + case 'f': // Prefix: "fixes" - if l := len("ap"); len(elem) >= l && elem[0:l] == "ap" { + if l := len("fixes"); len(elem) >= l && elem[0:l] == "fixes" { elem = elem[l:] } else { break } if len(elem) == 0 { - break + switch method { + case "GET": + r.name = ListMapfixesOperation + r.summary = "Get list of mapfixes" + r.operationID = "listMapfixes" + r.pathPattern = "/mapfixes" + r.args = args + r.count = 0 + return r, true + case "POST": + r.name = CreateMapfixOperation + r.summary = "Trigger the validator to create a mapfix" + r.operationID = "createMapfix" + r.pathPattern = "/mapfixes" + r.args = args + r.count = 0 + return r, true + default: + return + } } switch elem[0] { - case 'f': // Prefix: "fixes" + case '/': // Prefix: "/" - if l := len("fixes"); len(elem) >= l && elem[0:l] == "fixes" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break } + // Param: "MapfixID" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + if len(elem) == 0 { switch method { case "GET": - r.name = ListMapfixesOperation - r.summary = "Get list of mapfixes" - r.operationID = "listMapfixes" - r.pathPattern = "/mapfixes" + r.name = GetMapfixOperation + r.summary = "Retrieve map with ID" + r.operationID = "getMapfix" + r.pathPattern = "/mapfixes/{MapfixID}" r.args = args - r.count = 0 - return r, true - case "POST": - r.name = CreateMapfixOperation - r.summary = "Trigger the validator to create a mapfix" - r.operationID = "createMapfix" - r.pathPattern = "/mapfixes" - r.args = args - r.count = 0 + r.count = 1 return r, true default: return @@ -1578,537 +1564,13 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } - // Param: "MapfixID" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - if len(elem) == 0 { - switch method { - case "GET": - r.name = GetMapfixOperation - r.summary = "Retrieve map with ID" - r.operationID = "getMapfix" - r.pathPattern = "/mapfixes/{MapfixID}" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - switch elem[0] { - case '/': // Prefix: "/" - - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'a': // Prefix: "audit-events" - - if l := len("audit-events"); len(elem) >= l && elem[0:l] == "audit-events" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = ListMapfixAuditEventsOperation - r.summary = "Retrieve a list of audit events" - r.operationID = "listMapfixAuditEvents" - r.pathPattern = "/mapfixes/{MapfixID}/audit-events" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - case 'c': // Prefix: "com" - - if l := len("com"); len(elem) >= l && elem[0:l] == "com" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'm': // Prefix: "ment" - - if l := len("ment"); len(elem) >= l && elem[0:l] == "ment" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = CreateMapfixAuditCommentOperation - r.summary = "Post a comment to the audit log" - r.operationID = "createMapfixAuditComment" - r.pathPattern = "/mapfixes/{MapfixID}/comment" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - case 'p': // Prefix: "pleted" - - if l := len("pleted"); len(elem) >= l && elem[0:l] == "pleted" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = SetMapfixCompletedOperation - r.summary = "Called by maptest when a player completes the map" - r.operationID = "setMapfixCompleted" - r.pathPattern = "/mapfixes/{MapfixID}/completed" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - } - - case 'm': // Prefix: "model" - - if l := len("model"); len(elem) >= l && elem[0:l] == "model" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = UpdateMapfixModelOperation - r.summary = "Update model following role restrictions" - r.operationID = "updateMapfixModel" - r.pathPattern = "/mapfixes/{MapfixID}/model" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - case 's': // Prefix: "status/" - - if l := len("status/"); len(elem) >= l && elem[0:l] == "status/" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'r': // Prefix: "re" - - if l := len("re"); len(elem) >= l && elem[0:l] == "re" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'j': // Prefix: "ject" - - if l := len("ject"); len(elem) >= l && elem[0:l] == "ject" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = ActionMapfixRejectOperation - r.summary = "Role Reviewer changes status from Submitted -> Rejected" - r.operationID = "actionMapfixReject" - r.pathPattern = "/mapfixes/{MapfixID}/status/reject" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - case 'q': // Prefix: "quest-changes" - - if l := len("quest-changes"); len(elem) >= l && elem[0:l] == "quest-changes" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = ActionMapfixRequestChangesOperation - r.summary = "Role Reviewer changes status from Validated|Accepted|Submitted -> ChangesRequested" - r.operationID = "actionMapfixRequestChanges" - r.pathPattern = "/mapfixes/{MapfixID}/status/request-changes" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - case 's': // Prefix: "set-" - - if l := len("set-"); len(elem) >= l && elem[0:l] == "set-" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 's': // Prefix: "submitting" - - if l := len("submitting"); len(elem) >= l && elem[0:l] == "submitting" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = ActionMapfixResetSubmittingOperation - r.summary = "Role Submitter manually resets submitting softlock and changes status from Submitting -> UnderConstruction" - r.operationID = "actionMapfixResetSubmitting" - r.pathPattern = "/mapfixes/{MapfixID}/status/reset-submitting" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - case 'u': // Prefix: "uploading" - - if l := len("uploading"); len(elem) >= l && elem[0:l] == "uploading" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = ActionMapfixValidatedOperation - r.summary = "Role Admin manually resets uploading softlock and changes status from Uploading -> Validated" - r.operationID = "actionMapfixValidated" - r.pathPattern = "/mapfixes/{MapfixID}/status/reset-uploading" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - case 'v': // Prefix: "validating" - - if l := len("validating"); len(elem) >= l && elem[0:l] == "validating" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = ActionMapfixAcceptedOperation - r.summary = "Role Reviewer manually resets validating softlock and changes status from Validating -> Accepted" - r.operationID = "actionMapfixAccepted" - r.pathPattern = "/mapfixes/{MapfixID}/status/reset-validating" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - } - - case 't': // Prefix: "try-validate" - - if l := len("try-validate"); len(elem) >= l && elem[0:l] == "try-validate" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = ActionMapfixRetryValidateOperation - r.summary = "Role Reviewer re-runs validation and changes status from Accepted -> Validating" - r.operationID = "actionMapfixRetryValidate" - r.pathPattern = "/mapfixes/{MapfixID}/status/retry-validate" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - case 'v': // Prefix: "voke" - - if l := len("voke"); len(elem) >= l && elem[0:l] == "voke" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = ActionMapfixRevokeOperation - r.summary = "Role Submitter changes status from Submitted|ChangesRequested -> UnderConstruction" - r.operationID = "actionMapfixRevoke" - r.pathPattern = "/mapfixes/{MapfixID}/status/revoke" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - } - - case 't': // Prefix: "trigger-" - - if l := len("trigger-"); len(elem) >= l && elem[0:l] == "trigger-" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 's': // Prefix: "submit" - - if l := len("submit"); len(elem) >= l && elem[0:l] == "submit" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - switch method { - case "POST": - r.name = ActionMapfixTriggerSubmitOperation - r.summary = "Role Submitter changes status from UnderConstruction|ChangesRequested -> Submitting" - r.operationID = "actionMapfixTriggerSubmit" - r.pathPattern = "/mapfixes/{MapfixID}/status/trigger-submit" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - switch elem[0] { - case '-': // Prefix: "-unchecked" - - if l := len("-unchecked"); len(elem) >= l && elem[0:l] == "-unchecked" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = ActionMapfixTriggerSubmitUncheckedOperation - r.summary = "Role Reviewer changes status from ChangesRequested -> Submitting" - r.operationID = "actionMapfixTriggerSubmitUnchecked" - r.pathPattern = "/mapfixes/{MapfixID}/status/trigger-submit-unchecked" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - } - - case 'u': // Prefix: "upload" - - if l := len("upload"); len(elem) >= l && elem[0:l] == "upload" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = ActionMapfixTriggerUploadOperation - r.summary = "Role Admin changes status from Validated -> Uploading" - r.operationID = "actionMapfixTriggerUpload" - r.pathPattern = "/mapfixes/{MapfixID}/status/trigger-upload" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - case 'v': // Prefix: "validate" - - if l := len("validate"); len(elem) >= l && elem[0:l] == "validate" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = ActionMapfixTriggerValidateOperation - r.summary = "Role Reviewer triggers validation and changes status from Submitted -> Validating" - r.operationID = "actionMapfixTriggerValidate" - r.pathPattern = "/mapfixes/{MapfixID}/status/trigger-validate" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - } - - } - - } - - } - - } - - case 's': // Prefix: "s" - - if l := len("s"); len(elem) >= l && elem[0:l] == "s" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - switch method { - case "GET": - r.name = ListMapsOperation - r.summary = "Get list of maps" - r.operationID = "listMaps" - r.pathPattern = "/maps" - r.args = args - r.count = 0 - return r, true - default: - return - } - } - switch elem[0] { - case '/': // Prefix: "/" - - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { - elem = elem[l:] - } else { break } - - // Param: "MapID" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - - if len(elem) == 0 { - switch method { - case "GET": - r.name = GetMapOperation - r.summary = "Retrieve map with ID" - r.operationID = "getMap" - r.pathPattern = "/maps/{MapID}" - r.args = args - r.count = 1 - return r, true - default: - return - } - } switch elem[0] { - case '/': // Prefix: "/download" + case 'a': // Prefix: "audit-events" - if l := len("/download"); len(elem) >= l && elem[0:l] == "/download" { + if l := len("audit-events"); len(elem) >= l && elem[0:l] == "audit-events" { elem = elem[l:] } else { break @@ -2118,10 +1580,10 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = DownloadMapAssetOperation - r.summary = "Download the map asset" - r.operationID = "downloadMapAsset" - r.pathPattern = "/maps/{MapID}/download" + r.name = ListMapfixAuditEventsOperation + r.summary = "Retrieve a list of audit events" + r.operationID = "listMapfixAuditEvents" + r.pathPattern = "/mapfixes/{MapfixID}/audit-events" r.args = args r.count = 1 return r, true @@ -2130,28 +1592,434 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } } + case 'c': // Prefix: "com" + + if l := len("com"); len(elem) >= l && elem[0:l] == "com" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'm': // Prefix: "ment" + + if l := len("ment"); len(elem) >= l && elem[0:l] == "ment" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = CreateMapfixAuditCommentOperation + r.summary = "Post a comment to the audit log" + r.operationID = "createMapfixAuditComment" + r.pathPattern = "/mapfixes/{MapfixID}/comment" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 'p': // Prefix: "pleted" + + if l := len("pleted"); len(elem) >= l && elem[0:l] == "pleted" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = SetMapfixCompletedOperation + r.summary = "Called by maptest when a player completes the map" + r.operationID = "setMapfixCompleted" + r.pathPattern = "/mapfixes/{MapfixID}/completed" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + } + + case 'm': // Prefix: "model" + + if l := len("model"); len(elem) >= l && elem[0:l] == "model" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = UpdateMapfixModelOperation + r.summary = "Update model following role restrictions" + r.operationID = "updateMapfixModel" + r.pathPattern = "/mapfixes/{MapfixID}/model" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 's': // Prefix: "status/" + + if l := len("status/"); len(elem) >= l && elem[0:l] == "status/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'r': // Prefix: "re" + + if l := len("re"); len(elem) >= l && elem[0:l] == "re" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'j': // Prefix: "ject" + + if l := len("ject"); len(elem) >= l && elem[0:l] == "ject" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = ActionMapfixRejectOperation + r.summary = "Role Reviewer changes status from Submitted -> Rejected" + r.operationID = "actionMapfixReject" + r.pathPattern = "/mapfixes/{MapfixID}/status/reject" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 'q': // Prefix: "quest-changes" + + if l := len("quest-changes"); len(elem) >= l && elem[0:l] == "quest-changes" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = ActionMapfixRequestChangesOperation + r.summary = "Role Reviewer changes status from Validated|Accepted|Submitted -> ChangesRequested" + r.operationID = "actionMapfixRequestChanges" + r.pathPattern = "/mapfixes/{MapfixID}/status/request-changes" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 's': // Prefix: "set-" + + if l := len("set-"); len(elem) >= l && elem[0:l] == "set-" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 's': // Prefix: "submitting" + + if l := len("submitting"); len(elem) >= l && elem[0:l] == "submitting" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = ActionMapfixResetSubmittingOperation + r.summary = "Role Submitter manually resets submitting softlock and changes status from Submitting -> UnderConstruction" + r.operationID = "actionMapfixResetSubmitting" + r.pathPattern = "/mapfixes/{MapfixID}/status/reset-submitting" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 'u': // Prefix: "uploading" + + if l := len("uploading"); len(elem) >= l && elem[0:l] == "uploading" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = ActionMapfixValidatedOperation + r.summary = "Role Admin manually resets uploading softlock and changes status from Uploading -> Validated" + r.operationID = "actionMapfixValidated" + r.pathPattern = "/mapfixes/{MapfixID}/status/reset-uploading" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 'v': // Prefix: "validating" + + if l := len("validating"); len(elem) >= l && elem[0:l] == "validating" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = ActionMapfixAcceptedOperation + r.summary = "Role Reviewer manually resets validating softlock and changes status from Validating -> Accepted" + r.operationID = "actionMapfixAccepted" + r.pathPattern = "/mapfixes/{MapfixID}/status/reset-validating" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + } + + case 't': // Prefix: "try-validate" + + if l := len("try-validate"); len(elem) >= l && elem[0:l] == "try-validate" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = ActionMapfixRetryValidateOperation + r.summary = "Role Reviewer re-runs validation and changes status from Accepted -> Validating" + r.operationID = "actionMapfixRetryValidate" + r.pathPattern = "/mapfixes/{MapfixID}/status/retry-validate" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 'v': // Prefix: "voke" + + if l := len("voke"); len(elem) >= l && elem[0:l] == "voke" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = ActionMapfixRevokeOperation + r.summary = "Role Submitter changes status from Submitted|ChangesRequested -> UnderConstruction" + r.operationID = "actionMapfixRevoke" + r.pathPattern = "/mapfixes/{MapfixID}/status/revoke" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + } + + case 't': // Prefix: "trigger-" + + if l := len("trigger-"); len(elem) >= l && elem[0:l] == "trigger-" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 's': // Prefix: "submit" + + if l := len("submit"); len(elem) >= l && elem[0:l] == "submit" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + switch method { + case "POST": + r.name = ActionMapfixTriggerSubmitOperation + r.summary = "Role Submitter changes status from UnderConstruction|ChangesRequested -> Submitting" + r.operationID = "actionMapfixTriggerSubmit" + r.pathPattern = "/mapfixes/{MapfixID}/status/trigger-submit" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + switch elem[0] { + case '-': // Prefix: "-unchecked" + + if l := len("-unchecked"); len(elem) >= l && elem[0:l] == "-unchecked" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = ActionMapfixTriggerSubmitUncheckedOperation + r.summary = "Role Reviewer changes status from ChangesRequested -> Submitting" + r.operationID = "actionMapfixTriggerSubmitUnchecked" + r.pathPattern = "/mapfixes/{MapfixID}/status/trigger-submit-unchecked" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + } + + case 'u': // Prefix: "upload" + + if l := len("upload"); len(elem) >= l && elem[0:l] == "upload" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = ActionMapfixTriggerUploadOperation + r.summary = "Role Admin changes status from Validated -> Uploading" + r.operationID = "actionMapfixTriggerUpload" + r.pathPattern = "/mapfixes/{MapfixID}/status/trigger-upload" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 'v': // Prefix: "validate" + + if l := len("validate"); len(elem) >= l && elem[0:l] == "validate" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = ActionMapfixTriggerValidateOperation + r.summary = "Role Reviewer triggers validation and changes status from Submitted -> Validating" + r.operationID = "actionMapfixTriggerValidate" + r.pathPattern = "/mapfixes/{MapfixID}/status/trigger-validate" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + } + + } + } } } - case 'i': // Prefix: "igrate-maps" + case 's': // Prefix: "s" - if l := len("igrate-maps"); len(elem) >= l && elem[0:l] == "igrate-maps" { + if l := len("s"); len(elem) >= l && elem[0:l] == "s" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. switch method { - case "POST": - r.name = MigrateMapsOperation - r.summary = "Perform maps migration" - r.operationID = "migrateMaps" - r.pathPattern = "/migrate-maps" + case "GET": + r.name = ListMapsOperation + r.summary = "Get list of maps" + r.operationID = "listMaps" + r.pathPattern = "/maps" r.args = args r.count = 0 return r, true @@ -2159,6 +2027,66 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { return } } + switch elem[0] { + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } + + // Param: "MapID" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { + switch method { + case "GET": + r.name = GetMapOperation + r.summary = "Retrieve map with ID" + r.operationID = "getMap" + r.pathPattern = "/maps/{MapID}" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + switch elem[0] { + case '/': // Prefix: "/download" + + if l := len("/download"); len(elem) >= l && elem[0:l] == "/download" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = DownloadMapAssetOperation + r.summary = "Download the map asset" + r.operationID = "downloadMapAsset" + r.pathPattern = "/maps/{MapID}/download" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + } + + } } diff --git a/pkg/api/oas_schemas_gen.go b/pkg/api/oas_schemas_gen.go index 0d4af90..b65b80d 100644 --- a/pkg/api/oas_schemas_gen.go +++ b/pkg/api/oas_schemas_gen.go @@ -664,9 +664,6 @@ func (s *Mapfixes) SetMapfixes(val []Mapfix) { s.Mapfixes = val } -// MigrateMapsOK is response for MigrateMaps operation. -type MigrateMapsOK struct{} - // Ref: #/components/schemas/Operation type Operation struct { OperationID int32 `json:"OperationID"` diff --git a/pkg/api/oas_security_gen.go b/pkg/api/oas_security_gen.go index 4fb1167..100c173 100644 --- a/pkg/api/oas_security_gen.go +++ b/pkg/api/oas_security_gen.go @@ -67,7 +67,6 @@ var operationRolesCookieAuth = map[string][]string{ DeleteScriptPolicyOperation: []string{}, DownloadMapAssetOperation: []string{}, GetOperationOperation: []string{}, - MigrateMapsOperation: []string{}, ReleaseSubmissionsOperation: []string{}, SessionRolesOperation: []string{}, SessionUserOperation: []string{}, diff --git a/pkg/api/oas_server_gen.go b/pkg/api/oas_server_gen.go index ee1ddc3..bc8d72e 100644 --- a/pkg/api/oas_server_gen.go +++ b/pkg/api/oas_server_gen.go @@ -280,12 +280,6 @@ type Handler interface { // // GET /submissions ListSubmissions(ctx context.Context, params ListSubmissionsParams) (*Submissions, error) - // MigrateMaps implements migrateMaps operation. - // - // Perform maps migration. - // - // POST /migrate-maps - MigrateMaps(ctx context.Context) error // ReleaseSubmissions implements releaseSubmissions operation. // // Release a set of uploaded maps. diff --git a/pkg/api/oas_unimplemented_gen.go b/pkg/api/oas_unimplemented_gen.go index 238e748..2c74330 100644 --- a/pkg/api/oas_unimplemented_gen.go +++ b/pkg/api/oas_unimplemented_gen.go @@ -420,15 +420,6 @@ func (UnimplementedHandler) ListSubmissions(ctx context.Context, params ListSubm return r, ht.ErrNotImplemented } -// MigrateMaps implements migrateMaps operation. -// -// Perform maps migration. -// -// POST /migrate-maps -func (UnimplementedHandler) MigrateMaps(ctx context.Context) error { - return ht.ErrNotImplemented -} - // ReleaseSubmissions implements releaseSubmissions operation. // // Release a set of uploaded maps. -- 2.49.1 From ac05f4acdc94ba9c72ab99783428bda85ca5c129 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Fri, 25 Jul 2025 23:07:37 -0700 Subject: [PATCH 3/3] submissions: remove migration operation --- pkg/service/maps.go | 30 ------------------------------ pkg/web_api/maps.go | 23 ----------------------- 2 files changed, 53 deletions(-) diff --git a/pkg/service/maps.go b/pkg/service/maps.go index beb6809..ad29c0f 100644 --- a/pkg/service/maps.go +++ b/pkg/service/maps.go @@ -2,7 +2,6 @@ package service import ( "context" - "time" "git.itzana.me/strafesnet/go-grpc/maps" "git.itzana.me/strafesnet/maps-service/pkg/datastore" @@ -81,35 +80,6 @@ func (update MapFilter) SetSubmitter(submitter uint64) { datastore.OptionalMap(update).Add("submitter", submitter) } -func (svc *Service) TEMP_DoMapsMigration(ctx context.Context) (error) { - // get all maps - maps, err := svc.maps.List(ctx, &maps.ListRequest{}) - if err != nil { - return err - } - // create all maps - for _, item := range maps.Maps { - migrated := model.Map{ - ID: item.ID, - DisplayName: item.DisplayName, - Creator: item.Creator, - GameID: uint32(item.GameID), - Date: time.Unix(item.Date, 0), - // CreatedAt: time.Time{}, - // UpdatedAt: time.Time{}, - // Submitter: 0, - // Thumbnail: 0, - // AssetVersion: 0, - // LoadCount: 0, - // Modes: 0, - } - _, err := svc.db.Maps().Create(ctx, migrated) - if err != nil { - return err - } - } - return nil -} func (svc *Service) CreateMap(ctx context.Context, item model.Map) (int64, error) { // 2 jobs: // create map on maps-service diff --git a/pkg/web_api/maps.go b/pkg/web_api/maps.go index 1526692..97574b1 100644 --- a/pkg/web_api/maps.go +++ b/pkg/web_api/maps.go @@ -9,29 +9,6 @@ import ( "git.itzana.me/strafesnet/maps-service/pkg/service" ) -// MigrateMaps implements migrateMaps operation. -// -// Perform maps migration. -// -// POST /migrate -func (svc *Service) MigrateMaps(ctx context.Context) (error) { - userInfo, ok := ctx.Value("UserInfo").(UserInfoHandle) - if !ok { - return ErrUserInfo - } - - has_role, err := userInfo.HasRoleSubmissionRelease() - if err != nil { - return err - } - - if !has_role { - return ErrPermissionDeniedNeedRoleSubmissionRelease - } - - return svc.inner.TEMP_DoMapsMigration(ctx) -} - // ListMaps implements listMaps operation. // // Get list of maps. -- 2.49.1