125 lines
3.0 KiB
Go
125 lines
3.0 KiB
Go
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
|
|
} |