first commit
This commit is contained in:
125
internal/modules/user/repository.go
Normal file
125
internal/modules/user/repository.go
Normal file
@@ -0,0 +1,125 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user