package hwsauth import ( "context" ) type authenticatedModel[T Model] struct { model T fresh int64 } func getNil[T Model]() T { var result T return result } type Model interface { ID() int } type ContextLoader[T Model] func(ctx context.Context) T type LoadFunc[T Model] func(tx DBTransaction, id int) (T, error) // Return a new context with the user added in func setAuthenticatedModel[T Model](ctx context.Context, m authenticatedModel[T]) context.Context { return context.WithValue(ctx, "hwsauth context key authenticated-model", m) } // Retrieve a user from the given context. Returns nil if not set func getAuthorizedModel[T Model](ctx context.Context) (model authenticatedModel[T], ok bool) { defer func() { if r := recover(); r != nil { // panic happened, return ok = false ok = false model = authenticatedModel[T]{} } }() model, cok := ctx.Value("hwsauth context key authenticated-model").(authenticatedModel[T]) if !cok { return authenticatedModel[T]{}, false } return model, true } func (auth *Authenticator[T]) CurrentModel(ctx context.Context) T { auth.logger.Debug().Any("context", ctx).Msg("") if ctx == nil { return getNil[T]() } model, ok := getAuthorizedModel[T](ctx) if !ok { result := getNil[T]() auth.logger.Debug().Any("model", result).Msg("") return result } return model.model }