70 lines
2.7 KiB
Go
70 lines
2.7 KiB
Go
// 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" }
|