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