feat: Updated pricing page
Server Deploy / deploy (push) Successful in 2m46s

This commit is contained in:
mrhid6
2026-07-27 22:08:17 +01:00
parent d5c8d0d0f2
commit 20e57d19c7
5 changed files with 172 additions and 180 deletions
-92
View File
@@ -1,92 +0,0 @@
package store
import (
"context"
"errors"
"fmt"
"time"
"github.com/mrhid6/vantage/shared/indexes"
"go.mongodb.org/mongo-driver/v2/bson"
"go.mongodb.org/mongo-driver/v2/mongo"
"go.mongodb.org/mongo-driver/v2/mongo/options"
"go.mongodb.org/mongo-driver/v2/x/mongo/driver/connstring"
)
var database *mongo.Database
func Connect(uri string) error {
cs, err := connstring.ParseAndValidate(uri)
if err != nil {
return fmt.Errorf("parse MONGO_URI: %w", err)
}
if cs.Database == "" {
return errors.New("MONGO_URI must name a database, e.g. mongodb://host:27017/vantage")
}
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
client, err := mongo.Connect(options.Client().ApplyURI(uri))
if err != nil {
return err
}
if err := client.Ping(ctx, nil); err != nil {
return err
}
database = client.Database(cs.Database)
return nil
}
func DatabaseName() string {
if database == nil {
return ""
}
return database.Name()
}
func col(name string) *mongo.Collection { return database.Collection(name) }
func EnsureIndexes() error {
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
// users.email and instances.slug are declared in the shared module so both
// services agree. Re-declaring at boot means sitesvc does not depend on the
// control plane having started first.
return indexes.EnsureCoreIndexes(ctx, database)
}
// RequireMigratedDatabase refuses to start against a control-plane database
// that has not run migration 0004.
//
// Provisioning into `orgs` while the control plane reads `instances` would
// create tenants nobody can see — the exact skew failure the shared module was
// built to prevent. Failing to start is strictly better.
func RequireMigratedDatabase(ctx context.Context) error {
names, err := database.ListCollectionNames(ctx, bson.M{})
if err != nil {
return fmt.Errorf("list collections: %w", err)
}
var hasInstances, hasOrgs bool
for _, n := range names {
switch n {
case "instances":
hasInstances = true
case "orgs":
hasOrgs = true
}
}
// A brand-new database has neither. That is fine — whichever service starts
// first creates `instances`.
if !hasInstances && !hasOrgs {
return nil
}
if !hasInstances {
return errors.New("instances collection not found; deploy the control plane first")
}
return nil
}