68 lines
1.7 KiB
Go
68 lines
1.7 KiB
Go
package platform
|
|
|
|
import "context"
|
|
|
|
type Principal struct {
|
|
SubjectID string `json:"subjectId,omitempty"`
|
|
SessionID string `json:"-"`
|
|
Name string `json:"name"`
|
|
Username string `json:"username,omitempty"`
|
|
Role string `json:"role"`
|
|
UserType string `json:"userType"`
|
|
CustomerRef string `json:"customerRef,omitempty"`
|
|
TenantRef string `json:"tenantRef,omitempty"`
|
|
AuthProvider string `json:"authProvider"`
|
|
MenuKeys []string `json:"menuKeys"`
|
|
VehicleVINs []string `json:"-"`
|
|
VehicleCount int `json:"vehicleCount"`
|
|
}
|
|
|
|
func (p Principal) Clone() Principal {
|
|
p.MenuKeys = append([]string(nil), p.MenuKeys...)
|
|
p.VehicleVINs = append([]string(nil), p.VehicleVINs...)
|
|
p.VehicleCount = len(p.VehicleVINs)
|
|
return p
|
|
}
|
|
|
|
func (p Principal) CanMenu(key string) bool {
|
|
if p.UserType == "admin" || p.Role == "admin" {
|
|
return true
|
|
}
|
|
for _, value := range p.MenuKeys {
|
|
if value == key {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (p Principal) CanVIN(vin string) bool {
|
|
if p.UserType != "customer" {
|
|
return true
|
|
}
|
|
for _, allowed := range p.VehicleVINs {
|
|
if allowed == vin {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
type principalContextKey struct{}
|
|
|
|
func WithPrincipal(ctx context.Context, principal Principal) context.Context {
|
|
return context.WithValue(ctx, principalContextKey{}, principal)
|
|
}
|
|
|
|
func PrincipalFromContext(ctx context.Context) (Principal, bool) {
|
|
principal, ok := ctx.Value(principalContextKey{}).(Principal)
|
|
return principal, ok
|
|
}
|
|
|
|
func ActorFromContext(ctx context.Context) string {
|
|
if principal, ok := PrincipalFromContext(ctx); ok && principal.Name != "" {
|
|
return principal.Name
|
|
}
|
|
return "system"
|
|
}
|