60 lines
2.3 KiB
C#
60 lines
2.3 KiB
C#
using Microsoft.EntityFrameworkCore;
|
|
using Tiku.Application.Auth;
|
|
using Tiku.Domain.Tenancy;
|
|
using Tiku.Infrastructure.Persistence;
|
|
|
|
namespace Tiku.Infrastructure.Auth;
|
|
|
|
internal sealed class CurrentIdentityQueryService(IIdentityPersistence identityPersistence,
|
|
ITenancyPersistence tenancyPersistence) : ICurrentIdentityQueryService
|
|
{
|
|
public async Task<CurrentUserProfile?> GetUserAsync(
|
|
Guid userId,
|
|
CancellationToken cancellationToken = default)
|
|
{
|
|
var user = await identityPersistence.Users.AsNoTracking()
|
|
.Where(item => item.Id == userId)
|
|
.Select(item => new { item.Id, item.Phone, item.Email, item.Name })
|
|
.SingleOrDefaultAsync(cancellationToken);
|
|
if (user is null) return null;
|
|
|
|
var memberships = await identityPersistence.TenantMemberships.AsNoTracking()
|
|
.Where(item => item.UserId == userId && item.Status == MembershipStatus.Active)
|
|
.Join(
|
|
tenancyPersistence.Tenants.AsNoTracking(),
|
|
membership => membership.TenantId,
|
|
tenant => tenant.Id,
|
|
(membership, tenant) => new CurrentUserTenant(
|
|
tenant.Id,
|
|
tenant.Name,
|
|
tenant.Slug,
|
|
membership.Role,
|
|
membership.Status))
|
|
.ToArrayAsync(cancellationToken);
|
|
|
|
return new CurrentUserProfile(user.Id, user.Phone, user.Email, user.Name, memberships);
|
|
}
|
|
|
|
public Task<CurrentTenantMembership?> GetTenantMembershipAsync(
|
|
Guid userId,
|
|
Guid tenantId,
|
|
CancellationToken cancellationToken = default)
|
|
{
|
|
return identityPersistence.TenantMemberships.AsNoTracking()
|
|
.Where(item =>
|
|
item.UserId == userId &&
|
|
item.TenantId == tenantId &&
|
|
item.Status == MembershipStatus.Active)
|
|
.Join(
|
|
tenancyPersistence.Tenants.AsNoTracking(),
|
|
membership => membership.TenantId,
|
|
tenant => tenant.Id,
|
|
(membership, tenant) => new CurrentTenantMembership(
|
|
tenant.Id,
|
|
tenant.Name,
|
|
tenant.Slug,
|
|
tenant.Status,
|
|
membership.Role))
|
|
.SingleOrDefaultAsync(cancellationToken);
|
|
}
|
|
} |