102 lines
2.6 KiB
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)
|
|
}
|