package store import ( "fmt" "git.linuxforward.com/byom/byom-core/common" "git.linuxforward.com/byom/byom-core/logger" "github.com/sirupsen/logrus" "gorm.io/gorm" ) type DataStore struct { logger *logrus.Entry db *gorm.DB } func NewDataStore(db *gorm.DB) *DataStore { return &DataStore{ db: db, logger: logger.NewLogger("data-store"), } } func InitTables(db *gorm.DB) error { err := db.AutoMigrate(&common.User{}, &common.Invite{}, &common.UserWorkspaceRole{}, &common.Workspace{}, &common.Profile{}) if err != nil { return err } // check if there are any invites that are pending and have expired var invites []common.Invite result := db.Where("status = ? AND expires_at < ?", "pending", "now()").Find(&invites) if result.Error != nil { return fmt.Errorf("get expired invites: %w", result.Error) } // update the status of expired invites for _, invite := range invites { result := db.Model(&common.Invite{}).Where("token = ?", invite.Token).Update("status", "expired") if result.Error != nil { return fmt.Errorf("update expired invite status: %w", result.Error) } } return nil } //Tx methods func (s *DataStore) BeginTx() *gorm.DB { return s.db.Begin() } func (s *DataStore) CommitTx(tx *gorm.DB) error { return tx.Commit().Error } func (s *DataStore) Close() error { s.logger.Info("Closing database connections") sqlDB, err := s.db.DB() if err != nil { return fmt.Errorf("get sql.DB instance: %w", err) } if err := sqlDB.Close(); err != nil { return fmt.Errorf("close database connections: %w", err) } s.logger.Info("Database connections closed successfully") return nil }