98 lines
2.4 KiB
Go
98 lines
2.4 KiB
Go
|
|
// permission-seed upserts the platform permission catalog and default system
|
||
|
|
// roles for one or more tenants. Safe to re-run (idempotent by key).
|
||
|
|
package main
|
||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
"flag"
|
||
|
|
"fmt"
|
||
|
|
"os"
|
||
|
|
"strings"
|
||
|
|
"time"
|
||
|
|
|
||
|
|
libmongo "gateway/internal/library/mongo"
|
||
|
|
permrepo "gateway/internal/model/permission/repository"
|
||
|
|
permseed "gateway/internal/model/permission/seed"
|
||
|
|
|
||
|
|
"github.com/zeromicro/go-zero/core/logx"
|
||
|
|
)
|
||
|
|
|
||
|
|
var (
|
||
|
|
flagMongoHost = flag.String("mongo-host", envOr("K6_MONGO_HOST", "127.0.0.1"), "Mongo host")
|
||
|
|
flagMongoPort = flag.Int("mongo-port", envOrInt("K6_MONGO_PORT", 27017), "Mongo port")
|
||
|
|
flagMongoDB = flag.String("mongo-db", envOr("K6_MONGO_DB", "gateway_k6"), "Mongo database")
|
||
|
|
flagTenants = flag.String("tenants", envOr("PERM_SEED_TENANTS", "k6-tenant"), "Comma-separated tenant_id list")
|
||
|
|
)
|
||
|
|
|
||
|
|
func main() {
|
||
|
|
flag.Parse()
|
||
|
|
logx.Disable()
|
||
|
|
|
||
|
|
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
||
|
|
defer cancel()
|
||
|
|
|
||
|
|
tenantIDs := splitCSV(*flagTenants)
|
||
|
|
if len(tenantIDs) == 0 {
|
||
|
|
exitf("no tenants to seed")
|
||
|
|
}
|
||
|
|
|
||
|
|
conf := &libmongo.Conf{
|
||
|
|
Schema: "mongodb",
|
||
|
|
Host: *flagMongoHost,
|
||
|
|
Port: *flagMongoPort,
|
||
|
|
Database: *flagMongoDB,
|
||
|
|
}
|
||
|
|
|
||
|
|
perms := permrepo.NewPermissionRepository(permrepo.PermissionRepositoryParam{Conf: conf})
|
||
|
|
roles := permrepo.NewRoleRepository(permrepo.RoleRepositoryParam{Conf: conf})
|
||
|
|
rolePerms := permrepo.NewRolePermissionRepository(permrepo.RolePermissionRepositoryParam{Conf: conf})
|
||
|
|
|
||
|
|
rpt, err := permseed.Apply(ctx, perms, roles, rolePerms, permseed.ApplyOptions{
|
||
|
|
TenantIDs: tenantIDs,
|
||
|
|
})
|
||
|
|
if err != nil {
|
||
|
|
exitf("seed: %v", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
logf("tenants=%v catalog=%d roles=%d role_perms=%d",
|
||
|
|
tenantIDs, rpt.CatalogUpserted, rpt.RolesUpserted, rpt.RolePermissionSet)
|
||
|
|
}
|
||
|
|
|
||
|
|
func splitCSV(s string) []string {
|
||
|
|
parts := strings.Split(s, ",")
|
||
|
|
out := make([]string, 0, len(parts))
|
||
|
|
for _, p := range parts {
|
||
|
|
p = strings.TrimSpace(p)
|
||
|
|
if p != "" {
|
||
|
|
out = append(out, p)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return out
|
||
|
|
}
|
||
|
|
|
||
|
|
func envOr(k, def string) string {
|
||
|
|
if v := os.Getenv(k); v != "" {
|
||
|
|
return v
|
||
|
|
}
|
||
|
|
return def
|
||
|
|
}
|
||
|
|
|
||
|
|
func envOrInt(k string, def int) int {
|
||
|
|
if v := os.Getenv(k); v != "" {
|
||
|
|
var n int
|
||
|
|
if _, err := fmt.Sscanf(v, "%d", &n); err == nil {
|
||
|
|
return n
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return def
|
||
|
|
}
|
||
|
|
|
||
|
|
func logf(format string, a ...any) {
|
||
|
|
fmt.Fprintf(os.Stderr, "[permission-seed] "+format+"\n", a...)
|
||
|
|
}
|
||
|
|
|
||
|
|
func exitf(format string, a ...any) {
|
||
|
|
logf(format, a...)
|
||
|
|
os.Exit(1)
|
||
|
|
}
|