chore: build
ci-api / test (push) Successful in 23m32s
ci-web / test (push) Successful in 14m7s

This commit is contained in:
Xor290
2026-09-20 18:52:09 +02:00
parent 9e11f01c2c
commit 8d857faa45
66 changed files with 3673 additions and 1564 deletions
@@ -31,6 +31,7 @@ var adminUsernamePattern = regexp.MustCompile(`^[A-Za-z0-9]{3,64}$`)
type Provisioner interface {
ProvisionProject(spec demos.ProjectSpec) error
TeardownProject(namespace string) error
ProjectState(ctx context.Context, namespace string) (demos.ResourceState, error)
}
// NoopProvisioner : aucun déploiement réel (dev en mémoire, tests).
@@ -38,6 +39,9 @@ type NoopProvisioner struct{}
func (NoopProvisioner) ProvisionProject(demos.ProjectSpec) error { return nil }
func (NoopProvisioner) TeardownProject(string) error { return nil }
func (NoopProvisioner) ProjectState(context.Context, string) (demos.ResourceState, error) {
return demos.ResourceState{}, nil
}
// Config du service (injectable pour les tests).
type Config struct {
@@ -176,6 +180,24 @@ func (s *Service) Get(id string) (Project, error) {
func (s *Service) List() ([]Project, error) { return s.store.List() }
// State : état live des composants du projet (phase + CPU/mémoire). Un projet
// qui n'a pas (ou plus) de pods (échec, suppression) renvoie un état vide sans
// interroger le cluster.
func (s *Service) State(ctx context.Context, id string) (Project, demos.ResourceState, error) {
p, ok := s.store.Get(id)
if !ok {
return Project{}, demos.ResourceState{}, ErrNotFound
}
if p.Status != StatusProvisioning && p.Status != StatusReady {
return p, demos.ResourceState{}, nil
}
state, err := s.prov.ProjectState(ctx, p.Namespace)
if err != nil {
return p, demos.ResourceState{}, err
}
return p, state, nil
}
// Extend ajoute months mois à l'abonnement, à partir de l'échéance courante
// (ou de maintenant si elle est dépassée).
func (s *Service) Extend(id string, months int) (Project, error) {