diff --git a/internal/api/http/handlers/donat/donat.go b/internal/api/http/handlers/donat/donat.go index 5feb3b8..6704297 100644 --- a/internal/api/http/handlers/donat/donat.go +++ b/internal/api/http/handlers/donat/donat.go @@ -105,23 +105,28 @@ func GetDonat(donatService model.DonatService) echo.HandlerFunc { } } +// MarkDonatPaid godoc +// @Summary Mark donat as paid +// @Description Mark donat as paid +// @Tags Donate +// @Accept json +// @Produce json +// @Param request body model.MarkDonatPaidBody true "order id body" +// @Success 200 {string} string "Ok" +// @Failure 400 {object} echo.HTTPError "Некорректный формат streamerID" +// @Failure 500 {object} echo.HTTPError "Внутренняя ошибка сервера" +// @Router /donat/paid [post] func MarkDonatPaid(donatService model.DonatService) echo.HandlerFunc { - type MarkDonatPaidBody struct { - OrderID string `json:"orderID"` - } return func(request echo.Context) error { ctx := context.Background() - var body MarkDonatPaidBody - if err := request.Bind(&body); err != nil { + var body model.MarkDonatPaidBody + err := validator.ParseAndValidate(&body, request) + if err != nil { slog.Error(err.Error()) - return request.JSON(http.StatusInternalServerError, err.Error()) - } - if err := request.Validate(&body); err != nil { - slog.Error(err.Error()) - return request.JSON(http.StatusInternalServerError, err.Error()) + return echo.NewHTTPError(http.StatusUnprocessableEntity, "Unprocessable Entity") } - err := donatService.MarkDonatPaid(ctx, body.OrderID) + err = donatService.MarkDonatPaid(ctx, body.OrderID) if err != nil { slog.Error(err.Error()) return request.JSON(http.StatusInternalServerError, err.Error()) diff --git a/internal/docs/docs.go b/internal/docs/docs.go index 3686bcb..194c37e 100644 --- a/internal/docs/docs.go +++ b/internal/docs/docs.go @@ -268,6 +268,52 @@ const docTemplate = `{ } } }, + "/donat/paid": { + "post": { + "description": "Mark donat as paid", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Donate" + ], + "summary": "Mark donat as paid", + "parameters": [ + { + "description": "order id body", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/donat-widget_internal_model.MarkDonatPaidBody" + } + } + ], + "responses": { + "200": { + "description": "Ok", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Некорректный формат streamerID", + "schema": { + "$ref": "#/definitions/echo.HTTPError" + } + }, + "500": { + "description": "Внутренняя ошибка сервера", + "schema": { + "$ref": "#/definitions/echo.HTTPError" + } + } + } + } + }, "/donat/period-stat": { "get": { "security": [ @@ -1559,6 +1605,14 @@ const docTemplate = `{ } } }, + "donat-widget_internal_model.MarkDonatPaidBody": { + "type": "object", + "properties": { + "order_id": { + "type": "string" + } + } + }, "donat-widget_internal_model.ModerationDonat": { "type": "object", "properties": { diff --git a/internal/docs/swagger.json b/internal/docs/swagger.json index a8c90b4..2e7c5a1 100644 --- a/internal/docs/swagger.json +++ b/internal/docs/swagger.json @@ -261,6 +261,52 @@ } } }, + "/donat/paid": { + "post": { + "description": "Mark donat as paid", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Donate" + ], + "summary": "Mark donat as paid", + "parameters": [ + { + "description": "order id body", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/donat-widget_internal_model.MarkDonatPaidBody" + } + } + ], + "responses": { + "200": { + "description": "Ok", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Некорректный формат streamerID", + "schema": { + "$ref": "#/definitions/echo.HTTPError" + } + }, + "500": { + "description": "Внутренняя ошибка сервера", + "schema": { + "$ref": "#/definitions/echo.HTTPError" + } + } + } + } + }, "/donat/period-stat": { "get": { "security": [ @@ -1552,6 +1598,14 @@ } } }, + "donat-widget_internal_model.MarkDonatPaidBody": { + "type": "object", + "properties": { + "order_id": { + "type": "string" + } + } + }, "donat-widget_internal_model.ModerationDonat": { "type": "object", "properties": { diff --git a/internal/docs/swagger.yaml b/internal/docs/swagger.yaml index 677357c..074e626 100644 --- a/internal/docs/swagger.yaml +++ b/internal/docs/swagger.yaml @@ -317,6 +317,11 @@ definitions: ru_name: type: string type: object + donat-widget_internal_model.MarkDonatPaidBody: + properties: + order_id: + type: string + type: object donat-widget_internal_model.ModerationDonat: properties: accepted: @@ -660,6 +665,36 @@ paths: summary: Create donat tags: - Donate + /donat/paid: + post: + consumes: + - application/json + description: Mark donat as paid + parameters: + - description: order id body + in: body + name: request + required: true + schema: + $ref: '#/definitions/donat-widget_internal_model.MarkDonatPaidBody' + produces: + - application/json + responses: + "200": + description: Ok + schema: + type: string + "400": + description: Некорректный формат streamerID + schema: + $ref: '#/definitions/echo.HTTPError' + "500": + description: Внутренняя ошибка сервера + schema: + $ref: '#/definitions/echo.HTTPError' + summary: Mark donat as paid + tags: + - Donate /donat/period-stat: get: consumes: diff --git a/internal/model/models.go b/internal/model/models.go index 9cda152..6b5f494 100644 --- a/internal/model/models.go +++ b/internal/model/models.go @@ -302,6 +302,10 @@ type ModerationDonat struct { ShowName *bool `json:"show_name"` } +type MarkDonatPaidBody struct { + OrderID string `json:"order_id"` +} + //func (widget *GetWidgetDb) GetMediaUrl(mediaType MediaType) MediaUrl { // var mediaUrl MediaUrl // if mediaType == "background_url" { diff --git a/internal/model/sql/model.go b/internal/model/sql/model.go index e0e490a..af7d4d8 100644 --- a/internal/model/sql/model.go +++ b/internal/model/sql/model.go @@ -37,6 +37,7 @@ CREATE TABLE IF NOT EXISTS donats ( widget_id INTEGER REFERENCES widgets(id) NOT NULL, order_id UUID NOT NULL, target_id INTEGER, + paid_time TIMESTAMP, status VARCHAR(50) NOT NULL DEFAULT 'pending', diff --git a/internal/model/sql/query.go b/internal/model/sql/query.go index 4906b0e..39d8e41 100644 --- a/internal/model/sql/query.go +++ b/internal/model/sql/query.go @@ -55,7 +55,7 @@ WHERE id = (@id); ` var MarkDonatPaid = ` UPDATE donats -SET paid = (@paid) +SET paid_time = now(), status = 'moderation' WHERE order_id = (@order_id); ` var GetDonatByStreamerID = ` diff --git a/internal/repository/donat/donat.go b/internal/repository/donat/donat.go index b31ac27..c040438 100644 --- a/internal/repository/donat/donat.go +++ b/internal/repository/donat/donat.go @@ -130,7 +130,6 @@ func (repoDonat *RepoDonat) MarkDonatPaid( ) error { args := pgx.NamedArgs{ "order_id": orderID, - "paid": true, } err := repoDonat.db.Update(ctx, sql.MarkDonatPaid, args) if err != nil {