diff --git a/internal/api/http/handlers/donat/donat.go b/internal/api/http/handlers/donat/donat.go index 0cf54f1..ef4b5f5 100644 --- a/internal/api/http/handlers/donat/donat.go +++ b/internal/api/http/handlers/donat/donat.go @@ -389,14 +389,28 @@ func UpdateFiltersSettings(donatService model.DonatService) echo.HandlerFunc { // @Tags Donate // @Accept json // @Produce json +// @Security BearerAuth // @Success 200 {object} model.ModerationResponse "Current moderation settings" // @Failure 400 {object} echo.HTTPError "Bad request" // @Failure 401 {object} echo.HTTPError "Unauthorized or expired token" // @Failure 422 {object} echo.HTTPError "Validation error" // @Router /moderation-settings [get] func GetModerationSettings(donatService model.DonatService) echo.HandlerFunc { - return func(c echo.Context) error { - return nil + return func(request echo.Context) error { + ctx := context.Background() + + authData, err := donatService.CheckToken(request) + if err != nil { + slog.Error("Unauthorized") + return echo.NewHTTPError(http.StatusUnauthorized, err.Error()) + } + + moderationSettings, err := donatService.GetModerationSettings(ctx, authData.AccountID) + if err != nil { + slog.Error("Failed to get moderation settings", "error", err) + return echo.NewHTTPError(http.StatusInternalServerError, "Internal server error") + } + return request.JSON(http.StatusOK, moderationSettings) } } @@ -406,6 +420,7 @@ func GetModerationSettings(donatService model.DonatService) echo.HandlerFunc { // @Tags Donate // @Accept json // @Produce json +// @Security BearerAuth // @Success 200 {object} model.UpdateModeration "Update moderation settings" // @Failure 400 {object} echo.HTTPError "Bad request" // @Failure 401 {object} echo.HTTPError "Unauthorized or expired token" diff --git a/internal/app/http/app.go b/internal/app/http/app.go index 31e506e..1f1fff9 100644 --- a/internal/app/http/app.go +++ b/internal/app/http/app.go @@ -81,6 +81,9 @@ func IncludeDonatHandlers( server.GET(PREFIX+"/filters-settings", GetFiltersSettings(donatService)) server.PATCH(PREFIX+"/filters-settings", UpdateFiltersSettings(donatService)) + server.GET(PREFIX+"/moderation-settings", GetModerationSettings(donatService)) + server.PATCH(PREFIX+"/moderation-settings", UpdateModerationSettings(donatService)) + server.GET(PREFIX+"/donat/get/:streamerID", GetDonat(donatService)) server.POST(PREFIX+"/donat/view/:donatID", MarkDonatView(donatService)) diff --git a/internal/docs/docs.go b/internal/docs/docs.go index cd807cf..51dcee0 100644 --- a/internal/docs/docs.go +++ b/internal/docs/docs.go @@ -323,12 +323,6 @@ const docTemplate = `{ "schema": { "$ref": "#/definitions/donat-widget_internal_model.UpdateFilterSettings" } - }, - { - "type": "file", - "description": "Background image", - "name": "background", - "in": "formData" } ], "responses": { @@ -407,6 +401,11 @@ const docTemplate = `{ }, "/moderation-settings": { "get": { + "security": [ + { + "BearerAuth": [] + } + ], "description": "Get donat moderation settings", "consumes": [ "application/json" @@ -446,6 +445,11 @@ const docTemplate = `{ } }, "patch": { + "security": [ + { + "BearerAuth": [] + } + ], "description": "Update donat moderation settings", "consumes": [ "application/json" diff --git a/internal/docs/swagger.json b/internal/docs/swagger.json index f4f1089..996a021 100644 --- a/internal/docs/swagger.json +++ b/internal/docs/swagger.json @@ -316,12 +316,6 @@ "schema": { "$ref": "#/definitions/donat-widget_internal_model.UpdateFilterSettings" } - }, - { - "type": "file", - "description": "Background image", - "name": "background", - "in": "formData" } ], "responses": { @@ -400,6 +394,11 @@ }, "/moderation-settings": { "get": { + "security": [ + { + "BearerAuth": [] + } + ], "description": "Get donat moderation settings", "consumes": [ "application/json" @@ -439,6 +438,11 @@ } }, "patch": { + "security": [ + { + "BearerAuth": [] + } + ], "description": "Update donat moderation settings", "consumes": [ "application/json" diff --git a/internal/docs/swagger.yaml b/internal/docs/swagger.yaml index eb15613..d467b75 100644 --- a/internal/docs/swagger.yaml +++ b/internal/docs/swagger.yaml @@ -484,10 +484,6 @@ paths: required: true schema: $ref: '#/definitions/donat-widget_internal_model.UpdateFilterSettings' - - description: Background image - in: formData - name: background - type: file produces: - application/json responses: @@ -565,6 +561,8 @@ paths: description: Validation error schema: $ref: '#/definitions/echo.HTTPError' + security: + - BearerAuth: [] summary: Get donat moderation settings tags: - Donate @@ -591,6 +589,8 @@ paths: description: Validation error schema: $ref: '#/definitions/echo.HTTPError' + security: + - BearerAuth: [] summary: Update donat moderation settings tags: - Donate diff --git a/internal/model/interfaces.go b/internal/model/interfaces.go index fb0a84f..ff0d116 100644 --- a/internal/model/interfaces.go +++ b/internal/model/interfaces.go @@ -96,7 +96,7 @@ type DonatService interface { GetFiltersSettings(ctx context.Context, streamerID int) (FilterSettingResponse, error) UpdateFiltersSettings(ctx context.Context, streamerID int, updateModel UpdateFilterSettings) error - GetModerationSettings(ctx context.Context, streamerID StreamerID) (ModerationResponse, error) + GetModerationSettings(ctx context.Context, streamerID int) (ModerationResponse, error) UpdateModerationSettings(ctx context.Context, streamerID StreamerID, updateModel UpdateModeration) error } @@ -135,6 +135,8 @@ type DonatRepo interface { AddFilteredWords(ctx context.Context, filterID int, words []string) error RemoveFilteredWords(ctx context.Context, filterID int, words []string) error GetFilterIDByStreamer(ctx context.Context, streamerID int) (int, error) + + GetModeration(ctx context.Context, streamerID int) (ModerationResponse, error) } type TargetService interface { diff --git a/internal/model/sql/query.go b/internal/model/sql/query.go index 2a4caa5..5cbdc54 100644 --- a/internal/model/sql/query.go +++ b/internal/model/sql/query.go @@ -301,3 +301,9 @@ var DeleteFilteredWordsBatch = ` DELETE FROM filters_words WHERE donat_filter_id = @donat_filter_id AND word = ANY(@words); ` + +var UpdateModeration = ` +UPDATE moderation SET (enable, duration) VALUES (@enable, duration) WHERE streamer_id = @streamer_id;` + +var GetModeration = ` +SELECT enable, duration FROM moderation WHERE streamer_id = @streamer_id;` diff --git a/internal/repository/donat/donat.go b/internal/repository/donat/donat.go index b3f6e98..27f26c9 100644 --- a/internal/repository/donat/donat.go +++ b/internal/repository/donat/donat.go @@ -559,3 +559,46 @@ func (repoDonat *RepoDonat) RemoveFilteredWords( return nil } + +func (repoDonat *RepoDonat) GetModeration(ctx context.Context, streamerID int) (model.ModerationResponse, error) { + args := pgx.NamedArgs{ + "streamer_id": streamerID, + } + row, err := repoDonat.db.SelectOne(ctx, sql.GetModeration, args) + if err != nil { + slog.Error("Failed to get moderation state", "error", err) + return model.ModerationResponse{}, err + } + + var response model.ModerationResponse + err = row.Scan(&response.Enable, &response.Duration) + if err != nil { + slog.Error("Failed to get moderation state", "error", err) + return model.ModerationResponse{}, err + } + return response, nil +} + +func (repoDonat *RepoDonat) UpdateModeration( + ctx context.Context, + streamerID int, + enable *bool, + duration *int, +) error { + args := pgx.NamedArgs{ + "streamer_id": streamerID, + } + + if enable != nil { + args["enable"] = enable + } + if duration != nil { + args["duration"] = duration + } + err := repoDonat.db.Exec(ctx, sql.UpdateModeration, args) + if err != nil { + slog.Error("Failed to update moderation state", "error", err) + return err + } + return nil +} diff --git a/internal/service/donat/donat.go b/internal/service/donat/donat.go index 1814937..fde1226 100644 --- a/internal/service/donat/donat.go +++ b/internal/service/donat/donat.go @@ -416,9 +416,18 @@ func (donatService *ServiceDonat) UpdateFiltersSettings( func (donatService *ServiceDonat) GetModerationSettings( ctx context.Context, - streamerID model.StreamerID, + streamerID int, ) (model.ModerationResponse, error) { - return model.ModerationResponse{}, nil + moderationModel, err := donatService.donatRepo.GetModeration( + ctx, + streamerID, + ) + if err != nil { + slog.Error("Failed to get moderation settings", "error", err) + return model.ModerationResponse{}, err + } + + return moderationModel, nil } func (donatService *ServiceDonat) UpdateModerationSettings(