83 lines
1.8 KiB
Go
83 lines
1.8 KiB
Go
package demos
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
// Store : persistance des démos.
|
|
type Store interface {
|
|
Create(d Demo) (Demo, error)
|
|
Get(id string) (Demo, bool)
|
|
List() ([]Demo, error)
|
|
ListByUsername(username string) ([]Demo, error)
|
|
Update(d Demo) (Demo, error)
|
|
CountActive() (int, error)
|
|
GetDemoByUsername(username string) (Demo, error)
|
|
}
|
|
|
|
// GormStore : Store adossé à PostgreSQL via GORM.
|
|
type GormStore struct{ db *gorm.DB }
|
|
|
|
func NewGormStore(db *gorm.DB) *GormStore { return &GormStore{db: db} }
|
|
|
|
func (s *GormStore) Create(d Demo) (Demo, error) {
|
|
if err := s.db.Create(&d).Error; err != nil {
|
|
return Demo{}, err
|
|
}
|
|
return d, nil
|
|
}
|
|
|
|
func (s *GormStore) Get(id string) (Demo, bool) {
|
|
var d Demo
|
|
err := s.db.Where("id = ?", id).First(&d).Error
|
|
if errors.Is(err, gorm.ErrRecordNotFound) || err != nil {
|
|
return Demo{}, false
|
|
}
|
|
return d, true
|
|
}
|
|
|
|
func (s *GormStore) List() ([]Demo, error) {
|
|
var out []Demo
|
|
if err := s.db.Order("created_at DESC").Find(&out).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
return out, nil
|
|
}
|
|
|
|
func (s *GormStore) ListByUsername(username string) ([]Demo, error) {
|
|
var out []Demo
|
|
if err := s.db.Where("username = ?", username).Order("created_at DESC").Find(&out).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
return out, nil
|
|
}
|
|
|
|
func (s *GormStore) Update(d Demo) (Demo, error) {
|
|
if err := s.db.Save(&d).Error; err != nil {
|
|
return Demo{}, err
|
|
}
|
|
return d, nil
|
|
}
|
|
|
|
// CountActive compte les démos occupant de la capacité.
|
|
func (s *GormStore) CountActive() (int, error) {
|
|
var n int64
|
|
err := s.db.Model(&Demo{}).
|
|
Where("status IN ?", []Status{StatusPending, StatusProvisioning, StatusReady, StatusExpiring}).
|
|
Count(&n).Error
|
|
return int(n), err
|
|
}
|
|
|
|
func (s *GormStore) GetDemoByUsername(username string) (Demo, error) {
|
|
var demo Demo
|
|
|
|
err := s.db.
|
|
Where("username = ?", username).
|
|
First(&demo).
|
|
Error
|
|
|
|
return demo, err
|
|
}
|