mirror of
https://github.com/kevin-DL/services.git
synced 2026-01-11 19:04:35 +00:00
65 lines
1.2 KiB
Go
65 lines
1.2 KiB
Go
// Package tenant provides multi-tenancy helpers
|
|
package tenant
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/micro/micro/v3/service/auth"
|
|
)
|
|
|
|
const (
|
|
metaOwner = "apikey_owner"
|
|
)
|
|
|
|
// 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,
|
|
},
|
|
})
|
|
}
|