38 lines
1.0 KiB
C#
38 lines
1.0 KiB
C#
namespace QMax.Api.Infrastructure.Auth;
|
|
|
|
public interface ICurrentUserAccessor
|
|
{
|
|
Guid? UserId { get; }
|
|
bool BypassTenantFilter { get; }
|
|
IDisposable Push(Guid? userId, bool bypassTenantFilter = false);
|
|
}
|
|
|
|
public sealed class CurrentUserAccessor : ICurrentUserAccessor
|
|
{
|
|
private static readonly AsyncLocal<State?> Current = new();
|
|
|
|
public Guid? UserId => Current.Value?.UserId;
|
|
public bool BypassTenantFilter => Current.Value?.BypassTenantFilter == true;
|
|
|
|
public IDisposable Push(Guid? userId, bool bypassTenantFilter = false)
|
|
{
|
|
var previous = Current.Value;
|
|
Current.Value = new State(userId, bypassTenantFilter);
|
|
return new PopScope(previous);
|
|
}
|
|
|
|
private sealed record State(Guid? UserId, bool BypassTenantFilter);
|
|
|
|
private sealed class PopScope(State? previous) : IDisposable
|
|
{
|
|
private bool _disposed;
|
|
|
|
public void Dispose()
|
|
{
|
|
if (_disposed) return;
|
|
Current.Value = previous;
|
|
_disposed = true;
|
|
}
|
|
}
|
|
}
|