From 62b457d42bf31eb29fc1b76bff9d027daa0054aa Mon Sep 17 00:00:00 2001 From: harold Date: Sun, 9 Mar 2025 00:51:51 +0500 Subject: [PATCH] add router for update filter words --- internal/api/http/handlers/donat/donat.go | 26 ++++++- internal/app/http/app.go | 1 + internal/docs/docs.go | 5 ++ internal/docs/swagger.json | 5 ++ internal/docs/swagger.yaml | 2 + internal/model/interfaces.go | 6 +- internal/model/models.go | 2 +- internal/model/sql/query.go | 16 ++++ internal/repository/donat/donat.go | 94 ++++++++++++++++++++++- internal/service/donat/donat.go | 32 +++++++- 10 files changed, 182 insertions(+), 7 deletions(-) diff --git a/internal/api/http/handlers/donat/donat.go b/internal/api/http/handlers/donat/donat.go index fdce0e4..0cf54f1 100644 --- a/internal/api/http/handlers/donat/donat.go +++ b/internal/api/http/handlers/donat/donat.go @@ -350,16 +350,36 @@ func GetFiltersSettings(donatService model.DonatService) echo.HandlerFunc { // @Tags Donate // @Accept json // @Produce json +// @Security BearerAuth // @Param request body model.UpdateFilterSettings true "Update fields" -// @Param background formData file false "Background image" // @Success 200 {string} string "Voice settings 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 /filters-settings [patch] func UpdateFiltersSettings(donatService model.DonatService) echo.HandlerFunc { - return func(c echo.Context) error { - return nil + return func(request echo.Context) error { + ctx := context.Background() + + var body model.UpdateFilterSettings + err := validator.ParseAndValidate(&body, request) + if err != nil { + slog.Error(err.Error()) + return echo.NewHTTPError(http.StatusUnprocessableEntity, "Unprocessable Entity") + } + + authData, err := donatService.CheckToken(request) + if err != nil { + slog.Error("Unauthorized") + return echo.NewHTTPError(http.StatusUnauthorized, err.Error()) + } + + err = donatService.UpdateFiltersSettings( + ctx, + authData.AccountID, + body, + ) + return request.JSON(http.StatusOK, "Success update") } } diff --git a/internal/app/http/app.go b/internal/app/http/app.go index 26f0442..31e506e 100644 --- a/internal/app/http/app.go +++ b/internal/app/http/app.go @@ -79,6 +79,7 @@ func IncludeDonatHandlers( server.PATCH(PREFIX+"/voice-settings", UpdateVoiceSettings(donatService)) server.GET(PREFIX+"/filters-settings", GetFiltersSettings(donatService)) + server.PATCH(PREFIX+"/filters-settings", UpdateFiltersSettings(donatService)) server.GET(PREFIX+"/donat/get/:streamerID", GetDonat(donatService)) diff --git a/internal/docs/docs.go b/internal/docs/docs.go index 2c82287..cd807cf 100644 --- a/internal/docs/docs.go +++ b/internal/docs/docs.go @@ -298,6 +298,11 @@ const docTemplate = `{ } }, "patch": { + "security": [ + { + "BearerAuth": [] + } + ], "description": "Update donat filters settings.", "consumes": [ "application/json" diff --git a/internal/docs/swagger.json b/internal/docs/swagger.json index 104f4a4..f4f1089 100644 --- a/internal/docs/swagger.json +++ b/internal/docs/swagger.json @@ -291,6 +291,11 @@ } }, "patch": { + "security": [ + { + "BearerAuth": [] + } + ], "description": "Update donat filters settings.", "consumes": [ "application/json" diff --git a/internal/docs/swagger.yaml b/internal/docs/swagger.yaml index e05d17b..eb15613 100644 --- a/internal/docs/swagger.yaml +++ b/internal/docs/swagger.yaml @@ -507,6 +507,8 @@ paths: description: Validation error schema: $ref: '#/definitions/echo.HTTPError' + security: + - BearerAuth: [] summary: Update donat filters settings. tags: - Donate diff --git a/internal/model/interfaces.go b/internal/model/interfaces.go index 22feb13..fb0a84f 100644 --- a/internal/model/interfaces.go +++ b/internal/model/interfaces.go @@ -94,7 +94,7 @@ type DonatService interface { UpdateVoiceSettings(ctx context.Context, streamerID int, updateModel UpdateVoiceSettings) error GetFiltersSettings(ctx context.Context, streamerID int) (FilterSettingResponse, error) - UpdateFiltersSettings(ctx context.Context, streamerID StreamerID, updateModel UpdateFilterSettings) error + UpdateFiltersSettings(ctx context.Context, streamerID int, updateModel UpdateFilterSettings) error GetModerationSettings(ctx context.Context, streamerID StreamerID) (ModerationResponse, error) UpdateModerationSettings(ctx context.Context, streamerID StreamerID, updateModel UpdateModeration) error @@ -131,6 +131,10 @@ type DonatRepo interface { GetFilterSettingsByStreamerID(ctx context.Context, streamerID int) (int, bool, error) GetFilteredWords(ctx context.Context, streamerID int) ([]string, error) + UpdateFilterSettings(ctx context.Context, streamerID int, enableLinks *bool) error + 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) } type TargetService interface { diff --git a/internal/model/models.go b/internal/model/models.go index c8cfbdf..be59ed0 100644 --- a/internal/model/models.go +++ b/internal/model/models.go @@ -213,7 +213,7 @@ type FilterSettingResponse struct { } type UpdateFilterSettings struct { - EnableLinks bool `json:"enable_links"` + EnableLinks *bool `json:"enable_links"` AddWords []string `json:"add_words"` RemoveWords []string `json:"remove_words"` } diff --git a/internal/model/sql/query.go b/internal/model/sql/query.go index 0f85cbb..2a4caa5 100644 --- a/internal/model/sql/query.go +++ b/internal/model/sql/query.go @@ -285,3 +285,19 @@ SELECT id, enable_links FROM filters WHERE streamer_id = @streamer_id; var GetFilterWords = ` SELECT word FROM filters_words WHERE donat_filter_id = @donat_filter_id;` + +var UpdateFilterSettings = ` +UPDATE filters SET enable_links = @enable_links WHERE streamer_id = @streamer_id;` + +var InsertFilteredWordsBatch = ` +INSERT INTO filters_words (donat_filter_id, word) +VALUES %s; +` + +var GetFilterIdByStreamerID = ` +SELECT id FROM filters WHERE streamer_id = @streamer_id;` + +var DeleteFilteredWordsBatch = ` +DELETE FROM filters_words +WHERE donat_filter_id = @donat_filter_id AND word = ANY(@words); +` diff --git a/internal/repository/donat/donat.go b/internal/repository/donat/donat.go index 11b3f2f..b3f6e98 100644 --- a/internal/repository/donat/donat.go +++ b/internal/repository/donat/donat.go @@ -465,5 +465,97 @@ func (repoDonat *RepoDonat) GetFilteredWords( } return filterWords, nil - +} + +func (repoDonat RepoDonat) UpdateFilterSettings( + ctx context.Context, + streamerID int, + enableLinks *bool, +) error { + if enableLinks != nil { + args := pgx.NamedArgs{ + "streamer_id": streamerID, + "enable_links": enableLinks, + } + + err := repoDonat.db.Exec(ctx, sql.UpdateFilterSettings, args) + if err != nil { + slog.Error("Failed to update filter settings", "error", err) + return err + } + } + return nil +} + +func (repoDonat *RepoDonat) GetFilterIDByStreamer( + ctx context.Context, + streamerID int, +) (int, error) { + args := pgx.NamedArgs{ + "streamer_id": streamerID, + } + + row, err := repoDonat.db.SelectOne(ctx, sql.GetFilterIdByStreamerID, args) + if err != nil { + slog.Error("Failed to get filter settings", "error", err) + return 0, err + } + var filterID int + err = row.Scan(&filterID) + if err != nil { + slog.Error("Failed to scan filter settings", "error", err) + return 0, err + } + + return filterID, nil +} + +func (repoDonat *RepoDonat) AddFilteredWords( + ctx context.Context, + filterID int, + words []string, +) error { + if len(words) == 0 { + return nil + } + + var valueStrings []string + var valueArgs []interface{} + for i, word := range words { + valueStrings = append(valueStrings, fmt.Sprintf("($%d, $%d)", i*2+1, i*2+2)) + valueArgs = append(valueArgs, filterID, word) + } + + query := fmt.Sprintf(sql.InsertFilteredWordsBatch, strings.Join(valueStrings, ",")) + + err := repoDonat.db.Exec(ctx, query, valueArgs...) + if err != nil { + slog.Error("Failed to add filtered words", "error", err) + return err + } + + return nil +} + +func (repoDonat *RepoDonat) RemoveFilteredWords( + ctx context.Context, + filterID int, + words []string, +) error { + if len(words) == 0 { + return nil // Нет слов для удаления + } + + args := pgx.NamedArgs{ + "donat_filter_id": filterID, + "words": words, + } + + err := repoDonat.db.Exec(ctx, sql.DeleteFilteredWordsBatch, args) + if err != nil { + slog.Error("Failed to remove filtered words", "error", err) + return err + } + + return nil } diff --git a/internal/service/donat/donat.go b/internal/service/donat/donat.go index bde7812..1814937 100644 --- a/internal/service/donat/donat.go +++ b/internal/service/donat/donat.go @@ -378,9 +378,39 @@ func (donatService *ServiceDonat) GetFiltersSettings( func (donatService *ServiceDonat) UpdateFiltersSettings( ctx context.Context, - streamerID model.StreamerID, + streamerID int, updateModel model.UpdateFilterSettings, ) error { + filterID, err := donatService.donatRepo.GetFilterIDByStreamer(ctx, streamerID) + if err != nil { + slog.Error("Failed to get filter ID", "error", err) + return err + } + + if updateModel.EnableLinks != nil { + err = donatService.donatRepo.UpdateFilterSettings(ctx, streamerID, updateModel.EnableLinks) + if err != nil { + slog.Error("Failed to update filter settings", "error", err) + return err + } + } + + if len(updateModel.AddWords) > 0 { + err = donatService.donatRepo.AddFilteredWords(ctx, filterID, updateModel.AddWords) + if err != nil { + slog.Error("Failed to add filtered words", "error", err) + return err + } + } + + if len(updateModel.RemoveWords) > 0 { + err = donatService.donatRepo.RemoveFilteredWords(ctx, streamerID, updateModel.RemoveWords) + if err != nil { + slog.Error("Failed to remove filtered words", "error", err) + return err + } + } + return nil }