36 lines
973 B
Go
36 lines
973 B
Go
package auth
|
|||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
"slices"
|
||
|
|
)
|
||
|
|
|
||
|
|
// Actor is the signed-in household member a request acts for. Handlers
|
||
|
|
// record Actor.Subject as updated_by on edits.
|
||
|
|
type Actor struct {
|
||
|
|
Subject string
|
||
|
|
Email string
|
||
|
|
Name string
|
||
|
|
Groups []string
|
||
|
|
}
|
||
|
|
|
||
|
|
// Actor returns the household member s belongs to.
|
||
|
|
func (s Session) Actor() Actor {
|
||
|
|
return Actor{Subject: s.Subject, Email: s.Email, Name: s.Name, Groups: slices.Clone(s.Groups)}
|
||
|
|
}
|
||
|
|
|
||
|
|
type actorKey struct{}
|
||
|
|
|
||
|
|
// WithActor returns a copy of ctx carrying actor. The session middleware
|
||
|
|
// calls it for every authenticated request.
|
||
|
|
func WithActor(ctx context.Context, actor Actor) context.Context {
|
||
|
|
return context.WithValue(ctx, actorKey{}, actor)
|
||
|
|
}
|
||
|
|
|
||
|
|
// ActorFrom returns the actor WithActor stored in ctx. ok is false when ctx
|
||
|
|
// has none, which behind the session middleware means a wiring bug.
|
||
|
|
func ActorFrom(ctx context.Context) (actor Actor, ok bool) {
|
||
|
|
actor, ok = ctx.Value(actorKey{}).(Actor)
|
||
|
|
return actor, ok
|
||
|
|
}
|