src.dualinventive.com/go/users-service/internal/storage/gorm/userRepository.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)
}