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 }