diff --git a/api/gerald.yaml b/api/gerald.yaml index d6ece64..d66110f 100644 --- a/api/gerald.yaml +++ b/api/gerald.yaml @@ -104,6 +104,11 @@ paths: description: "Project id" required: true type: string + - in: query + name: session_uuid + description: "Session UUID" + required: true + type: string responses: 200: description: "successful operation" diff --git a/internal/interfaces/rest/handlers/feedback.go b/internal/interfaces/rest/handlers/feedback.go index 139184e..64ee7ca 100644 --- a/internal/interfaces/rest/handlers/feedback.go +++ b/internal/interfaces/rest/handlers/feedback.go @@ -44,19 +44,7 @@ func (h *FeedbackHandler) GetFeedbacks(params feedback.GetFeedbacksParams) middl return feedback.NewGetFeedbacksForbidden() } - return feedback.NewGetFeedbacksOK().WithPayload(feedbacksToAPI(feedbacks)) -} - -func (h *FeedbackHandler) GetFeedback(params feedback.GetFeedbacksForProjectParams) middleware.Responder { - feedbacks, err := h.feedback.GetByProjectID(params.ProjectID) - if err != nil { - h.logger.Error().Err(err).Msg("Cannot get feedbacks") - return feedback.NewGetFeedbacksForProjectForbidden() - - } - - return feedback.NewGetFeedbacksForProjectOK().WithPayload(feedbacksToAPI(feedbacks)) - + return feedback.NewGetFeedbacksOK().WithPayload(feedbacksToAPI(feedbacks, params.SessionUUID)) } func (h *FeedbackHandler) VoteFeedback(params feedback.UpvoteFeedbackParams) middleware.Responder { @@ -76,22 +64,22 @@ func (h *FeedbackHandler) GetFeedbacksForProject(params feedback.GetFeedbacksFor return feedback.NewGetFeedbacksForProjectForbidden() } - return feedback.NewGetFeedbacksForProjectOK().WithPayload(feedbacksToAPI(feedbacks)) + return feedback.NewGetFeedbacksForProjectOK().WithPayload(feedbacksToAPI(feedbacks, params.SessionUUID)) } -func feedbacksToAPI(feedbacks []*dmodels.Feedback) []*models.Feedback { +func feedbacksToAPI(feedbacks []*dmodels.Feedback, sessionUUID string) []*models.Feedback { apiFeedbacks := make([]*models.Feedback, 0, len(feedbacks)) for _, f := range feedbacks { - apiFeedbacks = append(apiFeedbacks, feedbackToAPI(f)) + apiFeedbacks = append(apiFeedbacks, feedbackToAPI(f, sessionUUID)) } return apiFeedbacks } -func feedbackToAPI(feedback *dmodels.Feedback) *models.Feedback { +func feedbackToAPI(feedback *dmodels.Feedback, sessionUUID string) *models.Feedback { var upvoted bool for _, upvote := range feedback.Upvote { - if upvote.SessionUUID == feedback.SessionUUID { + if upvote.SessionUUID == sessionUUID { upvoted = true break } diff --git a/internal/interfaces/rest/restapi/embedded_spec.go b/internal/interfaces/rest/restapi/embedded_spec.go index a516f35..a357dfd 100644 --- a/internal/interfaces/rest/restapi/embedded_spec.go +++ b/internal/interfaces/rest/restapi/embedded_spec.go @@ -160,6 +160,13 @@ func init() { "name": "project_id", "in": "path", "required": true + }, + { + "type": "string", + "description": "Session UUID", + "name": "session_uuid", + "in": "query", + "required": true } ], "responses": { @@ -365,6 +372,13 @@ func init() { "name": "project_id", "in": "path", "required": true + }, + { + "type": "string", + "description": "Session UUID", + "name": "session_uuid", + "in": "query", + "required": true } ], "responses": { diff --git a/internal/interfaces/rest/restapi/operations/feedback/get_feedbacks_for_project_parameters.go b/internal/interfaces/rest/restapi/operations/feedback/get_feedbacks_for_project_parameters.go index c95cfb3..dd147da 100644 --- a/internal/interfaces/rest/restapi/operations/feedback/get_feedbacks_for_project_parameters.go +++ b/internal/interfaces/rest/restapi/operations/feedback/get_feedbacks_for_project_parameters.go @@ -9,8 +9,10 @@ import ( "net/http" "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" "github.com/go-openapi/runtime/middleware" "github.com/go-openapi/strfmt" + "github.com/go-openapi/validate" ) // NewGetFeedbacksForProjectParams creates a new GetFeedbacksForProjectParams object @@ -35,6 +37,11 @@ type GetFeedbacksForProjectParams struct { In: path */ ProjectID string + /*Session UUID + Required: true + In: query + */ + SessionUUID string } // BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface @@ -46,10 +53,17 @@ func (o *GetFeedbacksForProjectParams) BindRequest(r *http.Request, route *middl o.HTTPRequest = r + qs := runtime.Values(r.URL.Query()) + rProjectID, rhkProjectID, _ := route.Params.GetOK("project_id") if err := o.bindProjectID(rProjectID, rhkProjectID, route.Formats); err != nil { res = append(res, err) } + + qSessionUUID, qhkSessionUUID, _ := qs.GetOK("session_uuid") + if err := o.bindSessionUUID(qSessionUUID, qhkSessionUUID, route.Formats); err != nil { + res = append(res, err) + } if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -69,3 +83,24 @@ func (o *GetFeedbacksForProjectParams) bindProjectID(rawData []string, hasKey bo return nil } + +// bindSessionUUID binds and validates parameter SessionUUID from query. +func (o *GetFeedbacksForProjectParams) bindSessionUUID(rawData []string, hasKey bool, formats strfmt.Registry) error { + if !hasKey { + return errors.Required("session_uuid", "query", rawData) + } + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + // Required: true + // AllowEmptyValue: false + + if err := validate.RequiredString("session_uuid", "query", raw); err != nil { + return err + } + o.SessionUUID = raw + + return nil +} diff --git a/internal/interfaces/rest/restapi/operations/feedback/get_feedbacks_for_project_urlbuilder.go b/internal/interfaces/rest/restapi/operations/feedback/get_feedbacks_for_project_urlbuilder.go index eec28f3..c894d9d 100644 --- a/internal/interfaces/rest/restapi/operations/feedback/get_feedbacks_for_project_urlbuilder.go +++ b/internal/interfaces/rest/restapi/operations/feedback/get_feedbacks_for_project_urlbuilder.go @@ -16,6 +16,8 @@ import ( type GetFeedbacksForProjectURL struct { ProjectID string + SessionUUID string + _basePath string // avoid unkeyed usage _ struct{} @@ -55,6 +57,15 @@ func (o *GetFeedbacksForProjectURL) Build() (*url.URL, error) { } _result.Path = golangswaggerpaths.Join(_basePath, _path) + qs := make(url.Values) + + sessionUUIDQ := o.SessionUUID + if sessionUUIDQ != "" { + qs.Set("session_uuid", sessionUUIDQ) + } + + _result.RawQuery = qs.Encode() + return &_result, nil }