// 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)) }