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) }