src.dualinventive.com/go/assets-service/internal/storage/gorm/assetRepository.go

102 lines
2.6 KiB
Go

package gorm
import (
"github.com/jinzhu/gorm"
"src.dualinventive.com/go/assets-service/internal/domain"
"src.dualinventive.com/go/assets-service/internal/storage"
"src.dualinventive.com/go/lib/dilog"
)
//AssetRepository reflects a gorm based AssetRepository
type AssetRepository struct {
DB *gorm.DB
logger dilog.Logger
}
var sortMapping = map[domain.SortCol]SortColQuery{ //nolint: gochecknoglobals
domain.SortColIDAsc: SortColQueryIDAsc,
domain.SortColIDDesc: SortColQueryIDDesc,
domain.SortColUIDAsc: SortColQueryUIDAsc,
domain.SortColUIDDesc: SortColQueryUIDDesc,
domain.SortColSerialNrAsc: SortColQuerySerialNrAsc,
domain.SortColSerialNrDesc: SortColQuerySerialNrDesc,
}
//NewAssetRepository returns a new gorm based storage.AssetRepository
func NewAssetRepository(logger dilog.Logger, host, port, name, user, pass string) (storage.AssetRepository, error) {
db, err := openDB(host, port, name, user, pass)
if err != nil {
return nil, err
}
repo := &AssetRepository{
DB: db,
logger: logger,
}
return repo, nil
}
//GetAssetByID returns an asset by the given assetID or nil if not found.
func (r *AssetRepository) GetAssetByID(assetID uint64) (*domain.Asset, error) {
var asset domain.Asset
err := r.DB.
Where(&domain.Asset{ID: uint(assetID)}).
First(&asset).Error
if err == gorm.ErrRecordNotFound {
return nil, nil
}
if err != nil {
return nil, err
}
return &asset, nil
}
//GetAssets returns all assets or nil if not found.
func (r *AssetRepository) GetAssets(
page uint64, perPage uint64, sort domain.SortCol) (
[]domain.Asset, uint64, error) {
var assets []domain.Asset
var count uint64
order, ok := sortMapping[sort]
if !ok {
order = SortColQueryIDAsc
}
err := r.DB.
Where(&domain.Asset{ID: uint(0)}).
Order(order.String()).
Offset((page - 1) * perPage).
Limit(perPage).
Find(&assets).
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 assets, count, nil
}
// SortColQuery represents the sorting column
type SortColQuery string
// SortColQuery constants
const (
SortColQueryIDAsc SortColQuery = "device_id asc"
SortColQueryIDDesc SortColQuery = "device_id desc"
SortColQueryUIDAsc SortColQuery = "device_uid asc"
SortColQueryUIDDesc SortColQuery = "device_uid desc"
SortColQuerySerialNrAsc SortColQuery = "serial_nr asc"
SortColQuerySerialNrDesc SortColQuery = "serial_nr desc"
)
// String for MsgType
func (scq SortColQuery) String() string {
return string(scq)
}