add router for update filter words

This commit is contained in:
harold 2025-03-09 00:51:51 +05:00
parent 3346e4db1b
commit 62b457d42b
10 changed files with 182 additions and 7 deletions

View File

@ -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")
}
}

View File

@ -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))

View File

@ -298,6 +298,11 @@ const docTemplate = `{
}
},
"patch": {
"security": [
{
"BearerAuth": []
}
],
"description": "Update donat filters settings.",
"consumes": [
"application/json"

View File

@ -291,6 +291,11 @@
}
},
"patch": {
"security": [
{
"BearerAuth": []
}
],
"description": "Update donat filters settings.",
"consumes": [
"application/json"

View File

@ -507,6 +507,8 @@ paths:
description: Validation error
schema:
$ref: '#/definitions/echo.HTTPError'
security:
- BearerAuth: []
summary: Update donat filters settings.
tags:
- Donate

View File

@ -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 {

View File

@ -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"`
}

View File

@ -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);
`

View File

@ -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
}

View File

@ -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
}