From 51ba05df692dc10532af36f050fe520010ee4974 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Fri, 15 Aug 2025 23:20:08 -0700 Subject: [PATCH] backend: remove mapfixes migrate endpoint --- openapi.yaml | 15 --- 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 | 56 --------- 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 -- pkg/datastore/datastore.go | 1 - pkg/datastore/gormstore/mapfixes.go | 17 --- pkg/service/mapfixes.go | 4 - pkg/web_api/mapfixes.go | 23 ---- 15 files changed, 494 deletions(-) diff --git a/openapi.yaml b/openapi.yaml index 29b316f..f87cfcf 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -318,21 +318,6 @@ paths: application/json: schema: $ref: "#/components/schemas/Error" - /mapfixes/migrate: - post: - summary: Perform the Uploaded -> Released migration. - operationId: migrateMapfixes - tags: - - Mapfixes - responses: - "204": - description: Successful response - default: - description: General Error - content: - application/json: - schema: - $ref: "#/components/schemas/Error" /mapfixes/{MapfixID}: get: summary: Retrieve map with ID diff --git a/pkg/api/oas_client_gen.go b/pkg/api/oas_client_gen.go index 361a9c1..90fb9bb 100644 --- a/pkg/api/oas_client_gen.go +++ b/pkg/api/oas_client_gen.go @@ -314,12 +314,6 @@ type Invoker interface { // // GET /submissions ListSubmissions(ctx context.Context, params ListSubmissionsParams) (*Submissions, error) - // MigrateMapfixes invokes migrateMapfixes operation. - // - // Perform the Uploaded -> Released migration. - // - // POST /mapfixes/migrate - MigrateMapfixes(ctx context.Context) error // ReleaseSubmissions invokes releaseSubmissions operation. // // Release a set of uploaded maps. Role SubmissionRelease. @@ -6423,111 +6417,6 @@ func (c *Client) sendListSubmissions(ctx context.Context, params ListSubmissions return result, nil } -// MigrateMapfixes invokes migrateMapfixes operation. -// -// Perform the Uploaded -> Released migration. -// -// POST /mapfixes/migrate -func (c *Client) MigrateMapfixes(ctx context.Context) error { - _, err := c.sendMigrateMapfixes(ctx) - return err -} - -func (c *Client) sendMigrateMapfixes(ctx context.Context) (res *MigrateMapfixesNoContent, err error) { - otelAttrs := []attribute.KeyValue{ - otelogen.OperationID("migrateMapfixes"), - semconv.HTTPRequestMethodKey.String("POST"), - semconv.HTTPRouteKey.String("/mapfixes/migrate"), - } - - // 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, MigrateMapfixesOperation, - 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] = "/mapfixes/migrate" - 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, MigrateMapfixesOperation, 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 := decodeMigrateMapfixesResponse(resp) - if err != nil { - return res, errors.Wrap(err, "decode response") - } - - return result, nil -} - // ReleaseSubmissions invokes releaseSubmissions operation. // // Release a set of uploaded maps. Role SubmissionRelease. diff --git a/pkg/api/oas_handlers_gen.go b/pkg/api/oas_handlers_gen.go index 837522f..aec3293 100644 --- a/pkg/api/oas_handlers_gen.go +++ b/pkg/api/oas_handlers_gen.go @@ -8832,186 +8832,6 @@ func (s *Server) handleListSubmissionsRequest(args [0]string, argsEscaped bool, } } -// handleMigrateMapfixesRequest handles migrateMapfixes operation. -// -// Perform the Uploaded -> Released migration. -// -// POST /mapfixes/migrate -func (s *Server) handleMigrateMapfixesRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { - statusWriter := &codeRecorder{ResponseWriter: w} - w = statusWriter - otelAttrs := []attribute.KeyValue{ - otelogen.OperationID("migrateMapfixes"), - semconv.HTTPRequestMethodKey.String("POST"), - semconv.HTTPRouteKey.String("/mapfixes/migrate"), - } - - // Start a span for this request. - ctx, span := s.cfg.Tracer.Start(r.Context(), MigrateMapfixesOperation, - 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: MigrateMapfixesOperation, - ID: "migrateMapfixes", - } - ) - { - type bitset = [1]uint8 - var satisfied bitset - { - sctx, ok, err := s.securityCookieAuth(ctx, MigrateMapfixesOperation, 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 *MigrateMapfixesNoContent - if m := s.cfg.Middleware; m != nil { - mreq := middleware.Request{ - Context: ctx, - OperationName: MigrateMapfixesOperation, - OperationSummary: "Perform the Uploaded -> Released migration.", - OperationID: "migrateMapfixes", - Body: nil, - Params: middleware.Parameters{}, - Raw: r, - } - - type ( - Request = struct{} - Params = struct{} - Response = *MigrateMapfixesNoContent - ) - 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.MigrateMapfixes(ctx) - return response, err - }, - ) - } else { - err = s.h.MigrateMapfixes(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 := encodeMigrateMapfixesResponse(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. Role SubmissionRelease. diff --git a/pkg/api/oas_operations_gen.go b/pkg/api/oas_operations_gen.go index dcd30ac..fa2d75d 100644 --- a/pkg/api/oas_operations_gen.go +++ b/pkg/api/oas_operations_gen.go @@ -53,7 +53,6 @@ const ( ListScriptsOperation OperationName = "ListScripts" ListSubmissionAuditEventsOperation OperationName = "ListSubmissionAuditEvents" ListSubmissionsOperation OperationName = "ListSubmissions" - MigrateMapfixesOperation OperationName = "MigrateMapfixes" 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 c4e0e14..230e890 100644 --- a/pkg/api/oas_response_decoders_gen.go +++ b/pkg/api/oas_response_decoders_gen.go @@ -3715,66 +3715,6 @@ func decodeListSubmissionsResponse(resp *http.Response) (res *Submissions, _ err return res, errors.Wrap(defRes, "error") } -func decodeMigrateMapfixesResponse(resp *http.Response) (res *MigrateMapfixesNoContent, _ error) { - switch resp.StatusCode { - case 204: - // Code 204. - return &MigrateMapfixesNoContent{}, 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 85976a5..ee6fc82 100644 --- a/pkg/api/oas_response_encoders_gen.go +++ b/pkg/api/oas_response_encoders_gen.go @@ -498,13 +498,6 @@ func encodeListSubmissionsResponse(response *Submissions, w http.ResponseWriter, return nil } -func encodeMigrateMapfixesResponse(response *MigrateMapfixesNoContent, w http.ResponseWriter, span trace.Span) error { - w.WriteHeader(204) - span.SetStatus(codes.Ok, http.StatusText(204)) - - 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 dce160b..50cc71f 100644 --- a/pkg/api/oas_router_gen.go +++ b/pkg/api/oas_router_gen.go @@ -102,32 +102,6 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } - if len(elem) == 0 { - break - } - switch elem[0] { - case 'm': // Prefix: "migrate" - origElem := elem - if l := len("migrate"); len(elem) >= l && elem[0:l] == "migrate" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleMigrateMapfixesRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, "POST") - } - - return - } - - elem = origElem - } // Param: "MapfixID" // Match until "/" idx := strings.IndexByte(elem, '/') @@ -1602,36 +1576,6 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } - if len(elem) == 0 { - break - } - switch elem[0] { - case 'm': // Prefix: "migrate" - origElem := elem - if l := len("migrate"); len(elem) >= l && elem[0:l] == "migrate" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = MigrateMapfixesOperation - r.summary = "Perform the Uploaded -> Released migration." - r.operationID = "migrateMapfixes" - r.pathPattern = "/mapfixes/migrate" - r.args = args - r.count = 0 - return r, true - default: - return - } - } - - elem = origElem - } // Param: "MapfixID" // Match until "/" idx := strings.IndexByte(elem, '/') diff --git a/pkg/api/oas_schemas_gen.go b/pkg/api/oas_schemas_gen.go index 0713b61..d1f415c 100644 --- a/pkg/api/oas_schemas_gen.go +++ b/pkg/api/oas_schemas_gen.go @@ -692,9 +692,6 @@ func (s *Mapfixes) SetMapfixes(val []Mapfix) { s.Mapfixes = val } -// MigrateMapfixesNoContent is response for MigrateMapfixes operation. -type MigrateMapfixesNoContent 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 ad72e8e..ddc2925 100644 --- a/pkg/api/oas_security_gen.go +++ b/pkg/api/oas_security_gen.go @@ -69,7 +69,6 @@ var operationRolesCookieAuth = map[string][]string{ DeleteScriptPolicyOperation: []string{}, DownloadMapAssetOperation: []string{}, GetOperationOperation: []string{}, - MigrateMapfixesOperation: []string{}, ReleaseSubmissionsOperation: []string{}, SessionRolesOperation: []string{}, SessionUserOperation: []string{}, diff --git a/pkg/api/oas_server_gen.go b/pkg/api/oas_server_gen.go index 53b80df..d3ece17 100644 --- a/pkg/api/oas_server_gen.go +++ b/pkg/api/oas_server_gen.go @@ -293,12 +293,6 @@ type Handler interface { // // GET /submissions ListSubmissions(ctx context.Context, params ListSubmissionsParams) (*Submissions, error) - // MigrateMapfixes implements migrateMapfixes operation. - // - // Perform the Uploaded -> Released migration. - // - // POST /mapfixes/migrate - MigrateMapfixes(ctx context.Context) error // ReleaseSubmissions implements releaseSubmissions operation. // // Release a set of uploaded maps. Role SubmissionRelease. diff --git a/pkg/api/oas_unimplemented_gen.go b/pkg/api/oas_unimplemented_gen.go index 63f35e7..1069f43 100644 --- a/pkg/api/oas_unimplemented_gen.go +++ b/pkg/api/oas_unimplemented_gen.go @@ -439,15 +439,6 @@ func (UnimplementedHandler) ListSubmissions(ctx context.Context, params ListSubm return r, ht.ErrNotImplemented } -// MigrateMapfixes implements migrateMapfixes operation. -// -// Perform the Uploaded -> Released migration. -// -// POST /mapfixes/migrate -func (UnimplementedHandler) MigrateMapfixes(ctx context.Context) error { - return ht.ErrNotImplemented -} - // ReleaseSubmissions implements releaseSubmissions operation. // // Release a set of uploaded maps. Role SubmissionRelease. diff --git a/pkg/datastore/datastore.go b/pkg/datastore/datastore.go index 5d4a381..0c43d1c 100644 --- a/pkg/datastore/datastore.go +++ b/pkg/datastore/datastore.go @@ -61,7 +61,6 @@ type Mapfixes interface { Delete(ctx context.Context, id int64) error List(ctx context.Context, filters OptionalMap, page model.Page, sort ListSort) ([]model.Mapfix, error) ListWithTotal(ctx context.Context, filters OptionalMap, page model.Page, sort ListSort) (int64, []model.Mapfix, error) - Migrate(ctx context.Context) error } type Operations interface { diff --git a/pkg/datastore/gormstore/mapfixes.go b/pkg/datastore/gormstore/mapfixes.go index 0d1fc27..ee4f0ad 100644 --- a/pkg/datastore/gormstore/mapfixes.go +++ b/pkg/datastore/gormstore/mapfixes.go @@ -8,8 +8,6 @@ import ( "git.itzana.me/strafesnet/maps-service/pkg/model" "gorm.io/gorm" "gorm.io/gorm/clause" - - log "github.com/sirupsen/logrus" ) type Mapfixes struct { @@ -153,18 +151,3 @@ func (env *Mapfixes) ListWithTotal(ctx context.Context, filters datastore.Option return total, maps, nil } - -func (env *Mapfixes) Migrate(ctx context.Context) error { - migrate_from := model.MapfixStatusUploaded - migrate_to := model.MapfixStatusReleased - count := int64(0) - err := env.db. - Model(&model.Mapfix{}). - Where("status_id = ?", migrate_from). - Update("status_id", migrate_to). - Count(&count). - Error - - log.Println("Mapfixes Migration rows affected:",count) - return err -} diff --git a/pkg/service/mapfixes.go b/pkg/service/mapfixes.go index 88f81f4..9ca7fe4 100644 --- a/pkg/service/mapfixes.go +++ b/pkg/service/mapfixes.go @@ -114,7 +114,3 @@ func (svc *Service) UpdateMapfixIfStatus(ctx context.Context, id int64, statuses func (svc *Service) UpdateAndGetMapfixIfStatus(ctx context.Context, id int64, statuses []model.MapfixStatus, pmap MapfixUpdate) (model.Mapfix, error) { return svc.db.Mapfixes().IfStatusThenUpdateAndGet(ctx, id, statuses, datastore.OptionalMap(pmap)) } - -func (svc *Service) MigrateMapfixes(ctx context.Context) error { - return svc.db.Mapfixes().Migrate(ctx) -} diff --git a/pkg/web_api/mapfixes.go b/pkg/web_api/mapfixes.go index 7cb77be..7232e77 100644 --- a/pkg/web_api/mapfixes.go +++ b/pkg/web_api/mapfixes.go @@ -1192,26 +1192,3 @@ func (svc *Service) ListMapfixAuditEvents(ctx context.Context, params api.ListMa }, ) } - -// MigrateMapfixes invokes MigrateMapfixes operation. -// -// Retrieve a list of audit events. -// -// GET /mapfixes/{MapfixID}/audit-events -func (svc *Service) MigrateMapfixes(ctx context.Context) error { - userInfo, ok := ctx.Value("UserInfo").(UserInfoHandle) - if !ok { - return ErrUserInfo - } - - has_role, err := userInfo.HasRoleSubmissionRelease() - if err != nil { - return err - } - // check if caller has required role - if !has_role { - return ErrPermissionDeniedNeedRoleSubmissionRelease - } - - return svc.inner.MigrateMapfixes(ctx) -} -- 2.49.1