cml04-falcon-ui/storage/storage.go

118 lines
3.5 KiB
Go
Raw Normal View History

2024-10-04 20:02:51 +02:00
package storage
2024-10-06 04:55:38 +02:00
import (
"context"
2024-10-07 10:25:25 +02:00
"fmt"
2024-10-07 10:38:01 +02:00
"sync"
2024-10-07 11:32:26 +02:00
"time"
2024-10-06 04:55:38 +02:00
"git.espin.casa/albert/cml04-falcon-ui/types"
2024-10-07 10:38:01 +02:00
"gorm.io/driver/postgres"
"gorm.io/gorm"
2024-10-06 04:55:38 +02:00
)
2024-10-07 10:38:01 +02:00
type DBConfig struct {
Username string
Password string
Host string
Port int
Name string
}
2024-10-06 04:55:38 +02:00
type Storager interface {
Barcode(ctx context.Context, reading string) (barcode *types.Barcode, err error)
2024-10-07 19:22:01 +02:00
ListBarcode(ctx context.Context, lb types.LoadingBed, inicio, final time.Time) (barcodes []types.Barcode, err error)
2024-10-06 04:55:38 +02:00
Bundle(ctx context.Context, ua string) (bundle *types.BundleData, err error)
2024-10-08 13:22:23 +02:00
ListBundle(ctx context.Context, lb types.LoadingBed, inicio, final time.Time, confirmed bool) (bundles []types.BundleData, err error)
2024-10-09 16:02:06 +02:00
ShiftListBundle(ctx context.Context, inicio, final time.Time) (bundles []types.BundleData, err error)
2024-10-06 04:55:38 +02:00
}
2024-10-04 20:02:51 +02:00
2024-10-07 10:38:01 +02:00
type storage struct {
db *gorm.DB
mux sync.RWMutex
}
2024-10-04 20:02:51 +02:00
2024-10-09 16:02:06 +02:00
// ShiftListBundle implements Storager.
func (s *storage) ShiftListBundle(ctx context.Context, inicio, final time.Time) (bundles []types.BundleData, err error) {
if err := s.db.Where("created_at >= ? and created_at < ?", inicio, final).Find(&bundles).WithContext(ctx).Error; err != nil {
return nil, err
}
return
}
2024-10-06 04:55:38 +02:00
// ListBundle implements Storager.
2024-10-08 13:22:23 +02:00
func (s *storage) ListBundle(ctx context.Context, lb types.LoadingBed, inicio time.Time, final time.Time, confirmed bool) (bundles []types.BundleData, err error) {
2024-10-07 11:32:26 +02:00
if lb == types.ALL {
2024-10-08 13:22:23 +02:00
if err := s.db.Where("created_at >= ? and created_at < ? and confirmed = ?", inicio, final, confirmed).Find(&bundles).WithContext(ctx).Error; err != nil {
2024-10-07 11:32:26 +02:00
return nil, err
}
} else {
2024-10-08 13:22:23 +02:00
if err := s.db.Where("substr(nromatricula,1,3)=? and created_at >= ? and created_at < ? and confirmed = ?", types.MapQueryBed[lb], inicio, final, confirmed).Find(&bundles).WithContext(ctx).Error; err != nil {
2024-10-07 11:32:26 +02:00
return nil, err
}
}
return
2024-10-06 04:55:38 +02:00
}
// Bundle implements Storager.
func (s *storage) Bundle(ctx context.Context, ua string) (bundle *types.BundleData, err error) {
2024-10-08 10:32:07 +02:00
if err := s.db.First(&bundle, ua).WithContext(ctx).Error; err != nil {
2024-10-07 11:32:26 +02:00
return nil, err
}
return
2024-10-06 04:55:38 +02:00
}
// ListBarcode implements Storager.
2024-10-07 19:22:01 +02:00
func (s *storage) ListBarcode(ctx context.Context, lb types.LoadingBed, inicio time.Time, final time.Time) (barcodes []types.Barcode, err error) {
2024-10-07 11:32:26 +02:00
if lb == types.ALL {
2024-10-07 19:22:01 +02:00
if err := s.db.Where("created_at >= ? and created_at < ?", inicio, final).Find(&barcodes).WithContext(ctx).Error; err != nil {
2024-10-07 11:32:26 +02:00
return nil, err
}
} else {
2024-10-07 19:22:01 +02:00
if err := s.db.Where("loading_bed = ? and created_at >= ? and created_at < ?", lb, inicio, final).Find(&barcodes).WithContext(ctx).Error; err != nil {
2024-10-07 11:32:26 +02:00
return nil, err
}
}
return
2024-10-06 04:55:38 +02:00
}
// Barcode implements Storager.
func (s *storage) Barcode(ctx context.Context, reading string) (barcode *types.Barcode, err error) {
2024-10-07 15:24:46 +02:00
if err := s.db.First(&barcode, reading).WithContext(ctx).Error; err != nil {
2024-10-07 11:32:26 +02:00
return nil, err
}
return
2024-10-06 04:55:38 +02:00
}
2024-10-07 10:38:01 +02:00
func ProductionDataBase(conf *DBConfig) (*gorm.DB, error) {
// create dsn string
dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%d sslmode=disable TimeZone=Europe/Madrid",
conf.Host,
conf.Username,
conf.Password,
conf.Name,
conf.Port,
)
// create open database connection
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
if err != nil {
return nil, err
}
return db, nil
}
func New(conf *DBConfig) (Storager, error) {
// database holder
var db *gorm.DB
// producctio
db, err := ProductionDataBase(conf)
if err != nil {
return nil, err
}
// done
return &storage{
db: db,
mux: sync.RWMutex{},
}, nil
2024-10-04 20:02:51 +02:00
}