From fd0af4bc718083d1b1dd0b7a2d39d2cf8edad538 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 8 Jul 2025 23:21:01 -0700 Subject: [PATCH 01/32] submissions: create service_inner for common code --- pkg/cmds/serve.go | 20 ++++++++++++-------- pkg/service/service.go | 11 ++--------- pkg/service_inner/service.go | 17 +++++++++++++++++ pkg/service_internal/service_internal.go | 5 ++--- 4 files changed, 33 insertions(+), 20 deletions(-) create mode 100644 pkg/service_inner/service.go diff --git a/pkg/cmds/serve.go b/pkg/cmds/serve.go index 39391c3..6613129 100644 --- a/pkg/cmds/serve.go +++ b/pkg/cmds/serve.go @@ -12,6 +12,7 @@ import ( internal "git.itzana.me/strafesnet/maps-service/pkg/internal" "git.itzana.me/strafesnet/maps-service/pkg/roblox" "git.itzana.me/strafesnet/maps-service/pkg/service" + "git.itzana.me/strafesnet/maps-service/pkg/service_inner" "git.itzana.me/strafesnet/maps-service/pkg/service_internal" "github.com/nats-io/nats.go" log "github.com/sirupsen/logrus" @@ -130,7 +131,7 @@ func serve(ctx *cli.Context) error { if err != nil { log.Fatal(err) } - svc := &service.Service{ + svc_inner := &service_inner.Service{ DB: db, Nats: js, Maps: maps.NewMapsServiceClient(conn), @@ -141,6 +142,10 @@ func serve(ctx *cli.Context) error { }, } + svc_external := &service.Service{ + Inner: svc_inner, + } + conn, err = grpc.Dial(ctx.String("auth-rpc-host"), grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { log.Fatal(err) @@ -149,17 +154,16 @@ func serve(ctx *cli.Context) error { Client: auth.NewAuthServiceClient(conn), } - srv, err := api.NewServer(svc, sec, api.WithPathPrefix("/v1")) + srv_external, err := api.NewServer(svc_external, sec, api.WithPathPrefix("/v1")) if err != nil { log.WithError(err).Fatal("failed to initialize api server") } - svc2 := &service_internal.Service{ - DB: db, - Nats: js, + svc_internal := &service_internal.Service{ + Inner: svc_inner, } - srv2, err := internal.NewServer(svc2, internal.WithPathPrefix("/v1")) + srv_internal, err := internal.NewServer(svc_internal, internal.WithPathPrefix("/v1")) if err != nil { log.WithError(err).Fatal("failed to initialize api server") } @@ -168,12 +172,12 @@ func serve(ctx *cli.Context) error { // First server go func(errChan chan error) { - errChan <- http.ListenAndServe(fmt.Sprintf(":%d", ctx.Int("port-internal")), srv2) + errChan <- http.ListenAndServe(fmt.Sprintf(":%d", ctx.Int("port-internal")), srv_internal) }(errChan) // Second server go func(errChan chan error) { - errChan <- http.ListenAndServe(fmt.Sprintf(":%d", ctx.Int("port")), srv) + errChan <- http.ListenAndServe(fmt.Sprintf(":%d", ctx.Int("port")), srv_external) }(errChan) // Wait for the first error or completion of both tasks diff --git a/pkg/service/service.go b/pkg/service/service.go index db5ccd1..e2faf9d 100644 --- a/pkg/service/service.go +++ b/pkg/service/service.go @@ -5,12 +5,9 @@ import ( "errors" "fmt" - "git.itzana.me/strafesnet/go-grpc/maps" - "git.itzana.me/strafesnet/go-grpc/users" "git.itzana.me/strafesnet/maps-service/pkg/api" "git.itzana.me/strafesnet/maps-service/pkg/datastore" - "git.itzana.me/strafesnet/maps-service/pkg/roblox" - "github.com/nats-io/nats.go" + "git.itzana.me/strafesnet/maps-service/pkg/service_inner" ) var ( @@ -32,11 +29,7 @@ var ( ) type Service struct { - DB datastore.Datastore - Nats nats.JetStreamContext - Maps maps.MapsServiceClient - Users users.UsersServiceClient - Roblox roblox.Client + Inner *service_inner.Service } // NewError creates *ErrorStatusCode from error returned by handler. diff --git a/pkg/service_inner/service.go b/pkg/service_inner/service.go new file mode 100644 index 0000000..e3062aa --- /dev/null +++ b/pkg/service_inner/service.go @@ -0,0 +1,17 @@ +package service_inner + +import ( + "git.itzana.me/strafesnet/go-grpc/maps" + "git.itzana.me/strafesnet/go-grpc/users" + "git.itzana.me/strafesnet/maps-service/pkg/datastore" + "git.itzana.me/strafesnet/maps-service/pkg/roblox" + "github.com/nats-io/nats.go" +) + +type Service struct { + DB datastore.Datastore + Nats nats.JetStreamContext + Maps maps.MapsServiceClient + Users users.UsersServiceClient + Roblox roblox.Client +} diff --git a/pkg/service_internal/service_internal.go b/pkg/service_internal/service_internal.go index 6aefe80..a4edce8 100644 --- a/pkg/service_internal/service_internal.go +++ b/pkg/service_internal/service_internal.go @@ -7,7 +7,7 @@ import ( "git.itzana.me/strafesnet/maps-service/pkg/datastore" internal "git.itzana.me/strafesnet/maps-service/pkg/internal" - "github.com/nats-io/nats.go" + "git.itzana.me/strafesnet/maps-service/pkg/service_inner" ) const ( @@ -19,8 +19,7 @@ var ( ) type Service struct { - DB datastore.Datastore - Nats nats.JetStreamContext + Inner *service_inner.Service } // yay duplicate code -- 2.49.1 From fb33420e750a9a53f05197538ddeef8a07012d06 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 8 Jul 2025 23:26:48 -0700 Subject: [PATCH 02/32] deduplicate audit events --- pkg/service/mapfixes.go | 28 +++--- pkg/service/submissions.go | 28 +++--- .../audit_events.go | 66 ++++++++++++- pkg/service_internal/audit_events.go | 92 ------------------- pkg/service_internal/mapfixes.go | 14 +-- pkg/service_internal/submissions.go | 16 ++-- 6 files changed, 108 insertions(+), 136 deletions(-) rename pkg/{service => service_inner}/audit_events.go (66%) delete mode 100644 pkg/service_internal/audit_events.go diff --git a/pkg/service/mapfixes.go b/pkg/service/mapfixes.go index 9bddba8..abf1426 100644 --- a/pkg/service/mapfixes.go +++ b/pkg/service/mapfixes.go @@ -317,7 +317,7 @@ func (svc *Service) UpdateMapfixModel(ctx context.Context, params api.UpdateMapf NewModelVersion: NewModelVersion, } - return svc.CreateAuditEventChangeModel( + return svc.Inner.CreateAuditEventChangeModel( ctx, userId, model.Resource{ @@ -366,7 +366,7 @@ func (svc *Service) ActionMapfixReject(ctx context.Context, params api.ActionMap TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -415,7 +415,7 @@ func (svc *Service) ActionMapfixRequestChanges(ctx context.Context, params api.A TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -467,7 +467,7 @@ func (svc *Service) ActionMapfixRevoke(ctx context.Context, params api.ActionMap TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -535,7 +535,7 @@ func (svc *Service) ActionMapfixTriggerSubmit(ctx context.Context, params api.Ac TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -612,7 +612,7 @@ func (svc *Service) ActionMapfixTriggerSubmitUnchecked(ctx context.Context, para TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -668,7 +668,7 @@ func (svc *Service) ActionMapfixResetSubmitting(ctx context.Context, params api. TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -735,7 +735,7 @@ func (svc *Service) ActionMapfixTriggerUpload(ctx context.Context, params api.Ac TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -794,7 +794,7 @@ func (svc *Service) ActionMapfixValidated(ctx context.Context, params api.Action TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -894,7 +894,7 @@ func (svc *Service) ActionMapfixTriggerValidate(ctx context.Context, params api. TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -965,7 +965,7 @@ func (svc *Service) ActionMapfixRetryValidate(ctx context.Context, params api.Ac TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -1024,7 +1024,7 @@ func (svc *Service) ActionMapfixAccepted(ctx context.Context, params api.ActionM TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -1077,7 +1077,7 @@ func (svc *Service) CreateMapfixAuditComment(ctx context.Context, req api.Create Comment: string(data), } - return svc.CreateAuditEventComment( + return svc.Inner.CreateAuditEventComment( ctx, userId, model.Resource{ @@ -1094,7 +1094,7 @@ func (svc *Service) CreateMapfixAuditComment(ctx context.Context, req api.Create // // GET /mapfixes/{MapfixID}/audit-events func (svc *Service) ListMapfixAuditEvents(ctx context.Context, params api.ListMapfixAuditEventsParams) ([]api.AuditEvent, error) { - return svc.ListAuditEvents( + return svc.Inner.ListAuditEvents( ctx, model.Resource{ ID: params.MapfixID, diff --git a/pkg/service/submissions.go b/pkg/service/submissions.go index c8562e1..b4b26e2 100644 --- a/pkg/service/submissions.go +++ b/pkg/service/submissions.go @@ -366,7 +366,7 @@ func (svc *Service) UpdateSubmissionModel(ctx context.Context, params api.Update NewModelVersion: NewModelVersion, } - return svc.CreateAuditEventChangeModel( + return svc.Inner.CreateAuditEventChangeModel( ctx, userId, model.Resource{ @@ -415,7 +415,7 @@ func (svc *Service) ActionSubmissionReject(ctx context.Context, params api.Actio TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -464,7 +464,7 @@ func (svc *Service) ActionSubmissionRequestChanges(ctx context.Context, params a TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -516,7 +516,7 @@ func (svc *Service) ActionSubmissionRevoke(ctx context.Context, params api.Actio TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -592,7 +592,7 @@ func (svc *Service) ActionSubmissionTriggerSubmit(ctx context.Context, params ap TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -669,7 +669,7 @@ func (svc *Service) ActionSubmissionTriggerSubmitUnchecked(ctx context.Context, TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -725,7 +725,7 @@ func (svc *Service) ActionSubmissionResetSubmitting(ctx context.Context, params TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -799,7 +799,7 @@ func (svc *Service) ActionSubmissionTriggerUpload(ctx context.Context, params ap TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -858,7 +858,7 @@ func (svc *Service) ActionSubmissionValidated(ctx context.Context, params api.Ac TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -941,7 +941,7 @@ func (svc *Service) ActionSubmissionTriggerValidate(ctx context.Context, params TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -1012,7 +1012,7 @@ func (svc *Service) ActionSubmissionRetryValidate(ctx context.Context, params ap TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -1071,7 +1071,7 @@ func (svc *Service) ActionSubmissionAccepted(ctx context.Context, params api.Act TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -1192,7 +1192,7 @@ func (svc *Service) CreateSubmissionAuditComment(ctx context.Context, req api.Cr Comment: string(data), } - return svc.CreateAuditEventComment( + return svc.Inner.CreateAuditEventComment( ctx, userId, model.Resource{ @@ -1209,7 +1209,7 @@ func (svc *Service) CreateSubmissionAuditComment(ctx context.Context, req api.Cr // // GET /submissions/{SubmissionID}/audit-events func (svc *Service) ListSubmissionAuditEvents(ctx context.Context, params api.ListSubmissionAuditEventsParams) ([]api.AuditEvent, error) { - return svc.ListAuditEvents( + return svc.Inner.ListAuditEvents( ctx, model.Resource{ ID: params.SubmissionID, diff --git a/pkg/service/audit_events.go b/pkg/service_inner/audit_events.go similarity index 66% rename from pkg/service/audit_events.go rename to pkg/service_inner/audit_events.go index d8ab5a6..7ab6d0e 100644 --- a/pkg/service/audit_events.go +++ b/pkg/service_inner/audit_events.go @@ -1,4 +1,4 @@ -package service +package service_inner import ( "context" @@ -130,3 +130,67 @@ func (svc *Service) CreateAuditEventChangeModel(ctx context.Context, userId uint return nil } + + +func (svc *Service) CreateAuditEventChangeValidatedModel(ctx context.Context, userId uint64, resource model.Resource, event_data model.AuditEventDataChangeValidatedModel) error { + EventData, err := json.Marshal(event_data) + if err != nil { + return err + } + + _, err = svc.DB.AuditEvents().Create(ctx, model.AuditEvent{ + ID: 0, + User: userId, + ResourceType: resource.Type, + ResourceID: resource.ID, + EventType: model.AuditEventTypeChangeValidatedModel, + EventData: EventData, + }) + if err != nil { + return err + } + + return nil +} + +func (svc *Service) CreateAuditEventError(ctx context.Context, userId uint64, resource model.Resource, event_data model.AuditEventDataError) error { + EventData, err := json.Marshal(event_data) + if err != nil { + return err + } + + _, err = svc.DB.AuditEvents().Create(ctx, model.AuditEvent{ + ID: 0, + User: userId, + ResourceType: resource.Type, + ResourceID: resource.ID, + EventType: model.AuditEventTypeError, + EventData: EventData, + }) + if err != nil { + return err + } + + return nil +} + +func (svc *Service) CreateAuditEventCheckList(ctx context.Context, userId uint64, resource model.Resource, event_data model.AuditEventDataCheckList) error { + EventData, err := json.Marshal(event_data) + if err != nil { + return err + } + + _, err = svc.DB.AuditEvents().Create(ctx, model.AuditEvent{ + ID: 0, + User: userId, + ResourceType: resource.Type, + ResourceID: resource.ID, + EventType: model.AuditEventTypeCheckList, + EventData: EventData, + }) + if err != nil { + return err + } + + return nil +} diff --git a/pkg/service_internal/audit_events.go b/pkg/service_internal/audit_events.go deleted file mode 100644 index 53e386c..0000000 --- a/pkg/service_internal/audit_events.go +++ /dev/null @@ -1,92 +0,0 @@ -package service_internal - -import ( - "context" - "encoding/json" - - "git.itzana.me/strafesnet/maps-service/pkg/model" -) - -func (svc *Service) CreateAuditEventAction(ctx context.Context, userId uint64, resource model.Resource, event_data model.AuditEventDataAction) error { - EventData, err := json.Marshal(event_data) - if err != nil { - return err - } - - _, err = svc.DB.AuditEvents().Create(ctx, model.AuditEvent{ - ID: 0, - User: userId, - ResourceType: resource.Type, - ResourceID: resource.ID, - EventType: model.AuditEventTypeAction, - EventData: EventData, - }) - if err != nil { - return err - } - - return nil -} - -func (svc *Service) CreateAuditEventChangeValidatedModel(ctx context.Context, userId uint64, resource model.Resource, event_data model.AuditEventDataChangeValidatedModel) error { - EventData, err := json.Marshal(event_data) - if err != nil { - return err - } - - _, err = svc.DB.AuditEvents().Create(ctx, model.AuditEvent{ - ID: 0, - User: userId, - ResourceType: resource.Type, - ResourceID: resource.ID, - EventType: model.AuditEventTypeChangeValidatedModel, - EventData: EventData, - }) - if err != nil { - return err - } - - return nil -} - -func (svc *Service) CreateAuditEventError(ctx context.Context, userId uint64, resource model.Resource, event_data model.AuditEventDataError) error { - EventData, err := json.Marshal(event_data) - if err != nil { - return err - } - - _, err = svc.DB.AuditEvents().Create(ctx, model.AuditEvent{ - ID: 0, - User: userId, - ResourceType: resource.Type, - ResourceID: resource.ID, - EventType: model.AuditEventTypeError, - EventData: EventData, - }) - if err != nil { - return err - } - - return nil -} - -func (svc *Service) CreateAuditEventCheckList(ctx context.Context, userId uint64, resource model.Resource, event_data model.AuditEventDataCheckList) error { - EventData, err := json.Marshal(event_data) - if err != nil { - return err - } - - _, err = svc.DB.AuditEvents().Create(ctx, model.AuditEvent{ - ID: 0, - User: userId, - ResourceType: resource.Type, - ResourceID: resource.ID, - EventType: model.AuditEventTypeCheckList, - EventData: EventData, - }) - if err != nil { - return err - } - - return nil -} diff --git a/pkg/service_internal/mapfixes.go b/pkg/service_internal/mapfixes.go index ad8e1e3..5da4912 100644 --- a/pkg/service_internal/mapfixes.go +++ b/pkg/service_internal/mapfixes.go @@ -53,7 +53,7 @@ func (svc *Service) UpdateMapfixValidatedModel(ctx context.Context, params inter ValidatedModelVersion: ValidatedModelVersion, } - return svc.CreateAuditEventChangeValidatedModel( + return svc.Inner.CreateAuditEventChangeValidatedModel( ctx, ValidtorUserID, model.Resource{ @@ -87,7 +87,7 @@ func (svc *Service) ActionMapfixSubmitted(ctx context.Context, params internal.A TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, ValidtorUserID, model.Resource{ @@ -117,7 +117,7 @@ func (svc *Service) ActionMapfixRequestChanges(ctx context.Context, params inter TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, ValidtorUserID, model.Resource{ @@ -160,7 +160,7 @@ func (svc *Service) ActionMapfixAccepted(ctx context.Context, params internal.Ac TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, ValidtorUserID, model.Resource{ @@ -190,7 +190,7 @@ func (svc *Service) ActionMapfixUploaded(ctx context.Context, params internal.Ac TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, ValidtorUserID, model.Resource{ @@ -211,7 +211,7 @@ func (svc *Service) CreateMapfixAuditError(ctx context.Context, params internal. Error: params.ErrorMessage, } - return svc.CreateAuditEventError( + return svc.Inner.CreateAuditEventError( ctx, ValidtorUserID, model.Resource{ @@ -241,7 +241,7 @@ func (svc *Service) CreateMapfixAuditCheckList(ctx context.Context, check_list i CheckList: check_list2, } - return svc.CreateAuditEventCheckList( + return svc.Inner.CreateAuditEventCheckList( ctx, ValidtorUserID, model.Resource{ diff --git a/pkg/service_internal/submissions.go b/pkg/service_internal/submissions.go index c7c18a7..f6e12a2 100644 --- a/pkg/service_internal/submissions.go +++ b/pkg/service_internal/submissions.go @@ -53,7 +53,7 @@ func (svc *Service) UpdateSubmissionValidatedModel(ctx context.Context, params i ValidatedModelVersion: ValidatedModelVersion, } - return svc.CreateAuditEventChangeValidatedModel( + return svc.Inner.CreateAuditEventChangeValidatedModel( ctx, ValidtorUserID, model.Resource{ @@ -87,7 +87,7 @@ func (svc *Service) ActionSubmissionSubmitted(ctx context.Context, params intern TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, ValidtorUserID, model.Resource{ @@ -118,7 +118,7 @@ func (svc *Service) ActionSubmissionRequestChanges(ctx context.Context, params i TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, ValidtorUserID, model.Resource{ @@ -148,7 +148,7 @@ func (svc *Service) ActionSubmissionValidated(ctx context.Context, params intern TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, ValidtorUserID, model.Resource{ @@ -179,7 +179,7 @@ func (svc *Service) ActionSubmissionAccepted(ctx context.Context, params interna TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, ValidtorUserID, model.Resource{ @@ -210,7 +210,7 @@ func (svc *Service) ActionSubmissionUploaded(ctx context.Context, params interna TargetStatus: uint32(target_status), } - return svc.CreateAuditEventAction( + return svc.Inner.CreateAuditEventAction( ctx, ValidtorUserID, model.Resource{ @@ -231,7 +231,7 @@ func (svc *Service) CreateSubmissionAuditError(ctx context.Context, params inter Error: params.ErrorMessage, } - return svc.CreateAuditEventError( + return svc.Inner.CreateAuditEventError( ctx, ValidtorUserID, model.Resource{ @@ -261,7 +261,7 @@ func (svc *Service) CreateSubmissionAuditCheckList(ctx context.Context, check_li CheckList: check_list2, } - return svc.CreateAuditEventCheckList( + return svc.Inner.CreateAuditEventCheckList( ctx, ValidtorUserID, model.Resource{ -- 2.49.1 From 79296093727be7ca8b0c12570c9b99ce5b995e72 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 9 Jul 2025 00:40:46 -0700 Subject: [PATCH 03/32] type safe scripts --- pkg/service/scripts.go | 73 +++++++++++++++++---------------- pkg/service_inner/scripts.go | 56 +++++++++++++++++++++++++ pkg/service_internal/scripts.go | 41 +++++++++--------- 3 files changed, 113 insertions(+), 57 deletions(-) create mode 100644 pkg/service_inner/scripts.go diff --git a/pkg/service/scripts.go b/pkg/service/scripts.go index 47da522..1b497a9 100644 --- a/pkg/service/scripts.go +++ b/pkg/service/scripts.go @@ -4,8 +4,8 @@ import ( "context" "git.itzana.me/strafesnet/maps-service/pkg/api" - "git.itzana.me/strafesnet/maps-service/pkg/datastore" "git.itzana.me/strafesnet/maps-service/pkg/model" + "git.itzana.me/strafesnet/maps-service/pkg/service_inner" ) // CreateScript implements createScript operation. @@ -27,7 +27,7 @@ func (svc *Service) CreateScript(ctx context.Context, req *api.ScriptCreate) (*a return nil, ErrPermissionDenied } - script, err := svc.DB.Scripts().Create(ctx, model.Script{ + script, err := svc.Inner.CreateScript(ctx, model.Script{ ID: 0, Name: req.Name, Hash: int64(model.HashSource(req.Source)), @@ -50,29 +50,28 @@ func (svc *Service) CreateScript(ctx context.Context, req *api.ScriptCreate) (*a // // GET /scripts func (svc *Service) ListScripts(ctx context.Context, params api.ListScriptsParams) ([]api.Script, error) { - filter := datastore.Optional() - - if params.Hash.IsSet(){ - hash, err := model.HashParse(params.Hash.Value) + hash, hash_ok := int64(0), false + if hash_hex, ok := params.Hash.Get(); ok{ + hash_parsed, err := model.HashParse(hash_hex) if err != nil { return nil, err } - filter.Add("hash", int64(hash)) // No type safety! - } - if params.Name.IsSet(){ - filter.Add("name", params.Name.Value) - } - if params.Source.IsSet(){ - filter.Add("source", params.Source.Value) - } - if params.ResourceType.IsSet(){ - filter.Add("resource_type", params.ResourceType.Value) - } - if params.ResourceID.IsSet(){ - filter.Add("resource_id", params.ResourceID.Value) + hash, hash_ok = int64(hash_parsed), true } + name, name_ok := params.Name.Get() + source, source_ok := params.Source.Get() + resource_type, resource_type_ok := params.ResourceType.Get() + resource_id, resource_id_ok := params.ResourceID.Get() - items, err := svc.DB.Scripts().List(ctx, filter, model.Page{ + filter := service_inner.MakeScriptFilter( + name, name_ok, + source, source_ok, + hash, hash_ok, + resource_type, resource_type_ok, + resource_id, resource_id_ok, + ) + + items, err := svc.Inner.ListScripts(ctx, filter, model.Page{ Number: params.Page, Size: params.Limit, }) @@ -114,7 +113,7 @@ func (svc *Service) DeleteScript(ctx context.Context, params api.DeleteScriptPar return ErrPermissionDenied } - return svc.DB.Scripts().Delete(ctx, params.ScriptID) + return svc.Inner.DeleteScript(ctx, params.ScriptID) } // GetScript implements getScript operation. @@ -123,7 +122,7 @@ func (svc *Service) DeleteScript(ctx context.Context, params api.DeleteScriptPar // // GET /scripts/{ScriptID} func (svc *Service) GetScript(ctx context.Context, params api.GetScriptParams) (*api.Script, error) { - script, err := svc.DB.Scripts().Get(ctx, params.ScriptID) + script, err := svc.Inner.GetScript(ctx, params.ScriptID) if err != nil { return nil, err } @@ -157,19 +156,21 @@ func (svc *Service) UpdateScript(ctx context.Context, req *api.ScriptUpdate, par return ErrPermissionDenied } - pmap := datastore.Optional() - if Name, ok := req.Name.Get(); ok { - pmap.Add("name", Name) + name, name_ok := req.Name.Get() + source, source_ok := req.Source.Get() + hash, hash_ok := int64(0), false + if source_ok { + hash, hash_ok = int64(model.HashSource(source)), true } - if source, ok := req.Source.Get(); ok { - pmap.Add("source", source) - pmap.Add("hash", int64(model.HashSource(source))) // No type safety! - } - if ResourceType, ok := req.ResourceType.Get(); ok { - pmap.Add("resource_type", ResourceType) - } - if ResourceID, ok := req.ResourceID.Get(); ok { - pmap.Add("resource_id", ResourceID) - } - return svc.DB.Scripts().Update(ctx, req.ID, pmap) + resource_type, resource_type_ok := req.ResourceType.Get() + resource_id, resource_id_ok := req.ResourceID.Get() + + filter := service_inner.MakeScriptFilter( + name, name_ok, + source, source_ok, + hash, hash_ok, + resource_type, resource_type_ok, + resource_id, resource_id_ok, + ) + return svc.Inner.UpdateScript(ctx, req.ID, filter) } diff --git a/pkg/service_inner/scripts.go b/pkg/service_inner/scripts.go new file mode 100644 index 0000000..81e37d5 --- /dev/null +++ b/pkg/service_inner/scripts.go @@ -0,0 +1,56 @@ +package service_inner + +import ( + "context" + + "git.itzana.me/strafesnet/maps-service/pkg/datastore" + "git.itzana.me/strafesnet/maps-service/pkg/model" +) + +type ScriptFilter datastore.OptionalMap + +func MakeScriptFilter( + name string, name_ok bool, + source string, source_ok bool, + hash int64, hash_ok bool, + resource_type int32, resource_type_ok bool, + resource_id int64, resource_id_ok bool, +) ScriptFilter { + filter := datastore.Optional() + if name_ok { + filter.Add("name", name) + } + if source_ok { + filter.Add("source", source) + } + if hash_ok { + filter.Add("hash", hash) + } + if resource_type_ok { + filter.Add("resource_type", resource_type) + } + if resource_id_ok { + filter.Add("resource_id", resource_id) + } + return ScriptFilter(filter) +} + +func (svc *Service) CreateScript(ctx context.Context, script model.Script) (model.Script, error) { + return svc.DB.Scripts().Create(ctx, script) +} + +func (svc *Service) ListScripts(ctx context.Context, filter ScriptFilter, page model.Page) ([]model.Script, error) { + return svc.DB.Scripts().List(ctx, datastore.OptionalMap(filter), page) +} + +func (svc *Service) DeleteScript(ctx context.Context, id int64) error { + return svc.DB.Scripts().Delete(ctx, id) +} + +func (svc *Service) GetScript(ctx context.Context, id int64) (model.Script, error) { + return svc.DB.Scripts().Get(ctx, id) +} + +func (svc *Service) UpdateScript(ctx context.Context, id int64, pmap ScriptFilter) error { + return svc.DB.Scripts().Update(ctx, id, datastore.OptionalMap(pmap)) +} diff --git a/pkg/service_internal/scripts.go b/pkg/service_internal/scripts.go index 3de5264..d3d8d40 100644 --- a/pkg/service_internal/scripts.go +++ b/pkg/service_internal/scripts.go @@ -3,9 +3,9 @@ package service_internal import ( "context" - "git.itzana.me/strafesnet/maps-service/pkg/datastore" api "git.itzana.me/strafesnet/maps-service/pkg/internal" "git.itzana.me/strafesnet/maps-service/pkg/model" + "git.itzana.me/strafesnet/maps-service/pkg/service_inner" ) // CreateScript implements createScript operation. @@ -14,7 +14,7 @@ import ( // // POST /scripts func (svc *Service) CreateScript(ctx context.Context, req *api.ScriptCreate) (*api.ScriptID, error) { - script, err := svc.DB.Scripts().Create(ctx, model.Script{ + script, err := svc.Inner.CreateScript(ctx, model.Script{ ID: 0, Name: req.Name, Hash: int64(model.HashSource(req.Source)), @@ -37,29 +37,28 @@ func (svc *Service) CreateScript(ctx context.Context, req *api.ScriptCreate) (*a // // GET /scripts func (svc *Service) ListScripts(ctx context.Context, params api.ListScriptsParams) ([]api.Script, error) { - filter := datastore.Optional() - - if params.Hash.IsSet(){ - hash, err := model.HashParse(params.Hash.Value) + hash, hash_ok := int64(0), false + if hash_hex, ok := params.Hash.Get(); ok{ + hash_parsed, err := model.HashParse(hash_hex) if err != nil { return nil, err } - filter.Add("hash", int64(hash)) // No type safety! - } - if params.Name.IsSet(){ - filter.Add("name", params.Name.Value) - } - if params.Source.IsSet(){ - filter.Add("source", params.Source.Value) - } - if params.ResourceType.IsSet(){ - filter.Add("resource_type", params.ResourceType.Value) - } - if params.ResourceID.IsSet(){ - filter.Add("resource_id", params.ResourceID.Value) + hash, hash_ok = int64(hash_parsed), true } + name, name_ok := params.Name.Get() + source, source_ok := params.Source.Get() + resource_type, resource_type_ok := params.ResourceType.Get() + resource_id, resource_id_ok := params.ResourceID.Get() - items, err := svc.DB.Scripts().List(ctx, filter, model.Page{ + filter := service_inner.MakeScriptFilter( + name, name_ok, + source, source_ok, + hash, hash_ok, + resource_type, resource_type_ok, + resource_id, resource_id_ok, + ) + + items, err := svc.Inner.ListScripts(ctx, filter, model.Page{ Number: params.Page, Size: params.Limit, }) @@ -88,7 +87,7 @@ func (svc *Service) ListScripts(ctx context.Context, params api.ListScriptsParam // // GET /scripts/{ScriptID} func (svc *Service) GetScript(ctx context.Context, params api.GetScriptParams) (*api.Script, error) { - script, err := svc.DB.Scripts().Get(ctx, params.ScriptID) + script, err := svc.Inner.GetScript(ctx, params.ScriptID) if err != nil { return nil, err } -- 2.49.1 From 45cde3cc65c24f05f888fa8672a34d7ee2092817 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 9 Jul 2025 00:45:56 -0700 Subject: [PATCH 04/32] scripts: return accurate error --- pkg/service/scripts.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/service/scripts.go b/pkg/service/scripts.go index 1b497a9..fe3c8dc 100644 --- a/pkg/service/scripts.go +++ b/pkg/service/scripts.go @@ -24,7 +24,7 @@ func (svc *Service) CreateScript(ctx context.Context, req *api.ScriptCreate) (*a return nil, err } if !has_role { - return nil, ErrPermissionDenied + return nil, ErrPermissionDeniedNeedRoleScriptWrite } script, err := svc.Inner.CreateScript(ctx, model.Script{ @@ -110,7 +110,7 @@ func (svc *Service) DeleteScript(ctx context.Context, params api.DeleteScriptPar return err } if !has_role { - return ErrPermissionDenied + return ErrPermissionDeniedNeedRoleScriptWrite } return svc.Inner.DeleteScript(ctx, params.ScriptID) @@ -153,7 +153,7 @@ func (svc *Service) UpdateScript(ctx context.Context, req *api.ScriptUpdate, par return err } if !has_role { - return ErrPermissionDenied + return ErrPermissionDeniedNeedRoleScriptWrite } name, name_ok := req.Name.Get() -- 2.49.1 From 3663c2f23a4e4d5edfb0e20b5bc2995dc987709e Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 9 Jul 2025 01:10:59 -0700 Subject: [PATCH 05/32] scripts: deduplicate permissions check --- pkg/service/script_policy.go | 30 +++-------------------- pkg/service/scripts.go | 47 +++++++++++++++--------------------- 2 files changed, 23 insertions(+), 54 deletions(-) diff --git a/pkg/service/script_policy.go b/pkg/service/script_policy.go index 771ab5c..b58c6b7 100644 --- a/pkg/service/script_policy.go +++ b/pkg/service/script_policy.go @@ -14,18 +14,10 @@ import ( // // POST /script-policy func (svc *Service) CreateScriptPolicy(ctx context.Context, req *api.ScriptPolicyCreate) (*api.ScriptPolicyID, error) { - userInfo, ok := ctx.Value("UserInfo").(UserInfoHandle) - if !ok { - return nil, ErrUserInfo - } - - has_role, err := userInfo.HasRoleScriptWrite() + err := CheckHasRoleScriptWrite(ctx) if err != nil { return nil, err } - if !has_role { - return nil, ErrPermissionDenied - } from_script, err := svc.DB.Scripts().Get(ctx, req.FromScriptID) if err != nil { @@ -99,18 +91,10 @@ func (svc *Service) ListScriptPolicy(ctx context.Context, params api.ListScriptP // // DELETE /script-policy/{ScriptPolicyID} func (svc *Service) DeleteScriptPolicy(ctx context.Context, params api.DeleteScriptPolicyParams) error { - userInfo, ok := ctx.Value("UserInfo").(UserInfoHandle) - if !ok { - return ErrUserInfo - } - - has_role, err := userInfo.HasRoleScriptWrite() + err := CheckHasRoleScriptWrite(ctx) if err != nil { return err } - if !has_role { - return ErrPermissionDenied - } return svc.DB.ScriptPolicy().Delete(ctx, params.ScriptPolicyID) } @@ -140,18 +124,10 @@ func (svc *Service) GetScriptPolicy(ctx context.Context, params api.GetScriptPol // // POST /script-policy/{ScriptPolicyID} func (svc *Service) UpdateScriptPolicy(ctx context.Context, req *api.ScriptPolicyUpdate, params api.UpdateScriptPolicyParams) error { - userInfo, ok := ctx.Value("UserInfo").(UserInfoHandle) - if !ok { - return ErrUserInfo - } - - has_role, err := userInfo.HasRoleScriptWrite() + err := CheckHasRoleScriptWrite(ctx) if err != nil { return err } - if !has_role { - return ErrPermissionDenied - } pmap := datastore.Optional() if from_script_id, ok := req.FromScriptID.Get(); ok { diff --git a/pkg/service/scripts.go b/pkg/service/scripts.go index fe3c8dc..7f8e80a 100644 --- a/pkg/service/scripts.go +++ b/pkg/service/scripts.go @@ -8,24 +8,33 @@ import ( "git.itzana.me/strafesnet/maps-service/pkg/service_inner" ) +func CheckHasRoleScriptWrite(ctx context.Context) error { + userInfo, ok := ctx.Value("UserInfo").(UserInfoHandle) + if !ok { + return ErrUserInfo + } + + has_role, err := userInfo.HasRoleScriptWrite() + if err != nil { + return err + } + if !has_role { + return ErrPermissionDeniedNeedRoleScriptWrite + } + + return nil +} + // CreateScript implements createScript operation. // // Create a new script. // // POST /scripts func (svc *Service) CreateScript(ctx context.Context, req *api.ScriptCreate) (*api.ScriptID, error) { - userInfo, ok := ctx.Value("UserInfo").(UserInfoHandle) - if !ok { - return nil, ErrUserInfo - } - - has_role, err := userInfo.HasRoleScriptWrite() + err := CheckHasRoleScriptWrite(ctx) if err != nil { return nil, err } - if !has_role { - return nil, ErrPermissionDeniedNeedRoleScriptWrite - } script, err := svc.Inner.CreateScript(ctx, model.Script{ ID: 0, @@ -100,18 +109,10 @@ func (svc *Service) ListScripts(ctx context.Context, params api.ListScriptsParam // // DELETE /scripts/{ScriptID} func (svc *Service) DeleteScript(ctx context.Context, params api.DeleteScriptParams) error { - userInfo, ok := ctx.Value("UserInfo").(UserInfoHandle) - if !ok { - return ErrUserInfo - } - - has_role, err := userInfo.HasRoleScriptWrite() + err := CheckHasRoleScriptWrite(ctx) if err != nil { return err } - if !has_role { - return ErrPermissionDeniedNeedRoleScriptWrite - } return svc.Inner.DeleteScript(ctx, params.ScriptID) } @@ -143,18 +144,10 @@ func (svc *Service) GetScript(ctx context.Context, params api.GetScriptParams) ( // // PATCH /scripts/{ScriptID} func (svc *Service) UpdateScript(ctx context.Context, req *api.ScriptUpdate, params api.UpdateScriptParams) error { - userInfo, ok := ctx.Value("UserInfo").(UserInfoHandle) - if !ok { - return ErrUserInfo - } - - has_role, err := userInfo.HasRoleScriptWrite() + err := CheckHasRoleScriptWrite(ctx) if err != nil { return err } - if !has_role { - return ErrPermissionDeniedNeedRoleScriptWrite - } name, name_ok := req.Name.Get() source, source_ok := req.Source.Get() -- 2.49.1 From 24615b6673fe99f67ab0ac48e2b2f4984bf571d4 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 9 Jul 2025 01:17:38 -0700 Subject: [PATCH 06/32] script policy: use inner --- pkg/service/script_policy.go | 59 +++++++++++++++------------ pkg/service_inner/script_policy.go | 48 ++++++++++++++++++++++ pkg/service_internal/script_policy.go | 31 +++++++------- 3 files changed, 96 insertions(+), 42 deletions(-) create mode 100644 pkg/service_inner/script_policy.go diff --git a/pkg/service/script_policy.go b/pkg/service/script_policy.go index b58c6b7..6e89f2c 100644 --- a/pkg/service/script_policy.go +++ b/pkg/service/script_policy.go @@ -4,8 +4,8 @@ import ( "context" "git.itzana.me/strafesnet/maps-service/pkg/api" - "git.itzana.me/strafesnet/maps-service/pkg/datastore" "git.itzana.me/strafesnet/maps-service/pkg/model" + "git.itzana.me/strafesnet/maps-service/pkg/service_inner" ) // CreateScriptPolicy implements createScriptPolicy operation. @@ -19,14 +19,14 @@ func (svc *Service) CreateScriptPolicy(ctx context.Context, req *api.ScriptPolic return nil, err } - from_script, err := svc.DB.Scripts().Get(ctx, req.FromScriptID) + from_script, err := svc.Inner.GetScript(ctx, req.FromScriptID) if err != nil { return nil, err } // the existence of ToScriptID does not need to be validated because it's checked by a foreign key constraint. - script, err := svc.DB.ScriptPolicy().Create(ctx, model.ScriptPolicy{ + script, err := svc.Inner.CreateScriptPolicy(ctx, model.ScriptPolicy{ ID: 0, FromScriptHash: from_script.Hash, ToScriptID: req.ToScriptID, @@ -48,23 +48,24 @@ func (svc *Service) CreateScriptPolicy(ctx context.Context, req *api.ScriptPolic // // GET /script-policy func (svc *Service) ListScriptPolicy(ctx context.Context, params api.ListScriptPolicyParams) ([]api.ScriptPolicy, error) { - filter := datastore.Optional() - - if params.FromScriptHash.IsSet(){ - hash, err := model.HashParse(params.FromScriptHash.Value) + from_script_hash, from_script_hash_ok := int64(0), false + if hash_hex, ok := params.FromScriptHash.Get(); ok{ + hash_parsed, err := model.HashParse(hash_hex) if err != nil { return nil, err } - filter.Add("from_script_hash", int64(hash)) // No type safety! - } - if params.ToScriptID.IsSet(){ - filter.Add("to_script_id", params.ToScriptID.Value) - } - if params.Policy.IsSet(){ - filter.Add("policy", params.Policy.Value) + from_script_hash, from_script_hash_ok = int64(hash_parsed), true } + to_script_id, to_script_id_ok := params.ToScriptID.Get() + policy, policy_ok := params.Policy.Get() - items, err := svc.DB.ScriptPolicy().List(ctx, filter, model.Page{ + filter := service_inner.MakeScriptPolicyFilter( + from_script_hash, from_script_hash_ok, + to_script_id, to_script_id_ok, + policy, policy_ok, + ) + + items, err := svc.Inner.ListScriptPolicies(ctx, filter, model.Page{ Number: params.Page, Size: params.Limit, }) @@ -96,7 +97,7 @@ func (svc *Service) DeleteScriptPolicy(ctx context.Context, params api.DeleteScr return err } - return svc.DB.ScriptPolicy().Delete(ctx, params.ScriptPolicyID) + return svc.Inner.DeleteScriptPolicy(ctx, params.ScriptPolicyID) } // GetScriptPolicy implements getScriptPolicy operation. @@ -105,7 +106,7 @@ func (svc *Service) DeleteScriptPolicy(ctx context.Context, params api.DeleteScr // // GET /script-policy/{ScriptPolicyID} func (svc *Service) GetScriptPolicy(ctx context.Context, params api.GetScriptPolicyParams) (*api.ScriptPolicy, error) { - policy, err := svc.DB.ScriptPolicy().Get(ctx, params.ScriptPolicyID) + policy, err := svc.Inner.GetScriptPolicy(ctx, params.ScriptPolicyID) if err != nil { return nil, err } @@ -129,19 +130,23 @@ func (svc *Service) UpdateScriptPolicy(ctx context.Context, req *api.ScriptPolic return err } - pmap := datastore.Optional() + from_script_hash, from_script_hash_ok := int64(0), false if from_script_id, ok := req.FromScriptID.Get(); ok { - from_script, err := svc.DB.Scripts().Get(ctx, from_script_id) + from_script, err := svc.Inner.GetScript(ctx, from_script_id) if err != nil { return err } - pmap.Add("from_script_hash", from_script.Hash) + from_script_hash, from_script_hash_ok = from_script.Hash, true } - if to_script_id, ok := req.ToScriptID.Get(); ok { - pmap.Add("to_script_id", to_script_id) - } - if policy, ok := req.Policy.Get(); ok { - pmap.Add("policy", policy) - } - return svc.DB.ScriptPolicy().Update(ctx, req.ID, pmap) + to_script_id, to_script_id_ok := req.ToScriptID.Get(); + policy, policy_ok := req.Policy.Get(); + + + filter := service_inner.MakeScriptPolicyFilter( + from_script_hash, from_script_hash_ok, + to_script_id, to_script_id_ok, + policy, policy_ok, + ) + + return svc.Inner.UpdateScriptPolicy(ctx, req.ID, filter) } diff --git a/pkg/service_inner/script_policy.go b/pkg/service_inner/script_policy.go new file mode 100644 index 0000000..35a4c80 --- /dev/null +++ b/pkg/service_inner/script_policy.go @@ -0,0 +1,48 @@ +package service_inner + +import ( + "context" + + "git.itzana.me/strafesnet/maps-service/pkg/datastore" + "git.itzana.me/strafesnet/maps-service/pkg/model" +) + +type ScriptPolicyFilter datastore.OptionalMap + +func MakeScriptPolicyFilter( + from_script_hash int64, from_script_hash_ok bool, + to_script_id int64, to_script_id_ok bool, + policy int32, policy_ok bool, +) ScriptPolicyFilter { + filter := datastore.Optional() + if from_script_hash_ok { + filter.Add("from_script_hash", from_script_hash) + } + if to_script_id_ok { + filter.Add("to_script_id", to_script_id) + } + if policy_ok { + filter.Add("policy", policy) + } + return ScriptPolicyFilter(filter) +} + +func (svc *Service) CreateScriptPolicy(ctx context.Context, script model.ScriptPolicy) (model.ScriptPolicy, error) { + return svc.DB.ScriptPolicy().Create(ctx, script) +} + +func (svc *Service) ListScriptPolicies(ctx context.Context, filter ScriptPolicyFilter, page model.Page) ([]model.ScriptPolicy, error) { + return svc.DB.ScriptPolicy().List(ctx, datastore.OptionalMap(filter), page) +} + +func (svc *Service) DeleteScriptPolicy(ctx context.Context, id int64) error { + return svc.DB.ScriptPolicy().Delete(ctx, id) +} + +func (svc *Service) GetScriptPolicy(ctx context.Context, id int64) (model.ScriptPolicy, error) { + return svc.DB.ScriptPolicy().Get(ctx, id) +} + +func (svc *Service) UpdateScriptPolicy(ctx context.Context, id int64, pmap ScriptPolicyFilter) error { + return svc.DB.ScriptPolicy().Update(ctx, id, datastore.OptionalMap(pmap)) +} diff --git a/pkg/service_internal/script_policy.go b/pkg/service_internal/script_policy.go index 3fd9b4e..c11bdd3 100644 --- a/pkg/service_internal/script_policy.go +++ b/pkg/service_internal/script_policy.go @@ -3,9 +3,9 @@ package service_internal import ( "context" - "git.itzana.me/strafesnet/maps-service/pkg/datastore" api "git.itzana.me/strafesnet/maps-service/pkg/internal" "git.itzana.me/strafesnet/maps-service/pkg/model" + "git.itzana.me/strafesnet/maps-service/pkg/service_inner" ) // CreateScriptPolicy implements createScriptPolicy operation. @@ -14,14 +14,14 @@ import ( // // POST /script-policy func (svc *Service) CreateScriptPolicy(ctx context.Context, req *api.ScriptPolicyCreate) (*api.ScriptPolicyID, error) { - from_script, err := svc.DB.Scripts().Get(ctx, req.FromScriptID) + from_script, err := svc.Inner.GetScript(ctx, req.FromScriptID) if err != nil { return nil, err } // the existence of ToScriptID does not need to be validated because it's checked by a foreign key constraint. - script, err := svc.DB.ScriptPolicy().Create(ctx, model.ScriptPolicy{ + script, err := svc.Inner.CreateScriptPolicy(ctx, model.ScriptPolicy{ ID: 0, FromScriptHash: from_script.Hash, ToScriptID: req.ToScriptID, @@ -42,23 +42,24 @@ func (svc *Service) CreateScriptPolicy(ctx context.Context, req *api.ScriptPolic // // GET /script-policy func (svc *Service) ListScriptPolicy(ctx context.Context, params api.ListScriptPolicyParams) ([]api.ScriptPolicy, error) { - filter := datastore.Optional() - - if params.FromScriptHash.IsSet(){ - hash, err := model.HashParse(params.FromScriptHash.Value) + from_script_hash, from_script_hash_ok := int64(0), false + if hash_hex, ok := params.FromScriptHash.Get(); ok{ + hash_parsed, err := model.HashParse(hash_hex) if err != nil { return nil, err } - filter.Add("from_script_hash", int64(hash)) // No type safety! - } - if params.ToScriptID.IsSet(){ - filter.Add("to_script_id", params.ToScriptID.Value) - } - if params.Policy.IsSet(){ - filter.Add("policy", params.Policy.Value) + from_script_hash, from_script_hash_ok = int64(hash_parsed), true } + to_script_id, to_script_id_ok := params.ToScriptID.Get() + policy, policy_ok := params.Policy.Get() - items, err := svc.DB.ScriptPolicy().List(ctx, filter, model.Page{ + filter := service_inner.MakeScriptPolicyFilter( + from_script_hash, from_script_hash_ok, + to_script_id, to_script_id_ok, + policy, policy_ok, + ) + + items, err := svc.Inner.ListScriptPolicies(ctx, filter, model.Page{ Number: params.Page, Size: params.Limit, }) -- 2.49.1 From faf013b8eab4b3d391a07df726b7b55ec0939bf1 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Tue, 15 Jul 2025 19:44:11 -0700 Subject: [PATCH 07/32] maps: create inner --- pkg/service_inner/maps.go | 124 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 pkg/service_inner/maps.go diff --git a/pkg/service_inner/maps.go b/pkg/service_inner/maps.go new file mode 100644 index 0000000..a56ef50 --- /dev/null +++ b/pkg/service_inner/maps.go @@ -0,0 +1,124 @@ +package service_inner + +import ( + "context" + "time" + + "git.itzana.me/strafesnet/go-grpc/maps" + "git.itzana.me/strafesnet/maps-service/pkg/model" +) + +type MapRequest maps.MapRequest + +func NewMapRequest( + id int64, + display_name string, display_name_ok bool, + creator string, creator_ok bool, + game_id int32, game_id_ok bool, + date int64, date_ok bool, +) *MapRequest { + item := MapRequest{ + ID: id, + } + if display_name_ok { + item.DisplayName = &display_name + } + if creator_ok { + item.Creator = &creator + } + if game_id_ok { + item.GameID = &game_id + } + if date_ok { + item.Date = &date + } + return &item +} + +type MapFilter maps.MapFilter + +func NewMapFilter( + display_name string, display_name_ok bool, + creator string, creator_ok bool, + game_id int32, game_id_ok bool, +) *MapFilter { + item := MapFilter{} + if display_name_ok { + item.DisplayName = &display_name + } + if creator_ok { + item.Creator = &creator + } + if game_id_ok { + item.GameID = &game_id + } + return &item +} + +func (svc *Service) CreateMap(ctx context.Context, item model.Map) (int64, error) { + date := item.Date.Unix() + id_message, err := svc.Maps.Create(ctx, &maps.MapRequest{ + ID: item.ID, + DisplayName: &item.DisplayName, + Creator: &item.Creator, + GameID: &item.GameID, + Date: &date, + }) + if err != nil { + return 0, err + } + + return id_message.ID, nil +} + +func (svc *Service) ListMaps(ctx context.Context, filter *MapFilter, page model.Page) ([]model.Map, error) { + page_request := maps.Pagination{ + Size: page.Size, + Number: page.Number, + } + request := maps.ListRequest{ + Filter: (*maps.MapFilter)(filter), + Page: &page_request, + } + + items, err := svc.Maps.List(ctx, &request) + if err != nil { + return nil, err + } + + resp := make([]model.Map, len(items.Maps)) + for i, item := range items.Maps { + resp[i].ID = item.ID + resp[i].DisplayName = item.DisplayName + resp[i].Creator = item.Creator + resp[i].GameID = item.GameID + resp[i].Date = time.Unix(item.Date, 0) + } + + return resp, nil +} + +func (svc *Service) DeleteMap(ctx context.Context, id int64) error { + _, err := svc.Maps.Delete(ctx, &maps.IdMessage{ID: id}) + return err +} + +func (svc *Service) GetMap(ctx context.Context, id int64) (*model.Map, error) { + item, err := svc.Maps.Get(ctx, &maps.IdMessage{ID: id}) + if err != nil { + return nil, err + } + + return &model.Map{ + ID: item.ID, + DisplayName: item.DisplayName, + Creator: item.Creator, + GameID: item.GameID, + Date: time.Unix(item.Date, 0), + }, nil +} + +func (svc *Service) UpdateMap(ctx context.Context, pmap *MapRequest) error { + _, err := svc.Maps.Update(ctx, (*maps.MapRequest)(pmap)) + return err +} -- 2.49.1 From e79b798dd896e61b28c91b5b7ac3aa17b8dc2111 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Tue, 15 Jul 2025 19:44:13 -0700 Subject: [PATCH 08/32] maps: use inner --- pkg/service/maps.go | 45 ++++++++++++++++++++------------------------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/pkg/service/maps.go b/pkg/service/maps.go index 9350424..aaff987 100644 --- a/pkg/service/maps.go +++ b/pkg/service/maps.go @@ -4,9 +4,10 @@ import ( "context" "strings" - "git.itzana.me/strafesnet/go-grpc/maps" "git.itzana.me/strafesnet/maps-service/pkg/api" + "git.itzana.me/strafesnet/maps-service/pkg/model" "git.itzana.me/strafesnet/maps-service/pkg/roblox" + "git.itzana.me/strafesnet/maps-service/pkg/service_inner" ) // ListMaps implements listMaps operation. @@ -15,37 +16,35 @@ import ( // // GET /maps func (svc *Service) ListMaps(ctx context.Context, params api.ListMapsParams) ([]api.Map, error) { - filter := maps.MapFilter{} + display_name, display_name_ok := params.DisplayName.Get() + creator, creator_ok := params.Creator.Get() + game_id, game_id_ok := params.GameID.Get() - if params.DisplayName.IsSet(){ - filter.DisplayName = ¶ms.DisplayName.Value - } - if params.Creator.IsSet(){ - filter.Creator = ¶ms.Creator.Value - } - if params.GameID.IsSet(){ - filter.GameID = ¶ms.GameID.Value - } + filter := service_inner.NewMapFilter( + display_name, display_name_ok, + creator, creator_ok, + game_id, game_id_ok, + ) - mapList, err := svc.Maps.List(ctx, &maps.ListRequest{ - Filter: &filter, - Page: &maps.Pagination{ + items, err := svc.Inner.ListMaps(ctx, + filter, + model.Page{ Size: params.Limit, Number: params.Page, }, - }) + ) if err != nil { return nil, err } var resp []api.Map - for _, item := range mapList.Maps { + for _, item := range items { resp = append(resp, api.Map{ ID: item.ID, DisplayName: item.DisplayName, Creator: item.Creator, GameID: item.GameID, - Date: item.Date, + Date: item.Date.Unix(), }) } @@ -58,9 +57,7 @@ func (svc *Service) ListMaps(ctx context.Context, params api.ListMapsParams) ([] // // GET /maps/{MapID} func (svc *Service) GetMap(ctx context.Context, params api.GetMapParams) (*api.Map, error) { - mapResponse, err := svc.Maps.Get(ctx, &maps.IdMessage{ - ID: params.MapID, - }) + mapResponse, err := svc.Inner.GetMap(ctx, params.MapID) if err != nil { return nil, err } @@ -70,7 +67,7 @@ func (svc *Service) GetMap(ctx context.Context, params api.GetMapParams) (*api.M DisplayName: mapResponse.DisplayName, Creator: mapResponse.Creator, GameID: mapResponse.GameID, - Date: mapResponse.Date, + Date: mapResponse.Date.Unix(), }, nil } @@ -96,14 +93,12 @@ func (svc *Service) GetMapAssetLocation(ctx context.Context, params api.GetMapAs // Ensure map exists in the db! // This could otherwise be used to access any asset - _, err = svc.Maps.Get(ctx, &maps.IdMessage{ - ID: params.MapID, - }) + _, err = svc.Inner.GetMap(ctx, params.MapID) if err != nil { return ok, err } - info, err := svc.Roblox.GetAssetLocation(roblox.GetAssetLatestRequest{ + info, err := svc.Inner.Roblox.GetAssetLocation(roblox.GetAssetLatestRequest{ AssetID: uint64(params.MapID), }) if err != nil{ -- 2.49.1 From 1d172924fe889eeaceb9acb4439b4f49aa450284 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Tue, 15 Jul 2025 20:01:50 -0700 Subject: [PATCH 09/32] operations: inner --- pkg/service/operations.go | 2 +- pkg/service_inner/operations.go | 41 ++++++++++++++++++++++++++++++ pkg/service_internal/operations.go | 11 ++++---- 3 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 pkg/service_inner/operations.go diff --git a/pkg/service/operations.go b/pkg/service/operations.go index 5a906f4..947166a 100644 --- a/pkg/service/operations.go +++ b/pkg/service/operations.go @@ -19,7 +19,7 @@ func (svc *Service) GetOperation(ctx context.Context, params api.GetOperationPar // You must be the operation owner to read it - operation, err := svc.DB.Operations().Get(ctx, params.OperationID) + operation, err := svc.Inner.GetOperation(ctx, params.OperationID) if err != nil { return nil, err } diff --git a/pkg/service_inner/operations.go b/pkg/service_inner/operations.go new file mode 100644 index 0000000..8ad6bc0 --- /dev/null +++ b/pkg/service_inner/operations.go @@ -0,0 +1,41 @@ +package service_inner + +import ( + "context" + "time" + + "git.itzana.me/strafesnet/maps-service/pkg/datastore" + "git.itzana.me/strafesnet/maps-service/pkg/model" +) + +type OperationFailParams datastore.OptionalMap + +func MakeOperationFailParams( + status_id model.OperationStatus, + status_message string, +) OperationFailParams { + filter := datastore.Optional() + filter.Add("status_id", status_id) + filter.Add("status_message", status_message) + return OperationFailParams(filter) +} + +func (svc *Service) CreateOperation(ctx context.Context, operation model.Operation) (model.Operation, error) { + return svc.DB.Operations().Create(ctx, operation) +} + +func (svc *Service) CountOperationsSince(ctx context.Context, owner int64, since time.Time) (int64, error) { + return svc.DB.Operations().CountSince(ctx, owner, since) +} + +func (svc *Service) DeleteOperation(ctx context.Context, id int32) error { + return svc.DB.Operations().Delete(ctx, id) +} + +func (svc *Service) GetOperation(ctx context.Context, id int32) (model.Operation, error) { + return svc.DB.Operations().Get(ctx, id) +} + +func (svc *Service) FailOperation(ctx context.Context, id int32, params OperationFailParams) error { + return svc.DB.Operations().Update(ctx, id, datastore.OptionalMap(params)) +} diff --git a/pkg/service_internal/operations.go b/pkg/service_internal/operations.go index 87ccccc..b5c59f6 100644 --- a/pkg/service_internal/operations.go +++ b/pkg/service_internal/operations.go @@ -3,9 +3,9 @@ package service_internal import ( "context" - "git.itzana.me/strafesnet/maps-service/pkg/datastore" internal "git.itzana.me/strafesnet/maps-service/pkg/internal" "git.itzana.me/strafesnet/maps-service/pkg/model" + "git.itzana.me/strafesnet/maps-service/pkg/service_inner" ) // ActionOperationFailed implements actionOperationFailed operation. @@ -14,8 +14,9 @@ import ( // // POST /operations/{OperationID}/status/operation-failed func (svc *Service) ActionOperationFailed(ctx context.Context, params internal.ActionOperationFailedParams) (error) { - pmap := datastore.Optional() - pmap.Add("status_id", model.OperationStatusFailed) - pmap.Add("status_message", params.StatusMessage) - return svc.DB.Operations().Update(ctx, params.OperationID, pmap) + fail_params := service_inner.MakeOperationFailParams( + model.OperationStatusFailed, + params.StatusMessage, + ) + return svc.Inner.FailOperation(ctx, params.OperationID, fail_params) } -- 2.49.1 From 7948879e0b0f58de7e8e76b9ecf0a74558f356ed Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Mon, 14 Jul 2025 21:26:23 -0700 Subject: [PATCH 10/32] wip: mapfixes --- pkg/service/mapfixes.go | 98 ++++++++++++++++++++++------------- pkg/service_inner/mapfixes.go | 68 ++++++++++++++++++++++++ 2 files changed, 129 insertions(+), 37 deletions(-) create mode 100644 pkg/service_inner/mapfixes.go diff --git a/pkg/service/mapfixes.go b/pkg/service/mapfixes.go index abf1426..0a7d822 100644 --- a/pkg/service/mapfixes.go +++ b/pkg/service/mapfixes.go @@ -8,10 +8,10 @@ import ( "io" "time" - "git.itzana.me/strafesnet/go-grpc/maps" "git.itzana.me/strafesnet/maps-service/pkg/api" "git.itzana.me/strafesnet/maps-service/pkg/datastore" "git.itzana.me/strafesnet/maps-service/pkg/model" + "git.itzana.me/strafesnet/maps-service/pkg/service_inner" ) var( @@ -61,10 +61,25 @@ func (svc *Service) CreateMapfix(ctx context.Context, request *api.MapfixTrigger // Check if user's mapfixes in the creation phase exceeds the limit { - filter := datastore.Optional() - filter.Add("submitter", int64(userId)) - filter.Add("status_id", CreationPhaseMapfixStatuses) - creation_mapfixes, err := svc.DB.Mapfixes().List(ctx, filter, model.Page{ + display_name, display_name_ok := "", false + creator, creator_ok := "", false + game_id, game_id_ok := int32(0), false + submitter, submitter_ok := int64(userId), true + asset_id, asset_id_ok := int64(0), false + target_asset_id, target_asset_id_ok := int64(0), false + status_id, status_id_ok := CreationPhaseMapfixStatuses, true + + filter := service_inner.MakeMapfixFilter( + display_name, display_name_ok, + creator, creator_ok, + game_id, game_id_ok, + asset_id, asset_id_ok, + submitter, submitter_ok, + target_asset_id, target_asset_id_ok, + status_id, status_id_ok, + ) + + creation_mapfixes, err := svc.Inner.ListMapfixes(ctx, filter, model.Page{ Number: 1, Size: int32(CreationPhaseMapfixesLimit), },datastore.ListSortDisabled) @@ -79,11 +94,28 @@ func (svc *Service) CreateMapfix(ctx context.Context, request *api.MapfixTrigger // Check if a mapfix targetting the same map exists in creation phase { - filter := datastore.Optional() - filter.Add("submitter", int64(userId)) - filter.Add("target_asset_id", request.TargetAssetID) - filter.Add("status_id", CreationPhaseMapfixStatuses) - active_mapfixes, err := svc.DB.Mapfixes().List(ctx, filter, model.Page{ + // set + submitter, submitter_ok := int64(userId), true + target_asset_id, target_asset_id_ok := request.TargetAssetID, false + status_id, status_id_ok := CreationPhaseMapfixStatuses, true + + // unset + display_name, display_name_ok := "", false + creator, creator_ok := "", false + game_id, game_id_ok := int32(0), false + asset_id, asset_id_ok := int64(0), false + + filter := service_inner.MakeMapfixFilter( + display_name, display_name_ok, + creator, creator_ok, + game_id, game_id_ok, + asset_id, asset_id_ok, + submitter, submitter_ok, + target_asset_id, target_asset_id_ok, + status_id, status_id_ok, + ) + + active_mapfixes, err := svc.Inner.ListMapfixes(ctx, filter, model.Page{ Number: 1, Size: 1, },datastore.ListSortDisabled) @@ -97,9 +129,7 @@ func (svc *Service) CreateMapfix(ctx context.Context, request *api.MapfixTrigger // Check if TargetAssetID actually exists { - _, err := svc.Maps.Get(ctx, &maps.IdMessage{ - ID: request.TargetAssetID, - }) + _, err := svc.Inner.GetMap(ctx, request.TargetAssetID) if err != nil { // TODO: match specific does not exist grpc error return nil, err @@ -108,7 +138,7 @@ func (svc *Service) CreateMapfix(ctx context.Context, request *api.MapfixTrigger // Check if too many operations have been created recently { - count, err := svc.DB.Operations().CountSince(ctx, + count, err := svc.Inner.CountOperationsSince(ctx, int64(userId), time.Now().Add(-CreateMapfixRecencyWindow), ) @@ -121,7 +151,7 @@ func (svc *Service) CreateMapfix(ctx context.Context, request *api.MapfixTrigger } } - operation, err := svc.DB.Operations().Create(ctx, model.Operation{ + operation, err := svc.Inner.CreateOperation(ctx, model.Operation{ Owner: userId, StatusID: model.OperationStatusCreated, }) @@ -184,29 +214,23 @@ func (svc *Service) GetMapfix(ctx context.Context, params api.GetMapfixParams) ( // // GET /mapfixes func (svc *Service) ListMapfixes(ctx context.Context, params api.ListMapfixesParams) (*api.Mapfixes, error) { - filter := datastore.Optional() + display_name, display_name_ok := params.DisplayName.Get() + creator, creator_ok := params.Creator.Get() + game_id, game_id_ok := params.GameID.Get() + submitter, submitter_ok := params.Submitter.Get() + asset_id, asset_id_ok := params.AssetID.Get() + target_asset_id, target_asset_id_ok := params.TargetAssetID.Get() + status_id, status_id_ok := params.StatusID.Get() - if params.DisplayName.IsSet(){ - filter.Add("display_name", params.DisplayName.Value) - } - if params.Creator.IsSet(){ - filter.Add("creator", params.Creator.Value) - } - if params.GameID.IsSet(){ - filter.Add("game_id", params.GameID.Value) - } - if params.Submitter.IsSet(){ - filter.Add("submitter", params.Submitter.Value) - } - if params.AssetID.IsSet(){ - filter.Add("asset_id", params.AssetID.Value) - } - if params.TargetAssetID.IsSet(){ - filter.Add("target_asset_id", params.TargetAssetID.Value) - } - if params.StatusID.IsSet(){ - filter.Add("status_id", params.StatusID.Value) - } + filter := service_inner.MakeMapfixFilter( + display_name, display_name_ok, + creator, creator_ok, + game_id, game_id_ok, + submitter, submitter_ok, + asset_id, asset_id_ok, + target_asset_id, target_asset_id_ok, + status_id, status_id_ok, + ) sort := datastore.ListSort(params.Sort.Or(int32(datastore.ListSortDisabled))) diff --git a/pkg/service_inner/mapfixes.go b/pkg/service_inner/mapfixes.go new file mode 100644 index 0000000..e44dbdc --- /dev/null +++ b/pkg/service_inner/mapfixes.go @@ -0,0 +1,68 @@ +package service_inner + +import ( + "context" + + "git.itzana.me/strafesnet/maps-service/pkg/datastore" + "git.itzana.me/strafesnet/maps-service/pkg/model" +) + +type MapfixFilter datastore.OptionalMap + +func MakeMapfixFilter( + display_name string, display_name_ok bool, + creator string, creator_ok bool, + game_id int32, game_id_ok bool, + submitter int64, submitter_ok bool, + asset_id int64, asset_id_ok bool, + target_asset_id int64, target_asset_id_ok bool, + status_id []model.MapfixStatus, status_id_ok bool, +) MapfixFilter { + filter := datastore.Optional() + if display_name_ok { + filter.Add("display_name", display_name) + } + if creator_ok { + filter.Add("creator", creator) + } + if game_id_ok { + filter.Add("game_id", game_id) + } + if submitter_ok { + filter.Add("submitter", submitter) + } + if asset_id_ok { + filter.Add("asset_id", asset_id) + } + if target_asset_id_ok { + filter.Add("target_asset_id", target_asset_id) + } + if status_id_ok { + filter.Add("status_id", status_id) + } + return MapfixFilter(filter) +} + +func (svc *Service) CreateMapfix(ctx context.Context, script model.Mapfix) (model.Mapfix, error) { + return svc.DB.Mapfixes().Create(ctx, script) +} + +func (svc *Service) ListMapfixes(ctx context.Context, filter MapfixFilter, page model.Page, sort datastore.ListSort) ([]model.Mapfix, error) { + return svc.DB.Mapfixes().List(ctx, datastore.OptionalMap(filter), page, sort) +} + +func (svc *Service) ListMapfixesWithTotal(ctx context.Context, filter MapfixFilter, page model.Page, sort datastore.ListSort) (int64, []model.Mapfix, error) { + return svc.DB.Mapfixes().ListWithTotal(ctx, datastore.OptionalMap(filter), page, sort) +} + +func (svc *Service) DeleteMapfix(ctx context.Context, id int64) error { + return svc.DB.Mapfixes().Delete(ctx, id) +} + +func (svc *Service) GetMapfix(ctx context.Context, id int64) (model.Mapfix, error) { + return svc.DB.Mapfixes().Get(ctx, id) +} + +func (svc *Service) UpdateMapfix(ctx context.Context, id int64, pmap MapfixFilter) error { + return svc.DB.Mapfixes().Update(ctx, id, datastore.OptionalMap(pmap)) +} -- 2.49.1 From 247bda4a02393de028e188c173555b8e6a69232b Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Tue, 15 Jul 2025 20:23:36 -0700 Subject: [PATCH 11/32] make inner service fields private --- pkg/cmds/serve.go | 16 ++++++++-------- pkg/service_inner/audit_events.go | 16 ++++++++-------- pkg/service_inner/mapfixes.go | 12 ++++++------ pkg/service_inner/maps.go | 10 +++++----- pkg/service_inner/operations.go | 10 +++++----- pkg/service_inner/script_policy.go | 10 +++++----- pkg/service_inner/scripts.go | 10 +++++----- pkg/service_inner/service.go | 26 +++++++++++++++++++++----- 8 files changed, 63 insertions(+), 47 deletions(-) diff --git a/pkg/cmds/serve.go b/pkg/cmds/serve.go index 6613129..b4c32eb 100644 --- a/pkg/cmds/serve.go +++ b/pkg/cmds/serve.go @@ -131,19 +131,19 @@ func serve(ctx *cli.Context) error { if err != nil { log.Fatal(err) } - svc_inner := &service_inner.Service{ - DB: db, - Nats: js, - Maps: maps.NewMapsServiceClient(conn), - Users: users.NewUsersServiceClient(conn), - Roblox: roblox.Client{ + svc_inner := service_inner.MakeService( + db, + js, + maps.NewMapsServiceClient(conn), + users.NewUsersServiceClient(conn), + roblox.Client{ HttpClient: http.DefaultClient, ApiKey: ctx.String("rbx-api-key"), }, - } + ) svc_external := &service.Service{ - Inner: svc_inner, + Inner: &svc_inner, } conn, err = grpc.Dial(ctx.String("auth-rpc-host"), grpc.WithTransportCredentials(insecure.NewCredentials())) diff --git a/pkg/service_inner/audit_events.go b/pkg/service_inner/audit_events.go index 7ab6d0e..aae7f47 100644 --- a/pkg/service_inner/audit_events.go +++ b/pkg/service_inner/audit_events.go @@ -16,7 +16,7 @@ func (svc *Service) ListAuditEvents(ctx context.Context, resource model.Resource filter.Add("resource_type", resource.Type) filter.Add("resource_id", resource.ID) - items, err := svc.DB.AuditEvents().List(ctx, filter, page) + items, err := svc.db.AuditEvents().List(ctx, filter, page) if err != nil { return nil, err } @@ -32,7 +32,7 @@ func (svc *Service) ListAuditEvents(ctx context.Context, resource model.Resource idList.ID = append(idList.ID, userId) } - userList, err := svc.Users.GetList(ctx, &idList) + userList, err := svc.users.GetList(ctx, &idList) if err != nil { return nil, err } @@ -74,7 +74,7 @@ func (svc *Service) CreateAuditEventAction(ctx context.Context, userId uint64, r return err } - _, err = svc.DB.AuditEvents().Create(ctx, model.AuditEvent{ + _, err = svc.db.AuditEvents().Create(ctx, model.AuditEvent{ ID: 0, User: userId, ResourceType: resource.Type, @@ -95,7 +95,7 @@ func (svc *Service) CreateAuditEventComment(ctx context.Context, userId uint64, return err } - _, err = svc.DB.AuditEvents().Create(ctx, model.AuditEvent{ + _, err = svc.db.AuditEvents().Create(ctx, model.AuditEvent{ ID: 0, User: userId, ResourceType: resource.Type, @@ -116,7 +116,7 @@ func (svc *Service) CreateAuditEventChangeModel(ctx context.Context, userId uint return err } - _, err = svc.DB.AuditEvents().Create(ctx, model.AuditEvent{ + _, err = svc.db.AuditEvents().Create(ctx, model.AuditEvent{ ID: 0, User: userId, ResourceType: resource.Type, @@ -138,7 +138,7 @@ func (svc *Service) CreateAuditEventChangeValidatedModel(ctx context.Context, us return err } - _, err = svc.DB.AuditEvents().Create(ctx, model.AuditEvent{ + _, err = svc.db.AuditEvents().Create(ctx, model.AuditEvent{ ID: 0, User: userId, ResourceType: resource.Type, @@ -159,7 +159,7 @@ func (svc *Service) CreateAuditEventError(ctx context.Context, userId uint64, re return err } - _, err = svc.DB.AuditEvents().Create(ctx, model.AuditEvent{ + _, err = svc.db.AuditEvents().Create(ctx, model.AuditEvent{ ID: 0, User: userId, ResourceType: resource.Type, @@ -180,7 +180,7 @@ func (svc *Service) CreateAuditEventCheckList(ctx context.Context, userId uint64 return err } - _, err = svc.DB.AuditEvents().Create(ctx, model.AuditEvent{ + _, err = svc.db.AuditEvents().Create(ctx, model.AuditEvent{ ID: 0, User: userId, ResourceType: resource.Type, diff --git a/pkg/service_inner/mapfixes.go b/pkg/service_inner/mapfixes.go index e44dbdc..bfcf79a 100644 --- a/pkg/service_inner/mapfixes.go +++ b/pkg/service_inner/mapfixes.go @@ -44,25 +44,25 @@ func MakeMapfixFilter( } func (svc *Service) CreateMapfix(ctx context.Context, script model.Mapfix) (model.Mapfix, error) { - return svc.DB.Mapfixes().Create(ctx, script) + return svc.db.Mapfixes().Create(ctx, script) } func (svc *Service) ListMapfixes(ctx context.Context, filter MapfixFilter, page model.Page, sort datastore.ListSort) ([]model.Mapfix, error) { - return svc.DB.Mapfixes().List(ctx, datastore.OptionalMap(filter), page, sort) + return svc.db.Mapfixes().List(ctx, datastore.OptionalMap(filter), page, sort) } func (svc *Service) ListMapfixesWithTotal(ctx context.Context, filter MapfixFilter, page model.Page, sort datastore.ListSort) (int64, []model.Mapfix, error) { - return svc.DB.Mapfixes().ListWithTotal(ctx, datastore.OptionalMap(filter), page, sort) + return svc.db.Mapfixes().ListWithTotal(ctx, datastore.OptionalMap(filter), page, sort) } func (svc *Service) DeleteMapfix(ctx context.Context, id int64) error { - return svc.DB.Mapfixes().Delete(ctx, id) + return svc.db.Mapfixes().Delete(ctx, id) } func (svc *Service) GetMapfix(ctx context.Context, id int64) (model.Mapfix, error) { - return svc.DB.Mapfixes().Get(ctx, id) + return svc.db.Mapfixes().Get(ctx, id) } func (svc *Service) UpdateMapfix(ctx context.Context, id int64, pmap MapfixFilter) error { - return svc.DB.Mapfixes().Update(ctx, id, datastore.OptionalMap(pmap)) + return svc.db.Mapfixes().Update(ctx, id, datastore.OptionalMap(pmap)) } diff --git a/pkg/service_inner/maps.go b/pkg/service_inner/maps.go index a56ef50..0b34804 100644 --- a/pkg/service_inner/maps.go +++ b/pkg/service_inner/maps.go @@ -57,7 +57,7 @@ func NewMapFilter( func (svc *Service) CreateMap(ctx context.Context, item model.Map) (int64, error) { date := item.Date.Unix() - id_message, err := svc.Maps.Create(ctx, &maps.MapRequest{ + id_message, err := svc.maps.Create(ctx, &maps.MapRequest{ ID: item.ID, DisplayName: &item.DisplayName, Creator: &item.Creator, @@ -81,7 +81,7 @@ func (svc *Service) ListMaps(ctx context.Context, filter *MapFilter, page model. Page: &page_request, } - items, err := svc.Maps.List(ctx, &request) + items, err := svc.maps.List(ctx, &request) if err != nil { return nil, err } @@ -99,12 +99,12 @@ func (svc *Service) ListMaps(ctx context.Context, filter *MapFilter, page model. } func (svc *Service) DeleteMap(ctx context.Context, id int64) error { - _, err := svc.Maps.Delete(ctx, &maps.IdMessage{ID: id}) + _, err := svc.maps.Delete(ctx, &maps.IdMessage{ID: id}) return err } func (svc *Service) GetMap(ctx context.Context, id int64) (*model.Map, error) { - item, err := svc.Maps.Get(ctx, &maps.IdMessage{ID: id}) + item, err := svc.maps.Get(ctx, &maps.IdMessage{ID: id}) if err != nil { return nil, err } @@ -119,6 +119,6 @@ func (svc *Service) GetMap(ctx context.Context, id int64) (*model.Map, error) { } func (svc *Service) UpdateMap(ctx context.Context, pmap *MapRequest) error { - _, err := svc.Maps.Update(ctx, (*maps.MapRequest)(pmap)) + _, err := svc.maps.Update(ctx, (*maps.MapRequest)(pmap)) return err } diff --git a/pkg/service_inner/operations.go b/pkg/service_inner/operations.go index 8ad6bc0..d9be5d5 100644 --- a/pkg/service_inner/operations.go +++ b/pkg/service_inner/operations.go @@ -21,21 +21,21 @@ func MakeOperationFailParams( } func (svc *Service) CreateOperation(ctx context.Context, operation model.Operation) (model.Operation, error) { - return svc.DB.Operations().Create(ctx, operation) + return svc.db.Operations().Create(ctx, operation) } func (svc *Service) CountOperationsSince(ctx context.Context, owner int64, since time.Time) (int64, error) { - return svc.DB.Operations().CountSince(ctx, owner, since) + return svc.db.Operations().CountSince(ctx, owner, since) } func (svc *Service) DeleteOperation(ctx context.Context, id int32) error { - return svc.DB.Operations().Delete(ctx, id) + return svc.db.Operations().Delete(ctx, id) } func (svc *Service) GetOperation(ctx context.Context, id int32) (model.Operation, error) { - return svc.DB.Operations().Get(ctx, id) + return svc.db.Operations().Get(ctx, id) } func (svc *Service) FailOperation(ctx context.Context, id int32, params OperationFailParams) error { - return svc.DB.Operations().Update(ctx, id, datastore.OptionalMap(params)) + return svc.db.Operations().Update(ctx, id, datastore.OptionalMap(params)) } diff --git a/pkg/service_inner/script_policy.go b/pkg/service_inner/script_policy.go index 35a4c80..d735ee9 100644 --- a/pkg/service_inner/script_policy.go +++ b/pkg/service_inner/script_policy.go @@ -28,21 +28,21 @@ func MakeScriptPolicyFilter( } func (svc *Service) CreateScriptPolicy(ctx context.Context, script model.ScriptPolicy) (model.ScriptPolicy, error) { - return svc.DB.ScriptPolicy().Create(ctx, script) + return svc.db.ScriptPolicy().Create(ctx, script) } func (svc *Service) ListScriptPolicies(ctx context.Context, filter ScriptPolicyFilter, page model.Page) ([]model.ScriptPolicy, error) { - return svc.DB.ScriptPolicy().List(ctx, datastore.OptionalMap(filter), page) + return svc.db.ScriptPolicy().List(ctx, datastore.OptionalMap(filter), page) } func (svc *Service) DeleteScriptPolicy(ctx context.Context, id int64) error { - return svc.DB.ScriptPolicy().Delete(ctx, id) + return svc.db.ScriptPolicy().Delete(ctx, id) } func (svc *Service) GetScriptPolicy(ctx context.Context, id int64) (model.ScriptPolicy, error) { - return svc.DB.ScriptPolicy().Get(ctx, id) + return svc.db.ScriptPolicy().Get(ctx, id) } func (svc *Service) UpdateScriptPolicy(ctx context.Context, id int64, pmap ScriptPolicyFilter) error { - return svc.DB.ScriptPolicy().Update(ctx, id, datastore.OptionalMap(pmap)) + return svc.db.ScriptPolicy().Update(ctx, id, datastore.OptionalMap(pmap)) } diff --git a/pkg/service_inner/scripts.go b/pkg/service_inner/scripts.go index 81e37d5..0aa70b8 100644 --- a/pkg/service_inner/scripts.go +++ b/pkg/service_inner/scripts.go @@ -36,21 +36,21 @@ func MakeScriptFilter( } func (svc *Service) CreateScript(ctx context.Context, script model.Script) (model.Script, error) { - return svc.DB.Scripts().Create(ctx, script) + return svc.db.Scripts().Create(ctx, script) } func (svc *Service) ListScripts(ctx context.Context, filter ScriptFilter, page model.Page) ([]model.Script, error) { - return svc.DB.Scripts().List(ctx, datastore.OptionalMap(filter), page) + return svc.db.Scripts().List(ctx, datastore.OptionalMap(filter), page) } func (svc *Service) DeleteScript(ctx context.Context, id int64) error { - return svc.DB.Scripts().Delete(ctx, id) + return svc.db.Scripts().Delete(ctx, id) } func (svc *Service) GetScript(ctx context.Context, id int64) (model.Script, error) { - return svc.DB.Scripts().Get(ctx, id) + return svc.db.Scripts().Get(ctx, id) } func (svc *Service) UpdateScript(ctx context.Context, id int64, pmap ScriptFilter) error { - return svc.DB.Scripts().Update(ctx, id, datastore.OptionalMap(pmap)) + return svc.db.Scripts().Update(ctx, id, datastore.OptionalMap(pmap)) } diff --git a/pkg/service_inner/service.go b/pkg/service_inner/service.go index e3062aa..cd73181 100644 --- a/pkg/service_inner/service.go +++ b/pkg/service_inner/service.go @@ -9,9 +9,25 @@ import ( ) type Service struct { - DB datastore.Datastore - Nats nats.JetStreamContext - Maps maps.MapsServiceClient - Users users.UsersServiceClient - Roblox roblox.Client + db datastore.Datastore + nats nats.JetStreamContext + maps maps.MapsServiceClient + users users.UsersServiceClient + roblox roblox.Client +} + +func MakeService( + db datastore.Datastore, + nats nats.JetStreamContext, + maps maps.MapsServiceClient, + users users.UsersServiceClient, + roblox roblox.Client, +) Service { + return Service{ + db: db, + nats: nats, + maps: maps, + users: users, + roblox: roblox, + } } -- 2.49.1 From 5096bc962d6711012d2fde6011d0e35341c90336 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Tue, 15 Jul 2025 20:28:57 -0700 Subject: [PATCH 12/32] make external service fields private --- pkg/cmds/serve.go | 6 ++---- pkg/service/mapfixes.go | 40 ++++++++++++++++++------------------ pkg/service/maps.go | 8 ++++---- pkg/service/operations.go | 2 +- pkg/service/script_policy.go | 14 ++++++------- pkg/service/scripts.go | 10 ++++----- pkg/service/service.go | 10 ++++++++- pkg/service/submissions.go | 28 ++++++++++++------------- 8 files changed, 62 insertions(+), 56 deletions(-) diff --git a/pkg/cmds/serve.go b/pkg/cmds/serve.go index b4c32eb..3038ee0 100644 --- a/pkg/cmds/serve.go +++ b/pkg/cmds/serve.go @@ -142,9 +142,7 @@ func serve(ctx *cli.Context) error { }, ) - svc_external := &service.Service{ - Inner: &svc_inner, - } + svc_external := service.MakeService(&svc_inner) conn, err = grpc.Dial(ctx.String("auth-rpc-host"), grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { @@ -154,7 +152,7 @@ func serve(ctx *cli.Context) error { Client: auth.NewAuthServiceClient(conn), } - srv_external, err := api.NewServer(svc_external, sec, api.WithPathPrefix("/v1")) + srv_external, err := api.NewServer(&svc_external, sec, api.WithPathPrefix("/v1")) if err != nil { log.WithError(err).Fatal("failed to initialize api server") } diff --git a/pkg/service/mapfixes.go b/pkg/service/mapfixes.go index 0a7d822..82b107e 100644 --- a/pkg/service/mapfixes.go +++ b/pkg/service/mapfixes.go @@ -79,7 +79,7 @@ func (svc *Service) CreateMapfix(ctx context.Context, request *api.MapfixTrigger status_id, status_id_ok, ) - creation_mapfixes, err := svc.Inner.ListMapfixes(ctx, filter, model.Page{ + creation_mapfixes, err := svc.inner.ListMapfixes(ctx, filter, model.Page{ Number: 1, Size: int32(CreationPhaseMapfixesLimit), },datastore.ListSortDisabled) @@ -115,7 +115,7 @@ func (svc *Service) CreateMapfix(ctx context.Context, request *api.MapfixTrigger status_id, status_id_ok, ) - active_mapfixes, err := svc.Inner.ListMapfixes(ctx, filter, model.Page{ + active_mapfixes, err := svc.inner.ListMapfixes(ctx, filter, model.Page{ Number: 1, Size: 1, },datastore.ListSortDisabled) @@ -129,7 +129,7 @@ func (svc *Service) CreateMapfix(ctx context.Context, request *api.MapfixTrigger // Check if TargetAssetID actually exists { - _, err := svc.Inner.GetMap(ctx, request.TargetAssetID) + _, err := svc.inner.GetMap(ctx, request.TargetAssetID) if err != nil { // TODO: match specific does not exist grpc error return nil, err @@ -138,7 +138,7 @@ func (svc *Service) CreateMapfix(ctx context.Context, request *api.MapfixTrigger // Check if too many operations have been created recently { - count, err := svc.Inner.CountOperationsSince(ctx, + count, err := svc.inner.CountOperationsSince(ctx, int64(userId), time.Now().Add(-CreateMapfixRecencyWindow), ) @@ -151,7 +151,7 @@ func (svc *Service) CreateMapfix(ctx context.Context, request *api.MapfixTrigger } } - operation, err := svc.Inner.CreateOperation(ctx, model.Operation{ + operation, err := svc.inner.CreateOperation(ctx, model.Operation{ Owner: userId, StatusID: model.OperationStatusCreated, }) @@ -171,7 +171,7 @@ func (svc *Service) CreateMapfix(ctx context.Context, request *api.MapfixTrigger return nil, err } - _, err = svc.Nats.Publish("maptest.mapfixes.create", []byte(j)) + _, err = svc.inner.Nats.Publish("maptest.mapfixes.create", []byte(j)) if err != nil { return nil, err } @@ -341,7 +341,7 @@ func (svc *Service) UpdateMapfixModel(ctx context.Context, params api.UpdateMapf NewModelVersion: NewModelVersion, } - return svc.Inner.CreateAuditEventChangeModel( + return svc.inner.CreateAuditEventChangeModel( ctx, userId, model.Resource{ @@ -390,7 +390,7 @@ func (svc *Service) ActionMapfixReject(ctx context.Context, params api.ActionMap TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -439,7 +439,7 @@ func (svc *Service) ActionMapfixRequestChanges(ctx context.Context, params api.A TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -491,7 +491,7 @@ func (svc *Service) ActionMapfixRevoke(ctx context.Context, params api.ActionMap TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -559,7 +559,7 @@ func (svc *Service) ActionMapfixTriggerSubmit(ctx context.Context, params api.Ac TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -636,7 +636,7 @@ func (svc *Service) ActionMapfixTriggerSubmitUnchecked(ctx context.Context, para TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -692,7 +692,7 @@ func (svc *Service) ActionMapfixResetSubmitting(ctx context.Context, params api. TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -759,7 +759,7 @@ func (svc *Service) ActionMapfixTriggerUpload(ctx context.Context, params api.Ac TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -818,7 +818,7 @@ func (svc *Service) ActionMapfixValidated(ctx context.Context, params api.Action TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -918,7 +918,7 @@ func (svc *Service) ActionMapfixTriggerValidate(ctx context.Context, params api. TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -989,7 +989,7 @@ func (svc *Service) ActionMapfixRetryValidate(ctx context.Context, params api.Ac TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -1048,7 +1048,7 @@ func (svc *Service) ActionMapfixAccepted(ctx context.Context, params api.ActionM TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -1101,7 +1101,7 @@ func (svc *Service) CreateMapfixAuditComment(ctx context.Context, req api.Create Comment: string(data), } - return svc.Inner.CreateAuditEventComment( + return svc.inner.CreateAuditEventComment( ctx, userId, model.Resource{ @@ -1118,7 +1118,7 @@ func (svc *Service) CreateMapfixAuditComment(ctx context.Context, req api.Create // // GET /mapfixes/{MapfixID}/audit-events func (svc *Service) ListMapfixAuditEvents(ctx context.Context, params api.ListMapfixAuditEventsParams) ([]api.AuditEvent, error) { - return svc.Inner.ListAuditEvents( + return svc.inner.ListAuditEvents( ctx, model.Resource{ ID: params.MapfixID, diff --git a/pkg/service/maps.go b/pkg/service/maps.go index aaff987..47d259c 100644 --- a/pkg/service/maps.go +++ b/pkg/service/maps.go @@ -26,7 +26,7 @@ func (svc *Service) ListMaps(ctx context.Context, params api.ListMapsParams) ([] game_id, game_id_ok, ) - items, err := svc.Inner.ListMaps(ctx, + items, err := svc.inner.ListMaps(ctx, filter, model.Page{ Size: params.Limit, @@ -57,7 +57,7 @@ func (svc *Service) ListMaps(ctx context.Context, params api.ListMapsParams) ([] // // GET /maps/{MapID} func (svc *Service) GetMap(ctx context.Context, params api.GetMapParams) (*api.Map, error) { - mapResponse, err := svc.Inner.GetMap(ctx, params.MapID) + mapResponse, err := svc.inner.GetMap(ctx, params.MapID) if err != nil { return nil, err } @@ -93,12 +93,12 @@ func (svc *Service) GetMapAssetLocation(ctx context.Context, params api.GetMapAs // Ensure map exists in the db! // This could otherwise be used to access any asset - _, err = svc.Inner.GetMap(ctx, params.MapID) + _, err = svc.inner.GetMap(ctx, params.MapID) if err != nil { return ok, err } - info, err := svc.Inner.Roblox.GetAssetLocation(roblox.GetAssetLatestRequest{ + info, err := svc.inner.Roblox.GetAssetLocation(roblox.GetAssetLatestRequest{ AssetID: uint64(params.MapID), }) if err != nil{ diff --git a/pkg/service/operations.go b/pkg/service/operations.go index 947166a..881858b 100644 --- a/pkg/service/operations.go +++ b/pkg/service/operations.go @@ -19,7 +19,7 @@ func (svc *Service) GetOperation(ctx context.Context, params api.GetOperationPar // You must be the operation owner to read it - operation, err := svc.Inner.GetOperation(ctx, params.OperationID) + operation, err := svc.inner.GetOperation(ctx, params.OperationID) if err != nil { return nil, err } diff --git a/pkg/service/script_policy.go b/pkg/service/script_policy.go index 6e89f2c..25cb0ff 100644 --- a/pkg/service/script_policy.go +++ b/pkg/service/script_policy.go @@ -19,14 +19,14 @@ func (svc *Service) CreateScriptPolicy(ctx context.Context, req *api.ScriptPolic return nil, err } - from_script, err := svc.Inner.GetScript(ctx, req.FromScriptID) + from_script, err := svc.inner.GetScript(ctx, req.FromScriptID) if err != nil { return nil, err } // the existence of ToScriptID does not need to be validated because it's checked by a foreign key constraint. - script, err := svc.Inner.CreateScriptPolicy(ctx, model.ScriptPolicy{ + script, err := svc.inner.CreateScriptPolicy(ctx, model.ScriptPolicy{ ID: 0, FromScriptHash: from_script.Hash, ToScriptID: req.ToScriptID, @@ -65,7 +65,7 @@ func (svc *Service) ListScriptPolicy(ctx context.Context, params api.ListScriptP policy, policy_ok, ) - items, err := svc.Inner.ListScriptPolicies(ctx, filter, model.Page{ + items, err := svc.inner.ListScriptPolicies(ctx, filter, model.Page{ Number: params.Page, Size: params.Limit, }) @@ -97,7 +97,7 @@ func (svc *Service) DeleteScriptPolicy(ctx context.Context, params api.DeleteScr return err } - return svc.Inner.DeleteScriptPolicy(ctx, params.ScriptPolicyID) + return svc.inner.DeleteScriptPolicy(ctx, params.ScriptPolicyID) } // GetScriptPolicy implements getScriptPolicy operation. @@ -106,7 +106,7 @@ func (svc *Service) DeleteScriptPolicy(ctx context.Context, params api.DeleteScr // // GET /script-policy/{ScriptPolicyID} func (svc *Service) GetScriptPolicy(ctx context.Context, params api.GetScriptPolicyParams) (*api.ScriptPolicy, error) { - policy, err := svc.Inner.GetScriptPolicy(ctx, params.ScriptPolicyID) + policy, err := svc.inner.GetScriptPolicy(ctx, params.ScriptPolicyID) if err != nil { return nil, err } @@ -132,7 +132,7 @@ func (svc *Service) UpdateScriptPolicy(ctx context.Context, req *api.ScriptPolic from_script_hash, from_script_hash_ok := int64(0), false if from_script_id, ok := req.FromScriptID.Get(); ok { - from_script, err := svc.Inner.GetScript(ctx, from_script_id) + from_script, err := svc.inner.GetScript(ctx, from_script_id) if err != nil { return err } @@ -148,5 +148,5 @@ func (svc *Service) UpdateScriptPolicy(ctx context.Context, req *api.ScriptPolic policy, policy_ok, ) - return svc.Inner.UpdateScriptPolicy(ctx, req.ID, filter) + return svc.inner.UpdateScriptPolicy(ctx, req.ID, filter) } diff --git a/pkg/service/scripts.go b/pkg/service/scripts.go index 7f8e80a..766dd1e 100644 --- a/pkg/service/scripts.go +++ b/pkg/service/scripts.go @@ -36,7 +36,7 @@ func (svc *Service) CreateScript(ctx context.Context, req *api.ScriptCreate) (*a return nil, err } - script, err := svc.Inner.CreateScript(ctx, model.Script{ + script, err := svc.inner.CreateScript(ctx, model.Script{ ID: 0, Name: req.Name, Hash: int64(model.HashSource(req.Source)), @@ -80,7 +80,7 @@ func (svc *Service) ListScripts(ctx context.Context, params api.ListScriptsParam resource_id, resource_id_ok, ) - items, err := svc.Inner.ListScripts(ctx, filter, model.Page{ + items, err := svc.inner.ListScripts(ctx, filter, model.Page{ Number: params.Page, Size: params.Limit, }) @@ -114,7 +114,7 @@ func (svc *Service) DeleteScript(ctx context.Context, params api.DeleteScriptPar return err } - return svc.Inner.DeleteScript(ctx, params.ScriptID) + return svc.inner.DeleteScript(ctx, params.ScriptID) } // GetScript implements getScript operation. @@ -123,7 +123,7 @@ func (svc *Service) DeleteScript(ctx context.Context, params api.DeleteScriptPar // // GET /scripts/{ScriptID} func (svc *Service) GetScript(ctx context.Context, params api.GetScriptParams) (*api.Script, error) { - script, err := svc.Inner.GetScript(ctx, params.ScriptID) + script, err := svc.inner.GetScript(ctx, params.ScriptID) if err != nil { return nil, err } @@ -165,5 +165,5 @@ func (svc *Service) UpdateScript(ctx context.Context, req *api.ScriptUpdate, par resource_type, resource_type_ok, resource_id, resource_id_ok, ) - return svc.Inner.UpdateScript(ctx, req.ID, filter) + return svc.inner.UpdateScript(ctx, req.ID, filter) } diff --git a/pkg/service/service.go b/pkg/service/service.go index e2faf9d..035695f 100644 --- a/pkg/service/service.go +++ b/pkg/service/service.go @@ -29,7 +29,15 @@ var ( ) type Service struct { - Inner *service_inner.Service + inner *service_inner.Service +} + +func MakeService( + inner *service_inner.Service, +) Service { + return Service{ + inner: inner, + } } // NewError creates *ErrorStatusCode from error returned by handler. diff --git a/pkg/service/submissions.go b/pkg/service/submissions.go index b4b26e2..493041c 100644 --- a/pkg/service/submissions.go +++ b/pkg/service/submissions.go @@ -366,7 +366,7 @@ func (svc *Service) UpdateSubmissionModel(ctx context.Context, params api.Update NewModelVersion: NewModelVersion, } - return svc.Inner.CreateAuditEventChangeModel( + return svc.inner.CreateAuditEventChangeModel( ctx, userId, model.Resource{ @@ -415,7 +415,7 @@ func (svc *Service) ActionSubmissionReject(ctx context.Context, params api.Actio TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -464,7 +464,7 @@ func (svc *Service) ActionSubmissionRequestChanges(ctx context.Context, params a TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -516,7 +516,7 @@ func (svc *Service) ActionSubmissionRevoke(ctx context.Context, params api.Actio TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -592,7 +592,7 @@ func (svc *Service) ActionSubmissionTriggerSubmit(ctx context.Context, params ap TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -669,7 +669,7 @@ func (svc *Service) ActionSubmissionTriggerSubmitUnchecked(ctx context.Context, TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -725,7 +725,7 @@ func (svc *Service) ActionSubmissionResetSubmitting(ctx context.Context, params TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -799,7 +799,7 @@ func (svc *Service) ActionSubmissionTriggerUpload(ctx context.Context, params ap TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -858,7 +858,7 @@ func (svc *Service) ActionSubmissionValidated(ctx context.Context, params api.Ac TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -941,7 +941,7 @@ func (svc *Service) ActionSubmissionTriggerValidate(ctx context.Context, params TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -1012,7 +1012,7 @@ func (svc *Service) ActionSubmissionRetryValidate(ctx context.Context, params ap TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -1071,7 +1071,7 @@ func (svc *Service) ActionSubmissionAccepted(ctx context.Context, params api.Act TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, userId, model.Resource{ @@ -1192,7 +1192,7 @@ func (svc *Service) CreateSubmissionAuditComment(ctx context.Context, req api.Cr Comment: string(data), } - return svc.Inner.CreateAuditEventComment( + return svc.inner.CreateAuditEventComment( ctx, userId, model.Resource{ @@ -1209,7 +1209,7 @@ func (svc *Service) CreateSubmissionAuditComment(ctx context.Context, req api.Cr // // GET /submissions/{SubmissionID}/audit-events func (svc *Service) ListSubmissionAuditEvents(ctx context.Context, params api.ListSubmissionAuditEventsParams) ([]api.AuditEvent, error) { - return svc.Inner.ListAuditEvents( + return svc.inner.ListAuditEvents( ctx, model.Resource{ ID: params.SubmissionID, -- 2.49.1 From fbb936c07b9f36af26c31539f81657aecf4a087b Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Tue, 15 Jul 2025 20:30:21 -0700 Subject: [PATCH 13/32] move roblox to external service --- pkg/cmds/serve.go | 6 ++++-- pkg/service/maps.go | 2 +- pkg/service/service.go | 4 ++++ pkg/service_inner/service.go | 4 ---- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/pkg/cmds/serve.go b/pkg/cmds/serve.go index 3038ee0..f937679 100644 --- a/pkg/cmds/serve.go +++ b/pkg/cmds/serve.go @@ -136,14 +136,16 @@ func serve(ctx *cli.Context) error { js, maps.NewMapsServiceClient(conn), users.NewUsersServiceClient(conn), + ) + + svc_external := service.MakeService( + &svc_inner, roblox.Client{ HttpClient: http.DefaultClient, ApiKey: ctx.String("rbx-api-key"), }, ) - svc_external := service.MakeService(&svc_inner) - conn, err = grpc.Dial(ctx.String("auth-rpc-host"), grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { log.Fatal(err) diff --git a/pkg/service/maps.go b/pkg/service/maps.go index 47d259c..475add5 100644 --- a/pkg/service/maps.go +++ b/pkg/service/maps.go @@ -98,7 +98,7 @@ func (svc *Service) GetMapAssetLocation(ctx context.Context, params api.GetMapAs return ok, err } - info, err := svc.inner.Roblox.GetAssetLocation(roblox.GetAssetLatestRequest{ + info, err := svc.roblox.GetAssetLocation(roblox.GetAssetLatestRequest{ AssetID: uint64(params.MapID), }) if err != nil{ diff --git a/pkg/service/service.go b/pkg/service/service.go index 035695f..8cf2cc4 100644 --- a/pkg/service/service.go +++ b/pkg/service/service.go @@ -7,6 +7,7 @@ import ( "git.itzana.me/strafesnet/maps-service/pkg/api" "git.itzana.me/strafesnet/maps-service/pkg/datastore" + "git.itzana.me/strafesnet/maps-service/pkg/roblox" "git.itzana.me/strafesnet/maps-service/pkg/service_inner" ) @@ -30,13 +31,16 @@ var ( type Service struct { inner *service_inner.Service + roblox roblox.Client } func MakeService( inner *service_inner.Service, + roblox roblox.Client, ) Service { return Service{ inner: inner, + roblox: roblox, } } diff --git a/pkg/service_inner/service.go b/pkg/service_inner/service.go index cd73181..4e26579 100644 --- a/pkg/service_inner/service.go +++ b/pkg/service_inner/service.go @@ -4,7 +4,6 @@ import ( "git.itzana.me/strafesnet/go-grpc/maps" "git.itzana.me/strafesnet/go-grpc/users" "git.itzana.me/strafesnet/maps-service/pkg/datastore" - "git.itzana.me/strafesnet/maps-service/pkg/roblox" "github.com/nats-io/nats.go" ) @@ -13,7 +12,6 @@ type Service struct { nats nats.JetStreamContext maps maps.MapsServiceClient users users.UsersServiceClient - roblox roblox.Client } func MakeService( @@ -21,13 +19,11 @@ func MakeService( nats nats.JetStreamContext, maps maps.MapsServiceClient, users users.UsersServiceClient, - roblox roblox.Client, ) Service { return Service{ db: db, nats: nats, maps: maps, users: users, - roblox: roblox, } } -- 2.49.1 From e6dc4c65d46445c09efb5a60fc7c1799d4162fcd Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Tue, 15 Jul 2025 20:31:44 -0700 Subject: [PATCH 14/32] make internal service fields private --- pkg/cmds/serve.go | 6 ++---- pkg/service_internal/mapfixes.go | 14 +++++++------- pkg/service_internal/operations.go | 2 +- pkg/service_internal/script_policy.go | 6 +++--- pkg/service_internal/scripts.go | 6 +++--- pkg/service_internal/service_internal.go | 10 +++++++++- pkg/service_internal/submissions.go | 16 ++++++++-------- 7 files changed, 33 insertions(+), 27 deletions(-) diff --git a/pkg/cmds/serve.go b/pkg/cmds/serve.go index f937679..8fc2499 100644 --- a/pkg/cmds/serve.go +++ b/pkg/cmds/serve.go @@ -159,11 +159,9 @@ func serve(ctx *cli.Context) error { log.WithError(err).Fatal("failed to initialize api server") } - svc_internal := &service_internal.Service{ - Inner: svc_inner, - } + svc_internal := service_internal.MakeService(&svc_inner) - srv_internal, err := internal.NewServer(svc_internal, internal.WithPathPrefix("/v1")) + srv_internal, err := internal.NewServer(&svc_internal, internal.WithPathPrefix("/v1")) if err != nil { log.WithError(err).Fatal("failed to initialize api server") } diff --git a/pkg/service_internal/mapfixes.go b/pkg/service_internal/mapfixes.go index 5da4912..2eef92a 100644 --- a/pkg/service_internal/mapfixes.go +++ b/pkg/service_internal/mapfixes.go @@ -53,7 +53,7 @@ func (svc *Service) UpdateMapfixValidatedModel(ctx context.Context, params inter ValidatedModelVersion: ValidatedModelVersion, } - return svc.Inner.CreateAuditEventChangeValidatedModel( + return svc.inner.CreateAuditEventChangeValidatedModel( ctx, ValidtorUserID, model.Resource{ @@ -87,7 +87,7 @@ func (svc *Service) ActionMapfixSubmitted(ctx context.Context, params internal.A TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, ValidtorUserID, model.Resource{ @@ -117,7 +117,7 @@ func (svc *Service) ActionMapfixRequestChanges(ctx context.Context, params inter TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, ValidtorUserID, model.Resource{ @@ -160,7 +160,7 @@ func (svc *Service) ActionMapfixAccepted(ctx context.Context, params internal.Ac TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, ValidtorUserID, model.Resource{ @@ -190,7 +190,7 @@ func (svc *Service) ActionMapfixUploaded(ctx context.Context, params internal.Ac TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, ValidtorUserID, model.Resource{ @@ -211,7 +211,7 @@ func (svc *Service) CreateMapfixAuditError(ctx context.Context, params internal. Error: params.ErrorMessage, } - return svc.Inner.CreateAuditEventError( + return svc.inner.CreateAuditEventError( ctx, ValidtorUserID, model.Resource{ @@ -241,7 +241,7 @@ func (svc *Service) CreateMapfixAuditCheckList(ctx context.Context, check_list i CheckList: check_list2, } - return svc.Inner.CreateAuditEventCheckList( + return svc.inner.CreateAuditEventCheckList( ctx, ValidtorUserID, model.Resource{ diff --git a/pkg/service_internal/operations.go b/pkg/service_internal/operations.go index b5c59f6..ed255d6 100644 --- a/pkg/service_internal/operations.go +++ b/pkg/service_internal/operations.go @@ -18,5 +18,5 @@ func (svc *Service) ActionOperationFailed(ctx context.Context, params internal.A model.OperationStatusFailed, params.StatusMessage, ) - return svc.Inner.FailOperation(ctx, params.OperationID, fail_params) + return svc.inner.FailOperation(ctx, params.OperationID, fail_params) } diff --git a/pkg/service_internal/script_policy.go b/pkg/service_internal/script_policy.go index c11bdd3..c37bfd2 100644 --- a/pkg/service_internal/script_policy.go +++ b/pkg/service_internal/script_policy.go @@ -14,14 +14,14 @@ import ( // // POST /script-policy func (svc *Service) CreateScriptPolicy(ctx context.Context, req *api.ScriptPolicyCreate) (*api.ScriptPolicyID, error) { - from_script, err := svc.Inner.GetScript(ctx, req.FromScriptID) + from_script, err := svc.inner.GetScript(ctx, req.FromScriptID) if err != nil { return nil, err } // the existence of ToScriptID does not need to be validated because it's checked by a foreign key constraint. - script, err := svc.Inner.CreateScriptPolicy(ctx, model.ScriptPolicy{ + script, err := svc.inner.CreateScriptPolicy(ctx, model.ScriptPolicy{ ID: 0, FromScriptHash: from_script.Hash, ToScriptID: req.ToScriptID, @@ -59,7 +59,7 @@ func (svc *Service) ListScriptPolicy(ctx context.Context, params api.ListScriptP policy, policy_ok, ) - items, err := svc.Inner.ListScriptPolicies(ctx, filter, model.Page{ + items, err := svc.inner.ListScriptPolicies(ctx, filter, model.Page{ Number: params.Page, Size: params.Limit, }) diff --git a/pkg/service_internal/scripts.go b/pkg/service_internal/scripts.go index d3d8d40..df66902 100644 --- a/pkg/service_internal/scripts.go +++ b/pkg/service_internal/scripts.go @@ -14,7 +14,7 @@ import ( // // POST /scripts func (svc *Service) CreateScript(ctx context.Context, req *api.ScriptCreate) (*api.ScriptID, error) { - script, err := svc.Inner.CreateScript(ctx, model.Script{ + script, err := svc.inner.CreateScript(ctx, model.Script{ ID: 0, Name: req.Name, Hash: int64(model.HashSource(req.Source)), @@ -58,7 +58,7 @@ func (svc *Service) ListScripts(ctx context.Context, params api.ListScriptsParam resource_id, resource_id_ok, ) - items, err := svc.Inner.ListScripts(ctx, filter, model.Page{ + items, err := svc.inner.ListScripts(ctx, filter, model.Page{ Number: params.Page, Size: params.Limit, }) @@ -87,7 +87,7 @@ func (svc *Service) ListScripts(ctx context.Context, params api.ListScriptsParam // // GET /scripts/{ScriptID} func (svc *Service) GetScript(ctx context.Context, params api.GetScriptParams) (*api.Script, error) { - script, err := svc.Inner.GetScript(ctx, params.ScriptID) + script, err := svc.inner.GetScript(ctx, params.ScriptID) if err != nil { return nil, err } diff --git a/pkg/service_internal/service_internal.go b/pkg/service_internal/service_internal.go index a4edce8..c803dc6 100644 --- a/pkg/service_internal/service_internal.go +++ b/pkg/service_internal/service_internal.go @@ -19,7 +19,15 @@ var ( ) type Service struct { - Inner *service_inner.Service + inner *service_inner.Service +} + +func MakeService( + inner *service_inner.Service, +) Service { + return Service{ + inner: inner, + } } // yay duplicate code diff --git a/pkg/service_internal/submissions.go b/pkg/service_internal/submissions.go index f6e12a2..435baf6 100644 --- a/pkg/service_internal/submissions.go +++ b/pkg/service_internal/submissions.go @@ -53,7 +53,7 @@ func (svc *Service) UpdateSubmissionValidatedModel(ctx context.Context, params i ValidatedModelVersion: ValidatedModelVersion, } - return svc.Inner.CreateAuditEventChangeValidatedModel( + return svc.inner.CreateAuditEventChangeValidatedModel( ctx, ValidtorUserID, model.Resource{ @@ -87,7 +87,7 @@ func (svc *Service) ActionSubmissionSubmitted(ctx context.Context, params intern TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, ValidtorUserID, model.Resource{ @@ -118,7 +118,7 @@ func (svc *Service) ActionSubmissionRequestChanges(ctx context.Context, params i TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, ValidtorUserID, model.Resource{ @@ -148,7 +148,7 @@ func (svc *Service) ActionSubmissionValidated(ctx context.Context, params intern TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, ValidtorUserID, model.Resource{ @@ -179,7 +179,7 @@ func (svc *Service) ActionSubmissionAccepted(ctx context.Context, params interna TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, ValidtorUserID, model.Resource{ @@ -210,7 +210,7 @@ func (svc *Service) ActionSubmissionUploaded(ctx context.Context, params interna TargetStatus: uint32(target_status), } - return svc.Inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, ValidtorUserID, model.Resource{ @@ -231,7 +231,7 @@ func (svc *Service) CreateSubmissionAuditError(ctx context.Context, params inter Error: params.ErrorMessage, } - return svc.Inner.CreateAuditEventError( + return svc.inner.CreateAuditEventError( ctx, ValidtorUserID, model.Resource{ @@ -261,7 +261,7 @@ func (svc *Service) CreateSubmissionAuditCheckList(ctx context.Context, check_li CheckList: check_list2, } - return svc.Inner.CreateAuditEventCheckList( + return svc.inner.CreateAuditEventCheckList( ctx, ValidtorUserID, model.Resource{ -- 2.49.1 From 881f3a596d5eade4c42bc087f99768e06b86d7bd Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Tue, 15 Jul 2025 20:40:18 -0700 Subject: [PATCH 15/32] nats for mapfixes --- pkg/service/mapfixes.go | 121 +++++++++++--------------------------- pkg/service_inner/nats.go | 114 +++++++++++++++++++++++++++++++++++ 2 files changed, 148 insertions(+), 87 deletions(-) create mode 100644 pkg/service_inner/nats.go diff --git a/pkg/service/mapfixes.go b/pkg/service/mapfixes.go index 82b107e..b5a4b8a 100644 --- a/pkg/service/mapfixes.go +++ b/pkg/service/mapfixes.go @@ -2,7 +2,6 @@ package service import ( "context" - "encoding/json" "errors" "fmt" "io" @@ -159,19 +158,12 @@ func (svc *Service) CreateMapfix(ctx context.Context, request *api.MapfixTrigger return nil, err } - create_request := model.CreateMapfixRequest{ - OperationID: operation.ID, - ModelID: ModelID, - TargetAssetID: TargetAssetID, - Description: request.Description, - } - - j, err := json.Marshal(create_request) - if err != nil { - return nil, err - } - - _, err = svc.inner.Nats.Publish("maptest.mapfixes.create", []byte(j)) + err = svc.inner.NatsCreateMapfix( + operation.ID, + ModelID, + TargetAssetID, + request.Description, + ) if err != nil { return nil, err } @@ -539,18 +531,11 @@ func (svc *Service) ActionMapfixTriggerSubmit(ctx context.Context, params api.Ac return err } - validate_request := model.CheckMapfixRequest{ - MapfixID: mapfix.ID, - ModelID: mapfix.AssetID, - SkipChecks: false, - } - - j, err := json.Marshal(validate_request) - if err != nil { - return err - } - - _, err = svc.Nats.Publish("maptest.mapfixes.check", []byte(j)) + err = svc.inner.NatsCheckMapfix( + mapfix.ID, + mapfix.AssetID, + false, + ) if err != nil { return err } @@ -616,18 +601,11 @@ func (svc *Service) ActionMapfixTriggerSubmitUnchecked(ctx context.Context, para return err } - validate_request := model.CheckMapfixRequest{ - MapfixID: mapfix.ID, - ModelID: mapfix.AssetID, - SkipChecks: true, - } - - j, err := json.Marshal(validate_request) - if err != nil { - return err - } - - _, err = svc.Nats.Publish("maptest.mapfixes.check", []byte(j)) + err = svc.inner.NatsCheckMapfix( + mapfix.ID, + mapfix.AssetID, + true, + ) if err != nil { return err } @@ -738,19 +716,12 @@ func (svc *Service) ActionMapfixTriggerUpload(ctx context.Context, params api.Ac } // this is a map fix - upload_fix_request := model.UploadMapfixRequest{ - MapfixID: mapfix.ID, - ModelID: mapfix.ValidatedAssetID, - ModelVersion: mapfix.ValidatedAssetVersion, - TargetAssetID: mapfix.TargetAssetID, - } - - j, err := json.Marshal(upload_fix_request) - if err != nil { - return err - } - - _, err = svc.Nats.Publish("maptest.mapfixes.upload", []byte(j)) + err = svc.inner.NatsUploadMapfix( + mapfix.ID, + mapfix.ValidatedAssetID, + mapfix.ValidatedAssetVersion, + mapfix.TargetAssetID, + ) if err != nil { return err } @@ -892,24 +863,12 @@ func (svc *Service) ActionMapfixTriggerValidate(ctx context.Context, params api. return err } - validate_request := model.ValidateMapfixRequest{ - MapfixID: mapfix.ID, - ModelID: mapfix.AssetID, - ModelVersion: mapfix.AssetVersion, - ValidatedModelID: nil, - } - - // sentinel values because we're not using rust - if mapfix.ValidatedAssetID != 0 { - validate_request.ValidatedModelID = &mapfix.ValidatedAssetID - } - - j, err := json.Marshal(validate_request) - if err != nil { - return err - } - - _, err = svc.Nats.Publish("maptest.mapfixes.validate", []byte(j)) + err = svc.inner.NatsValidateMapfix( + mapfix.ID, + mapfix.AssetID, + mapfix.AssetVersion, + mapfix.ValidatedAssetID, + ) if err != nil { return err } @@ -963,24 +922,12 @@ func (svc *Service) ActionMapfixRetryValidate(ctx context.Context, params api.Ac return err } - validate_request := model.ValidateMapfixRequest{ - MapfixID: mapfix.ID, - ModelID: mapfix.AssetID, - ModelVersion: mapfix.AssetVersion, - ValidatedModelID: nil, - } - - // sentinel values because we're not using rust - if mapfix.ValidatedAssetID != 0 { - validate_request.ValidatedModelID = &mapfix.ValidatedAssetID - } - - j, err := json.Marshal(validate_request) - if err != nil { - return err - } - - _, err = svc.Nats.Publish("maptest.mapfixes.validate", []byte(j)) + err = svc.inner.NatsValidateMapfix( + mapfix.ID, + mapfix.AssetID, + mapfix.AssetVersion, + mapfix.ValidatedAssetID, + ) if err != nil { return err } diff --git a/pkg/service_inner/nats.go b/pkg/service_inner/nats.go new file mode 100644 index 0000000..67ced2a --- /dev/null +++ b/pkg/service_inner/nats.go @@ -0,0 +1,114 @@ +package service_inner + +import ( + "encoding/json" + + "git.itzana.me/strafesnet/maps-service/pkg/model" +) + +func (svc *Service) NatsCreateMapfix( + OperationID int32, + ModelID uint64, + TargetAssetID uint64, + Description string, +) error { + create_request := model.CreateMapfixRequest{ + OperationID: OperationID, + ModelID: ModelID, + TargetAssetID: TargetAssetID, + Description: Description, + } + + j, err := json.Marshal(create_request) + if err != nil { + return err + } + + _, err = svc.nats.Publish("maptest.mapfixes.create", []byte(j)) + if err != nil { + return err + } + + return nil +} + +func (svc *Service) NatsCheckMapfix( + MapfixID int64, + ModelID uint64, + SkipChecks bool, +) error { + validate_request := model.CheckMapfixRequest{ + MapfixID: MapfixID, + ModelID: ModelID, + SkipChecks: SkipChecks, + } + + j, err := json.Marshal(validate_request) + if err != nil { + return err + } + + _, err = svc.nats.Publish("maptest.mapfixes.check", []byte(j)) + if err != nil { + return err + } + + return nil +} + +func (svc *Service) NatsUploadMapfix( + MapfixID int64, + ModelID uint64, + ModelVersion uint64, + TargetAssetID uint64, +) error { + upload_fix_request := model.UploadMapfixRequest{ + MapfixID: MapfixID, + ModelID: ModelID, + ModelVersion: ModelVersion, + TargetAssetID: TargetAssetID, + } + + j, err := json.Marshal(upload_fix_request) + if err != nil { + return err + } + + _, err = svc.nats.Publish("maptest.mapfixes.upload", []byte(j)) + if err != nil { + return err + } + + return nil +} + +func (svc *Service) NatsValidateMapfix( + MapfixID int64, + ModelID uint64, + ModelVersion uint64, + ValidatedAssetID uint64, +) error { + validate_request := model.ValidateMapfixRequest{ + MapfixID: MapfixID, + ModelID: ModelID, + ModelVersion: ModelVersion, + ValidatedModelID: nil, + } + + // sentinel values because we're not using rust + if ValidatedAssetID != 0 { + validate_request.ValidatedModelID = &ValidatedAssetID + } + + j, err := json.Marshal(validate_request) + if err != nil { + return err + } + + _, err = svc.nats.Publish("maptest.mapfixes.validate", []byte(j)) + if err != nil { + return err + } + + return nil +} -- 2.49.1 From 048fb4f3f67a3204cb7349834036f6abf5b166ef Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Tue, 15 Jul 2025 21:00:12 -0700 Subject: [PATCH 16/32] mapfix completed --- pkg/service/mapfixes.go | 4 +--- pkg/service_inner/mapfixes.go | 6 ++++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/pkg/service/mapfixes.go b/pkg/service/mapfixes.go index b5a4b8a..3bc966b 100644 --- a/pkg/service/mapfixes.go +++ b/pkg/service/mapfixes.go @@ -277,9 +277,7 @@ func (svc *Service) SetMapfixCompleted(ctx context.Context, params api.SetMapfix return ErrPermissionDeniedNeedRoleMaptest } - pmap := datastore.Optional() - pmap.Add("completed", true) - return svc.DB.Mapfixes().Update(ctx, params.MapfixID, pmap) + return svc.inner.UpdateMapfix(ctx, params.MapfixID, service_inner.MakeMapfixFilterCompleted()) } // UpdateMapfixModel implements patchMapfixModel operation. diff --git a/pkg/service_inner/mapfixes.go b/pkg/service_inner/mapfixes.go index bfcf79a..14af093 100644 --- a/pkg/service_inner/mapfixes.go +++ b/pkg/service_inner/mapfixes.go @@ -43,6 +43,12 @@ func MakeMapfixFilter( return MapfixFilter(filter) } +func MakeMapfixFilterCompleted() MapfixFilter { + filter := datastore.Optional() + filter.Add("completed", true) + return MapfixFilter(filter) +} + func (svc *Service) CreateMapfix(ctx context.Context, script model.Mapfix) (model.Mapfix, error) { return svc.db.Mapfixes().Create(ctx, script) } -- 2.49.1 From 8ddcf94829936b9815de59f7420a0d96465ff30f Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Tue, 15 Jul 2025 21:03:45 -0700 Subject: [PATCH 17/32] wip: mapfixes: use inner --- pkg/service/mapfixes.go | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/pkg/service/mapfixes.go b/pkg/service/mapfixes.go index 3bc966b..b7e67bf 100644 --- a/pkg/service/mapfixes.go +++ b/pkg/service/mapfixes.go @@ -179,7 +179,7 @@ func (svc *Service) CreateMapfix(ctx context.Context, request *api.MapfixTrigger // // GET /mapfixes/{MapfixID} func (svc *Service) GetMapfix(ctx context.Context, params api.GetMapfixParams) (*api.Mapfix, error) { - mapfix, err := svc.DB.Mapfixes().Get(ctx, params.MapfixID) + mapfix, err := svc.inner.GetMapfix(ctx, params.MapfixID) if err != nil { return nil, err } @@ -221,12 +221,12 @@ func (svc *Service) ListMapfixes(ctx context.Context, params api.ListMapfixesPar submitter, submitter_ok, asset_id, asset_id_ok, target_asset_id, target_asset_id_ok, - status_id, status_id_ok, + []model.MapfixStatus{model.MapfixStatus(status_id)}, status_id_ok, ) sort := datastore.ListSort(params.Sort.Or(int32(datastore.ListSortDisabled))) - total, items, err := svc.DB.Mapfixes().ListWithTotal(ctx, filter, model.Page{ + total, items, err := svc.inner.ListMapfixesWithTotal(ctx, filter, model.Page{ Number: params.Page, Size: params.Limit, },sort) @@ -292,7 +292,7 @@ func (svc *Service) UpdateMapfixModel(ctx context.Context, params api.UpdateMapf } // read mapfix (this could be done with a transaction WHERE clause) - mapfix, err := svc.DB.Mapfixes().Get(ctx, params.MapfixID) + mapfix, err := svc.inner.GetMapfix(ctx, params.MapfixID) if err != nil { return err } @@ -452,7 +452,7 @@ func (svc *Service) ActionMapfixRevoke(ctx context.Context, params api.ActionMap } // read mapfix (this could be done with a transaction WHERE clause) - mapfix, err := svc.DB.Mapfixes().Get(ctx, params.MapfixID) + mapfix, err := svc.inner.GetMapfix(ctx, params.MapfixID) if err != nil { return err } @@ -504,7 +504,7 @@ func (svc *Service) ActionMapfixTriggerSubmit(ctx context.Context, params api.Ac } // read mapfix (this could be done with a transaction WHERE clause) - mapfix, err := svc.DB.Mapfixes().Get(ctx, params.MapfixID) + mapfix, err := svc.inner.GetMapfix(ctx, params.MapfixID) if err != nil { return err } @@ -565,7 +565,7 @@ func (svc *Service) ActionMapfixTriggerSubmitUnchecked(ctx context.Context, para } // read mapfix (this could be done with a transaction WHERE clause) - mapfix, err := svc.DB.Mapfixes().Get(ctx, params.MapfixID) + mapfix, err := svc.inner.GetMapfix(ctx, params.MapfixID) if err != nil { return err } @@ -640,7 +640,7 @@ func (svc *Service) ActionMapfixResetSubmitting(ctx context.Context, params api. } // check when mapfix was updated - mapfix, err := svc.DB.Mapfixes().Get(ctx, params.MapfixID) + mapfix, err := svc.inner.GetMapfix(ctx, params.MapfixID) if err != nil { return err } @@ -765,7 +765,7 @@ func (svc *Service) ActionMapfixValidated(ctx context.Context, params api.Action } // check when mapfix was updated - mapfix, err := svc.DB.Mapfixes().Get(ctx, params.MapfixID) + mapfix, err := svc.inner.GetMapfix(ctx, params.MapfixID) if err != nil { return err } @@ -819,7 +819,7 @@ func (svc *Service) ActionMapfixTriggerValidate(ctx context.Context, params api. } // read mapfix (this could be done with a transaction WHERE clause) - mapfix, err := svc.DB.Mapfixes().Get(ctx, params.MapfixID) + mapfix, err := svc.inner.GetMapfix(ctx, params.MapfixID) if err != nil { return err } @@ -971,7 +971,7 @@ func (svc *Service) ActionMapfixAccepted(ctx context.Context, params api.ActionM } // check when mapfix was updated - mapfix, err := svc.DB.Mapfixes().Get(ctx, params.MapfixID) + mapfix, err := svc.inner.GetMapfix(ctx, params.MapfixID) if err != nil { return err } @@ -1027,7 +1027,7 @@ func (svc *Service) CreateMapfixAuditComment(ctx context.Context, req api.Create if !has_role { // Submitter has special permission to comment on their mapfix - mapfix, err := svc.DB.Mapfixes().Get(ctx, params.MapfixID) + mapfix, err := svc.inner.GetMapfix(ctx, params.MapfixID) if err != nil { return err } -- 2.49.1 From 55730f2eb0406c5f887ff0d8aaf4d7c3464faeb3 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Wed, 16 Jul 2025 18:02:17 -0700 Subject: [PATCH 18/32] write New instead of Make --- pkg/cmds/serve.go | 6 +++--- pkg/service/mapfixes.go | 8 ++++---- pkg/service/script_policy.go | 4 ++-- pkg/service/scripts.go | 4 ++-- pkg/service/service.go | 2 +- pkg/service_inner/mapfixes.go | 4 ++-- pkg/service_inner/operations.go | 2 +- pkg/service_inner/script_policy.go | 2 +- pkg/service_inner/scripts.go | 2 +- pkg/service_inner/service.go | 2 +- pkg/service_internal/operations.go | 2 +- pkg/service_internal/script_policy.go | 2 +- pkg/service_internal/scripts.go | 2 +- pkg/service_internal/service_internal.go | 2 +- 14 files changed, 22 insertions(+), 22 deletions(-) diff --git a/pkg/cmds/serve.go b/pkg/cmds/serve.go index 8fc2499..54eb145 100644 --- a/pkg/cmds/serve.go +++ b/pkg/cmds/serve.go @@ -131,14 +131,14 @@ func serve(ctx *cli.Context) error { if err != nil { log.Fatal(err) } - svc_inner := service_inner.MakeService( + svc_inner := service_inner.NewService( db, js, maps.NewMapsServiceClient(conn), users.NewUsersServiceClient(conn), ) - svc_external := service.MakeService( + svc_external := service.NewService( &svc_inner, roblox.Client{ HttpClient: http.DefaultClient, @@ -159,7 +159,7 @@ func serve(ctx *cli.Context) error { log.WithError(err).Fatal("failed to initialize api server") } - svc_internal := service_internal.MakeService(&svc_inner) + svc_internal := service_internal.NewService(&svc_inner) srv_internal, err := internal.NewServer(&svc_internal, internal.WithPathPrefix("/v1")) if err != nil { diff --git a/pkg/service/mapfixes.go b/pkg/service/mapfixes.go index b7e67bf..6646de8 100644 --- a/pkg/service/mapfixes.go +++ b/pkg/service/mapfixes.go @@ -68,7 +68,7 @@ func (svc *Service) CreateMapfix(ctx context.Context, request *api.MapfixTrigger target_asset_id, target_asset_id_ok := int64(0), false status_id, status_id_ok := CreationPhaseMapfixStatuses, true - filter := service_inner.MakeMapfixFilter( + filter := service_inner.NewMapfixFilter( display_name, display_name_ok, creator, creator_ok, game_id, game_id_ok, @@ -104,7 +104,7 @@ func (svc *Service) CreateMapfix(ctx context.Context, request *api.MapfixTrigger game_id, game_id_ok := int32(0), false asset_id, asset_id_ok := int64(0), false - filter := service_inner.MakeMapfixFilter( + filter := service_inner.NewMapfixFilter( display_name, display_name_ok, creator, creator_ok, game_id, game_id_ok, @@ -214,7 +214,7 @@ func (svc *Service) ListMapfixes(ctx context.Context, params api.ListMapfixesPar target_asset_id, target_asset_id_ok := params.TargetAssetID.Get() status_id, status_id_ok := params.StatusID.Get() - filter := service_inner.MakeMapfixFilter( + filter := service_inner.NewMapfixFilter( display_name, display_name_ok, creator, creator_ok, game_id, game_id_ok, @@ -277,7 +277,7 @@ func (svc *Service) SetMapfixCompleted(ctx context.Context, params api.SetMapfix return ErrPermissionDeniedNeedRoleMaptest } - return svc.inner.UpdateMapfix(ctx, params.MapfixID, service_inner.MakeMapfixFilterCompleted()) + return svc.inner.UpdateMapfix(ctx, params.MapfixID, service_inner.NewMapfixFilterCompleted()) } // UpdateMapfixModel implements patchMapfixModel operation. diff --git a/pkg/service/script_policy.go b/pkg/service/script_policy.go index 25cb0ff..b612724 100644 --- a/pkg/service/script_policy.go +++ b/pkg/service/script_policy.go @@ -59,7 +59,7 @@ func (svc *Service) ListScriptPolicy(ctx context.Context, params api.ListScriptP to_script_id, to_script_id_ok := params.ToScriptID.Get() policy, policy_ok := params.Policy.Get() - filter := service_inner.MakeScriptPolicyFilter( + filter := service_inner.NewScriptPolicyFilter( from_script_hash, from_script_hash_ok, to_script_id, to_script_id_ok, policy, policy_ok, @@ -142,7 +142,7 @@ func (svc *Service) UpdateScriptPolicy(ctx context.Context, req *api.ScriptPolic policy, policy_ok := req.Policy.Get(); - filter := service_inner.MakeScriptPolicyFilter( + filter := service_inner.NewScriptPolicyFilter( from_script_hash, from_script_hash_ok, to_script_id, to_script_id_ok, policy, policy_ok, diff --git a/pkg/service/scripts.go b/pkg/service/scripts.go index 766dd1e..674df6d 100644 --- a/pkg/service/scripts.go +++ b/pkg/service/scripts.go @@ -72,7 +72,7 @@ func (svc *Service) ListScripts(ctx context.Context, params api.ListScriptsParam resource_type, resource_type_ok := params.ResourceType.Get() resource_id, resource_id_ok := params.ResourceID.Get() - filter := service_inner.MakeScriptFilter( + filter := service_inner.NewScriptFilter( name, name_ok, source, source_ok, hash, hash_ok, @@ -158,7 +158,7 @@ func (svc *Service) UpdateScript(ctx context.Context, req *api.ScriptUpdate, par resource_type, resource_type_ok := req.ResourceType.Get() resource_id, resource_id_ok := req.ResourceID.Get() - filter := service_inner.MakeScriptFilter( + filter := service_inner.NewScriptFilter( name, name_ok, source, source_ok, hash, hash_ok, diff --git a/pkg/service/service.go b/pkg/service/service.go index 8cf2cc4..d32e67d 100644 --- a/pkg/service/service.go +++ b/pkg/service/service.go @@ -34,7 +34,7 @@ type Service struct { roblox roblox.Client } -func MakeService( +func NewService( inner *service_inner.Service, roblox roblox.Client, ) Service { diff --git a/pkg/service_inner/mapfixes.go b/pkg/service_inner/mapfixes.go index 14af093..0fb9690 100644 --- a/pkg/service_inner/mapfixes.go +++ b/pkg/service_inner/mapfixes.go @@ -9,7 +9,7 @@ import ( type MapfixFilter datastore.OptionalMap -func MakeMapfixFilter( +func NewMapfixFilter( display_name string, display_name_ok bool, creator string, creator_ok bool, game_id int32, game_id_ok bool, @@ -43,7 +43,7 @@ func MakeMapfixFilter( return MapfixFilter(filter) } -func MakeMapfixFilterCompleted() MapfixFilter { +func NewMapfixFilterCompleted() MapfixFilter { filter := datastore.Optional() filter.Add("completed", true) return MapfixFilter(filter) diff --git a/pkg/service_inner/operations.go b/pkg/service_inner/operations.go index d9be5d5..0a0b0ac 100644 --- a/pkg/service_inner/operations.go +++ b/pkg/service_inner/operations.go @@ -10,7 +10,7 @@ import ( type OperationFailParams datastore.OptionalMap -func MakeOperationFailParams( +func NewOperationFailParams( status_id model.OperationStatus, status_message string, ) OperationFailParams { diff --git a/pkg/service_inner/script_policy.go b/pkg/service_inner/script_policy.go index d735ee9..fb71a69 100644 --- a/pkg/service_inner/script_policy.go +++ b/pkg/service_inner/script_policy.go @@ -9,7 +9,7 @@ import ( type ScriptPolicyFilter datastore.OptionalMap -func MakeScriptPolicyFilter( +func NewScriptPolicyFilter( from_script_hash int64, from_script_hash_ok bool, to_script_id int64, to_script_id_ok bool, policy int32, policy_ok bool, diff --git a/pkg/service_inner/scripts.go b/pkg/service_inner/scripts.go index 0aa70b8..9f8858e 100644 --- a/pkg/service_inner/scripts.go +++ b/pkg/service_inner/scripts.go @@ -9,7 +9,7 @@ import ( type ScriptFilter datastore.OptionalMap -func MakeScriptFilter( +func NewScriptFilter( name string, name_ok bool, source string, source_ok bool, hash int64, hash_ok bool, diff --git a/pkg/service_inner/service.go b/pkg/service_inner/service.go index 4e26579..12ee58e 100644 --- a/pkg/service_inner/service.go +++ b/pkg/service_inner/service.go @@ -14,7 +14,7 @@ type Service struct { users users.UsersServiceClient } -func MakeService( +func NewService( db datastore.Datastore, nats nats.JetStreamContext, maps maps.MapsServiceClient, diff --git a/pkg/service_internal/operations.go b/pkg/service_internal/operations.go index ed255d6..f8d3371 100644 --- a/pkg/service_internal/operations.go +++ b/pkg/service_internal/operations.go @@ -14,7 +14,7 @@ import ( // // POST /operations/{OperationID}/status/operation-failed func (svc *Service) ActionOperationFailed(ctx context.Context, params internal.ActionOperationFailedParams) (error) { - fail_params := service_inner.MakeOperationFailParams( + fail_params := service_inner.NewOperationFailParams( model.OperationStatusFailed, params.StatusMessage, ) diff --git a/pkg/service_internal/script_policy.go b/pkg/service_internal/script_policy.go index c37bfd2..75b7ca6 100644 --- a/pkg/service_internal/script_policy.go +++ b/pkg/service_internal/script_policy.go @@ -53,7 +53,7 @@ func (svc *Service) ListScriptPolicy(ctx context.Context, params api.ListScriptP to_script_id, to_script_id_ok := params.ToScriptID.Get() policy, policy_ok := params.Policy.Get() - filter := service_inner.MakeScriptPolicyFilter( + filter := service_inner.NewScriptPolicyFilter( from_script_hash, from_script_hash_ok, to_script_id, to_script_id_ok, policy, policy_ok, diff --git a/pkg/service_internal/scripts.go b/pkg/service_internal/scripts.go index df66902..08a7533 100644 --- a/pkg/service_internal/scripts.go +++ b/pkg/service_internal/scripts.go @@ -50,7 +50,7 @@ func (svc *Service) ListScripts(ctx context.Context, params api.ListScriptsParam resource_type, resource_type_ok := params.ResourceType.Get() resource_id, resource_id_ok := params.ResourceID.Get() - filter := service_inner.MakeScriptFilter( + filter := service_inner.NewScriptFilter( name, name_ok, source, source_ok, hash, hash_ok, diff --git a/pkg/service_internal/service_internal.go b/pkg/service_internal/service_internal.go index c803dc6..5f56218 100644 --- a/pkg/service_internal/service_internal.go +++ b/pkg/service_internal/service_internal.go @@ -22,7 +22,7 @@ type Service struct { inner *service_inner.Service } -func MakeService( +func NewService( inner *service_inner.Service, ) Service { return Service{ -- 2.49.1 From 83e363c056ce1979e913d44b4d06f8462b86b4b1 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Wed, 16 Jul 2025 18:07:21 -0700 Subject: [PATCH 19/32] rename MapRequest to MapUpdate --- pkg/service_inner/maps.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/pkg/service_inner/maps.go b/pkg/service_inner/maps.go index 0b34804..74d125c 100644 --- a/pkg/service_inner/maps.go +++ b/pkg/service_inner/maps.go @@ -8,16 +8,17 @@ import ( "git.itzana.me/strafesnet/maps-service/pkg/model" ) -type MapRequest maps.MapRequest +// Optional map used to update an object +type MapUpdate maps.MapRequest -func NewMapRequest( +func NewMapUpdate( id int64, display_name string, display_name_ok bool, creator string, creator_ok bool, game_id int32, game_id_ok bool, date int64, date_ok bool, -) *MapRequest { - item := MapRequest{ +) *MapUpdate { + item := MapUpdate{ ID: id, } if display_name_ok { @@ -35,6 +36,7 @@ func NewMapRequest( return &item } +// Optional map used to find matching objects type MapFilter maps.MapFilter func NewMapFilter( @@ -118,7 +120,7 @@ func (svc *Service) GetMap(ctx context.Context, id int64) (*model.Map, error) { }, nil } -func (svc *Service) UpdateMap(ctx context.Context, pmap *MapRequest) error { +func (svc *Service) UpdateMap(ctx context.Context, pmap *MapUpdate) error { _, err := svc.maps.Update(ctx, (*maps.MapRequest)(pmap)) return err } -- 2.49.1 From f05089b4b1c9655eb3eb4c4218fd65c02f8e12a1 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Wed, 16 Jul 2025 18:15:08 -0700 Subject: [PATCH 20/32] MapfixUpdate is distinct from MapfixFilter --- pkg/service_inner/mapfixes.go | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/pkg/service_inner/mapfixes.go b/pkg/service_inner/mapfixes.go index 0fb9690..d6be0d2 100644 --- a/pkg/service_inner/mapfixes.go +++ b/pkg/service_inner/mapfixes.go @@ -7,6 +7,62 @@ import ( "git.itzana.me/strafesnet/maps-service/pkg/model" ) +type MapfixUpdate datastore.OptionalMap + +func NewMapfixUpdate( + display_name string, display_name_ok bool, + creator string, creator_ok bool, + game_id uint32, game_id_ok bool, + submitter uint64, submitter_ok bool, + asset_id uint64, asset_id_ok bool, + asset_version uint64, asset_version_ok bool, + validated_asset_id uint64, validated_asset_id_ok bool, + validated_asset_version uint64, validated_asset_version_ok bool, + completed bool, completed_ok bool, + target_asset_id uint64, target_asset_id_ok bool, + status_id model.MapfixStatus, status_id_ok bool, + description string, description_ok bool, +) MapfixUpdate { + update := datastore.Optional() + if display_name_ok { + update.Add("display_name", display_name) + } + if creator_ok { + update.Add("creator", creator) + } + if game_id_ok { + update.Add("game_id", game_id) + } + if submitter_ok { + update.Add("submitter", submitter) + } + if asset_id_ok { + update.Add("asset_id", asset_id) + } + if asset_version_ok { + update.Add("asset_version", asset_version) + } + if validated_asset_id_ok { + update.Add("validated_asset_id", validated_asset_id) + } + if validated_asset_version_ok { + update.Add("validated_asset_version", validated_asset_version) + } + if completed_ok { + update.Add("completed", completed) + } + if target_asset_id_ok { + update.Add("target_asset_id", target_asset_id) + } + if status_id_ok { + update.Add("status_id", status_id) + } + if description_ok { + update.Add("description", description) + } + return MapfixUpdate(update) +} + type MapfixFilter datastore.OptionalMap func NewMapfixFilter( @@ -69,6 +125,6 @@ func (svc *Service) GetMapfix(ctx context.Context, id int64) (model.Mapfix, erro return svc.db.Mapfixes().Get(ctx, id) } -func (svc *Service) UpdateMapfix(ctx context.Context, id int64, pmap MapfixFilter) error { +func (svc *Service) UpdateMapfix(ctx context.Context, id int64, pmap MapfixUpdate) error { return svc.db.Mapfixes().Update(ctx, id, datastore.OptionalMap(pmap)) } -- 2.49.1 From a9a39b59463f89f05ba2da76704a14915fef080a Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Wed, 16 Jul 2025 18:33:14 -0700 Subject: [PATCH 21/32] rewrite giant thing --- pkg/service_inner/mapfixes.go | 94 ++++++++++++++--------------------- 1 file changed, 38 insertions(+), 56 deletions(-) diff --git a/pkg/service_inner/mapfixes.go b/pkg/service_inner/mapfixes.go index d6be0d2..7e45f6d 100644 --- a/pkg/service_inner/mapfixes.go +++ b/pkg/service_inner/mapfixes.go @@ -9,60 +9,48 @@ import ( type MapfixUpdate datastore.OptionalMap -func NewMapfixUpdate( - display_name string, display_name_ok bool, - creator string, creator_ok bool, - game_id uint32, game_id_ok bool, - submitter uint64, submitter_ok bool, - asset_id uint64, asset_id_ok bool, - asset_version uint64, asset_version_ok bool, - validated_asset_id uint64, validated_asset_id_ok bool, - validated_asset_version uint64, validated_asset_version_ok bool, - completed bool, completed_ok bool, - target_asset_id uint64, target_asset_id_ok bool, - status_id model.MapfixStatus, status_id_ok bool, - description string, description_ok bool, -) MapfixUpdate { +func NewMapfixUpdate() MapfixUpdate { update := datastore.Optional() - if display_name_ok { - update.Add("display_name", display_name) - } - if creator_ok { - update.Add("creator", creator) - } - if game_id_ok { - update.Add("game_id", game_id) - } - if submitter_ok { - update.Add("submitter", submitter) - } - if asset_id_ok { - update.Add("asset_id", asset_id) - } - if asset_version_ok { - update.Add("asset_version", asset_version) - } - if validated_asset_id_ok { - update.Add("validated_asset_id", validated_asset_id) - } - if validated_asset_version_ok { - update.Add("validated_asset_version", validated_asset_version) - } - if completed_ok { - update.Add("completed", completed) - } - if target_asset_id_ok { - update.Add("target_asset_id", target_asset_id) - } - if status_id_ok { - update.Add("status_id", status_id) - } - if description_ok { - update.Add("description", description) - } return MapfixUpdate(update) } +func (update MapfixUpdate) SetDisplayName(display_name string) { + datastore.OptionalMap(update).Add("display_name", display_name) +} +func (update MapfixUpdate) SetCreator(creator string) { + datastore.OptionalMap(update).Add("creator", creator) +} +func (update MapfixUpdate) SetGameID(game_id uint32) { + datastore.OptionalMap(update).Add("game_id", game_id) +} +func (update MapfixUpdate) SetSubmitter(submitter uint64) { + datastore.OptionalMap(update).Add("submitter", submitter) +} +func (update MapfixUpdate) SetAssetID(asset_id uint64) { + datastore.OptionalMap(update).Add("asset_id", asset_id) +} +func (update MapfixUpdate) SetAssetVersion(asset_version uint64) { + datastore.OptionalMap(update).Add("asset_version", asset_version) +} +func (update MapfixUpdate) SetValidatedAssetID(validated_asset_id uint64) { + datastore.OptionalMap(update).Add("validated_asset_id", validated_asset_id) +} +func (update MapfixUpdate) SetValidatedAssetVersion(validated_asset_version uint64) { + datastore.OptionalMap(update).Add("validated_asset_version", validated_asset_version) +} +func (update MapfixUpdate) SetCompleted(completed bool) { + datastore.OptionalMap(update).Add("completed", completed) +} +func (update MapfixUpdate) SetTargetAssetID(target_asset_id uint64) { + datastore.OptionalMap(update).Add("target_asset_id", target_asset_id) +} +func (update MapfixUpdate) SetStatusID(status_id model.MapfixStatus) { + datastore.OptionalMap(update).Add("status_id", status_id) +} +func (update MapfixUpdate) SetDescription(description string) { + datastore.OptionalMap(update).Add("description", description) +} + type MapfixFilter datastore.OptionalMap func NewMapfixFilter( @@ -99,12 +87,6 @@ func NewMapfixFilter( return MapfixFilter(filter) } -func NewMapfixFilterCompleted() MapfixFilter { - filter := datastore.Optional() - filter.Add("completed", true) - return MapfixFilter(filter) -} - func (svc *Service) CreateMapfix(ctx context.Context, script model.Mapfix) (model.Mapfix, error) { return svc.db.Mapfixes().Create(ctx, script) } -- 2.49.1 From 0fb04c31273cc997f2f5b103a4caa27dfe1bc704 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Wed, 16 Jul 2025 18:41:54 -0700 Subject: [PATCH 22/32] tough stuff --- pkg/service/mapfixes.go | 94 ++++++++++++++++++++--------------- pkg/service_inner/mapfixes.go | 8 +++ 2 files changed, 62 insertions(+), 40 deletions(-) diff --git a/pkg/service/mapfixes.go b/pkg/service/mapfixes.go index 6646de8..81fce23 100644 --- a/pkg/service/mapfixes.go +++ b/pkg/service/mapfixes.go @@ -277,7 +277,9 @@ func (svc *Service) SetMapfixCompleted(ctx context.Context, params api.SetMapfix return ErrPermissionDeniedNeedRoleMaptest } - return svc.inner.UpdateMapfix(ctx, params.MapfixID, service_inner.NewMapfixFilterCompleted()) + update := service_inner.NewMapfixUpdate() + update.SetCompleted(true) + return svc.inner.UpdateMapfix(ctx, params.MapfixID, update) } // UpdateMapfixModel implements patchMapfixModel operation. @@ -314,12 +316,13 @@ func (svc *Service) UpdateMapfixModel(ctx context.Context, params api.UpdateMapf NewModelVersion := uint64(params.ModelVersion) // check if Status is ChangesRequested|Submitted|UnderConstruction - pmap := datastore.Optional() - pmap.Add("asset_id", NewModelID) - pmap.Add("asset_version", NewModelVersion) + update := service_inner.NewMapfixUpdate() + update.SetAssetID(NewModelID) + update.SetAssetVersion(NewModelVersion) //always reset completed when model changes - pmap.Add("completed", false) - err = svc.DB.Mapfixes().IfStatusThenUpdate(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusChangesRequested, model.MapfixStatusSubmitted, model.MapfixStatusUnderConstruction}, pmap) + update.SetCompleted(false) + allow_statuses := []model.MapfixStatus{model.MapfixStatusChangesRequested, model.MapfixStatusSubmitted, model.MapfixStatusUnderConstruction} + err = svc.inner.UpdateMapfixIfStatus(ctx, params.MapfixID, allow_statuses, update) if err != nil { return err } @@ -369,9 +372,10 @@ func (svc *Service) ActionMapfixReject(ctx context.Context, params api.ActionMap // transaction target_status := model.MapfixStatusRejected - smap := datastore.Optional() - smap.Add("status_id", target_status) - err = svc.DB.Mapfixes().IfStatusThenUpdate(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusSubmitted}, smap) + update := service_inner.NewMapfixUpdate() + update.SetStatusID(target_status) + allow_statuses := []model.MapfixStatus{model.MapfixStatusSubmitted} + err = svc.inner.UpdateMapfixIfStatus(ctx, params.MapfixID, allow_statuses, update) if err != nil { return err } @@ -418,9 +422,10 @@ func (svc *Service) ActionMapfixRequestChanges(ctx context.Context, params api.A // transaction target_status := model.MapfixStatusChangesRequested - smap := datastore.Optional() - smap.Add("status_id", target_status) - err = svc.DB.Mapfixes().IfStatusThenUpdate(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusValidated, model.MapfixStatusAcceptedUnvalidated, model.MapfixStatusSubmitted}, smap) + update := service_inner.NewMapfixUpdate() + update.SetStatusID(target_status) + allow_statuses := []model.MapfixStatus{model.MapfixStatusValidated, model.MapfixStatusAcceptedUnvalidated, model.MapfixStatusSubmitted} + err = svc.inner.UpdateMapfixIfStatus(ctx, params.MapfixID, allow_statuses, update) if err != nil { return err } @@ -470,9 +475,10 @@ func (svc *Service) ActionMapfixRevoke(ctx context.Context, params api.ActionMap // transaction target_status := model.MapfixStatusUnderConstruction - smap := datastore.Optional() - smap.Add("status_id", target_status) - err = svc.DB.Mapfixes().IfStatusThenUpdate(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusSubmitted, model.MapfixStatusChangesRequested}, smap) + update := service_inner.NewMapfixUpdate() + update.SetStatusID(target_status) + allow_statuses := []model.MapfixStatus{model.MapfixStatusSubmitted, model.MapfixStatusChangesRequested} + err = svc.inner.UpdateMapfixIfStatus(ctx, params.MapfixID, allow_statuses, update) if err != nil { return err } @@ -522,9 +528,10 @@ func (svc *Service) ActionMapfixTriggerSubmit(ctx context.Context, params api.Ac // transaction target_status := model.MapfixStatusSubmitting - smap := datastore.Optional() - smap.Add("status_id", target_status) - err = svc.DB.Mapfixes().IfStatusThenUpdate(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusUnderConstruction, model.MapfixStatusChangesRequested}, smap) + update := service_inner.NewMapfixUpdate() + update.SetStatusID(target_status) + allow_statuses := []model.MapfixStatus{model.MapfixStatusUnderConstruction, model.MapfixStatusChangesRequested} + err = svc.inner.UpdateMapfixIfStatus(ctx, params.MapfixID, allow_statuses, update) if err != nil { return err } @@ -592,9 +599,10 @@ func (svc *Service) ActionMapfixTriggerSubmitUnchecked(ctx context.Context, para // transaction target_status := model.MapfixStatusSubmitting - smap := datastore.Optional() - smap.Add("status_id", target_status) - err = svc.DB.Mapfixes().IfStatusThenUpdate(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusChangesRequested}, smap) + update := service_inner.NewMapfixUpdate() + update.SetStatusID(target_status) + allow_statuses := []model.MapfixStatus{model.MapfixStatusChangesRequested} + err = svc.inner.UpdateMapfixIfStatus(ctx, params.MapfixID, allow_statuses, update) if err != nil { return err } @@ -657,9 +665,10 @@ func (svc *Service) ActionMapfixResetSubmitting(ctx context.Context, params api. // transaction target_status := model.MapfixStatusUnderConstruction - smap := datastore.Optional() - smap.Add("status_id", target_status) - err = svc.DB.Mapfixes().IfStatusThenUpdate(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusSubmitting}, smap) + update := service_inner.NewMapfixUpdate() + update.SetStatusID(target_status) + allow_statuses := []model.MapfixStatus{model.MapfixStatusSubmitting} + err = svc.inner.UpdateMapfixIfStatus(ctx, params.MapfixID, allow_statuses, update) if err != nil { return err } @@ -706,9 +715,10 @@ func (svc *Service) ActionMapfixTriggerUpload(ctx context.Context, params api.Ac // transaction target_status := model.MapfixStatusUploading - smap := datastore.Optional() - smap.Add("status_id", target_status) - mapfix, err := svc.DB.Mapfixes().IfStatusThenUpdateAndGet(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusValidated}, smap) + update := service_inner.NewMapfixUpdate() + update.SetStatusID(target_status) + allow_statuses := []model.MapfixStatus{model.MapfixStatusValidated} + mapfix, err := svc.inner.UpdateAndGetMapfixIfStatus(ctx, params.MapfixID, allow_statuses, update) if err != nil { return err } @@ -776,9 +786,10 @@ func (svc *Service) ActionMapfixValidated(ctx context.Context, params api.Action // transaction target_status := model.MapfixStatusValidated - smap := datastore.Optional() - smap.Add("status_id", target_status) - err = svc.DB.Mapfixes().IfStatusThenUpdate(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusUploading}, smap) + update := service_inner.NewMapfixUpdate() + update.SetStatusID(target_status) + allow_statuses := []model.MapfixStatus{model.MapfixStatusUploading} + err = svc.inner.UpdateMapfixIfStatus(ctx, params.MapfixID, allow_statuses, update) if err != nil { return err } @@ -839,7 +850,7 @@ func (svc *Service) ActionMapfixTriggerValidate(ctx context.Context, params api. if mapfix.TargetAssetID != 0 { filter := datastore.Optional() filter.Add("target_asset_id", mapfix.TargetAssetID) - filter.Add("status_id", ActiveAcceptedMapfixStatuses) + filter.SetStatusID(ActiveAcceptedMapfixStatuses) active_mapfixes, err := svc.DB.Mapfixes().List(ctx, filter, model.Page{ Number: 1, Size: 1, @@ -854,9 +865,10 @@ func (svc *Service) ActionMapfixTriggerValidate(ctx context.Context, params api. // transaction target_status := model.MapfixStatusValidating - smap := datastore.Optional() - smap.Add("status_id", target_status) - mapfix, err = svc.DB.Mapfixes().IfStatusThenUpdateAndGet(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusSubmitted}, smap) + update := service_inner.NewMapfixUpdate() + update.SetStatusID(target_status) + allow_statuses := []model.MapfixStatus{model.MapfixStatusSubmitted} + mapfix, err = svc.inner.UpdateAndGetMapfixIfStatus(ctx, params.MapfixID, allow_statuses, update) if err != nil { return err } @@ -913,9 +925,10 @@ func (svc *Service) ActionMapfixRetryValidate(ctx context.Context, params api.Ac // transaction target_status := model.MapfixStatusValidating - smap := datastore.Optional() - smap.Add("status_id", target_status) - mapfix, err := svc.DB.Mapfixes().IfStatusThenUpdateAndGet(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusAcceptedUnvalidated}, smap) + update := service_inner.NewMapfixUpdate() + update.SetStatusID(target_status) + allow_statuses := []model.MapfixStatus{model.MapfixStatusAcceptedUnvalidated} + mapfix, err := svc.inner.UpdateAndGetMapfixIfStatus(ctx, params.MapfixID, allow_statuses, update) if err != nil { return err } @@ -982,9 +995,10 @@ func (svc *Service) ActionMapfixAccepted(ctx context.Context, params api.ActionM // transaction target_status := model.MapfixStatusAcceptedUnvalidated - smap := datastore.Optional() - smap.Add("status_id", target_status) - err = svc.DB.Mapfixes().IfStatusThenUpdate(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusValidating}, smap) + update := service_inner.NewMapfixUpdate() + update.SetStatusID(target_status) + allow_statuses := []model.MapfixStatus{model.MapfixStatusValidating} + err = svc.inner.UpdateMapfixIfStatus(ctx, params.MapfixID, allow_statuses, update) if err != nil { return err } diff --git a/pkg/service_inner/mapfixes.go b/pkg/service_inner/mapfixes.go index 7e45f6d..050cca7 100644 --- a/pkg/service_inner/mapfixes.go +++ b/pkg/service_inner/mapfixes.go @@ -110,3 +110,11 @@ func (svc *Service) GetMapfix(ctx context.Context, id int64) (model.Mapfix, erro func (svc *Service) UpdateMapfix(ctx context.Context, id int64, pmap MapfixUpdate) error { return svc.db.Mapfixes().Update(ctx, id, datastore.OptionalMap(pmap)) } + +func (svc *Service) UpdateMapfixIfStatus(ctx context.Context, id int64, statuses []model.MapfixStatus, pmap MapfixUpdate) error { + return svc.db.Mapfixes().IfStatusThenUpdate(ctx, id, statuses, datastore.OptionalMap(pmap)) +} + +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)) +} -- 2.49.1 From 6f9d93be6b114018a0a58f03efa88b0d003e9b6e Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Wed, 16 Jul 2025 18:49:53 -0700 Subject: [PATCH 23/32] rewrite MapfixFilter --- pkg/service/mapfixes.go | 91 +++++++++++++---------------------- pkg/service_inner/mapfixes.go | 49 ++++++++----------- 2 files changed, 55 insertions(+), 85 deletions(-) diff --git a/pkg/service/mapfixes.go b/pkg/service/mapfixes.go index 81fce23..fad5de4 100644 --- a/pkg/service/mapfixes.go +++ b/pkg/service/mapfixes.go @@ -60,23 +60,9 @@ func (svc *Service) CreateMapfix(ctx context.Context, request *api.MapfixTrigger // Check if user's mapfixes in the creation phase exceeds the limit { - display_name, display_name_ok := "", false - creator, creator_ok := "", false - game_id, game_id_ok := int32(0), false - submitter, submitter_ok := int64(userId), true - asset_id, asset_id_ok := int64(0), false - target_asset_id, target_asset_id_ok := int64(0), false - status_id, status_id_ok := CreationPhaseMapfixStatuses, true - - filter := service_inner.NewMapfixFilter( - display_name, display_name_ok, - creator, creator_ok, - game_id, game_id_ok, - asset_id, asset_id_ok, - submitter, submitter_ok, - target_asset_id, target_asset_id_ok, - status_id, status_id_ok, - ) + filter := service_inner.NewMapfixFilter() + filter.SetSubmitter(userId) + filter.SetStatuses(CreationPhaseMapfixStatuses) creation_mapfixes, err := svc.inner.ListMapfixes(ctx, filter, model.Page{ Number: 1, @@ -93,26 +79,10 @@ func (svc *Service) CreateMapfix(ctx context.Context, request *api.MapfixTrigger // Check if a mapfix targetting the same map exists in creation phase { - // set - submitter, submitter_ok := int64(userId), true - target_asset_id, target_asset_id_ok := request.TargetAssetID, false - status_id, status_id_ok := CreationPhaseMapfixStatuses, true - - // unset - display_name, display_name_ok := "", false - creator, creator_ok := "", false - game_id, game_id_ok := int32(0), false - asset_id, asset_id_ok := int64(0), false - - filter := service_inner.NewMapfixFilter( - display_name, display_name_ok, - creator, creator_ok, - game_id, game_id_ok, - asset_id, asset_id_ok, - submitter, submitter_ok, - target_asset_id, target_asset_id_ok, - status_id, status_id_ok, - ) + filter := service_inner.NewMapfixFilter() + filter.SetSubmitter(userId) + filter.SetTargetAssetID(uint64(request.TargetAssetID)) + filter.SetStatuses(CreationPhaseMapfixStatuses) active_mapfixes, err := svc.inner.ListMapfixes(ctx, filter, model.Page{ Number: 1, @@ -206,23 +176,30 @@ func (svc *Service) GetMapfix(ctx context.Context, params api.GetMapfixParams) ( // // GET /mapfixes func (svc *Service) ListMapfixes(ctx context.Context, params api.ListMapfixesParams) (*api.Mapfixes, error) { - display_name, display_name_ok := params.DisplayName.Get() - creator, creator_ok := params.Creator.Get() - game_id, game_id_ok := params.GameID.Get() - submitter, submitter_ok := params.Submitter.Get() - asset_id, asset_id_ok := params.AssetID.Get() - target_asset_id, target_asset_id_ok := params.TargetAssetID.Get() - status_id, status_id_ok := params.StatusID.Get() + filter := service_inner.NewMapfixFilter() - filter := service_inner.NewMapfixFilter( - display_name, display_name_ok, - creator, creator_ok, - game_id, game_id_ok, - submitter, submitter_ok, - asset_id, asset_id_ok, - target_asset_id, target_asset_id_ok, - []model.MapfixStatus{model.MapfixStatus(status_id)}, status_id_ok, - ) + if display_name, display_name_ok := params.DisplayName.Get(); display_name_ok{ + filter.SetDisplayName(display_name) + } + if creator, creator_ok := params.Creator.Get(); creator_ok{ + filter.SetCreator(creator) + } + if game_id, game_id_ok := params.GameID.Get(); game_id_ok{ + filter.SetGameID(uint32(game_id)) + } + if submitter, submitter_ok := params.Submitter.Get(); submitter_ok{ + filter.SetSubmitter(uint64(submitter)) + } + if asset_id, asset_id_ok := params.AssetID.Get(); asset_id_ok{ + filter.SetAssetID(uint64(asset_id)) + } + if target_asset_id, target_asset_id_ok := params.TargetAssetID.Get(); target_asset_id_ok{ + filter.SetTargetAssetID(uint64(target_asset_id)) + } + // TODO: make this a list of statuses + if status_id, status_id_ok := params.StatusID.Get(); status_id_ok{ + filter.SetStatuses([]model.MapfixStatus{model.MapfixStatus(status_id)}) + } sort := datastore.ListSort(params.Sort.Or(int32(datastore.ListSortDisabled))) @@ -848,10 +825,10 @@ func (svc *Service) ActionMapfixTriggerValidate(ctx context.Context, params api. // Check if an active mapfix with the same target asset id exists if mapfix.TargetAssetID != 0 { - filter := datastore.Optional() - filter.Add("target_asset_id", mapfix.TargetAssetID) - filter.SetStatusID(ActiveAcceptedMapfixStatuses) - active_mapfixes, err := svc.DB.Mapfixes().List(ctx, filter, model.Page{ + filter := service_inner.NewMapfixFilter() + filter.SetTargetAssetID(mapfix.TargetAssetID) + filter.SetStatuses(ActiveAcceptedMapfixStatuses) + active_mapfixes, err := svc.inner.ListMapfixes(ctx, filter, model.Page{ Number: 1, Size: 1, },datastore.ListSortDisabled) diff --git a/pkg/service_inner/mapfixes.go b/pkg/service_inner/mapfixes.go index 050cca7..160c7de 100644 --- a/pkg/service_inner/mapfixes.go +++ b/pkg/service_inner/mapfixes.go @@ -54,38 +54,31 @@ func (update MapfixUpdate) SetDescription(description string) { type MapfixFilter datastore.OptionalMap func NewMapfixFilter( - display_name string, display_name_ok bool, - creator string, creator_ok bool, - game_id int32, game_id_ok bool, - submitter int64, submitter_ok bool, - asset_id int64, asset_id_ok bool, - target_asset_id int64, target_asset_id_ok bool, - status_id []model.MapfixStatus, status_id_ok bool, ) MapfixFilter { filter := datastore.Optional() - if display_name_ok { - filter.Add("display_name", display_name) - } - if creator_ok { - filter.Add("creator", creator) - } - if game_id_ok { - filter.Add("game_id", game_id) - } - if submitter_ok { - filter.Add("submitter", submitter) - } - if asset_id_ok { - filter.Add("asset_id", asset_id) - } - if target_asset_id_ok { - filter.Add("target_asset_id", target_asset_id) - } - if status_id_ok { - filter.Add("status_id", status_id) - } return MapfixFilter(filter) } +func (update MapfixFilter) SetDisplayName(display_name string) { + datastore.OptionalMap(update).Add("display_name", display_name) +} +func (update MapfixFilter) SetCreator(creator string) { + datastore.OptionalMap(update).Add("creator", creator) +} +func (update MapfixFilter) SetGameID(game_id uint32) { + datastore.OptionalMap(update).Add("game_id", game_id) +} +func (update MapfixFilter) SetSubmitter(submitter uint64) { + datastore.OptionalMap(update).Add("submitter", submitter) +} +func (update MapfixFilter) SetAssetID(asset_id uint64) { + datastore.OptionalMap(update).Add("asset_id", asset_id) +} +func (update MapfixFilter) SetTargetAssetID(target_asset_id uint64) { + datastore.OptionalMap(update).Add("target_asset_id", target_asset_id) +} +func (update MapfixFilter) SetStatuses(statuses []model.MapfixStatus) { + datastore.OptionalMap(update).Add("status_id", statuses) +} func (svc *Service) CreateMapfix(ctx context.Context, script model.Mapfix) (model.Mapfix, error) { return svc.db.Mapfixes().Create(ctx, script) -- 2.49.1 From eef848250c5021490bdf3f9420f07515aaf02602 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Wed, 16 Jul 2025 19:10:45 -0700 Subject: [PATCH 24/32] extend operations --- pkg/service_inner/operations.go | 18 ++++++++++++++++-- pkg/service_internal/operations.go | 2 -- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/pkg/service_inner/operations.go b/pkg/service_inner/operations.go index 0a0b0ac..1cde8c0 100644 --- a/pkg/service_inner/operations.go +++ b/pkg/service_inner/operations.go @@ -11,15 +11,25 @@ import ( type OperationFailParams datastore.OptionalMap func NewOperationFailParams( - status_id model.OperationStatus, status_message string, ) OperationFailParams { filter := datastore.Optional() - filter.Add("status_id", status_id) + filter.Add("status_id", model.OperationStatusFailed) filter.Add("status_message", status_message) return OperationFailParams(filter) } +type OperationCompleteParams datastore.OptionalMap + +func NewOperationCompleteParams( + path string, +) OperationCompleteParams { + filter := datastore.Optional() + filter.Add("status_id", model.OperationStatusCompleted) + filter.Add("path", path) + return OperationCompleteParams(filter) +} + func (svc *Service) CreateOperation(ctx context.Context, operation model.Operation) (model.Operation, error) { return svc.db.Operations().Create(ctx, operation) } @@ -39,3 +49,7 @@ func (svc *Service) GetOperation(ctx context.Context, id int32) (model.Operation func (svc *Service) FailOperation(ctx context.Context, id int32, params OperationFailParams) error { return svc.db.Operations().Update(ctx, id, datastore.OptionalMap(params)) } + +func (svc *Service) CompleteOperation(ctx context.Context, id int32, params OperationCompleteParams) error { + return svc.db.Operations().Update(ctx, id, datastore.OptionalMap(params)) +} diff --git a/pkg/service_internal/operations.go b/pkg/service_internal/operations.go index f8d3371..2b02a92 100644 --- a/pkg/service_internal/operations.go +++ b/pkg/service_internal/operations.go @@ -4,7 +4,6 @@ import ( "context" internal "git.itzana.me/strafesnet/maps-service/pkg/internal" - "git.itzana.me/strafesnet/maps-service/pkg/model" "git.itzana.me/strafesnet/maps-service/pkg/service_inner" ) @@ -15,7 +14,6 @@ import ( // POST /operations/{OperationID}/status/operation-failed func (svc *Service) ActionOperationFailed(ctx context.Context, params internal.ActionOperationFailedParams) (error) { fail_params := service_inner.NewOperationFailParams( - model.OperationStatusFailed, params.StatusMessage, ) return svc.inner.FailOperation(ctx, params.OperationID, fail_params) -- 2.49.1 From 7951cc4d9cc4b0b56d0343fe2e6b1b822bcfdadc Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Wed, 16 Jul 2025 19:10:52 -0700 Subject: [PATCH 25/32] extend mapfixes --- pkg/service_inner/mapfixes.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkg/service_inner/mapfixes.go b/pkg/service_inner/mapfixes.go index 160c7de..bc22967 100644 --- a/pkg/service_inner/mapfixes.go +++ b/pkg/service_inner/mapfixes.go @@ -73,6 +73,9 @@ func (update MapfixFilter) SetSubmitter(submitter uint64) { func (update MapfixFilter) SetAssetID(asset_id uint64) { datastore.OptionalMap(update).Add("asset_id", asset_id) } +func (update MapfixFilter) SetAssetVersion(asset_version uint64) { + datastore.OptionalMap(update).Add("asset_version", asset_version) +} func (update MapfixFilter) SetTargetAssetID(target_asset_id uint64) { datastore.OptionalMap(update).Add("target_asset_id", target_asset_id) } -- 2.49.1 From a69b1a7b5decd1f34e582327cf7281eea10ae252 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Wed, 16 Jul 2025 19:10:33 -0700 Subject: [PATCH 26/32] mapfixes internal: use inner --- pkg/service_internal/mapfixes.go | 70 ++++++++++++++++---------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/pkg/service_internal/mapfixes.go b/pkg/service_internal/mapfixes.go index 2eef92a..bdf6bb2 100644 --- a/pkg/service_internal/mapfixes.go +++ b/pkg/service_internal/mapfixes.go @@ -8,6 +8,7 @@ import ( "git.itzana.me/strafesnet/maps-service/pkg/datastore" internal "git.itzana.me/strafesnet/maps-service/pkg/internal" "git.itzana.me/strafesnet/maps-service/pkg/model" + "git.itzana.me/strafesnet/maps-service/pkg/service_inner" ) var( @@ -38,12 +39,12 @@ func (svc *Service) UpdateMapfixValidatedModel(ctx context.Context, params inter ValidatedModelVersion := uint64(params.ValidatedModelVersion) // check if Status is ChangesRequested|Submitted|UnderConstruction - pmap := datastore.Optional() - pmap.Add("validated_asset_id", ValidatedModelID) - pmap.Add("validated_asset_version", ValidatedModelVersion) + update := service_inner.NewMapfixUpdate() + update.SetValidatedAssetID(ValidatedModelID) + update.SetValidatedAssetVersion(ValidatedModelVersion) // DO NOT reset completed when validated model is updated - // pmap.Add("completed", false) - err := svc.DB.Mapfixes().IfStatusThenUpdate(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusValidating}, pmap) + // update.Add("completed", false) + err := svc.inner.UpdateMapfixIfStatus(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusValidating}, update) if err != nil { return err } @@ -72,13 +73,14 @@ func (svc *Service) UpdateMapfixValidatedModel(ctx context.Context, params inter func (svc *Service) ActionMapfixSubmitted(ctx context.Context, params internal.ActionMapfixSubmittedParams) error { // transaction target_status := model.MapfixStatusSubmitted - smap := datastore.Optional() - smap.Add("status_id", target_status) - smap.Add("asset_version", params.ModelVersion) - smap.Add("display_name", params.DisplayName) - smap.Add("creator", params.Creator) - smap.Add("game_id", params.GameID) - err := svc.DB.Mapfixes().IfStatusThenUpdate(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusSubmitting}, smap) + update := service_inner.NewMapfixUpdate() + update.SetStatusID(target_status) + update.SetAssetVersion(uint64(params.ModelVersion)) + update.SetDisplayName(params.DisplayName) + update.SetCreator(params.Creator) + update.SetGameID(uint32(params.GameID)) + allow_statuses := []model.MapfixStatus{model.MapfixStatusSubmitting} + err := svc.inner.UpdateMapfixIfStatus(ctx, params.MapfixID, allow_statuses, update) if err != nil { return err } @@ -106,9 +108,9 @@ func (svc *Service) ActionMapfixSubmitted(ctx context.Context, params internal.A func (svc *Service) ActionMapfixRequestChanges(ctx context.Context, params internal.ActionMapfixRequestChangesParams) error { // transaction target_status := model.MapfixStatusChangesRequested - smap := datastore.Optional() - smap.Add("status_id", target_status) - err := svc.DB.Mapfixes().IfStatusThenUpdate(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusSubmitting}, smap) + update := service_inner.NewMapfixUpdate() + update.SetStatusID(target_status) + err := svc.inner.UpdateMapfixIfStatus(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusSubmitting}, update) if err != nil { return err } @@ -135,9 +137,9 @@ func (svc *Service) ActionMapfixRequestChanges(ctx context.Context, params inter // POST /mapfixes/{MapfixID}/status/validator-validated func (svc *Service) ActionMapfixValidated(ctx context.Context, params internal.ActionMapfixValidatedParams) error { // transaction - smap := datastore.Optional() - smap.Add("status_id", model.MapfixStatusValidated) - return svc.DB.Mapfixes().IfStatusThenUpdate(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusValidating}, smap) + update := service_inner.NewMapfixUpdate() + update.SetStatusID(model.MapfixStatusValidated) + return svc.inner.UpdateMapfixIfStatus(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusValidating}, update) } // ActionMapfixAccepted implements actionMapfixAccepted operation. @@ -148,9 +150,9 @@ func (svc *Service) ActionMapfixValidated(ctx context.Context, params internal.A func (svc *Service) ActionMapfixAccepted(ctx context.Context, params internal.ActionMapfixAcceptedParams) error { // transaction target_status := model.MapfixStatusAcceptedUnvalidated - smap := datastore.Optional() - smap.Add("status_id", target_status) - err := svc.DB.Mapfixes().IfStatusThenUpdate(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusValidating}, smap) + update := service_inner.NewMapfixUpdate() + update.SetStatusID(target_status) + err := svc.inner.UpdateMapfixIfStatus(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusValidating}, update) if err != nil { return err } @@ -179,9 +181,9 @@ func (svc *Service) ActionMapfixAccepted(ctx context.Context, params internal.Ac func (svc *Service) ActionMapfixUploaded(ctx context.Context, params internal.ActionMapfixUploadedParams) error { // transaction target_status := model.MapfixStatusUploaded - smap := datastore.Optional() - smap.Add("status_id", target_status) - err := svc.DB.Mapfixes().IfStatusThenUpdate(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusUploading}, smap) + update := service_inner.NewMapfixUpdate() + update.SetStatusID(target_status) + err := svc.inner.UpdateMapfixIfStatus(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusUploading}, update) if err != nil { return err } @@ -270,11 +272,11 @@ func (svc *Service) CreateMapfix(ctx context.Context, request *internal.MapfixCr // Check if an active mapfix with the same asset id exists { - filter := datastore.Optional() - filter.Add("asset_id", request.AssetID) - filter.Add("asset_version", request.AssetVersion) - filter.Add("status_id", ActiveMapfixStatuses) - active_mapfixes, err := svc.DB.Mapfixes().List(ctx, filter, model.Page{ + filter := service_inner.NewMapfixFilter() + filter.SetAssetID(AssetID) + filter.SetAssetVersion(AssetVersion) + filter.SetStatuses(ActiveMapfixStatuses) + active_mapfixes, err := svc.inner.ListMapfixes(ctx, filter, model.Page{ Number: 1, Size: 1, },datastore.ListSortDisabled) @@ -286,7 +288,7 @@ func (svc *Service) CreateMapfix(ctx context.Context, request *internal.MapfixCr } } - operation, err := svc.DB.Operations().Get(ctx, request.OperationID) + operation, err := svc.inner.GetOperation(ctx, request.OperationID) if err != nil { return nil, err } @@ -297,7 +299,7 @@ func (svc *Service) CreateMapfix(ctx context.Context, request *internal.MapfixCr return nil, ErrNotAssetOwner } - mapfix, err := svc.DB.Mapfixes().Create(ctx, model.Mapfix{ + mapfix, err := svc.inner.CreateMapfix(ctx, model.Mapfix{ ID: 0, DisplayName: request.DisplayName, Creator: request.Creator, @@ -315,10 +317,8 @@ func (svc *Service) CreateMapfix(ctx context.Context, request *internal.MapfixCr } // mark the operation as completed and provide the path - pmap := datastore.Optional() - pmap.Add("status_id", model.OperationStatusCompleted) - pmap.Add("path", fmt.Sprintf("/mapfixes/%d", mapfix.ID)) - err = svc.DB.Operations().Update(ctx, request.OperationID, pmap) + params := service_inner.NewOperationCompleteParams(fmt.Sprintf("/mapfixes/%d", mapfix.ID)) + err = svc.inner.CompleteOperation(ctx, request.OperationID, params) if err != nil { return nil, err } -- 2.49.1 From c7491ff78995a0a40eebed9a4aaae9f6be680653 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Wed, 16 Jul 2025 19:15:10 -0700 Subject: [PATCH 27/32] submissions inner --- pkg/service_inner/submissions.go | 116 +++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 pkg/service_inner/submissions.go diff --git a/pkg/service_inner/submissions.go b/pkg/service_inner/submissions.go new file mode 100644 index 0000000..96ec416 --- /dev/null +++ b/pkg/service_inner/submissions.go @@ -0,0 +1,116 @@ +package service_inner + +import ( + "context" + + "git.itzana.me/strafesnet/maps-service/pkg/datastore" + "git.itzana.me/strafesnet/maps-service/pkg/model" +) + +type SubmissionUpdate datastore.OptionalMap + +func NewSubmissionUpdate() SubmissionUpdate { + update := datastore.Optional() + return SubmissionUpdate(update) +} + +func (update SubmissionUpdate) SetDisplayName(display_name string) { + datastore.OptionalMap(update).Add("display_name", display_name) +} +func (update SubmissionUpdate) SetCreator(creator string) { + datastore.OptionalMap(update).Add("creator", creator) +} +func (update SubmissionUpdate) SetGameID(game_id uint32) { + datastore.OptionalMap(update).Add("game_id", game_id) +} +func (update SubmissionUpdate) SetSubmitter(submitter uint64) { + datastore.OptionalMap(update).Add("submitter", submitter) +} +func (update SubmissionUpdate) SetAssetID(asset_id uint64) { + datastore.OptionalMap(update).Add("asset_id", asset_id) +} +func (update SubmissionUpdate) SetAssetVersion(asset_version uint64) { + datastore.OptionalMap(update).Add("asset_version", asset_version) +} +func (update SubmissionUpdate) SetValidatedAssetID(validated_asset_id uint64) { + datastore.OptionalMap(update).Add("validated_asset_id", validated_asset_id) +} +func (update SubmissionUpdate) SetValidatedAssetVersion(validated_asset_version uint64) { + datastore.OptionalMap(update).Add("validated_asset_version", validated_asset_version) +} +func (update SubmissionUpdate) SetCompleted(completed bool) { + datastore.OptionalMap(update).Add("completed", completed) +} +func (update SubmissionUpdate) SetUploadedAssetID(uploaded_asset_id uint64) { + datastore.OptionalMap(update).Add("uploaded_asset_id", uploaded_asset_id) +} +func (update SubmissionUpdate) SetStatusID(status_id model.SubmissionStatus) { + datastore.OptionalMap(update).Add("status_id", status_id) +} +func (update SubmissionUpdate) SetDescription(description string) { + datastore.OptionalMap(update).Add("description", description) +} + +type SubmissionFilter datastore.OptionalMap + +func NewSubmissionFilter( +) SubmissionFilter { + filter := datastore.Optional() + return SubmissionFilter(filter) +} +func (update SubmissionFilter) SetDisplayName(display_name string) { + datastore.OptionalMap(update).Add("display_name", display_name) +} +func (update SubmissionFilter) SetCreator(creator string) { + datastore.OptionalMap(update).Add("creator", creator) +} +func (update SubmissionFilter) SetGameID(game_id uint32) { + datastore.OptionalMap(update).Add("game_id", game_id) +} +func (update SubmissionFilter) SetSubmitter(submitter uint64) { + datastore.OptionalMap(update).Add("submitter", submitter) +} +func (update SubmissionFilter) SetAssetID(asset_id uint64) { + datastore.OptionalMap(update).Add("asset_id", asset_id) +} +func (update SubmissionFilter) SetAssetVersion(asset_version uint64) { + datastore.OptionalMap(update).Add("asset_version", asset_version) +} +func (update SubmissionFilter) SetUploadedAssetID(uploaded_asset_id uint64) { + datastore.OptionalMap(update).Add("uploaded_asset_id", uploaded_asset_id) +} +func (update SubmissionFilter) SetStatuses(statuses []model.SubmissionStatus) { + datastore.OptionalMap(update).Add("status_id", statuses) +} + +func (svc *Service) CreateSubmission(ctx context.Context, script model.Submission) (model.Submission, error) { + return svc.db.Submissions().Create(ctx, script) +} + +func (svc *Service) ListSubmissions(ctx context.Context, filter SubmissionFilter, page model.Page, sort datastore.ListSort) ([]model.Submission, error) { + return svc.db.Submissions().List(ctx, datastore.OptionalMap(filter), page, sort) +} + +func (svc *Service) ListSubmissionsWithTotal(ctx context.Context, filter SubmissionFilter, page model.Page, sort datastore.ListSort) (int64, []model.Submission, error) { + return svc.db.Submissions().ListWithTotal(ctx, datastore.OptionalMap(filter), page, sort) +} + +func (svc *Service) DeleteSubmission(ctx context.Context, id int64) error { + return svc.db.Submissions().Delete(ctx, id) +} + +func (svc *Service) GetSubmission(ctx context.Context, id int64) (model.Submission, error) { + return svc.db.Submissions().Get(ctx, id) +} + +func (svc *Service) UpdateSubmission(ctx context.Context, id int64, pmap SubmissionUpdate) error { + return svc.db.Submissions().Update(ctx, id, datastore.OptionalMap(pmap)) +} + +func (svc *Service) UpdateSubmissionIfStatus(ctx context.Context, id int64, statuses []model.SubmissionStatus, pmap SubmissionUpdate) error { + return svc.db.Submissions().IfStatusThenUpdate(ctx, id, statuses, datastore.OptionalMap(pmap)) +} + +func (svc *Service) UpdateAndGetSubmissionIfStatus(ctx context.Context, id int64, statuses []model.SubmissionStatus, pmap SubmissionUpdate) (model.Submission, error) { + return svc.db.Submissions().IfStatusThenUpdateAndGet(ctx, id, statuses, datastore.OptionalMap(pmap)) +} -- 2.49.1 From 79d6dc84d9df09a06fdc0045754d3dae50344a6b Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Wed, 16 Jul 2025 19:18:46 -0700 Subject: [PATCH 28/32] rename --- pkg/service_inner/{nats.go => nats_mapfix.go} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename pkg/service_inner/{nats.go => nats_mapfix.go} (100%) diff --git a/pkg/service_inner/nats.go b/pkg/service_inner/nats_mapfix.go similarity index 100% rename from pkg/service_inner/nats.go rename to pkg/service_inner/nats_mapfix.go -- 2.49.1 From fd280efde8e725ae05dfd4776da566134e2bdf97 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Wed, 16 Jul 2025 19:29:35 -0700 Subject: [PATCH 29/32] submissions nats --- pkg/service/submissions.go | 136 +++++++++------------------ pkg/service_inner/nats_submission.go | 120 +++++++++++++++++++++++ 2 files changed, 162 insertions(+), 94 deletions(-) create mode 100644 pkg/service_inner/nats_submission.go diff --git a/pkg/service/submissions.go b/pkg/service/submissions.go index 493041c..9d51176 100644 --- a/pkg/service/submissions.go +++ b/pkg/service/submissions.go @@ -101,22 +101,15 @@ func (svc *Service) CreateSubmission(ctx context.Context, request *api.Submissio return nil, err } - create_request := model.CreateSubmissionRequest{ - OperationID: operation.ID, - ModelID: ModelID, - DisplayName: request.DisplayName, - Creator: request.Creator, - GameID: uint32(request.GameID), - Status: uint32(model.SubmissionStatusUnderConstruction), - Roles: uint32(RolesEmpty), - } - - j, err := json.Marshal(create_request) - if err != nil { - return nil, err - } - - _, err = svc.Nats.Publish("maptest.submissions.create", []byte(j)) + err = svc.inner.NatsCreateSubmission( + operation.ID, + ModelID, + request.DisplayName, + request.Creator, + uint32(request.GameID), + uint32(model.SubmissionStatusUnderConstruction), + uint32(RolesEmpty), + ) if err != nil { return nil, err } @@ -177,22 +170,15 @@ func (svc *Service) CreateSubmissionAdmin(ctx context.Context, request *api.Subm return nil, err } - create_request := model.CreateSubmissionRequest{ - OperationID: operation.ID, - ModelID: ModelID, - DisplayName: request.DisplayName, - Creator: request.Creator, - GameID: uint32(request.GameID), - Status: uint32(model.SubmissionStatusChangesRequested), - Roles: uint32(roles), - } - - j, err := json.Marshal(create_request) - if err != nil { - return nil, err - } - - _, err = svc.Nats.Publish("maptest.submissions.create", []byte(j)) + err = svc.inner.NatsCreateSubmission( + operation.ID, + ModelID, + request.DisplayName, + request.Creator, + uint32(request.GameID), + uint32(model.SubmissionStatusChangesRequested), + uint32(roles), + ) if err != nil { return nil, err } @@ -649,18 +635,11 @@ func (svc *Service) ActionSubmissionTriggerSubmitUnchecked(ctx context.Context, return err } - validate_request := model.CheckSubmissionRequest{ - SubmissionID: submission.ID, - ModelID: submission.AssetID, - SkipChecks: true, - } - - j, err := json.Marshal(validate_request) - if err != nil { - return err - } - - _, err = svc.Nats.Publish("maptest.submissions.check", []byte(j)) + err = svc.inner.NatsCheckSubmission( + submission.ID, + submission.AssetID, + true, + ) if err != nil { return err } @@ -773,20 +752,13 @@ func (svc *Service) ActionSubmissionTriggerUpload(ctx context.Context, params ap // sentinel value because we are not using rust if submission.UploadedAssetID == 0 { // this is a new map - upload_new_request := model.UploadSubmissionRequest{ - SubmissionID: submission.ID, - ModelID: submission.ValidatedAssetID, - ModelVersion: submission.ValidatedAssetVersion, - // upload as displayname, whatever - ModelName: submission.DisplayName, - } - - j, err := json.Marshal(upload_new_request) - if err != nil { - return err - } - - _, err = svc.Nats.Publish("maptest.submissions.upload", []byte(j)) + err = svc.inner.NatsUploadSubmission( + submission.ID, + submission.ValidatedAssetID, + submission.ValidatedAssetVersion, + // upload ModelName as displayname, whatever + submission.DisplayName, + ) if err != nil { return err } @@ -915,24 +887,12 @@ func (svc *Service) ActionSubmissionTriggerValidate(ctx context.Context, params return err } - validate_request := model.ValidateSubmissionRequest{ - SubmissionID: submission.ID, - ModelID: submission.AssetID, - ModelVersion: submission.AssetVersion, - ValidatedModelID: nil, - } - - // sentinel values because we're not using rust - if submission.ValidatedAssetID != 0 { - validate_request.ValidatedModelID = &submission.ValidatedAssetID - } - - j, err := json.Marshal(validate_request) - if err != nil { - return err - } - - _, err = svc.Nats.Publish("maptest.submissions.validate", []byte(j)) + err = svc.inner.NatsValidateSubmission( + submission.ID, + submission.AssetID, + submission.AssetVersion, + submission.ValidatedAssetID, + ) if err != nil { return err } @@ -986,24 +946,12 @@ func (svc *Service) ActionSubmissionRetryValidate(ctx context.Context, params ap return err } - validate_request := model.ValidateSubmissionRequest{ - SubmissionID: submission.ID, - ModelID: submission.AssetID, - ModelVersion: submission.AssetVersion, - ValidatedModelID: nil, - } - - // sentinel values because we're not using rust - if submission.ValidatedAssetID != 0 { - validate_request.ValidatedModelID = &submission.ValidatedAssetID - } - - j, err := json.Marshal(validate_request) - if err != nil { - return err - } - - _, err = svc.Nats.Publish("maptest.submissions.validate", []byte(j)) + err = svc.inner.NatsValidateSubmission( + submission.ID, + submission.AssetID, + submission.AssetVersion, + submission.ValidatedAssetID, + ) if err != nil { return err } diff --git a/pkg/service_inner/nats_submission.go b/pkg/service_inner/nats_submission.go new file mode 100644 index 0000000..f00c700 --- /dev/null +++ b/pkg/service_inner/nats_submission.go @@ -0,0 +1,120 @@ +package service_inner + +import ( + "encoding/json" + + "git.itzana.me/strafesnet/maps-service/pkg/model" +) + +func (svc *Service) NatsCreateSubmission( + OperationID int32, + ModelID uint64, + DisplayName string, + Creator string, + GameID uint32, + Status uint32, + Roles uint32, +) error { + create_request := model.CreateSubmissionRequest{ + OperationID: OperationID, + ModelID: ModelID, + DisplayName: DisplayName, + Creator: Creator, + GameID: GameID, + Status: Status, + Roles: Roles, + } + + j, err := json.Marshal(create_request) + if err != nil { + return err + } + + _, err = svc.nats.Publish("maptest.submissions.create", []byte(j)) + if err != nil { + return err + } + + return nil +} + +func (svc *Service) NatsCheckSubmission( + SubmissionID int64, + ModelID uint64, + SkipChecks bool, +) error { + validate_request := model.CheckSubmissionRequest{ + SubmissionID: SubmissionID, + ModelID: ModelID, + SkipChecks: SkipChecks, + } + + j, err := json.Marshal(validate_request) + if err != nil { + return err + } + + _, err = svc.nats.Publish("maptest.submissions.check", []byte(j)) + if err != nil { + return err + } + + return nil +} + +func (svc *Service) NatsUploadSubmission( + SubmissionID int64, + ModelID uint64, + ModelVersion uint64, + ModelName string, +) error { + upload_new_request := model.UploadSubmissionRequest{ + SubmissionID: SubmissionID, + ModelID: ModelID, + ModelVersion: ModelVersion, + ModelName: ModelName, + } + + j, err := json.Marshal(upload_new_request) + if err != nil { + return err + } + + _, err = svc.nats.Publish("maptest.submissions.upload", []byte(j)) + if err != nil { + return err + } + + return nil +} + +func (svc *Service) NatsValidateSubmission( + SubmissionID int64, + ModelID uint64, + ModelVersion uint64, + ValidatedModelID uint64, +) error { + validate_request := model.ValidateSubmissionRequest{ + SubmissionID: SubmissionID, + ModelID: ModelID, + ModelVersion: ModelVersion, + ValidatedModelID: nil, + } + + // sentinel values because we're not using rust + if ValidatedModelID != 0 { + validate_request.ValidatedModelID = &ValidatedModelID + } + + j, err := json.Marshal(validate_request) + if err != nil { + return err + } + + _, err = svc.nats.Publish("maptest.submissions.validate", []byte(j)) + if err != nil { + return err + } + + return nil +} -- 2.49.1 From af1d2c37985cf060fcc311673f874106d05c6fb1 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Wed, 16 Jul 2025 19:49:22 -0700 Subject: [PATCH 30/32] done --- pkg/service/submissions.go | 199 ++++++++++++++-------------- pkg/service_inner/submissions.go | 4 + pkg/service_internal/submissions.go | 77 ++++++----- 3 files changed, 146 insertions(+), 134 deletions(-) diff --git a/pkg/service/submissions.go b/pkg/service/submissions.go index 9d51176..b1e19c2 100644 --- a/pkg/service/submissions.go +++ b/pkg/service/submissions.go @@ -2,16 +2,15 @@ package service import ( "context" - "encoding/json" "errors" "fmt" "io" "time" - "git.itzana.me/strafesnet/go-grpc/maps" "git.itzana.me/strafesnet/maps-service/pkg/api" "git.itzana.me/strafesnet/maps-service/pkg/datastore" "git.itzana.me/strafesnet/maps-service/pkg/model" + "git.itzana.me/strafesnet/maps-service/pkg/service_inner" ) var( @@ -62,10 +61,10 @@ func (svc *Service) CreateSubmission(ctx context.Context, request *api.Submissio // Check if user's submissions in the creation phase exceeds the limit { - filter := datastore.Optional() - filter.Add("submitter", int64(userId)) - filter.Add("status_id", CreationPhaseSubmissionStatuses) - creation_submissions, err := svc.DB.Submissions().List(ctx, filter, model.Page{ + filter := service_inner.NewSubmissionFilter() + filter.SetSubmitter(userId) + filter.SetStatuses(CreationPhaseSubmissionStatuses) + creation_submissions, err := svc.inner.ListSubmissions(ctx, filter, model.Page{ Number: 1, Size: int32(CreationPhaseSubmissionsLimit), },datastore.ListSortDisabled) @@ -80,7 +79,7 @@ func (svc *Service) CreateSubmission(ctx context.Context, request *api.Submissio // Check if too many operations have been created recently { - count, err := svc.DB.Operations().CountSince(ctx, + count, err := svc.inner.CountOperationsSince(ctx, int64(userId), time.Now().Add(-CreateSubmissionRecencyWindow), ) @@ -93,7 +92,7 @@ func (svc *Service) CreateSubmission(ctx context.Context, request *api.Submissio } } - operation, err := svc.DB.Operations().Create(ctx, model.Operation{ + operation, err := svc.inner.CreateOperation(ctx, model.Operation{ Owner: userId, StatusID: model.OperationStatusCreated, }) @@ -149,7 +148,7 @@ func (svc *Service) CreateSubmissionAdmin(ctx context.Context, request *api.Subm // Check if too many operations have been created recently { - count, err := svc.DB.Operations().CountSince(ctx, + count, err := svc.inner.CountOperationsSince(ctx, int64(userId), time.Now().Add(-CreateSubmissionRecencyWindow), ) @@ -162,7 +161,7 @@ func (svc *Service) CreateSubmissionAdmin(ctx context.Context, request *api.Subm } } - operation, err := svc.DB.Operations().Create(ctx, model.Operation{ + operation, err := svc.inner.CreateOperation(ctx, model.Operation{ Owner: userId, StatusID: model.OperationStatusCreated, }) @@ -194,7 +193,7 @@ func (svc *Service) CreateSubmissionAdmin(ctx context.Context, request *api.Subm // // GET /submissions/{SubmissionID} func (svc *Service) GetSubmission(ctx context.Context, params api.GetSubmissionParams) (*api.Submission, error) { - submission, err := svc.DB.Submissions().Get(ctx, params.SubmissionID) + submission, err := svc.inner.GetSubmission(ctx, params.SubmissionID) if err != nil { return nil, err } @@ -220,33 +219,33 @@ func (svc *Service) GetSubmission(ctx context.Context, params api.GetSubmissionP // // GET /submissions func (svc *Service) ListSubmissions(ctx context.Context, params api.ListSubmissionsParams) (*api.Submissions, error) { - filter := datastore.Optional() + filter := service_inner.NewSubmissionFilter() - if params.DisplayName.IsSet(){ - filter.Add("display_name", params.DisplayName.Value) + if display_name, display_name_ok := params.DisplayName.Get(); display_name_ok{ + filter.SetDisplayName(display_name) } - if params.Creator.IsSet(){ - filter.Add("creator", params.Creator.Value) + if creator, creator_ok := params.Creator.Get(); creator_ok{ + filter.SetCreator(creator) } - if params.GameID.IsSet(){ - filter.Add("game_id", params.GameID.Value) + if game_id, game_id_ok := params.GameID.Get(); game_id_ok{ + filter.SetGameID(uint32(game_id)) } - if params.Submitter.IsSet(){ - filter.Add("submitter", params.Submitter.Value) + if submitter, submitter_ok := params.Submitter.Get(); submitter_ok{ + filter.SetSubmitter(uint64(submitter)) } - if params.AssetID.IsSet(){ - filter.Add("asset_id", params.AssetID.Value) + if asset_id, asset_id_ok := params.AssetID.Get(); asset_id_ok{ + filter.SetAssetID(uint64(asset_id)) } - if params.UploadedAssetID.IsSet(){ - filter.Add("uploaded_asset_id", params.UploadedAssetID.Value) + if uploaded_asset_id, uploaded_asset_id_ok := params.UploadedAssetID.Get(); uploaded_asset_id_ok{ + filter.SetUploadedAssetID(uint64(uploaded_asset_id)) } - if params.StatusID.IsSet(){ - filter.Add("status_id", params.StatusID.Value) + if status_id, status_id_ok := params.StatusID.Get(); status_id_ok{ + filter.SetStatuses([]model.SubmissionStatus{model.SubmissionStatus(status_id)}) } sort := datastore.ListSort(params.Sort.Or(int32(datastore.ListSortDisabled))) - total, items, err := svc.DB.Submissions().ListWithTotal(ctx, filter, model.Page{ + total, items, err := svc.inner.ListSubmissionsWithTotal(ctx, filter, model.Page{ Number: params.Page, Size: params.Limit, },sort) @@ -296,9 +295,9 @@ func (svc *Service) SetSubmissionCompleted(ctx context.Context, params api.SetSu return ErrPermissionDeniedNeedRoleMaptest } - pmap := datastore.Optional() - pmap.Add("completed", true) - return svc.DB.Submissions().Update(ctx, params.SubmissionID, pmap) + update := service_inner.NewSubmissionUpdate() + update.SetCompleted(true) + return svc.inner.UpdateSubmission(ctx, params.SubmissionID, update) } // UpdateSubmissionModel implements patchSubmissionModel operation. @@ -313,7 +312,7 @@ func (svc *Service) UpdateSubmissionModel(ctx context.Context, params api.Update } // read submission (this could be done with a transaction WHERE clause) - submission, err := svc.DB.Submissions().Get(ctx, params.SubmissionID) + submission, err := svc.inner.GetSubmission(ctx, params.SubmissionID) if err != nil { return err } @@ -335,12 +334,12 @@ func (svc *Service) UpdateSubmissionModel(ctx context.Context, params api.Update NewModelVersion := uint64(params.ModelVersion) // check if Status is ChangesRequested|Submitted|UnderConstruction - pmap := datastore.Optional() - pmap.Add("asset_id", NewModelID) - pmap.Add("asset_version", NewModelVersion) + update := service_inner.NewSubmissionUpdate() + update.SetAssetID(NewModelID) + update.SetAssetVersion(NewModelVersion) //always reset completed when model changes - pmap.Add("completed", false) - err = svc.DB.Submissions().IfStatusThenUpdate(ctx, params.SubmissionID, []model.SubmissionStatus{model.SubmissionStatusChangesRequested, model.SubmissionStatusUnderConstruction}, pmap) + update.SetCompleted(false) + err = svc.inner.UpdateSubmissionIfStatus(ctx, params.SubmissionID, []model.SubmissionStatus{model.SubmissionStatusChangesRequested, model.SubmissionStatusUnderConstruction}, update) if err != nil { return err } @@ -390,9 +389,10 @@ func (svc *Service) ActionSubmissionReject(ctx context.Context, params api.Actio // transaction target_status := model.SubmissionStatusRejected - smap := datastore.Optional() - smap.Add("status_id", target_status) - err = svc.DB.Submissions().IfStatusThenUpdate(ctx, params.SubmissionID, []model.SubmissionStatus{model.SubmissionStatusSubmitted}, smap) + update := service_inner.NewSubmissionUpdate() + update.SetStatusID(target_status) + allowed_statuses := []model.SubmissionStatus{model.SubmissionStatusSubmitted} + err = svc.inner.UpdateSubmissionIfStatus(ctx, params.SubmissionID, allowed_statuses, update) if err != nil { return err } @@ -439,9 +439,10 @@ func (svc *Service) ActionSubmissionRequestChanges(ctx context.Context, params a // transaction target_status := model.SubmissionStatusChangesRequested - smap := datastore.Optional() - smap.Add("status_id", target_status) - err = svc.DB.Submissions().IfStatusThenUpdate(ctx, params.SubmissionID, []model.SubmissionStatus{model.SubmissionStatusValidated, model.SubmissionStatusAcceptedUnvalidated, model.SubmissionStatusSubmitted}, smap) + update := service_inner.NewSubmissionUpdate() + update.SetStatusID(target_status) + allowed_statuses := []model.SubmissionStatus{model.SubmissionStatusValidated, model.SubmissionStatusAcceptedUnvalidated, model.SubmissionStatusSubmitted} + err = svc.inner.UpdateSubmissionIfStatus(ctx, params.SubmissionID, allowed_statuses, update) if err != nil { return err } @@ -473,7 +474,7 @@ func (svc *Service) ActionSubmissionRevoke(ctx context.Context, params api.Actio } // read submission (this could be done with a transaction WHERE clause) - submission, err := svc.DB.Submissions().Get(ctx, params.SubmissionID) + submission, err := svc.inner.GetSubmission(ctx, params.SubmissionID) if err != nil { return err } @@ -491,9 +492,10 @@ func (svc *Service) ActionSubmissionRevoke(ctx context.Context, params api.Actio // transaction target_status := model.SubmissionStatusUnderConstruction - smap := datastore.Optional() - smap.Add("status_id", target_status) - err = svc.DB.Submissions().IfStatusThenUpdate(ctx, params.SubmissionID, []model.SubmissionStatus{model.SubmissionStatusSubmitted, model.SubmissionStatusChangesRequested}, smap) + update := service_inner.NewSubmissionUpdate() + update.SetStatusID(target_status) + allowed_statuses := []model.SubmissionStatus{model.SubmissionStatusSubmitted, model.SubmissionStatusChangesRequested} + err = svc.inner.UpdateSubmissionIfStatus(ctx, params.SubmissionID, allowed_statuses, update) if err != nil { return err } @@ -525,7 +527,7 @@ func (svc *Service) ActionSubmissionTriggerSubmit(ctx context.Context, params ap } // read submission (this could be done with a transaction WHERE clause) - submission, err := svc.DB.Submissions().Get(ctx, params.SubmissionID) + submission, err := svc.inner.GetSubmission(ctx, params.SubmissionID) if err != nil { return err } @@ -551,25 +553,19 @@ func (svc *Service) ActionSubmissionTriggerSubmit(ctx context.Context, params ap // transaction target_status := model.SubmissionStatusSubmitting - smap := datastore.Optional() - smap.Add("status_id", target_status) - err = svc.DB.Submissions().IfStatusThenUpdate(ctx, params.SubmissionID, []model.SubmissionStatus{model.SubmissionStatusUnderConstruction, model.SubmissionStatusChangesRequested}, smap) + update := service_inner.NewSubmissionUpdate() + update.SetStatusID(target_status) + allowed_statuses := []model.SubmissionStatus{model.SubmissionStatusUnderConstruction, model.SubmissionStatusChangesRequested} + err = svc.inner.UpdateSubmissionIfStatus(ctx, params.SubmissionID, allowed_statuses, update) if err != nil { return err } - validate_request := model.CheckSubmissionRequest{ - SubmissionID: submission.ID, - ModelID: submission.AssetID, - SkipChecks: false, - } - - j, err := json.Marshal(validate_request) - if err != nil { - return err - } - - _, err = svc.Nats.Publish("maptest.submissions.check", []byte(j)) + err = svc.inner.NatsCheckSubmission( + submission.ID, + submission.AssetID, + false, + ) if err != nil { return err } @@ -601,7 +597,7 @@ func (svc *Service) ActionSubmissionTriggerSubmitUnchecked(ctx context.Context, } // read submission (this could be done with a transaction WHERE clause) - submission, err := svc.DB.Submissions().Get(ctx, params.SubmissionID) + submission, err := svc.inner.GetSubmission(ctx, params.SubmissionID) if err != nil { return err } @@ -628,9 +624,10 @@ func (svc *Service) ActionSubmissionTriggerSubmitUnchecked(ctx context.Context, // transaction target_status := model.SubmissionStatusSubmitting - smap := datastore.Optional() - smap.Add("status_id", target_status) - err = svc.DB.Submissions().IfStatusThenUpdate(ctx, params.SubmissionID, []model.SubmissionStatus{model.SubmissionStatusChangesRequested}, smap) + update := service_inner.NewSubmissionUpdate() + update.SetStatusID(target_status) + allowed_statuses := []model.SubmissionStatus{model.SubmissionStatusChangesRequested} + err = svc.inner.UpdateSubmissionIfStatus(ctx, params.SubmissionID, allowed_statuses, update) if err != nil { return err } @@ -676,7 +673,7 @@ func (svc *Service) ActionSubmissionResetSubmitting(ctx context.Context, params } // check when submission was updated - submission, err := svc.DB.Submissions().Get(ctx, params.SubmissionID) + submission, err := svc.inner.GetSubmission(ctx, params.SubmissionID) if err != nil { return err } @@ -693,9 +690,10 @@ func (svc *Service) ActionSubmissionResetSubmitting(ctx context.Context, params // transaction target_status := model.SubmissionStatusUnderConstruction - smap := datastore.Optional() - smap.Add("status_id", target_status) - err = svc.DB.Submissions().IfStatusThenUpdate(ctx, params.SubmissionID, []model.SubmissionStatus{model.SubmissionStatusSubmitting}, smap) + update := service_inner.NewSubmissionUpdate() + update.SetStatusID(target_status) + allowed_statuses := []model.SubmissionStatus{model.SubmissionStatusSubmitting} + err = svc.inner.UpdateSubmissionIfStatus(ctx, params.SubmissionID, allowed_statuses, update) if err != nil { return err } @@ -742,9 +740,10 @@ func (svc *Service) ActionSubmissionTriggerUpload(ctx context.Context, params ap // transaction target_status := model.SubmissionStatusUploading - smap := datastore.Optional() - smap.Add("status_id", target_status) - submission, err := svc.DB.Submissions().IfStatusThenUpdateAndGet(ctx, params.SubmissionID, []model.SubmissionStatus{model.SubmissionStatusValidated}, smap) + update := service_inner.NewSubmissionUpdate() + update.SetStatusID(target_status) + allowed_statuses := []model.SubmissionStatus{model.SubmissionStatusValidated} + submission, err := svc.inner.UpdateAndGetSubmissionIfStatus(ctx, params.SubmissionID, allowed_statuses, update) if err != nil { return err } @@ -808,7 +807,7 @@ func (svc *Service) ActionSubmissionValidated(ctx context.Context, params api.Ac } // check when submission was updated - submission, err := svc.DB.Submissions().Get(ctx, params.SubmissionID) + submission, err := svc.inner.GetSubmission(ctx, params.SubmissionID) if err != nil { return err } @@ -819,9 +818,10 @@ func (svc *Service) ActionSubmissionValidated(ctx context.Context, params api.Ac // transaction target_status := model.SubmissionStatusValidated - smap := datastore.Optional() - smap.Add("status_id", target_status) - err = svc.DB.Submissions().IfStatusThenUpdate(ctx, params.SubmissionID, []model.SubmissionStatus{model.SubmissionStatusUploading}, smap) + update := service_inner.NewSubmissionUpdate() + update.SetStatusID(target_status) + allowed_statuses := []model.SubmissionStatus{model.SubmissionStatusUploading} + err = svc.inner.UpdateSubmissionIfStatus(ctx, params.SubmissionID, allowed_statuses, update) if err != nil { return err } @@ -862,7 +862,7 @@ func (svc *Service) ActionSubmissionTriggerValidate(ctx context.Context, params } // read submission (this could be done with a transaction WHERE clause) - submission, err := svc.DB.Submissions().Get(ctx, params.SubmissionID) + submission, err := svc.inner.GetSubmission(ctx, params.SubmissionID) if err != nil { return err } @@ -880,9 +880,10 @@ func (svc *Service) ActionSubmissionTriggerValidate(ctx context.Context, params // transaction target_status := model.SubmissionStatusValidating - smap := datastore.Optional() - smap.Add("status_id", target_status) - submission, err = svc.DB.Submissions().IfStatusThenUpdateAndGet(ctx, params.SubmissionID, []model.SubmissionStatus{model.SubmissionStatusSubmitted}, smap) + update := service_inner.NewSubmissionUpdate() + update.SetStatusID(target_status) + allowed_statuses := []model.SubmissionStatus{model.SubmissionStatusSubmitted} + submission, err = svc.inner.UpdateAndGetSubmissionIfStatus(ctx, params.SubmissionID, allowed_statuses, update) if err != nil { return err } @@ -939,9 +940,10 @@ func (svc *Service) ActionSubmissionRetryValidate(ctx context.Context, params ap // transaction target_status := model.SubmissionStatusValidating - smap := datastore.Optional() - smap.Add("status_id", target_status) - submission, err := svc.DB.Submissions().IfStatusThenUpdateAndGet(ctx, params.SubmissionID, []model.SubmissionStatus{model.SubmissionStatusAcceptedUnvalidated}, smap) + update := service_inner.NewSubmissionUpdate() + update.SetStatusID(target_status) + allowed_statuses := []model.SubmissionStatus{model.SubmissionStatusAcceptedUnvalidated} + submission, err := svc.inner.UpdateAndGetSubmissionIfStatus(ctx, params.SubmissionID, allowed_statuses, update) if err != nil { return err } @@ -997,7 +999,7 @@ func (svc *Service) ActionSubmissionAccepted(ctx context.Context, params api.Act } // check when submission was updated - submission, err := svc.DB.Submissions().Get(ctx, params.SubmissionID) + submission, err := svc.inner.GetSubmission(ctx, params.SubmissionID) if err != nil { return err } @@ -1008,9 +1010,10 @@ func (svc *Service) ActionSubmissionAccepted(ctx context.Context, params api.Act // transaction target_status := model.SubmissionStatusAcceptedUnvalidated - smap := datastore.Optional() - smap.Add("status_id", target_status) - err = svc.DB.Submissions().IfStatusThenUpdate(ctx, params.SubmissionID, []model.SubmissionStatus{model.SubmissionStatusValidating}, smap) + update := service_inner.NewSubmissionUpdate() + update.SetStatusID(target_status) + allowed_statuses := []model.SubmissionStatus{model.SubmissionStatusValidating} + err = svc.inner.UpdateSubmissionIfStatus(ctx, params.SubmissionID, allowed_statuses, update) if err != nil { return err } @@ -1056,7 +1059,7 @@ func (svc *Service) ReleaseSubmissions(ctx context.Context, request []api.Releas } // fetch submissions - submissions, err := svc.DB.Submissions().GetList(ctx, idList) + submissions, err := svc.inner.GetSubmissionList(ctx, idList) if err != nil { return err } @@ -1075,21 +1078,21 @@ func (svc *Service) ReleaseSubmissions(ctx context.Context, request []api.Releas date := request[i].Date.Unix() var GameID = int32(submission.GameID) // create each map with go-grpc - _, err := svc.Maps.Create(ctx, &maps.MapRequest{ + _, err := svc.inner.CreateMap(ctx, model.Map{ ID: int64(submission.UploadedAssetID), - DisplayName: &submission.DisplayName, - Creator: &submission.Creator, - GameID: &GameID, - Date: &date, + DisplayName: submission.DisplayName, + Creator: submission.Creator, + GameID: GameID, + Date: time.Unix(date, 0), }) if err != nil { return err } // update each status to Released - smap := datastore.Optional() - smap.Add("status_id", model.SubmissionStatusReleased) - err = svc.DB.Submissions().IfStatusThenUpdate(ctx, submission.ID, []model.SubmissionStatus{model.SubmissionStatusUploaded}, smap) + update := service_inner.NewSubmissionUpdate() + update.SetStatusID(model.SubmissionStatusReleased) + err = svc.inner.UpdateSubmissionIfStatus(ctx, submission.ID, []model.SubmissionStatus{model.SubmissionStatusUploaded}, update) if err != nil { return err } @@ -1121,7 +1124,7 @@ func (svc *Service) CreateSubmissionAuditComment(ctx context.Context, req api.Cr if !has_role { // Submitter has special permission to comment on their submission - submission, err := svc.DB.Submissions().Get(ctx, params.SubmissionID) + submission, err := svc.inner.GetSubmission(ctx, params.SubmissionID) if err != nil { return err } diff --git a/pkg/service_inner/submissions.go b/pkg/service_inner/submissions.go index 96ec416..915ab07 100644 --- a/pkg/service_inner/submissions.go +++ b/pkg/service_inner/submissions.go @@ -103,6 +103,10 @@ func (svc *Service) GetSubmission(ctx context.Context, id int64) (model.Submissi return svc.db.Submissions().Get(ctx, id) } +func (svc *Service) GetSubmissionList(ctx context.Context, ids []int64) ([]model.Submission, error) { + return svc.db.Submissions().GetList(ctx, ids) +} + func (svc *Service) UpdateSubmission(ctx context.Context, id int64, pmap SubmissionUpdate) error { return svc.db.Submissions().Update(ctx, id, datastore.OptionalMap(pmap)) } diff --git a/pkg/service_internal/submissions.go b/pkg/service_internal/submissions.go index 435baf6..5e422b0 100644 --- a/pkg/service_internal/submissions.go +++ b/pkg/service_internal/submissions.go @@ -9,6 +9,7 @@ import ( internal "git.itzana.me/strafesnet/maps-service/pkg/internal" "git.itzana.me/strafesnet/maps-service/pkg/model" "git.itzana.me/strafesnet/maps-service/pkg/service" + "git.itzana.me/strafesnet/maps-service/pkg/service_inner" ) var( @@ -38,12 +39,13 @@ func (svc *Service) UpdateSubmissionValidatedModel(ctx context.Context, params i ValidatedModelVersion := uint64(params.ValidatedModelVersion) // check if Status is ChangesRequested|Submitted|UnderConstruction - pmap := datastore.Optional() - pmap.Add("validated_asset_id", ValidatedModelID) - pmap.Add("validated_asset_version", ValidatedModelVersion) + update := service_inner.NewSubmissionUpdate() + update.SetValidatedAssetID(ValidatedModelID) + update.SetValidatedAssetVersion(ValidatedModelVersion) // DO NOT reset completed when validated model is updated - // pmap.Add("completed", false) - err := svc.DB.Submissions().IfStatusThenUpdate(ctx, params.SubmissionID, []model.SubmissionStatus{model.SubmissionStatusValidating}, pmap) + // update.Add("completed", false) + allowed_statuses := []model.SubmissionStatus{model.SubmissionStatusValidating} + err := svc.inner.UpdateSubmissionIfStatus(ctx, params.SubmissionID, allowed_statuses, update) if err != nil { return err } @@ -72,13 +74,14 @@ func (svc *Service) UpdateSubmissionValidatedModel(ctx context.Context, params i func (svc *Service) ActionSubmissionSubmitted(ctx context.Context, params internal.ActionSubmissionSubmittedParams) error { // transaction target_status := model.SubmissionStatusSubmitted - smap := datastore.Optional() - smap.Add("status_id", target_status) - smap.Add("asset_version", params.ModelVersion) - smap.Add("display_name", params.DisplayName) - smap.Add("creator", params.Creator) - smap.Add("game_id", params.GameID) - err := svc.DB.Submissions().IfStatusThenUpdate(ctx, params.SubmissionID, []model.SubmissionStatus{model.SubmissionStatusSubmitting}, smap) + update := service_inner.NewSubmissionUpdate() + update.SetStatusID(target_status) + update.SetAssetVersion(uint64(params.ModelVersion)) + update.SetDisplayName(params.DisplayName) + update.SetCreator(params.Creator) + update.SetGameID(uint32(params.GameID)) + allowed_statuses := []model.SubmissionStatus{model.SubmissionStatusSubmitting} + err := svc.inner.UpdateSubmissionIfStatus(ctx, params.SubmissionID, allowed_statuses, update) if err != nil { return err } @@ -106,9 +109,10 @@ func (svc *Service) ActionSubmissionSubmitted(ctx context.Context, params intern func (svc *Service) ActionSubmissionRequestChanges(ctx context.Context, params internal.ActionSubmissionRequestChangesParams) error { // transaction target_status := model.SubmissionStatusChangesRequested - smap := datastore.Optional() - smap.Add("status_id", target_status) - err := svc.DB.Submissions().IfStatusThenUpdate(ctx, params.SubmissionID, []model.SubmissionStatus{model.SubmissionStatusSubmitting}, smap) + update := service_inner.NewSubmissionUpdate() + update.SetStatusID(target_status) + allowed_statuses :=[]model.SubmissionStatus{model.SubmissionStatusSubmitting} + err := svc.inner.UpdateSubmissionIfStatus(ctx, params.SubmissionID, allowed_statuses, update) if err != nil { return err } @@ -137,9 +141,10 @@ func (svc *Service) ActionSubmissionRequestChanges(ctx context.Context, params i func (svc *Service) ActionSubmissionValidated(ctx context.Context, params internal.ActionSubmissionValidatedParams) error { // transaction target_status := model.SubmissionStatusValidated - smap := datastore.Optional() - smap.Add("status_id", target_status) - err := svc.DB.Submissions().IfStatusThenUpdate(ctx, params.SubmissionID, []model.SubmissionStatus{model.SubmissionStatusValidating}, smap) + update := service_inner.NewSubmissionUpdate() + update.SetStatusID(target_status) + allowed_statuses :=[]model.SubmissionStatus{model.SubmissionStatusValidating} + err := svc.inner.UpdateSubmissionIfStatus(ctx, params.SubmissionID, allowed_statuses, update) if err != nil { return err } @@ -167,9 +172,10 @@ func (svc *Service) ActionSubmissionValidated(ctx context.Context, params intern func (svc *Service) ActionSubmissionAccepted(ctx context.Context, params internal.ActionSubmissionAcceptedParams) error { // transaction target_status := model.SubmissionStatusAcceptedUnvalidated - smap := datastore.Optional() - smap.Add("status_id", target_status) - err := svc.DB.Submissions().IfStatusThenUpdate(ctx, params.SubmissionID, []model.SubmissionStatus{model.SubmissionStatusValidating}, smap) + update := service_inner.NewSubmissionUpdate() + update.SetStatusID(target_status) + allowed_statuses :=[]model.SubmissionStatus{model.SubmissionStatusValidating} + err := svc.inner.UpdateSubmissionIfStatus(ctx, params.SubmissionID, allowed_statuses, update) if err != nil { return err } @@ -198,10 +204,11 @@ func (svc *Service) ActionSubmissionAccepted(ctx context.Context, params interna func (svc *Service) ActionSubmissionUploaded(ctx context.Context, params internal.ActionSubmissionUploadedParams) error { // transaction target_status := model.SubmissionStatusUploaded - smap := datastore.Optional() - smap.Add("status_id", target_status) - smap.Add("uploaded_asset_id", params.UploadedAssetID) - err := svc.DB.Submissions().IfStatusThenUpdate(ctx, params.SubmissionID, []model.SubmissionStatus{model.SubmissionStatusUploading}, smap) + update := service_inner.NewSubmissionUpdate() + update.SetStatusID(target_status) + update.SetUploadedAssetID(uint64(params.UploadedAssetID)) + allowed_statuses :=[]model.SubmissionStatus{model.SubmissionStatusUploading} + err := svc.inner.UpdateSubmissionIfStatus(ctx, params.SubmissionID, allowed_statuses, update) if err != nil { return err } @@ -290,11 +297,11 @@ func (svc *Service) CreateSubmission(ctx context.Context, request *internal.Subm // Check if an active submission with the same asset id exists { - filter := datastore.Optional() - filter.Add("asset_id", request.AssetID) - filter.Add("asset_version", request.AssetVersion) - filter.Add("status_id", ActiveSubmissionStatuses) - active_submissions, err := svc.DB.Submissions().List(ctx, filter, model.Page{ + filter := service_inner.NewSubmissionFilter() + filter.SetAssetID(AssetID) + filter.SetAssetVersion(AssetVersion) + filter.SetStatuses(ActiveSubmissionStatuses) + active_submissions, err := svc.inner.ListSubmissions(ctx, filter, model.Page{ Number: 1, Size: 1, },datastore.ListSortDisabled) @@ -306,7 +313,7 @@ func (svc *Service) CreateSubmission(ctx context.Context, request *internal.Subm } } - operation, err := svc.DB.Operations().Get(ctx, request.OperationID) + operation, err := svc.inner.GetOperation(ctx, request.OperationID) if err != nil { return nil, err } @@ -320,7 +327,7 @@ func (svc *Service) CreateSubmission(ctx context.Context, request *internal.Subm return nil, ErrNotAssetOwner } - submission, err := svc.DB.Submissions().Create(ctx, model.Submission{ + submission, err := svc.inner.CreateSubmission(ctx, model.Submission{ ID: 0, DisplayName: request.DisplayName, Creator: request.Creator, @@ -336,10 +343,8 @@ func (svc *Service) CreateSubmission(ctx context.Context, request *internal.Subm } // mark the operation as completed and provide the path - pmap := datastore.Optional() - pmap.Add("status_id", model.OperationStatusCompleted) - pmap.Add("path", fmt.Sprintf("/submissions/%d", submission.ID)) - err = svc.DB.Operations().Update(ctx, request.OperationID, pmap) + params := service_inner.NewOperationCompleteParams(fmt.Sprintf("/submissions/%d", submission.ID)) + err = svc.inner.CompleteOperation(ctx, request.OperationID, params) if err != nil { return nil, err } -- 2.49.1 From 2095f288750fc001982754307c1a23466cd9262b Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Wed, 16 Jul 2025 19:55:26 -0700 Subject: [PATCH 31/32] rewrite map filter and update --- pkg/service/maps.go | 18 +++++++------ pkg/service_inner/maps.go | 56 ++++++++++++++++----------------------- 2 files changed, 33 insertions(+), 41 deletions(-) diff --git a/pkg/service/maps.go b/pkg/service/maps.go index 475add5..b98745b 100644 --- a/pkg/service/maps.go +++ b/pkg/service/maps.go @@ -16,15 +16,17 @@ import ( // // GET /maps func (svc *Service) ListMaps(ctx context.Context, params api.ListMapsParams) ([]api.Map, error) { - display_name, display_name_ok := params.DisplayName.Get() - creator, creator_ok := params.Creator.Get() - game_id, game_id_ok := params.GameID.Get() + filter := service_inner.NewMapFilter() - filter := service_inner.NewMapFilter( - display_name, display_name_ok, - creator, creator_ok, - game_id, game_id_ok, - ) + if display_name, display_name_ok := params.DisplayName.Get(); display_name_ok{ + filter.SetDisplayName(display_name) + } + if creator, creator_ok := params.Creator.Get(); creator_ok{ + filter.SetCreator(creator) + } + if game_id, game_id_ok := params.GameID.Get(); game_id_ok{ + filter.SetGameID(game_id) + } items, err := svc.inner.ListMaps(ctx, filter, diff --git a/pkg/service_inner/maps.go b/pkg/service_inner/maps.go index 74d125c..e8de2f2 100644 --- a/pkg/service_inner/maps.go +++ b/pkg/service_inner/maps.go @@ -11,51 +11,41 @@ import ( // Optional map used to update an object type MapUpdate maps.MapRequest -func NewMapUpdate( - id int64, - display_name string, display_name_ok bool, - creator string, creator_ok bool, - game_id int32, game_id_ok bool, - date int64, date_ok bool, -) *MapUpdate { +func NewMapUpdate(id int64) *MapUpdate { item := MapUpdate{ ID: id, } - if display_name_ok { - item.DisplayName = &display_name - } - if creator_ok { - item.Creator = &creator - } - if game_id_ok { - item.GameID = &game_id - } - if date_ok { - item.Date = &date - } return &item } +func (update *MapUpdate) SetDisplayName(display_name string) { + update.DisplayName = &display_name +} +func (update *MapUpdate) SetCreator(creator string) { + update.Creator = &creator +} +func (update *MapUpdate) SetGameID(game_id int32) { + update.GameID = &game_id +} +func (update *MapUpdate) SetDate(date int64) { + update.Date = &date +} // Optional map used to find matching objects type MapFilter maps.MapFilter -func NewMapFilter( - display_name string, display_name_ok bool, - creator string, creator_ok bool, - game_id int32, game_id_ok bool, -) *MapFilter { +func NewMapFilter() *MapFilter { item := MapFilter{} - if display_name_ok { - item.DisplayName = &display_name - } - if creator_ok { - item.Creator = &creator - } - if game_id_ok { - item.GameID = &game_id - } return &item } +func (filter *MapFilter) SetDisplayName(display_name string) { + filter.DisplayName = &display_name +} +func (filter *MapFilter) SetCreator(creator string) { + filter.Creator = &creator +} +func (filter *MapFilter) SetGameID(game_id int32) { + filter.GameID = &game_id +} func (svc *Service) CreateMap(ctx context.Context, item model.Map) (int64, error) { date := item.Date.Unix() -- 2.49.1 From 0d9172cfd50cc27f54197fa098f68d70e622f5d3 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Wed, 16 Jul 2025 20:10:00 -0700 Subject: [PATCH 32/32] rewrite script & policy filter --- pkg/service/script_policy.go | 37 +++++++++--------- pkg/service/scripts.go | 55 ++++++++++++++------------- pkg/service_inner/script_policy.go | 25 ++++++------ pkg/service_inner/scripts.go | 38 ++++++++---------- pkg/service_internal/script_policy.go | 19 +++++---- pkg/service_internal/scripts.go | 28 +++++++------- 6 files changed, 95 insertions(+), 107 deletions(-) diff --git a/pkg/service/script_policy.go b/pkg/service/script_policy.go index b612724..433a1d7 100644 --- a/pkg/service/script_policy.go +++ b/pkg/service/script_policy.go @@ -48,22 +48,22 @@ func (svc *Service) CreateScriptPolicy(ctx context.Context, req *api.ScriptPolic // // GET /script-policy func (svc *Service) ListScriptPolicy(ctx context.Context, params api.ListScriptPolicyParams) ([]api.ScriptPolicy, error) { - from_script_hash, from_script_hash_ok := int64(0), false + filter := service_inner.NewScriptPolicyFilter() + if hash_hex, ok := params.FromScriptHash.Get(); ok{ hash_parsed, err := model.HashParse(hash_hex) if err != nil { return nil, err } - from_script_hash, from_script_hash_ok = int64(hash_parsed), true + filter.SetFromScriptHash(int64(hash_parsed)) + } + if to_script_id, to_script_id_ok := params.ToScriptID.Get(); to_script_id_ok{ + filter.SetToScriptID(to_script_id) + } + if policy, policy_ok := params.Policy.Get(); policy_ok{ + filter.SetPolicy(policy) } - to_script_id, to_script_id_ok := params.ToScriptID.Get() - policy, policy_ok := params.Policy.Get() - filter := service_inner.NewScriptPolicyFilter( - from_script_hash, from_script_hash_ok, - to_script_id, to_script_id_ok, - policy, policy_ok, - ) items, err := svc.inner.ListScriptPolicies(ctx, filter, model.Page{ Number: params.Page, @@ -130,23 +130,20 @@ func (svc *Service) UpdateScriptPolicy(ctx context.Context, req *api.ScriptPolic return err } - from_script_hash, from_script_hash_ok := int64(0), false + filter := service_inner.NewScriptPolicyFilter() if from_script_id, ok := req.FromScriptID.Get(); ok { from_script, err := svc.inner.GetScript(ctx, from_script_id) if err != nil { return err } - from_script_hash, from_script_hash_ok = from_script.Hash, true + filter.SetFromScriptHash(from_script.Hash) + } + if to_script_id, to_script_id_ok := req.ToScriptID.Get(); to_script_id_ok{ + filter.SetToScriptID(to_script_id) + } + if policy, policy_ok := req.Policy.Get(); policy_ok{ + filter.SetPolicy(policy) } - to_script_id, to_script_id_ok := req.ToScriptID.Get(); - policy, policy_ok := req.Policy.Get(); - - - filter := service_inner.NewScriptPolicyFilter( - from_script_hash, from_script_hash_ok, - to_script_id, to_script_id_ok, - policy, policy_ok, - ) return svc.inner.UpdateScriptPolicy(ctx, req.ID, filter) } diff --git a/pkg/service/scripts.go b/pkg/service/scripts.go index 674df6d..904f86d 100644 --- a/pkg/service/scripts.go +++ b/pkg/service/scripts.go @@ -59,26 +59,28 @@ func (svc *Service) CreateScript(ctx context.Context, req *api.ScriptCreate) (*a // // GET /scripts func (svc *Service) ListScripts(ctx context.Context, params api.ListScriptsParams) ([]api.Script, error) { - hash, hash_ok := int64(0), false + filter := service_inner.NewScriptFilter() + if hash_hex, ok := params.Hash.Get(); ok{ hash_parsed, err := model.HashParse(hash_hex) if err != nil { return nil, err } - hash, hash_ok = int64(hash_parsed), true + filter.SetHash(int64(hash_parsed)) + } + if name, name_ok := params.Name.Get(); name_ok{ + filter.SetName(name) + } + if source, source_ok := params.Source.Get(); source_ok{ + filter.SetSource(source) + } + if resource_type, resource_type_ok := params.ResourceType.Get(); resource_type_ok{ + filter.SetResourceType(resource_type) + } + if resource_id, resource_id_ok := params.ResourceID.Get(); resource_id_ok{ + filter.SetResourceID(resource_id) } - name, name_ok := params.Name.Get() - source, source_ok := params.Source.Get() - resource_type, resource_type_ok := params.ResourceType.Get() - resource_id, resource_id_ok := params.ResourceID.Get() - filter := service_inner.NewScriptFilter( - name, name_ok, - source, source_ok, - hash, hash_ok, - resource_type, resource_type_ok, - resource_id, resource_id_ok, - ) items, err := svc.inner.ListScripts(ctx, filter, model.Page{ Number: params.Page, @@ -149,21 +151,20 @@ func (svc *Service) UpdateScript(ctx context.Context, req *api.ScriptUpdate, par return err } - name, name_ok := req.Name.Get() - source, source_ok := req.Source.Get() - hash, hash_ok := int64(0), false - if source_ok { - hash, hash_ok = int64(model.HashSource(source)), true + filter := service_inner.NewScriptFilter() + if name, name_ok := req.Name.Get(); name_ok{ + filter.SetName(name) + } + if source, source_ok := req.Source.Get(); source_ok{ + filter.SetSource(source) + filter.SetHash(int64(model.HashSource(source))) + } + if resource_type, resource_type_ok := req.ResourceType.Get(); resource_type_ok{ + filter.SetResourceType(resource_type) + } + if resource_id, resource_id_ok := req.ResourceID.Get(); resource_id_ok{ + filter.SetResourceID(resource_id) } - resource_type, resource_type_ok := req.ResourceType.Get() - resource_id, resource_id_ok := req.ResourceID.Get() - filter := service_inner.NewScriptFilter( - name, name_ok, - source, source_ok, - hash, hash_ok, - resource_type, resource_type_ok, - resource_id, resource_id_ok, - ) return svc.inner.UpdateScript(ctx, req.ID, filter) } diff --git a/pkg/service_inner/script_policy.go b/pkg/service_inner/script_policy.go index fb71a69..9851c00 100644 --- a/pkg/service_inner/script_policy.go +++ b/pkg/service_inner/script_policy.go @@ -9,23 +9,20 @@ import ( type ScriptPolicyFilter datastore.OptionalMap -func NewScriptPolicyFilter( - from_script_hash int64, from_script_hash_ok bool, - to_script_id int64, to_script_id_ok bool, - policy int32, policy_ok bool, -) ScriptPolicyFilter { +func NewScriptPolicyFilter() ScriptPolicyFilter { filter := datastore.Optional() - if from_script_hash_ok { - filter.Add("from_script_hash", from_script_hash) - } - if to_script_id_ok { - filter.Add("to_script_id", to_script_id) - } - if policy_ok { - filter.Add("policy", policy) - } return ScriptPolicyFilter(filter) } +func (filter ScriptPolicyFilter) SetFromScriptHash(from_script_hash int64) { + // Finally, type safety! + datastore.OptionalMap(filter).Add("from_script_hash", from_script_hash) +} +func (filter ScriptPolicyFilter) SetToScriptID(to_script_id int64) { + datastore.OptionalMap(filter).Add("to_script_id", to_script_id) +} +func (filter ScriptPolicyFilter) SetPolicy(policy int32) { + datastore.OptionalMap(filter).Add("policy", policy) +} func (svc *Service) CreateScriptPolicy(ctx context.Context, script model.ScriptPolicy) (model.ScriptPolicy, error) { return svc.db.ScriptPolicy().Create(ctx, script) diff --git a/pkg/service_inner/scripts.go b/pkg/service_inner/scripts.go index 9f8858e..29be42d 100644 --- a/pkg/service_inner/scripts.go +++ b/pkg/service_inner/scripts.go @@ -9,31 +9,25 @@ import ( type ScriptFilter datastore.OptionalMap -func NewScriptFilter( - name string, name_ok bool, - source string, source_ok bool, - hash int64, hash_ok bool, - resource_type int32, resource_type_ok bool, - resource_id int64, resource_id_ok bool, -) ScriptFilter { +func NewScriptFilter() ScriptFilter { filter := datastore.Optional() - if name_ok { - filter.Add("name", name) - } - if source_ok { - filter.Add("source", source) - } - if hash_ok { - filter.Add("hash", hash) - } - if resource_type_ok { - filter.Add("resource_type", resource_type) - } - if resource_id_ok { - filter.Add("resource_id", resource_id) - } return ScriptFilter(filter) } +func (filter ScriptFilter) SetName(name string) { + datastore.OptionalMap(filter).Add("name", name) +} +func (filter ScriptFilter) SetSource(source string) { + datastore.OptionalMap(filter).Add("source", source) +} +func (filter ScriptFilter) SetHash(hash int64) { + datastore.OptionalMap(filter).Add("hash", hash) +} +func (filter ScriptFilter) SetResourceType(resource_type int32) { + datastore.OptionalMap(filter).Add("resource_type", resource_type) +} +func (filter ScriptFilter) SetResourceID(resource_id int64) { + datastore.OptionalMap(filter).Add("resource_id", resource_id) +} func (svc *Service) CreateScript(ctx context.Context, script model.Script) (model.Script, error) { return svc.db.Scripts().Create(ctx, script) diff --git a/pkg/service_internal/script_policy.go b/pkg/service_internal/script_policy.go index 75b7ca6..2126285 100644 --- a/pkg/service_internal/script_policy.go +++ b/pkg/service_internal/script_policy.go @@ -42,22 +42,21 @@ func (svc *Service) CreateScriptPolicy(ctx context.Context, req *api.ScriptPolic // // GET /script-policy func (svc *Service) ListScriptPolicy(ctx context.Context, params api.ListScriptPolicyParams) ([]api.ScriptPolicy, error) { - from_script_hash, from_script_hash_ok := int64(0), false + filter := service_inner.NewScriptPolicyFilter() + if hash_hex, ok := params.FromScriptHash.Get(); ok{ hash_parsed, err := model.HashParse(hash_hex) if err != nil { return nil, err } - from_script_hash, from_script_hash_ok = int64(hash_parsed), true + filter.SetFromScriptHash(int64(hash_parsed)) + } + if to_script_id, to_script_id_ok := params.ToScriptID.Get(); to_script_id_ok{ + filter.SetToScriptID(to_script_id) + } + if policy, policy_ok := params.Policy.Get(); policy_ok{ + filter.SetPolicy(policy) } - to_script_id, to_script_id_ok := params.ToScriptID.Get() - policy, policy_ok := params.Policy.Get() - - filter := service_inner.NewScriptPolicyFilter( - from_script_hash, from_script_hash_ok, - to_script_id, to_script_id_ok, - policy, policy_ok, - ) items, err := svc.inner.ListScriptPolicies(ctx, filter, model.Page{ Number: params.Page, diff --git a/pkg/service_internal/scripts.go b/pkg/service_internal/scripts.go index 08a7533..bd23e7f 100644 --- a/pkg/service_internal/scripts.go +++ b/pkg/service_internal/scripts.go @@ -37,26 +37,26 @@ func (svc *Service) CreateScript(ctx context.Context, req *api.ScriptCreate) (*a // // GET /scripts func (svc *Service) ListScripts(ctx context.Context, params api.ListScriptsParams) ([]api.Script, error) { - hash, hash_ok := int64(0), false + filter := service_inner.NewScriptFilter() if hash_hex, ok := params.Hash.Get(); ok{ hash_parsed, err := model.HashParse(hash_hex) if err != nil { return nil, err } - hash, hash_ok = int64(hash_parsed), true + filter.SetHash(int64(hash_parsed)) + } + if name, name_ok := params.Name.Get(); name_ok{ + filter.SetName(name) + } + if source, source_ok := params.Source.Get(); source_ok{ + filter.SetSource(source) + } + if resource_type, resource_type_ok := params.ResourceType.Get(); resource_type_ok{ + filter.SetResourceType(resource_type) + } + if resource_id, resource_id_ok := params.ResourceID.Get(); resource_id_ok{ + filter.SetResourceID(resource_id) } - name, name_ok := params.Name.Get() - source, source_ok := params.Source.Get() - resource_type, resource_type_ok := params.ResourceType.Get() - resource_id, resource_id_ok := params.ResourceID.Get() - - filter := service_inner.NewScriptFilter( - name, name_ok, - source, source_ok, - hash, hash_ok, - resource_type, resource_type_ok, - resource_id, resource_id_ok, - ) items, err := svc.inner.ListScripts(ctx, filter, model.Page{ Number: params.Page, -- 2.49.1