package user import "gorm.io/gorm" type Repository interface { Create(u *User) error FindAll() ([]User, error) FindAllPaginated(page, limit int, query ListUserQuery) ([]User, int64, error) FindByID(id uint) (*User, error) FindByEmail(email string) (*User, error) FindByGoogleID(googleID string) (*User, error) FindByVerificationToken(token string) (*User, error) FindByResetToken(token string) (*User, error) Update(u *User) error Delete(id uint) error } type repository struct { db *gorm.DB } func NewRepository(db *gorm.DB) Repository { return &repository{db: db} } var userSelectColumns = []string{ "id", "name", "email", "password", "role", "status", "avatar_url", "google_id", "is_email_verified", "verification_token", "reset_password_token", "reset_password_expires_at", "created_at", "updated_at", } func (r *repository) Create(u *User) error { return r.db.Create(u).Error } func (r *repository) FindAll() ([]User, error) { var users []User err := r.db.Select(userSelectColumns).Find(&users).Error return users, err } func (r *repository) FindAllPaginated(page, limit int, queryParams ListUserQuery) ([]User, int64, error) { var users []User var total int64 query := r.db.Model(&User{}).Select(userSelectColumns) if queryParams.Role != "" { query = query.Where("role = ?", queryParams.Role) } if queryParams.Status != "" { query = query.Where("status = ?", queryParams.Status) } if queryParams.Search != "" { pattern := "%" + queryParams.Search + "%" query = query.Where("name ILIKE ? OR email ILIKE ?", pattern, pattern) } if err := query.Count(&total).Error; err != nil { return nil, 0, err } offset := (page - 1) * limit err := query.Order("id DESC").Limit(limit).Offset(offset).Find(&users).Error if err != nil { return nil, 0, err } return users, total, nil } func (r *repository) FindByID(id uint) (*User, error) { var u User err := r.db.Select(userSelectColumns).First(&u, id).Error if err != nil { return nil, err } return &u, nil } func (r *repository) FindByEmail(email string) (*User, error) { var u User err := r.db.Select(userSelectColumns).Where("email = ?", email).First(&u).Error if err != nil { return nil, err } return &u, nil } func (r *repository) FindByGoogleID(googleID string) (*User, error) { var u User err := r.db.Select(userSelectColumns).Where("google_id = ?", googleID).First(&u).Error if err != nil { return nil, err } return &u, nil } func (r *repository) FindByVerificationToken(token string) (*User, error) { var u User err := r.db.Select(userSelectColumns).Where("verification_token = ?", token).First(&u).Error if err != nil { return nil, err } return &u, nil } func (r *repository) FindByResetToken(token string) (*User, error) { var u User err := r.db.Select(userSelectColumns).Where("reset_password_token = ?", token).First(&u).Error if err != nil { return nil, err } return &u, nil } func (r *repository) Update(u *User) error { return r.db.Save(u).Error } func (r *repository) Delete(id uint) error { return r.db.Delete(&User{}, id).Error }