Files
Xor290 9e11f01c2c
ci-api / test (push) Failing after 14m25s
ci-web / test (push) Failing after 8m17s
chore: build
2026-09-20 16:14:29 +02:00

65 lines
2.3 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), la durée d'un projet payé est
// choisie au déploiement puis prolongée à chaque renouvellement ; à l'échéance
// il est supprimé, sans délai de grâce. 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
StatusDeleting Status = "deleting" // suppression en cours
StatusDeleted Status = "deleted" // supprimé
StatusFailed Status = "failed" // échec du déploiement
)
// Extendable : un abonnement peut être prolongé.
func (s Status) Extendable() bool {
switch s {
case StatusProvisioning, StatusReady:
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 supprimé).
ExpiresAt time.Time `json:"expires_at"`
}
func (Project) TableName() string { return "projects" }