diff --git a/internal/api/http/handlers/donat/donat.go b/internal/api/http/handlers/donat/donat.go index d44586e..011cb0c 100644 --- a/internal/api/http/handlers/donat/donat.go +++ b/internal/api/http/handlers/donat/donat.go @@ -55,6 +55,47 @@ func CreateDonat(donatService model.DonatService) echo.HandlerFunc { } } +// CreateTestDonat godoc +// @Summary Create donat +// @Description Create donat +// @Tags Donate +// @Accept json +// @Produce json +// @Param streamer-login path string true "Login стримера" +// @Param request body model.CreateDonatBody true "Create donat body json" +// @Success 200 {object} model.CreateDonatResponse "Donat page updated successfully" +// @Failure 400 {object} echo.HTTPError "Bad request" +// @Failure 401 {object} echo.HTTPError "Unauthorized or expired token" +// @Failure 422 {object} echo.HTTPError "Validation error" +// @Router /test-donat/{streamer-login} [post] +func CreateTestDonat(donatService model.DonatService) echo.HandlerFunc { + return func(request echo.Context) error { + ctx := context.Background() + var body model.CreateDonatBody + + err := validator.ParseAndValidate(&body, request) + if err != nil { + slog.Error(err.Error()) + return echo.NewHTTPError(http.StatusUnprocessableEntity, "Unprocessable Entity") + } + + streamerLogin := request.Param("streamer-login") + err = donatService.CreateTestDonat( + ctx, + streamerLogin, + body.Text, + body.DonatUser, + body.TargetID, + body.Amount, + ) + if err != nil { + return request.JSON(http.StatusInternalServerError, err.Error()) + } + + return request.JSON(http.StatusCreated, "Test donat has been created!") + } +} + // GetDonat godoc // @Summary Get donats // @Description Получает список донатов для указанного стримера с пагинацией diff --git a/internal/app/http/app.go b/internal/app/http/app.go index a15b5e7..555e475 100644 --- a/internal/app/http/app.go +++ b/internal/app/http/app.go @@ -80,6 +80,7 @@ func IncludeDonatHandlers( server.POST(PREFIX+"/init-streamer", InitNewStreamer(donatService)) server.POST(PREFIX+"/donat/:streamer-login", CreateDonat(donatService)) + server.POST(PREFIX+"/test-donat/:streamer-login", CreateTestDonat(donatService)) server.GET(PREFIX+"/inner-donate-page", GetInnerDonatePage(donatService)) server.GET(PREFIX+"/outer-donate-page/:streamer-login", GetOuterDonatePage(donatService)) diff --git a/internal/docs/docs.go b/internal/docs/docs.go index 180a37b..6874d49 100644 --- a/internal/docs/docs.go +++ b/internal/docs/docs.go @@ -504,7 +504,7 @@ const docTemplate = `{ "parameters": [ { "type": "file", - "description": "New file to upload", + "description": "New file to upload (max 20 MB)", "name": "new_file", "in": "formData", "required": true @@ -535,6 +535,12 @@ const docTemplate = `{ "$ref": "#/definitions/echo.HTTPError" } }, + "413": { + "description": "File size exceeds 20 MB limit", + "schema": { + "$ref": "#/definitions/echo.HTTPError" + } + }, "422": { "description": "Validation error (specific cases, might overlap with 400/500)", "schema": { @@ -1105,6 +1111,65 @@ const docTemplate = `{ } } }, + "/test-donat/{streamer-login}": { + "post": { + "description": "Create donat", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Donate" + ], + "summary": "Create donat", + "parameters": [ + { + "type": "string", + "description": "Login стримера", + "name": "streamer-login", + "in": "path", + "required": true + }, + { + "description": "Create donat body json", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/donat-widget_internal_model.CreateDonatBody" + } + } + ], + "responses": { + "200": { + "description": "Donat page updated successfully", + "schema": { + "$ref": "#/definitions/donat-widget_internal_model.CreateDonatResponse" + } + }, + "400": { + "description": "Bad request", + "schema": { + "$ref": "#/definitions/echo.HTTPError" + } + }, + "401": { + "description": "Unauthorized or expired token", + "schema": { + "$ref": "#/definitions/echo.HTTPError" + } + }, + "422": { + "description": "Validation error", + "schema": { + "$ref": "#/definitions/echo.HTTPError" + } + } + } + } + }, "/text-after-donat/{order-id}": { "get": { "description": "Получает список донатов для указанного стримера с пагинацией", diff --git a/internal/docs/swagger.json b/internal/docs/swagger.json index a7a1e60..be77e1e 100644 --- a/internal/docs/swagger.json +++ b/internal/docs/swagger.json @@ -497,7 +497,7 @@ "parameters": [ { "type": "file", - "description": "New file to upload", + "description": "New file to upload (max 20 MB)", "name": "new_file", "in": "formData", "required": true @@ -528,6 +528,12 @@ "$ref": "#/definitions/echo.HTTPError" } }, + "413": { + "description": "File size exceeds 20 MB limit", + "schema": { + "$ref": "#/definitions/echo.HTTPError" + } + }, "422": { "description": "Validation error (specific cases, might overlap with 400/500)", "schema": { @@ -1098,6 +1104,65 @@ } } }, + "/test-donat/{streamer-login}": { + "post": { + "description": "Create donat", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Donate" + ], + "summary": "Create donat", + "parameters": [ + { + "type": "string", + "description": "Login стримера", + "name": "streamer-login", + "in": "path", + "required": true + }, + { + "description": "Create donat body json", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/donat-widget_internal_model.CreateDonatBody" + } + } + ], + "responses": { + "200": { + "description": "Donat page updated successfully", + "schema": { + "$ref": "#/definitions/donat-widget_internal_model.CreateDonatResponse" + } + }, + "400": { + "description": "Bad request", + "schema": { + "$ref": "#/definitions/echo.HTTPError" + } + }, + "401": { + "description": "Unauthorized or expired token", + "schema": { + "$ref": "#/definitions/echo.HTTPError" + } + }, + "422": { + "description": "Validation error", + "schema": { + "$ref": "#/definitions/echo.HTTPError" + } + } + } + } + }, "/text-after-donat/{order-id}": { "get": { "description": "Получает список донатов для указанного стримера с пагинацией", diff --git a/internal/docs/swagger.yaml b/internal/docs/swagger.yaml index d8773a4..ba608bd 100644 --- a/internal/docs/swagger.yaml +++ b/internal/docs/swagger.yaml @@ -870,7 +870,7 @@ paths: - multipart/form-data description: Add new File. The entity type defaults to 'widget' if not specified. parameters: - - description: New file to upload + - description: New file to upload (max 20 MB) in: formData name: new_file required: true @@ -894,6 +894,10 @@ paths: description: Unauthorized or expired token schema: $ref: '#/definitions/echo.HTTPError' + "413": + description: File size exceeds 20 MB limit + schema: + $ref: '#/definitions/echo.HTTPError' "422": description: Validation error (specific cases, might overlap with 400/500) schema: @@ -1265,6 +1269,45 @@ paths: summary: Get outer donate page info tags: - Donate + /test-donat/{streamer-login}: + post: + consumes: + - application/json + description: Create donat + parameters: + - description: Login стримера + in: path + name: streamer-login + required: true + type: string + - description: Create donat body json + in: body + name: request + required: true + schema: + $ref: '#/definitions/donat-widget_internal_model.CreateDonatBody' + produces: + - application/json + responses: + "200": + description: Donat page updated successfully + schema: + $ref: '#/definitions/donat-widget_internal_model.CreateDonatResponse' + "400": + description: Bad request + schema: + $ref: '#/definitions/echo.HTTPError' + "401": + description: Unauthorized or expired token + schema: + $ref: '#/definitions/echo.HTTPError' + "422": + description: Validation error + schema: + $ref: '#/definitions/echo.HTTPError' + summary: Create donat + tags: + - Donate /text-after-donat/{order-id}: get: consumes: diff --git a/internal/model/interfaces.go b/internal/model/interfaces.go index 508d27c..a2a8093 100644 --- a/internal/model/interfaces.go +++ b/internal/model/interfaces.go @@ -74,6 +74,14 @@ type DonatService interface { CheckToken(request echo.Context) (api.CheckTokenResponse, error) CreateDonat(ctx context.Context, streamerLogin, text, donatUser string, targetID *int, amount int) (CreateDonatResponse, error) + CreateTestDonat( + ctx context.Context, + streamerLogin string, + text string, + donatUser string, + targetID *int, + amount int, + ) error GetDonatsByStreamerID(ctx context.Context, streamerID, page, limit int) ([]*Donat, error) GetDonatByOrderID(ctx context.Context, orderID string) (*Donat, error) @@ -131,6 +139,7 @@ type DonatRepo interface { amount int, text string, donatUser string, + status string, ) error GetDonatsByStreamerID(ctx context.Context, streamerID, page, limit int) ([]*Donat, error) diff --git a/internal/model/sql/query.go b/internal/model/sql/query.go index e7bf134..ce08101 100644 --- a/internal/model/sql/query.go +++ b/internal/model/sql/query.go @@ -77,6 +77,7 @@ FROM donats WHERE streamer_id = @streamer_id AND rejected_time IS NULL AND paid_time IS NOT NULL + AND status != 'test_donat' ORDER BY created_at DESC LIMIT @limit OFFSET @offset; @@ -580,7 +581,7 @@ FROM widgets AS w INNER JOIN donats AS d ON d.widget_id = w.id WHERE d.streamer_id = @streamer_id - AND d.status = 'accepted_moderation' + AND (d.status = 'accepted_moderation' OR d.status = 'test_donat') AND d.showed_time IS NULL ORDER BY d.accepted_time ASC LIMIT 1; diff --git a/internal/repository/donat/donat.go b/internal/repository/donat/donat.go index c3b5afe..146d031 100644 --- a/internal/repository/donat/donat.go +++ b/internal/repository/donat/donat.go @@ -33,6 +33,7 @@ func (repoDonat *RepoDonat) CreateDonat( amount int, text string, donatUser string, + status string, ) error { args := pgx.NamedArgs{ "streamer_id": streamerID, @@ -41,7 +42,7 @@ func (repoDonat *RepoDonat) CreateDonat( "target_id": targetID, "text": text, "amount": amount, - "status": "pending", + "status": status, "donat_user": donatUser, } _, err := repoDonat.db.Insert(ctx, sql.CreateDonat, args) diff --git a/internal/service/donat/donat.go b/internal/service/donat/donat.go index eece252..1fa2aed 100644 --- a/internal/service/donat/donat.go +++ b/internal/service/donat/donat.go @@ -120,7 +120,15 @@ func (donatService *ServiceDonat) CreateDonat( } err = donatService.donatRepo.CreateDonat( - ctx, donatePage.StreamerID, targetID, widgetID, orderID, amount, text, donatUser, + ctx, + donatePage.StreamerID, + targetID, + widgetID, + orderID, + amount, + text, + donatUser, + "pending", ) if err != nil { slog.Error(err.Error()) @@ -139,6 +147,43 @@ func (donatService *ServiceDonat) CreateDonat( return createDonatResp, err } +func (donatService *ServiceDonat) CreateTestDonat( + ctx context.Context, + streamerLogin string, + text string, + donatUser string, + targetID *int, + amount int, +) error { + donatePage, err := donatService.donatRepo.GetDonatPageByLogin(ctx, streamerLogin) + if err != nil { + slog.Error("Failed to get donate page", "error", err.Error()) + return err + } + + orderID := uuid.New() + + widgetID := donatService.defaultWidgetID + + err = donatService.donatRepo.CreateDonat( + ctx, + donatePage.StreamerID, + targetID, + widgetID, + orderID, + amount, + text, + donatUser, + "test_donat", + ) + if err != nil { + slog.Error(err.Error()) + return err + } + + return nil +} + func (donatService *ServiceDonat) GetDonatsByStreamerID( ctx context.Context, streamerID int,