openova/core/marketplace-api/main.go
hatiyildiz 3c2f7e4cda feat(consolidation): Phase 1 — move Catalyst-Zero apps + CI + manifests into public monorepo
Per docs/PROVISIONING-PLAN.md Phase 1. Catalyst-Zero (the running deployment on Contabo k3s, namespaces catalyst/sme/marketplace/website) source code now lives in this public repo. Cutover to public-repo CI builds happens in Phase 2.

What moved (from openova-private → openova):
- apps/console/ → core/console/ (Astro+Svelte UI)
- apps/admin/ → core/admin/ (Astro+Svelte UI, includes canonical voucher/billing/tenants admin surface)
- apps/marketplace/ → core/marketplace/ (Astro+Svelte UI, 5-step Plan→Apps→Addons→Checkout→Review flow)
- website/marketplace-api/ → core/marketplace-api/ (Go backend with handlers/, provisioner/, store/)
- clusters/contabo-mkt/apps/catalyst/ → products/catalyst/chart/templates/ (catalyst-{ui,api} K8s manifests)
- clusters/contabo-mkt/apps/sme/services/ → products/catalyst/chart/templates/sme-services/ (15 manifests)
- clusters/contabo-mkt/apps/marketplace-api/ → products/catalyst/chart/templates/marketplace-api/
- 5 CI workflows (catalyst-build, marketplace-api-build, sme-{admin,console,marketplace}-build) → .github/workflows/, renamed to drop "sme-" prefix

Image refs updated:
- ghcr.io/openova-io/openova-private/catalyst-{ui,api} → ghcr.io/openova-io/openova/catalyst-{ui,api}
- ghcr.io/openova-io/openova-private/sme-{admin,console,marketplace} → ghcr.io/openova-io/openova/{admin,console,marketplace}
- ghcr.io/openova-io/openova-private/marketplace-api → ghcr.io/openova-io/openova/marketplace-api

Workflow path updates:
- paths: 'apps/{X}/**' → 'core/{X}/**'
- context: apps/{X} → core/{X}
- deploy paths: clusters/contabo-mkt/apps/{X}/.../{X}.yaml → products/catalyst/chart/templates/.../{X}.yaml
- deploy commit: git add clusters/ → git add products/

Deferred to follow-up phase:
- 8 legacy SME backend services (auth, billing, catalog, domain, gateway, notification, provisioning, tenant) keep their ghcr.io/openova-io/openova-private/sme-* image refs because their source code in openova-private/services/ has not yet been migrated to public repo. Tracked via TODO in core/README.md migration history.
- sme-services-build.yaml NOT migrated (matches deferred services).

Documentation updates:
- core/README.md rewritten to describe what's actually in this directory now (4 deployed modules, not the old Go-monorepo placeholder design)
- products/catalyst/README.md created with migration status table
- products/catalyst/chart/Chart.yaml created (umbrella bp-catalyst-platform chart)
- docs/IMPLEMENTATION-STATUS.md §1 + §2.1 + §6 updated: console/admin/marketplace/marketplace-api/catalyst-{ui,api} all flipped from 📐 to 🚧 (deployed but not yet wired to unified Catalyst contract); openova Sovereign description rewritten to make Catalyst-Zero status explicit; omantel target updated to omantel.omani.works on Hetzner.

Verification:
- 99 source files copied (verified via git ls-files count)
- All image refs updated except the 8 deferred legacy SME backend services (verified via grep openova-private)
- Workflow naming reflects unified Catalyst (no more "sme-" prefix)

Phase 2 next: trigger public-repo CI builds, GHCR images published under openova/ namespace, Flux source on Catalyst-Zero repointed to this repo, rolling update of Contabo pods to new image SHAs. Catalyst-Zero becomes self-built from the public repo.
2026-04-28 12:08:09 +02:00

62 lines
1.7 KiB
Go

package main
import (
"log"
"net/http"
"os"
"github.com/openova-io/openova-private/website/marketplace-api/handlers"
"github.com/openova-io/openova-private/website/marketplace-api/store"
)
func getEnv(key, fallback string) string {
if v := os.Getenv(key); v != "" {
return v
}
return fallback
}
func main() {
jwtSecret := getEnv("JWT_SECRET", "dev-secret-change-me")
allowOrigin := getEnv("CORS_ORIGIN", "https://openova.io")
gitRepoPath := getEnv("GIT_REPO_PATH", "/data/repo")
smtpHost := getEnv("SMTP_HOST", "stalwart-mail.stalwart.svc.cluster.local")
smtpPort := getEnv("SMTP_PORT", "25")
fromEmail := getEnv("FROM_EMAIL", "marketplace@openova.io")
s := store.NewMemoryStore()
h := &handlers.Handler{
Store: s,
JWTSecret: []byte(jwtSecret),
AllowOrigin: allowOrigin,
GitRepoPath: gitRepoPath,
SMTPHost: smtpHost,
SMTPPort: smtpPort,
FromEmail: fromEmail,
}
mux := http.NewServeMux()
// Catalog (public, cacheable)
mux.HandleFunc("/api/marketplace/apps", h.CORS(h.ListApps))
mux.HandleFunc("/api/marketplace/apps/", h.CORS(h.GetApp))
mux.HandleFunc("/api/marketplace/bundles", h.CORS(h.ListBundles))
// Provisioning
mux.HandleFunc("/api/marketplace/provisions", h.CORS(h.CreateProvision))
mux.HandleFunc("/api/marketplace/provisions/", h.CORS(h.GetProvisionStatus))
// Tenant management (authenticated)
mux.HandleFunc("/api/marketplace/tenants/", h.CORS(h.TenantRouter))
// Health check
mux.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
w.Write([]byte("ok"))
})
log.Println("marketplace-api listening on :8080")
log.Fatal(http.ListenAndServe(":8080", mux))
}