Files
tamabox/route/user/moderation.go
T
2026-10-19 01:11:28 +08:00

53 lines
2.1 KiB
Go

// Copyright 2022 E99p1ant. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package user
import (
"github.com/sirupsen/logrus"
"github.com/tamakyi/TamaBox/internal/context"
"github.com/tamakyi/TamaBox/internal/db"
"github.com/tamakyi/TamaBox/internal/form"
"github.com/tamakyi/TamaBox/internal/i18n"
"github.com/tamakyi/TamaBox/internal/security/censor"
)
// UpdateModerationStrictness 保存当前账号的「内容审核严格度」档位。
//
// 该档位同时作用于提问、投票、私聊三条链路(由 internal/security/moderation.Check
// 统一裁决),因此只需在账号侧存一份。
func UpdateModerationStrictness(ctx context.Context, f form.UpdateModerationStrictness) {
// 反序列化失败(如请求体超限)时零值 Strictness="" 会被当成「跟随站点默认」写入,
// 把账号已选择的档位静默改回默认档 —— 先中止,不触碰现有设置。
if abortOnFormError(ctx, returnTab(ctx)) {
return
}
// 处置期内禁止修改档位:EffectiveStrictness 会强制 strict,允许保存只会让箱主
// 以为「我调成宽松了」,实际审核仍按严格执行,是更糟的误导。
if level, _, err := db.Restrictions.ActiveLevel(ctx.Request().Context(), ctx.User.ID); err == nil && level != "" {
ctx.SetErrorFlash(i18n.T(ctx.Lang(), "admin.flash.strictnessLocked"))
ctx.Redirect(returnTab(ctx))
return
}
// 非法取值一律拒绝保存:宁可保留原档位,也不要写入一个解释不了的中间状态。
if !censor.IsValidStrictness(f.Strictness) {
ctx.SetErrorFlash(i18n.T(ctx.Lang(), "admin.flash.moderationStrictnessInvalid"))
ctx.Redirect(returnTab(ctx))
return
}
if err := db.Users.UpdateModerationStrictness(ctx.Request().Context(), ctx.User.ID, f.Strictness); err != nil {
logrus.WithContext(ctx.Request().Context()).WithError(err).Error("Failed to update moderation strictness")
ctx.SetInternalErrorFlash()
ctx.Redirect(returnTab(ctx))
return
}
ctx.SetSuccessFlash(i18n.T(ctx.Lang(), "admin.flash.moderationStrictnessUpdated"))
ctx.Redirect(returnTab(ctx))
}