13c53fea0a
- 管理员可管理任意用户笔记(读取/修改/删除/回收站/标签/图谱/FTS 全平台) - 普通用户仍数据隔离, 越权返回404 - 新增注册开关: 管理员后台⚙设置可开/关, 支持REGISTRATION_ENABLED环境变量 - 注册关闭时前台/登录页隐藏注册入口, 注册接口返回400 - 冒烟测试扩展到91用例全过
92 lines
2.4 KiB
Go
92 lines
2.4 KiB
Go
package repository
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"gorm.io/gorm"
|
|
"note-manager/model"
|
|
)
|
|
|
|
// UserRepository 用户数据访问层(多租户账号)
|
|
type UserRepository struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
// NewUserRepository 创建用户仓库(复用已有数据库连接)
|
|
func NewUserRepository(db *gorm.DB) *UserRepository {
|
|
return &UserRepository{db: db}
|
|
}
|
|
|
|
// AutoMigrate 确保 users 表存在
|
|
func (r *UserRepository) AutoMigrate() error {
|
|
return r.db.AutoMigrate(&model.User{})
|
|
}
|
|
|
|
// Count 统计用户总数
|
|
func (r *UserRepository) Count() (int64, error) {
|
|
var n int64
|
|
err := r.db.Model(&model.User{}).Count(&n).Error
|
|
return n, err
|
|
}
|
|
|
|
// Create 创建用户(用户名冲突返回错误)
|
|
func (r *UserRepository) Create(u *model.User) error {
|
|
return r.db.Create(u).Error
|
|
}
|
|
|
|
// GetByUsername 通过用户名查询(不分大小写,统一小写存储/匹配)
|
|
func (r *UserRepository) GetByUsername(username string) (*model.User, error) {
|
|
var u model.User
|
|
err := r.db.Where("username = ?", username).First(&u).Error
|
|
if err != nil {
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return nil, errors.New("用户不存在")
|
|
}
|
|
return nil, err
|
|
}
|
|
return &u, nil
|
|
}
|
|
|
|
// GetByID 通过 ID 查询用户
|
|
func (r *UserRepository) GetByID(id uint) (*model.User, error) {
|
|
var u model.User
|
|
err := r.db.First(&u, id).Error
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &u, nil
|
|
}
|
|
|
|
// GetDB 暴露底层连接(供需要跨表事务/迁移的场景)
|
|
func (r *UserRepository) GetDB() *gorm.DB {
|
|
return r.db
|
|
}
|
|
|
|
// ─────────────── 系统设置(key-value,含注册开关等)───────────────
|
|
|
|
// GetSetting 读取设置项(不存在返回 defaultVal)
|
|
func (r *UserRepository) GetSetting(key, defaultVal string) string {
|
|
var val string
|
|
err := r.db.Raw("SELECT value FROM app_settings WHERE key = ?", key).Scan(&val).Error
|
|
if err != nil || val == "" {
|
|
return defaultVal
|
|
}
|
|
return val
|
|
}
|
|
|
|
// SetSetting 写入或更新设置项
|
|
func (r *UserRepository) SetSetting(key, val string) error {
|
|
return r.db.Exec(`
|
|
INSERT INTO app_settings (key, value) VALUES (?, ?)
|
|
ON CONFLICT(key) DO UPDATE SET value = excluded.value`, key, val).Error
|
|
}
|
|
|
|
// Migration 中创建 app_settings 表
|
|
func (r *UserRepository) EnsureSettingsTable() error {
|
|
return r.db.Exec(`
|
|
CREATE TABLE IF NOT EXISTS app_settings (
|
|
key TEXT PRIMARY KEY,
|
|
value TEXT NOT NULL DEFAULT ''
|
|
)`).Error
|
|
}
|