// Package projects : cycle de vie des projets vitrine déployés pour un client // sur abonnement de 1 à 12 mois (un projet = un namespace isolé). // // Contrairement aux démos (TTL fixe de 30 jours, détruites à l'échéance), un // projet payé est suspendu à l'échéance puis supprimé seulement après un // délai de grâce : un renouvellement en retard ne détruit pas les données du // client. Le paiement est hors périmètre : l'admin Omnex saisit la durée // souscrite au déploiement puis à chaque renouvellement. package projects import "time" const ( MinMonths = 1 MaxMonths = 12 // DefaultAdminNumber : nombre de comptes admin autorisés dans le backend // déployé (ADMIN_NUMBER) quand l'admin Omnex n'en précise pas. DefaultAdminNumber = 1 MaxAdminNumber = 20 ) // Status : état d'un projet. type Status string const ( StatusPending Status = "pending" // créé, pas encore pris par le worker StatusProvisioning Status = "provisioning" // déploiement en cours StatusReady Status = "ready" // en ligne StatusSuspended Status = "suspended" // abonnement échu : arrêté, données conservées jusqu'à DeleteAt StatusDeleting Status = "deleting" // suppression en cours StatusDeleted Status = "deleted" // supprimé StatusFailed Status = "failed" // échec du déploiement ) // Extendable : un abonnement peut être prolongé (et un projet suspendu relancé). func (s Status) Extendable() bool { switch s { case StatusProvisioning, StatusReady, StatusSuspended: return true } return false } type Project struct { ID string `gorm:"type:uuid;primaryKey" json:"id"` ClientName string `gorm:"size:64;not null;index" json:"client_name"` Status Status `gorm:"size:20;not null;index" json:"status"` Namespace string `gorm:"size:63;uniqueIndex" json:"namespace"` Host string `gorm:"size:255" json:"host"` URL string `gorm:"size:255" json:"url"` // AdminUsername : compte admin créé dans le backend déployé (le mot de // passe n'est jamais persisté). AdminNumber : ADMIN_NUMBER du backend. AdminUsername string `gorm:"size:64" json:"admin_username"` AdminNumber int `json:"admin_number"` // MonthsPurchased : total des mois souscrits (création + renouvellements). MonthsPurchased int `json:"months_purchased"` CreatedAt time.Time `json:"created_at"` // ExpiresAt : fin de l'abonnement (le projet est alors suspendu). ExpiresAt time.Time `json:"expires_at"` // DeleteAt : suppression définitive si l'abonnement n'est pas renouvelé // (ExpiresAt + délai de grâce). DeleteAt time.Time `json:"delete_at"` SuspendedAt *time.Time `json:"suspended_at,omitempty"` } func (Project) TableName() string { return "projects" }