108 lines
2.6 KiB
Go
108 lines
2.6 KiB
Go
package gorm
|
|
|
|
import (
|
|
"github.com/jinzhu/gorm"
|
|
"src.dualinventive.com/go/lib/dilog"
|
|
"src.dualinventive.com/go/users-service/internal/domain"
|
|
"src.dualinventive.com/go/users-service/internal/storage"
|
|
)
|
|
|
|
//UserRepository reflects a gorm based UserRepository
|
|
type UserRepository struct {
|
|
DB *gorm.DB
|
|
logger dilog.Logger
|
|
}
|
|
|
|
//NewUserRepository returns a new gorm based storage.UserRepository
|
|
func NewUserRepository(logger dilog.Logger, dbconn *gorm.DB) (storage.UserRepository, error) {
|
|
repo := &UserRepository{
|
|
DB: dbconn,
|
|
logger: logger,
|
|
}
|
|
return repo, nil
|
|
}
|
|
|
|
//GetUserByID returns a user by the given userID or nil if not found.
|
|
func (r *UserRepository) GetUserByID(userID uint64) (*domain.User, error) {
|
|
var user domain.User
|
|
err := r.DB.
|
|
Preload("Roles").
|
|
Preload("Roles.Rights").
|
|
Preload("Company").
|
|
Where(&domain.User{ID: uint(userID)}).
|
|
First(&user).Error
|
|
if err == gorm.ErrRecordNotFound {
|
|
return nil, nil
|
|
}
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &user, nil
|
|
}
|
|
|
|
//ListUsers returns users based on filter, paginated and sorted or nil if not found.
|
|
func (r *UserRepository) ListUsers(
|
|
filter domain.UsersFilter, page uint64, perPage uint64, sort domain.SortCol,
|
|
) ([]domain.User, uint64, error) {
|
|
var users []domain.User
|
|
var count uint64
|
|
|
|
sortMapping := map[domain.SortCol]SortColQuery{
|
|
domain.SortColIDAsc: SortColQueryIDAsc,
|
|
domain.SortColIDDesc: SortColQueryIDDesc,
|
|
domain.SortColNameAsc: SortColQueryNameAsc,
|
|
domain.SortColNameDesc: SortColQueryNameDesc,
|
|
}
|
|
|
|
order, ok := sortMapping[sort]
|
|
if !ok {
|
|
order = SortColQueryIDAsc
|
|
}
|
|
|
|
whereClause := make(map[string]interface{})
|
|
if len(filter) != 0 {
|
|
for k, v := range filter {
|
|
columnname := k.String()
|
|
whereClause[columnname] = v
|
|
}
|
|
}
|
|
|
|
err := r.DB.
|
|
Preload("Roles").
|
|
Preload("Roles.Rights").
|
|
Preload("Company").
|
|
Where(whereClause).
|
|
Order(order.String()).
|
|
Offset((page - 1) * perPage).
|
|
Limit(perPage).
|
|
Find(&users).
|
|
Offset(0). // Count doesn't work with offset (https://github.com/jinzhu/gorm/issues/1752)
|
|
Count(&count).
|
|
Error
|
|
if err == gorm.ErrRecordNotFound {
|
|
return nil, 0, nil
|
|
}
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
return users, count, nil
|
|
}
|
|
|
|
// SortColQuery represents the sorting column
|
|
type SortColQuery string
|
|
|
|
// SortColQuery constants
|
|
const (
|
|
SortColQueryIDAsc SortColQuery = "user_id asc"
|
|
SortColQueryIDDesc SortColQuery = "user_id desc"
|
|
SortColQueryNameAsc SortColQuery = "user_name asc"
|
|
SortColQueryNameDesc SortColQuery = "user_name desc"
|
|
)
|
|
|
|
// String for MsgType
|
|
func (scq SortColQuery) String() string {
|
|
return string(scq)
|
|
}
|