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 }