79 lines
2.3 KiB
C#
79 lines
2.3 KiB
C#
|
|
using Microsoft.EntityFrameworkCore;
|
||
|
|
using WorkClub.Application.Interfaces;
|
||
|
|
using WorkClub.Domain.Entities;
|
||
|
|
using WorkClub.Domain.Enums;
|
||
|
|
using WorkClub.Infrastructure.Data;
|
||
|
|
|
||
|
|
namespace WorkClub.Api.Services;
|
||
|
|
|
||
|
|
public class MemberSyncService
|
||
|
|
{
|
||
|
|
private readonly AppDbContext _context;
|
||
|
|
private readonly ITenantProvider _tenantProvider;
|
||
|
|
|
||
|
|
public MemberSyncService(AppDbContext context, ITenantProvider tenantProvider)
|
||
|
|
{
|
||
|
|
_context = context;
|
||
|
|
_tenantProvider = tenantProvider;
|
||
|
|
}
|
||
|
|
|
||
|
|
public async Task EnsureMemberExistsAsync(HttpContext httpContext)
|
||
|
|
{
|
||
|
|
if (httpContext?.User?.Identity?.IsAuthenticated != true)
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
var externalUserId = httpContext.User.FindFirst("sub")?.Value;
|
||
|
|
if (string.IsNullOrEmpty(externalUserId))
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
var tenantId = _tenantProvider.GetTenantId();
|
||
|
|
|
||
|
|
var existingMember = await _context.Members
|
||
|
|
.FirstOrDefaultAsync(m => m.ExternalUserId == externalUserId && m.TenantId == tenantId);
|
||
|
|
|
||
|
|
if (existingMember != null)
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
var email = httpContext.User.FindFirst("email")?.Value ?? httpContext.User.FindFirst("preferred_username")?.Value ?? "unknown@example.com";
|
||
|
|
var name = httpContext.User.FindFirst("name")?.Value ?? email.Split('@')[0];
|
||
|
|
|
||
|
|
var roleClaim = httpContext.User.FindFirst(System.Security.Claims.ClaimTypes.Role)?.Value ?? "Member";
|
||
|
|
var clubRole = roleClaim.ToLowerInvariant() switch
|
||
|
|
{
|
||
|
|
"admin" => ClubRole.Admin,
|
||
|
|
"manager" => ClubRole.Manager,
|
||
|
|
"member" => ClubRole.Member,
|
||
|
|
"viewer" => ClubRole.Viewer,
|
||
|
|
_ => ClubRole.Member
|
||
|
|
};
|
||
|
|
|
||
|
|
var club = await _context.Clubs.FirstOrDefaultAsync(c => c.TenantId == tenantId);
|
||
|
|
if (club == null)
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
var newMember = new Member
|
||
|
|
{
|
||
|
|
Id = Guid.NewGuid(),
|
||
|
|
TenantId = tenantId,
|
||
|
|
ExternalUserId = externalUserId,
|
||
|
|
DisplayName = name,
|
||
|
|
Email = email,
|
||
|
|
Role = clubRole,
|
||
|
|
ClubId = club.Id,
|
||
|
|
CreatedAt = DateTimeOffset.UtcNow,
|
||
|
|
UpdatedAt = DateTimeOffset.UtcNow
|
||
|
|
};
|
||
|
|
|
||
|
|
_context.Members.Add(newMember);
|
||
|
|
await _context.SaveChangesAsync();
|
||
|
|
}
|
||
|
|
}
|