Files
services/pkg/tenant/tenant.go
2022-02-17 16:33:10 +00:00

77 lines
1.4 KiB
Go

// Package tenant provides multi-tenancy helpers
package tenant
import (
"context"
"fmt"
"github.com/micro/micro/v3/service/auth"
)
const (
metaOwner = "apikey_owner"
// default tenant
defaultId = "micro"
)
// FromContext returns a tenant from the context
func FromContext(ctx context.Context) (string, bool) {
acc, ok := auth.AccountFromContext(ctx)
if !ok {
return "", false
}
return FromAccount(acc), true
}
// FromAccount returns a tenant from
func FromAccount(acc *auth.Account) string {
id := acc.ID
issuer := acc.Issuer
owner := acc.Metadata[metaOwner]
if len(id) == 0 {
id = "micro"
}
if len(issuer) == 0 {
issuer = "micro"
}
if len(owner) == 0 {
owner = id
}
return fmt.Sprintf("%s/%s", acc.Issuer, owner)
}
// CreateKey generated a unique key for a resource
func CreateKey(ctx context.Context, key string) string {
t, ok := FromContext(ctx)
if !ok {
return key
}
// return a tenant prefixed key e.g micro/asim/foobar
return fmt.Sprintf("%s/%s", t, key)
}
// NewContext returns a context that will encapsulate the given tenant
func NewContext(id, issuer, owner string) context.Context {
return auth.ContextWithAccount(context.Background(), &auth.Account{
ID: id,
Issuer: issuer,
Metadata: map[string]string{
metaOwner: owner,
},
})
}
// Get the tenant and default where needed
func Id(ctx context.Context) string {
id, ok := FromContext(ctx)
if !ok {
return "micro"
}
return id
}