diff --git a/internal/api/http/handlers/donat/donat.go b/internal/api/http/handlers/donat/donat.go index 815a22b..fdce0e4 100644 --- a/internal/api/http/handlers/donat/donat.go +++ b/internal/api/http/handlers/donat/donat.go @@ -320,14 +320,27 @@ func UpdateVoiceSettings(donatService model.DonatService) echo.HandlerFunc { // @Tags Donate // @Accept json // @Produce json +// @Security BearerAuth // @Success 200 {object} model.FilterSettingResponse "Current filters 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 /filters-settings [get] func GetFiltersSettings(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()) + } + filtersSettings, err := donatService.GetFiltersSettings(ctx, authData.AccountID) + if err != nil { + slog.Error("Failed to get filters settings", "error", err) + return echo.NewHTTPError(http.StatusInternalServerError, "Internal server error") + } + return request.JSON(http.StatusOK, filtersSettings) } } diff --git a/internal/app/http/app.go b/internal/app/http/app.go index e2ff799..26f0442 100644 --- a/internal/app/http/app.go +++ b/internal/app/http/app.go @@ -78,6 +78,8 @@ func IncludeDonatHandlers( server.GET(PREFIX+"/voice-settings", GetVoiceSettings(donatService)) server.PATCH(PREFIX+"/voice-settings", UpdateVoiceSettings(donatService)) + server.GET(PREFIX+"/filters-settings", GetFiltersSettings(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 378f56d..2c82287 100644 --- a/internal/docs/docs.go +++ b/internal/docs/docs.go @@ -254,6 +254,11 @@ const docTemplate = `{ }, "/filters-settings": { "get": { + "security": [ + { + "BearerAuth": [] + } + ], "description": "Get donat filters settings", "consumes": [ "application/json" diff --git a/internal/docs/swagger.json b/internal/docs/swagger.json index 5ed0e21..104f4a4 100644 --- a/internal/docs/swagger.json +++ b/internal/docs/swagger.json @@ -247,6 +247,11 @@ }, "/filters-settings": { "get": { + "security": [ + { + "BearerAuth": [] + } + ], "description": "Get donat filters settings", "consumes": [ "application/json" diff --git a/internal/docs/swagger.yaml b/internal/docs/swagger.yaml index 05b2345..e05d17b 100644 --- a/internal/docs/swagger.yaml +++ b/internal/docs/swagger.yaml @@ -468,6 +468,8 @@ paths: description: Validation error schema: $ref: '#/definitions/echo.HTTPError' + security: + - BearerAuth: [] summary: Get donat filters settings tags: - Donate diff --git a/internal/model/interfaces.go b/internal/model/interfaces.go index f03791d..22feb13 100644 --- a/internal/model/interfaces.go +++ b/internal/model/interfaces.go @@ -93,7 +93,7 @@ type DonatService interface { GetVoiceSettings(ctx context.Context, streamerID int) (VoiceSettingsResponse, error) UpdateVoiceSettings(ctx context.Context, streamerID int, updateModel UpdateVoiceSettings) error - GetFiltersSettings(ctx context.Context, streamerID StreamerID) (FilterSettingResponse, error) + GetFiltersSettings(ctx context.Context, streamerID int) (FilterSettingResponse, error) UpdateFiltersSettings(ctx context.Context, streamerID StreamerID, updateModel UpdateFilterSettings) error GetModerationSettings(ctx context.Context, streamerID StreamerID) (ModerationResponse, error) @@ -128,6 +128,9 @@ type DonatRepo interface { InsertLanguagesForVoiceSetting(ctx context.Context, voiceSettingID int, languageIDs []int) error GetLanguageIDsByISOCodes(ctx context.Context, isoCodes []string) ([]int, error) GetVoiceSettingIDByStreamerID(ctx context.Context, streamerID int) (int, error) + + GetFilterSettingsByStreamerID(ctx context.Context, streamerID int) (int, bool, error) + GetFilteredWords(ctx context.Context, streamerID int) ([]string, error) } type TargetService interface { diff --git a/internal/model/sql/query.go b/internal/model/sql/query.go index bc0c195..0f85cbb 100644 --- a/internal/model/sql/query.go +++ b/internal/model/sql/query.go @@ -268,7 +268,7 @@ var VoiceIDByStreamer = ` ` -const UpdateVoiceSettings = ` +var UpdateVoiceSettings = ` UPDATE voice_settings SET enable = COALESCE(@enable, enable), @@ -278,3 +278,10 @@ SET min_price = COALESCE(@min_price, min_price) WHERE streamer_id = @streamer_id; ` + +var GetFilterSettings = ` +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;` diff --git a/internal/repository/donat/donat.go b/internal/repository/donat/donat.go index 93aea37..94dbf18 100644 --- a/internal/repository/donat/donat.go +++ b/internal/repository/donat/donat.go @@ -418,3 +418,52 @@ func (repoDonat *RepoDonat) UpdateVoiceSettings( return nil } + +func (repoDonat *RepoDonat) GetFilterSettingsByStreamerID( + ctx context.Context, + streamerID int, +) (int, bool, error) { + args := pgx.NamedArgs{ + "streamer_id": streamerID, + } + + row, err := repoDonat.db.SelectOne(ctx, sql.GetFilterSettings, args) + if err != nil { + slog.Error("Failed to get filter settings", "error", err) + return 0, false, err + } + + var filterSettingID int + var enableLinks bool + err = row.Scan(&filterSettingID, &enableLinks) + if err != nil { + slog.Error("Failed to scan filter settings", "error", err) + return 0, false, err + } + + return filterSettingID, enableLinks, nil +} + +func (repoDonat *RepoDonat) GetFilteredWords( + ctx context.Context, + filterId int, +) ([]string, error) { + args := pgx.NamedArgs{ + "donat_filter_id": filterId, + } + rows, err := repoDonat.db.Select(ctx, sql.GetFilterSettings, args) + if err != nil { + slog.Error("Failed to get filter settings", "error", err) + return nil, err + } + + var filterWords []string + err = pgxscan.ScanAll(&filterWords, rows) + if err != nil { + slog.Error("Failed to scan filter settings", "error", err) + return nil, err + } + + return filterWords, nil + +} diff --git a/internal/service/donat/donat.go b/internal/service/donat/donat.go index d948a35..bde7812 100644 --- a/internal/service/donat/donat.go +++ b/internal/service/donat/donat.go @@ -352,9 +352,28 @@ func (donatService *ServiceDonat) UpdateVoiceSettings( func (donatService *ServiceDonat) GetFiltersSettings( ctx context.Context, - streamerID model.StreamerID, + streamerID int, ) (model.FilterSettingResponse, error) { - return model.FilterSettingResponse{}, nil + filterSettingID, enableLinks, err := donatService.donatRepo.GetFilterSettingsByStreamerID(ctx, streamerID) + if err != nil { + slog.Error("Failed to get filter settings", "error", err) + return model.FilterSettingResponse{}, err + } + + filteredWords, err := donatService.donatRepo.GetFilteredWords(ctx, filterSettingID) + if err != nil { + slog.Error("Failed to get filtered words", "error", err) + return model.FilterSettingResponse{}, err + } + if filteredWords == nil { + filteredWords = []string{} + } + response := model.FilterSettingResponse{ + EnableLinks: enableLinks, + FilteredWords: filteredWords, + } + + return response, nil } func (donatService *ServiceDonat) UpdateFiltersSettings(