From c8b6ac4cdd92551dbdaa32f973b008f40d69a74c Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Tue, 23 Sep 2025 15:08:56 -0700 Subject: [PATCH 1/5] openapi: return OperationID from release-submissions --- openapi.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/openapi.yaml b/openapi.yaml index f87cfcf..0131c65 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -1164,6 +1164,10 @@ paths: responses: "201": description: Successful response + content: + application/json: + schema: + $ref: "#/components/schemas/OperationID" default: description: General Error content: -- 2.49.1 From 99c73ee86093b2882b44b87da4e2be497d6fb0ba Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Tue, 23 Sep 2025 15:09:37 -0700 Subject: [PATCH 2/5] openapi: generate --- pkg/api/oas_client_gen.go | 10 +++---- pkg/api/oas_handlers_gen.go | 8 ++--- pkg/api/oas_response_decoders_gen.go | 45 ++++++++++++++++++++++++++-- pkg/api/oas_response_encoders_gen.go | 9 +++++- pkg/api/oas_schemas_gen.go | 3 -- pkg/api/oas_server_gen.go | 2 +- pkg/api/oas_unimplemented_gen.go | 4 +-- 7 files changed, 63 insertions(+), 18 deletions(-) diff --git a/pkg/api/oas_client_gen.go b/pkg/api/oas_client_gen.go index 90fb9bb..bc5d28a 100644 --- a/pkg/api/oas_client_gen.go +++ b/pkg/api/oas_client_gen.go @@ -319,7 +319,7 @@ type Invoker interface { // Release a set of uploaded maps. Role SubmissionRelease. // // POST /release-submissions - ReleaseSubmissions(ctx context.Context, request []ReleaseInfo) error + ReleaseSubmissions(ctx context.Context, request []ReleaseInfo) (*OperationID, error) // SessionRoles invokes sessionRoles operation. // // Get list of roles for the current session. @@ -6422,12 +6422,12 @@ func (c *Client) sendListSubmissions(ctx context.Context, params ListSubmissions // Release a set of uploaded maps. Role SubmissionRelease. // // POST /release-submissions -func (c *Client) ReleaseSubmissions(ctx context.Context, request []ReleaseInfo) error { - _, err := c.sendReleaseSubmissions(ctx, request) - return err +func (c *Client) ReleaseSubmissions(ctx context.Context, request []ReleaseInfo) (*OperationID, error) { + res, err := c.sendReleaseSubmissions(ctx, request) + return res, err } -func (c *Client) sendReleaseSubmissions(ctx context.Context, request []ReleaseInfo) (res *ReleaseSubmissionsCreated, err error) { +func (c *Client) sendReleaseSubmissions(ctx context.Context, request []ReleaseInfo) (res *OperationID, err error) { otelAttrs := []attribute.KeyValue{ otelogen.OperationID("releaseSubmissions"), semconv.HTTPRequestMethodKey.String("POST"), diff --git a/pkg/api/oas_handlers_gen.go b/pkg/api/oas_handlers_gen.go index aec3293..2d9f21e 100644 --- a/pkg/api/oas_handlers_gen.go +++ b/pkg/api/oas_handlers_gen.go @@ -8968,7 +8968,7 @@ func (s *Server) handleReleaseSubmissionsRequest(args [0]string, argsEscaped boo } }() - var response *ReleaseSubmissionsCreated + var response *OperationID if m := s.cfg.Middleware; m != nil { mreq := middleware.Request{ Context: ctx, @@ -8983,7 +8983,7 @@ func (s *Server) handleReleaseSubmissionsRequest(args [0]string, argsEscaped boo type ( Request = []ReleaseInfo Params = struct{} - Response = *ReleaseSubmissionsCreated + Response = *OperationID ) response, err = middleware.HookMiddleware[ Request, @@ -8994,12 +8994,12 @@ func (s *Server) handleReleaseSubmissionsRequest(args [0]string, argsEscaped boo mreq, nil, func(ctx context.Context, request Request, params Params) (response Response, err error) { - err = s.h.ReleaseSubmissions(ctx, request) + response, err = s.h.ReleaseSubmissions(ctx, request) return response, err }, ) } else { - err = s.h.ReleaseSubmissions(ctx, request) + response, err = s.h.ReleaseSubmissions(ctx, request) } if err != nil { if errRes, ok := errors.Into[*ErrorStatusCode](err); ok { diff --git a/pkg/api/oas_response_decoders_gen.go b/pkg/api/oas_response_decoders_gen.go index 230e890..25ecc22 100644 --- a/pkg/api/oas_response_decoders_gen.go +++ b/pkg/api/oas_response_decoders_gen.go @@ -3715,11 +3715,52 @@ func decodeListSubmissionsResponse(resp *http.Response) (res *Submissions, _ err return res, errors.Wrap(defRes, "error") } -func decodeReleaseSubmissionsResponse(resp *http.Response) (res *ReleaseSubmissionsCreated, _ error) { +func decodeReleaseSubmissionsResponse(resp *http.Response) (res *OperationID, _ error) { switch resp.StatusCode { case 201: // Code 201. - return &ReleaseSubmissionsCreated{}, nil + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response OperationID + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } } // Convenient error response. defRes, err := func() (res *ErrorStatusCode, err error) { diff --git a/pkg/api/oas_response_encoders_gen.go b/pkg/api/oas_response_encoders_gen.go index ee6fc82..abd0578 100644 --- a/pkg/api/oas_response_encoders_gen.go +++ b/pkg/api/oas_response_encoders_gen.go @@ -498,10 +498,17 @@ func encodeListSubmissionsResponse(response *Submissions, w http.ResponseWriter, return nil } -func encodeReleaseSubmissionsResponse(response *ReleaseSubmissionsCreated, w http.ResponseWriter, span trace.Span) error { +func encodeReleaseSubmissionsResponse(response *OperationID, w http.ResponseWriter, span trace.Span) error { + w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(201) span.SetStatus(codes.Ok, http.StatusText(201)) + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + return nil } diff --git a/pkg/api/oas_schemas_gen.go b/pkg/api/oas_schemas_gen.go index d1f415c..26e9c6d 100644 --- a/pkg/api/oas_schemas_gen.go +++ b/pkg/api/oas_schemas_gen.go @@ -941,9 +941,6 @@ func (s *ReleaseInfo) SetDate(val time.Time) { s.Date = val } -// ReleaseSubmissionsCreated is response for ReleaseSubmissions operation. -type ReleaseSubmissionsCreated struct{} - // Ref: #/components/schemas/Roles type Roles struct { Roles int32 `json:"Roles"` diff --git a/pkg/api/oas_server_gen.go b/pkg/api/oas_server_gen.go index d3ece17..88cc775 100644 --- a/pkg/api/oas_server_gen.go +++ b/pkg/api/oas_server_gen.go @@ -298,7 +298,7 @@ type Handler interface { // Release a set of uploaded maps. Role SubmissionRelease. // // POST /release-submissions - ReleaseSubmissions(ctx context.Context, req []ReleaseInfo) error + ReleaseSubmissions(ctx context.Context, req []ReleaseInfo) (*OperationID, error) // SessionRoles implements sessionRoles operation. // // Get list of roles for the current session. diff --git a/pkg/api/oas_unimplemented_gen.go b/pkg/api/oas_unimplemented_gen.go index 1069f43..5321159 100644 --- a/pkg/api/oas_unimplemented_gen.go +++ b/pkg/api/oas_unimplemented_gen.go @@ -444,8 +444,8 @@ func (UnimplementedHandler) ListSubmissions(ctx context.Context, params ListSubm // Release a set of uploaded maps. Role SubmissionRelease. // // POST /release-submissions -func (UnimplementedHandler) ReleaseSubmissions(ctx context.Context, req []ReleaseInfo) error { - return ht.ErrNotImplemented +func (UnimplementedHandler) ReleaseSubmissions(ctx context.Context, req []ReleaseInfo) (r *OperationID, _ error) { + return r, ht.ErrNotImplemented } // SessionRoles implements sessionRoles operation. -- 2.49.1 From 3da9936d416cbdcfdb2cdcdd614a0c06e90b7cb3 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Tue, 23 Sep 2025 15:10:51 -0700 Subject: [PATCH 3/5] submissions: return OperationID from release-submissions --- pkg/web_api/submissions.go | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/pkg/web_api/submissions.go b/pkg/web_api/submissions.go index ef8bdd7..890ed5a 100644 --- a/pkg/web_api/submissions.go +++ b/pkg/web_api/submissions.go @@ -1034,24 +1034,24 @@ func (svc *Service) ActionSubmissionAccepted(ctx context.Context, params api.Act // Release a set of uploaded maps. // // POST /release-submissions -func (svc *Service) ReleaseSubmissions(ctx context.Context, request []api.ReleaseInfo) error { +func (svc *Service) ReleaseSubmissions(ctx context.Context, request []api.ReleaseInfo) (*api.OperationID, error) { userInfo, ok := ctx.Value("UserInfo").(UserInfoHandle) if !ok { - return ErrUserInfo + return nil, ErrUserInfo } has_role, err := userInfo.HasRoleSubmissionRelease() if err != nil { - return err + return nil, err } // check if caller has required role if !has_role { - return ErrPermissionDeniedNeedRoleSubmissionRelease + return nil, ErrPermissionDeniedNeedRoleSubmissionRelease } userId, err := userInfo.GetUserID() if err != nil { - return err + return nil, err } idList := make([]int64, len(request)) @@ -1062,16 +1062,16 @@ func (svc *Service) ReleaseSubmissions(ctx context.Context, request []api.Releas // fetch submissions submissions, err := svc.inner.GetSubmissionList(ctx, idList) if err != nil { - return err + return nil, err } // check each submission to make sure it is ready to release for _,submission := range submissions{ if submission.StatusID != model.SubmissionStatusUploaded{ - return ErrReleaseInvalidStatus + return nil, ErrReleaseInvalidStatus } if submission.UploadedAssetID == 0{ - return ErrReleaseNoUploadedAssetID + return nil, ErrReleaseNoUploadedAssetID } } @@ -1098,7 +1098,7 @@ func (svc *Service) ReleaseSubmissions(ctx context.Context, request []api.Releas StatusID: model.OperationStatusCreated, }) if err != nil { - return err + return nil, err } // this is a map fix @@ -1107,10 +1107,12 @@ func (svc *Service) ReleaseSubmissions(ctx context.Context, request []api.Releas operation.ID, ) if err != nil { - return err + return nil, err } - return nil + return &api.OperationID{ + OperationID: operation.ID, + }, nil } // CreateSubmissionAuditComment implements createSubmissionAuditComment operation. -- 2.49.1 From fca3776f743bd8cd261777bb4f8ec0795bdecc89 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Tue, 23 Sep 2025 15:21:52 -0700 Subject: [PATCH 4/5] submissions-api: return OperationID from release-submissions --- submissions-api-rs/src/external.rs | 7 +++---- submissions-api-rs/src/types.rs | 5 +++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/submissions-api-rs/src/external.rs b/submissions-api-rs/src/external.rs index fd540ae..8b8b6aa 100644 --- a/submissions-api-rs/src/external.rs +++ b/submissions-api-rs/src/external.rs @@ -263,7 +263,7 @@ impl Context{ ).await.map_err(Error::Response)? .json().await.map_err(Error::ReqwestJson) } - pub async fn release_submissions(&self,config:ReleaseRequest<'_>)->Result<(),Error>{ + pub async fn release_submissions(&self,config:ReleaseRequest<'_>)->Result{ let url_raw=format!("{}/release-submissions",self.0.base_url); let url=reqwest::Url::parse(url_raw.as_str()).map_err(Error::Parse)?; @@ -271,8 +271,7 @@ impl Context{ response_ok( self.0.post(url,body).await.map_err(Error::Reqwest)? - ).await.map_err(Error::Response)?; - - Ok(()) + ).await.map_err(Error::Response)? + .json().await.map_err(Error::ReqwestJson) } } diff --git a/submissions-api-rs/src/types.rs b/submissions-api-rs/src/types.rs index a65f71d..d695e66 100644 --- a/submissions-api-rs/src/types.rs +++ b/submissions-api-rs/src/types.rs @@ -548,3 +548,8 @@ pub struct ReleaseInfo{ pub struct ReleaseRequest<'a>{ pub schedule:&'a [ReleaseInfo], } +#[allow(nonstandard_style)] +#[derive(Clone,Debug,serde::Deserialize)] +pub struct OperationIDResponse{ + pub OperationID:OperationID, +} -- 2.49.1 From 99b33a1a543bfb490df655a0f356b916af0e45eb Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Tue, 23 Sep 2025 15:23:53 -0700 Subject: [PATCH 5/5] submissions-api: v0.10.0 --- submissions-api-rs/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submissions-api-rs/Cargo.toml b/submissions-api-rs/Cargo.toml index 1d38d16..a7da31d 100644 --- a/submissions-api-rs/Cargo.toml +++ b/submissions-api-rs/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "submissions-api" -version = "0.9.1" +version = "0.10.0" edition = "2024" publish = ["strafesnet"] repository = "https://git.itzana.me/StrafesNET/maps-service" -- 2.49.1