45 lines
1.4 KiB
C#
45 lines
1.4 KiB
C#
using HopFrame.Core.Services;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using SpotiParty.Web.Models;
|
|
|
|
namespace SpotiParty.Web.Services;
|
|
|
|
public class DashboardAuthHandler(ClientSideStorage storage, IDbContextFactory<DatabaseContext> contextFactory) : IHopFrameAuthHandler {
|
|
|
|
public const string AdminPolicy = "ADMIN";
|
|
|
|
public async Task<bool> IsAuthenticatedAsync(string? policy) {
|
|
var user = await GetCurrentUser();
|
|
if (user is null)
|
|
return false;
|
|
|
|
if (policy == AdminPolicy) {
|
|
return user.IsAdmin;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public async Task<string> GetCurrentUserDisplayNameAsync() {
|
|
var token = storage.GetUserToken();
|
|
if (string.IsNullOrWhiteSpace(token))
|
|
return string.Empty;
|
|
|
|
await using var context = await contextFactory.CreateDbContextAsync();
|
|
var user = await context.Users.AsNoTracking().FirstOrDefaultAsync(u => u.RefreshToken == token);
|
|
if (user is null) return string.Empty;
|
|
|
|
return user.DisplayName;
|
|
}
|
|
|
|
public async Task<User?> GetCurrentUser() {
|
|
var token = storage.GetUserToken();
|
|
if (string.IsNullOrWhiteSpace(token))
|
|
return null;
|
|
|
|
await using var context = await contextFactory.CreateDbContextAsync();
|
|
|
|
return await context.Users.AsNoTracking().FirstOrDefaultAsync(u => u.RefreshToken == token);
|
|
}
|
|
|
|
} |