90 lines
3.5 KiB
Go
90 lines
3.5 KiB
Go
package tenant
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/influxdata/influxdb/v2"
|
|
"github.com/influxdata/influxdb/v2/kit/metric"
|
|
"github.com/influxdata/influxdb/v2/label"
|
|
"github.com/influxdata/influxdb/v2/secret"
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
type contextKey string
|
|
|
|
const (
|
|
ctxInternal contextKey = "influx/tenant/internal"
|
|
)
|
|
|
|
func internalCtx(ctx context.Context) context.Context {
|
|
return context.WithValue(ctx, ctxInternal, true)
|
|
}
|
|
|
|
func isInternal(ctx context.Context) bool {
|
|
_, ok := ctx.Value(ctxInternal).(bool)
|
|
return ok
|
|
}
|
|
|
|
type Service struct {
|
|
store *Store
|
|
influxdb.UserService
|
|
influxdb.PasswordsService
|
|
influxdb.UserResourceMappingService
|
|
influxdb.OrganizationService
|
|
influxdb.BucketService
|
|
}
|
|
|
|
func (s *Service) RLock() {
|
|
s.store.RLock()
|
|
}
|
|
|
|
func (s *Service) RUnlock() {
|
|
s.store.RUnlock()
|
|
}
|
|
|
|
// NewService creates a new base tenant service.
|
|
func NewService(st *Store) *Service {
|
|
svc := &Service{store: st}
|
|
userSvc := NewUserSvc(st, svc)
|
|
svc.UserService = userSvc
|
|
svc.PasswordsService = userSvc
|
|
svc.UserResourceMappingService = NewUserResourceMappingSvc(st, svc)
|
|
svc.OrganizationService = NewOrganizationSvc(st, svc)
|
|
svc.BucketService = NewBucketSvc(st, svc)
|
|
|
|
return svc
|
|
}
|
|
|
|
// creates a new Service with logging and metrics middleware wrappers.
|
|
func NewSystem(store *Store, log *zap.Logger, reg prometheus.Registerer, metricOpts ...metric.ClientOptFn) *Service {
|
|
ts := NewService(store)
|
|
ts.UserService = NewUserLogger(log, NewUserMetrics(reg, ts.UserService, metricOpts...))
|
|
ts.PasswordsService = NewPasswordLogger(log, NewPasswordMetrics(reg, ts.PasswordsService, metricOpts...))
|
|
ts.UserResourceMappingService = NewURMLogger(log, NewUrmMetrics(reg, ts.UserResourceMappingService, metricOpts...))
|
|
ts.OrganizationService = NewOrgLogger(log, NewOrgMetrics(reg, ts.OrganizationService, metricOpts...))
|
|
ts.BucketService = NewBucketLogger(log, NewBucketMetrics(reg, ts.BucketService, metricOpts...))
|
|
|
|
return ts
|
|
}
|
|
|
|
func (ts *Service) NewOrgHTTPHandler(log *zap.Logger, secretSvc influxdb.SecretService) *OrgHandler {
|
|
secretHandler := secret.NewHandler(log, "id", secret.NewAuthedService(secretSvc))
|
|
urmHandler := NewURMHandler(log.With(zap.String("handler", "urm")), influxdb.OrgsResourceType, "id", ts.UserService, NewAuthedURMService(ts.OrganizationService, ts.UserResourceMappingService))
|
|
return NewHTTPOrgHandler(log.With(zap.String("handler", "org")), NewAuthedOrgService(ts.OrganizationService), urmHandler, secretHandler)
|
|
}
|
|
|
|
func (ts *Service) NewBucketHTTPHandler(log *zap.Logger, labelSvc influxdb.LabelService) *BucketHandler {
|
|
urmHandler := NewURMHandler(log.With(zap.String("handler", "urm")), influxdb.BucketsResourceType, "id", ts.UserService, NewAuthedURMService(ts.OrganizationService, ts.UserResourceMappingService))
|
|
labelHandler := label.NewHTTPEmbeddedHandler(log.With(zap.String("handler", "label")), influxdb.BucketsResourceType, labelSvc)
|
|
return NewHTTPBucketHandler(log.With(zap.String("handler", "bucket")), NewAuthedBucketService(ts.BucketService), labelSvc, urmHandler, labelHandler)
|
|
}
|
|
|
|
func (ts *Service) NewUserHTTPHandler(log *zap.Logger) *UserHandler {
|
|
return NewHTTPUserHandler(log.With(zap.String("handler", "user")), NewAuthedUserService(ts.UserService), NewAuthedPasswordService(ts.PasswordsService))
|
|
}
|
|
|
|
func (ts *Service) NewMeHTTPHandler(log *zap.Logger) *MeHandler {
|
|
return NewHTTPMeHandler(log.With(zap.String("handler", "user")), NewAuthedUserService(ts.UserService), NewAuthedPasswordService(ts.PasswordsService))
|
|
}
|