From 5f38bcd76c6858d3303d477676705b3084f2fc4c Mon Sep 17 00:00:00 2001 From: violog <51th.apprent1ce.f0rce@gmail.com> Date: Tue, 30 Jan 2024 12:45:08 +0200 Subject: [PATCH] API models improvements, fixes in paths and handlers --- .../spec/components/parameters/pageOrder.yaml | 4 +- docs/spec/components/schemas/ClaimEvent.yaml | 17 -------- .../components/schemas/CreateBalance.yaml | 16 ------- .../components/schemas/CreateBalanceKey.yaml | 5 +++ ...rations@rarime-points-svc@v1@balances.yaml | 3 +- ...ions@rarime-points-svc@v1@events@{id}.yaml | 2 +- internal/service/handlers/create_balance.go | 2 +- internal/service/handlers/get_balance.go | 2 +- internal/service/requests/claim_event.go | 13 +++--- internal/service/requests/create_balance.go | 12 ++++-- internal/service/requests/get_balance.go | 18 +++----- internal/service/router.go | 8 ++-- resources/model_claim_event.go | 43 ------------------- resources/model_claim_event_attributes.go | 10 ----- resources/model_create_balance.go | 43 ------------------- resources/model_create_balance_attributes.go | 10 ----- 16 files changed, 37 insertions(+), 171 deletions(-) delete mode 100644 docs/spec/components/schemas/ClaimEvent.yaml delete mode 100644 docs/spec/components/schemas/CreateBalance.yaml delete mode 100644 resources/model_claim_event.go delete mode 100644 resources/model_claim_event_attributes.go delete mode 100644 resources/model_create_balance.go delete mode 100644 resources/model_create_balance_attributes.go diff --git a/docs/spec/components/parameters/pageOrder.yaml b/docs/spec/components/parameters/pageOrder.yaml index b7fe176..f099007 100644 --- a/docs/spec/components/parameters/pageOrder.yaml +++ b/docs/spec/components/parameters/pageOrder.yaml @@ -7,6 +7,4 @@ schema: - asc - desc default: desc - description: >- - Order of records on the page. If pageOrder is not specified, order of - records is by default sorted by ID. + description: Order of records on the page. diff --git a/docs/spec/components/schemas/ClaimEvent.yaml b/docs/spec/components/schemas/ClaimEvent.yaml deleted file mode 100644 index 25348b4..0000000 --- a/docs/spec/components/schemas/ClaimEvent.yaml +++ /dev/null @@ -1,17 +0,0 @@ -allOf: - - $ref: '#/components/schemas/ClaimEventKey' - - type: object - x-go-is-request: true - required: - - attributes - properties: - attributes: - type: object - required: - - user_did - - status - properties: - status: - type: string - description: New status. Just to be JSON:API compliant. - enum: [ claimed ] diff --git a/docs/spec/components/schemas/CreateBalance.yaml b/docs/spec/components/schemas/CreateBalance.yaml deleted file mode 100644 index d8d51d4..0000000 --- a/docs/spec/components/schemas/CreateBalance.yaml +++ /dev/null @@ -1,16 +0,0 @@ -allOf: - - $ref: '#/components/schemas/CreateBalanceKey' - - type: object - x-go-is-request: true - required: - - attributes - properties: - attributes: - type: object - required: - - user_did - properties: - user_did: - type: string - description: DID of the balance owner - example: "did:iden3:readonly:tUDjWxnVJNi7t3FudukqrUcNwF5KVGoWgim5pp2jV" diff --git a/docs/spec/components/schemas/CreateBalanceKey.yaml b/docs/spec/components/schemas/CreateBalanceKey.yaml index 781ec34..ca44323 100644 --- a/docs/spec/components/schemas/CreateBalanceKey.yaml +++ b/docs/spec/components/schemas/CreateBalanceKey.yaml @@ -1,7 +1,12 @@ type: object required: + - id - type properties: + id: + type: string + description: DID of the points owner + example: "did:iden3:readonly:tUDjWxnVJNi7t3FudukqrUcNwF5KVGoWgim5pp2jV" type: type: string enum: [ create_balance ] diff --git a/docs/spec/paths/integrations@rarime-points-svc@v1@balances.yaml b/docs/spec/paths/integrations@rarime-points-svc@v1@balances.yaml index 77ddd0f..9f3345b 100644 --- a/docs/spec/paths/integrations@rarime-points-svc@v1@balances.yaml +++ b/docs/spec/paths/integrations@rarime-points-svc@v1@balances.yaml @@ -16,7 +16,7 @@ post: - data properties: data: - $ref: '#/components/schemas/CreateBalance' + $ref: '#/components/schemas/CreateBalanceKey' responses: 201: description: Created @@ -49,6 +49,7 @@ get: parameters: - $ref: '#/components/parameters/pageCursor' - $ref: '#/components/parameters/pageLimit' + - $ref: '#/components/parameters/pageNumber' responses: 200: description: Success diff --git a/docs/spec/paths/integrations@rarime-points-svc@v1@events@{id}.yaml b/docs/spec/paths/integrations@rarime-points-svc@v1@events@{id}.yaml index 6fdd600..2f57890 100644 --- a/docs/spec/paths/integrations@rarime-points-svc@v1@events@{id}.yaml +++ b/docs/spec/paths/integrations@rarime-points-svc@v1@events@{id}.yaml @@ -23,7 +23,7 @@ patch: - data properties: data: - $ref: '#/components/schemas/ClaimEvent' + $ref: '#/components/schemas/ClaimEventKey' responses: 200: description: Event claimed, points accrued diff --git a/internal/service/handlers/create_balance.go b/internal/service/handlers/create_balance.go index fd2f031..3af33b2 100644 --- a/internal/service/handlers/create_balance.go +++ b/internal/service/handlers/create_balance.go @@ -18,7 +18,7 @@ func CreateBalance(w http.ResponseWriter, r *http.Request) { return } - did := req.Data.Attributes.UserDid + did := req.Data.ID balance := getBalanceByDID(did, false, w, r) if balance != nil { ape.RenderErr(w, problems.Conflict()) diff --git a/internal/service/handlers/get_balance.go b/internal/service/handlers/get_balance.go index ed011b0..fdcf138 100644 --- a/internal/service/handlers/get_balance.go +++ b/internal/service/handlers/get_balance.go @@ -18,7 +18,7 @@ func GetBalance(w http.ResponseWriter, r *http.Request) { return } - balance := getBalanceByDID(req.FilterDID, true, w, r) + balance := getBalanceByDID(req.DID, true, w, r) if balance == nil { return } diff --git a/internal/service/requests/claim_event.go b/internal/service/requests/claim_event.go index f74e365..8229ab4 100644 --- a/internal/service/requests/claim_event.go +++ b/internal/service/requests/claim_event.go @@ -7,20 +7,23 @@ import ( "github.com/go-chi/chi" validation "github.com/go-ozzo/ozzo-validation/v4" - "github.com/rarimo/rarime-points-svc/internal/data" "github.com/rarimo/rarime-points-svc/resources" ) -func NewClaimEvent(r *http.Request) (req resources.ClaimEventRequest, err error) { +func NewClaimEvent(r *http.Request) (req resources.Relation, err error) { id := chi.URLParam(r, "id") if err = json.NewDecoder(r.Body).Decode(&req); err != nil { err = fmt.Errorf("decode request body: %w", err) return } + if req.Data == nil { + err = validation.Errors{"data": validation.ErrRequired} + return + } + return req, validation.Errors{ - "data/id": validation.Validate(req.Data.ID, validation.Required, validation.In(id)), - "data/type": validation.Validate(req.Data.Type, validation.Required, validation.In(resources.CLAIM_EVENT)), - "data/attributes/status": validation.Validate(req.Data.Attributes.Status, validation.Required, validation.In(data.EventClaimed)), + "data/id": validation.Validate(req.Data.ID, validation.Required, validation.In(id)), + "data/type": validation.Validate(req.Data.Type, validation.Required, validation.In(resources.CLAIM_EVENT)), }.Filter() } diff --git a/internal/service/requests/create_balance.go b/internal/service/requests/create_balance.go index 298c7c2..04c44a8 100644 --- a/internal/service/requests/create_balance.go +++ b/internal/service/requests/create_balance.go @@ -9,15 +9,19 @@ import ( "github.com/rarimo/rarime-points-svc/resources" ) -func NewCreateBalance(r *http.Request) (req resources.CreateBalanceRequest, err error) { +func NewCreateBalance(r *http.Request) (req resources.Relation, err error) { if err = json.NewDecoder(r.Body).Decode(&req); err != nil { err = fmt.Errorf("decode request body: %w", err) return } + if req.Data == nil { + err = validation.Errors{"data": validation.ErrRequired} + return + } + return req, validation.Errors{ - "data/id": validation.Validate(req.Data.ID, validation.Empty), - "data/type": validation.Validate(req.Data.Type, validation.Required, validation.In(resources.CREATE_BALANCE)), - "data/attributes/user_did": validation.Validate(req.Data.Attributes.UserDid, validation.Required), + "data/id": validation.Validate(req.Data.ID, validation.Required), + "data/type": validation.Validate(req.Data.Type, validation.Required, validation.In(resources.CREATE_BALANCE)), }.Filter() } diff --git a/internal/service/requests/get_balance.go b/internal/service/requests/get_balance.go index d450a7b..b255f5d 100644 --- a/internal/service/requests/get_balance.go +++ b/internal/service/requests/get_balance.go @@ -1,26 +1,20 @@ package requests import ( - "fmt" "net/http" + "github.com/go-chi/chi" validation "github.com/go-ozzo/ozzo-validation/v4" - "gitlab.com/distributed_lab/urlval/v4" ) type GetBalance struct { - FilterDID string `filter:"did"` + DID string } -func NewGetBalance(r *http.Request) (req GetBalance, err error) { - if err = urlval.Decode(r.URL.Query(), &req); err != nil { - return req, validation.Errors{ - "query": fmt.Errorf("failed to decode query: %w", err), - } - } +func NewGetBalance(r *http.Request) (GetBalance, error) { + did := chi.URLParam(r, "did") - err = validation.Errors{ - "filter[did]": validation.Validate(req.FilterDID, validation.Required), + return GetBalance{did}, validation.Errors{ + "did": validation.Validate(did, validation.Required), }.Filter() - return } diff --git a/internal/service/router.go b/internal/service/router.go index bbb4ab5..ace9218 100644 --- a/internal/service/router.go +++ b/internal/service/router.go @@ -20,15 +20,15 @@ func (s *service) router() chi.Router { handlers.CtxEventTypes(s.cfg.EventTypes()), ), ) - r.Route("/integrations/rarime-points-svc", func(r chi.Router) { + r.Route("/integrations/rarime-points-svc/v1", func(r chi.Router) { r.Group(func(r chi.Router) { r.Use(handlers.AuthMiddleware(s.cfg.Auth(), s.log)) - r.Get("/balance", handlers.GetBalance) - r.Post("/balance", handlers.CreateBalance) + r.Get("/balances/{did}", handlers.GetBalance) + r.Post("/balances", handlers.CreateBalance) r.Get("/events", handlers.ListEvents) r.Patch("/events/{id}", handlers.ClaimEvent) }) - r.Get("/leaderboard", handlers.Leaderboard) + r.Get("/balances", handlers.Leaderboard) }) return r diff --git a/resources/model_claim_event.go b/resources/model_claim_event.go deleted file mode 100644 index 4b8fe7b..0000000 --- a/resources/model_claim_event.go +++ /dev/null @@ -1,43 +0,0 @@ -/* - * GENERATED. Do not modify. Your changes might be overwritten! - */ - -package resources - -import "encoding/json" - -type ClaimEvent struct { - Key - Attributes ClaimEventAttributes `json:"attributes"` -} -type ClaimEventRequest struct { - Data ClaimEvent `json:"data"` - Included Included `json:"included"` -} - -type ClaimEventListRequest struct { - Data []ClaimEvent `json:"data"` - Included Included `json:"included"` - Links *Links `json:"links"` - Meta json.RawMessage `json:"meta,omitempty"` -} - -func (r *ClaimEventListRequest) PutMeta(v interface{}) (err error) { - r.Meta, err = json.Marshal(v) - return err -} - -func (r *ClaimEventListRequest) GetMeta(out interface{}) error { - return json.Unmarshal(r.Meta, out) -} - -// MustClaimEvent - returns ClaimEvent from include collection. -// if entry with specified key does not exist - returns nil -// if entry with specified key exists but type or ID mismatches - panics -func (c *Included) MustClaimEvent(key Key) *ClaimEvent { - var claimEvent ClaimEvent - if c.tryFindEntry(key, &claimEvent) { - return &claimEvent - } - return nil -} diff --git a/resources/model_claim_event_attributes.go b/resources/model_claim_event_attributes.go deleted file mode 100644 index ec7e93f..0000000 --- a/resources/model_claim_event_attributes.go +++ /dev/null @@ -1,10 +0,0 @@ -/* - * GENERATED. Do not modify. Your changes might be overwritten! - */ - -package resources - -type ClaimEventAttributes struct { - // New status. Just to be JSON:API compliant. - Status string `json:"status"` -} diff --git a/resources/model_create_balance.go b/resources/model_create_balance.go deleted file mode 100644 index e3ae5ec..0000000 --- a/resources/model_create_balance.go +++ /dev/null @@ -1,43 +0,0 @@ -/* - * GENERATED. Do not modify. Your changes might be overwritten! - */ - -package resources - -import "encoding/json" - -type CreateBalance struct { - Key - Attributes CreateBalanceAttributes `json:"attributes"` -} -type CreateBalanceRequest struct { - Data CreateBalance `json:"data"` - Included Included `json:"included"` -} - -type CreateBalanceListRequest struct { - Data []CreateBalance `json:"data"` - Included Included `json:"included"` - Links *Links `json:"links"` - Meta json.RawMessage `json:"meta,omitempty"` -} - -func (r *CreateBalanceListRequest) PutMeta(v interface{}) (err error) { - r.Meta, err = json.Marshal(v) - return err -} - -func (r *CreateBalanceListRequest) GetMeta(out interface{}) error { - return json.Unmarshal(r.Meta, out) -} - -// MustCreateBalance - returns CreateBalance from include collection. -// if entry with specified key does not exist - returns nil -// if entry with specified key exists but type or ID mismatches - panics -func (c *Included) MustCreateBalance(key Key) *CreateBalance { - var createBalance CreateBalance - if c.tryFindEntry(key, &createBalance) { - return &createBalance - } - return nil -} diff --git a/resources/model_create_balance_attributes.go b/resources/model_create_balance_attributes.go deleted file mode 100644 index c9fb8a1..0000000 --- a/resources/model_create_balance_attributes.go +++ /dev/null @@ -1,10 +0,0 @@ -/* - * GENERATED. Do not modify. Your changes might be overwritten! - */ - -package resources - -type CreateBalanceAttributes struct { - // DID of the balance owner - UserDid string `json:"user_did"` -}