UserService refactored to integrate into TenantUser

This commit is contained in:
2026-09-25 03:55:20 +02:00
parent 26df423180
commit 4b806a3202
@@ -1,5 +1,6 @@
using PostFundManagement.Application.Abstractions.Services; using PostFundManagement.Application.Abstractions.Services;
using PostFundManagement.Domain; using PostFundManagement.Domain;
using PostFundManagement.Domain.Abstractions;
using PostFundManagement.Domain.Errors; using PostFundManagement.Domain.Errors;
using PostFundManagement.Domain.Extensions; using PostFundManagement.Domain.Extensions;
using PostFundManagement.Domain.Models; using PostFundManagement.Domain.Models;
@@ -7,19 +8,19 @@ using PostFundManagement.Infrastructure.Database;
namespace PostFundManagement.Application.Services.Users; namespace PostFundManagement.Application.Services.Users;
public sealed class UserService(IDbContextFactory<ApplicationDbContext> contextFactory) : IUserService public sealed class UserService(IDbContextFactory<ApplicationDbContext> contextFactory, ITenantContextService tenantContext) : IUserService
{ {
public async Task<Result> SyncUserAsync(Guid userId, string email, CancellationToken cancellationToken = default) => public async Task<Result> SyncUserAsync(Guid userId, string email, CancellationToken cancellationToken = default) =>
await Result.Try((Func<Task<Result>>)(async () => await Result.Try((Func<Task<Result>>)(async () =>
{ {
await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); await using var context = await contextFactory.CreateDbContextAsync(cancellationToken);
// TODO: refactor to use TenantUser var tenantUser = await context.TenantUsers
var user = await context.Users.FirstOrDefaultAsync(u => u.Id == userId, cancellationToken); .Include(i => i.User)
.FirstOrDefaultAsync(u => u.UserId == userId, cancellationToken);
// TODO: refactor to use TenantUser if (tenantUser is null)
// TODO: Also add to TenantUser {
if (user is null)
context.Users.Add(new Domain.Entities.User context.Users.Add(new Domain.Entities.User
{ {
Id = userId, Id = userId,
@@ -27,12 +28,22 @@ public sealed class UserService(IDbContextFactory<ApplicationDbContext> contextF
Status = ActivityStatus.Active, Status = ActivityStatus.Active,
LastLoginAt = DateTime.UtcNow LastLoginAt = DateTime.UtcNow
}); });
context.TenantUsers.Add(new Domain.Entities.TenantUser
{
CreatedAt = DateTime.UtcNow,
CreatedBy = userId,
Status = ActivityStatus.Active,
TenantId = tenantContext.TenantId,
UserId = userId
});
}
else else
{ {
user!.Email = email; tenantUser.User!.Email = email;
user.LastLoginAt = DateTime.UtcNow; tenantUser.User.LastLoginAt = DateTime.UtcNow;
context.Users.Update(user); context.Users.Update(tenantUser.User);
} }
return Result.OkIf(await context.SaveChangesAsync(cancellationToken) > 0, CreateError.New); return Result.OkIf(await context.SaveChangesAsync(cancellationToken) > 0, CreateError.New);
@@ -43,32 +54,29 @@ public sealed class UserService(IDbContextFactory<ApplicationDbContext> contextF
{ {
await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); await using var context = await contextFactory.CreateDbContextAsync(cancellationToken);
// TODO: refactor to use TenantUser var query = context.TenantUsers.Include(i => i.User).AsNoTracking();
var query = context.Users.AsNoTracking();
// TODO: refactor to use TenantUser
if (request.Status.HasValue) if (request.Status.HasValue)
query = query.Where(u => u.Status == request.Status.Value); query = query.Where(u => u.Status == request.Status.Value);
if (!string.IsNullOrWhiteSpace(request.Email)) if (!string.IsNullOrWhiteSpace(request.Email))
query = query.Where(u => u.Email != null && u.Email.Contains(request.Email)); query = query.Where(u => u.User!.Email != null && u.User!.Email.Contains(request.Email));
if (!string.IsNullOrWhiteSpace(request.SortBy)) if (!string.IsNullOrWhiteSpace(request.SortBy))
query = request.SortBy.ToLowerInvariant() switch query = request.SortBy.ToLowerInvariant() switch
{ {
"email" => request.SortDescending ? query.OrderByDescending(u => u.Email) : query.OrderBy(u => u.Email), "email" => request.SortDescending ? query.OrderByDescending(u => u.User!.Email) : query.OrderBy(u => u.User!.Email),
"lastloginat" => request.SortDescending ? query.OrderByDescending(u => u.LastLoginAt) : query.OrderBy(u => u.LastLoginAt), "lastloginat" => request.SortDescending ? query.OrderByDescending(u => u.User!.LastLoginAt) : query.OrderBy(u => u.User!.LastLoginAt),
"status" => request.SortDescending ? query.OrderByDescending(u => u.Status) : query.OrderBy(u => u.Status), "status" => request.SortDescending ? query.OrderByDescending(u => u.Status) : query.OrderBy(u => u.Status),
_ => request.SortDescending ? query.OrderByDescending(u => u.Id) : query.OrderBy(u => u.Id) _ => request.SortDescending ? query.OrderByDescending(u => u.Id) : query.OrderBy(u => u.Id)
}; };
else else
query = query.OrderBy(u => u.Id); query = query.OrderBy(u => u.Id);
// TODO: refactor to use TenantUser
var users = await query.Skip((pagination.Page - 1) * pagination.PageSize) var users = await query.Skip((pagination.Page - 1) * pagination.PageSize)
.Take(pagination.PageSize).ToListAsync(cancellationToken); .Take(pagination.PageSize).ToListAsync(cancellationToken);
return Result.Ok(users.Select(u => u.Map()).ToArray()); return Result.Ok(users.Select(u => u.User!.Map()).ToArray());
})); }));
public async Task<Result> UpdateUserStatusAsync(Guid userId, ActivityStatus status, CancellationToken cancellationToken = default) => public async Task<Result> UpdateUserStatusAsync(Guid userId, ActivityStatus status, CancellationToken cancellationToken = default) =>
@@ -76,9 +84,13 @@ public sealed class UserService(IDbContextFactory<ApplicationDbContext> contextF
{ {
await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); await using var context = await contextFactory.CreateDbContextAsync(cancellationToken);
// TODO: Update TenantUser status as well var changedTotal = await context.TenantUsers
var changedTotal = await context.Users .Include(i => i.User)
.Where(f => f.Id == userId) .Where(f => f.UserId == userId)
.ExecuteUpdateAsync(f => f
.SetProperty(u => u.Status, status), cancellationToken);
changedTotal += await context.Users.Where(f => f.Id == userId)
.ExecuteUpdateAsync(f => f.SetProperty(u => u.Status, status), cancellationToken); .ExecuteUpdateAsync(f => f.SetProperty(u => u.Status, status), cancellationToken);
return Result.OkIf(changedTotal > 0, UpdateError.New); return Result.OkIf(changedTotal > 0, UpdateError.New);
@@ -89,11 +101,11 @@ public sealed class UserService(IDbContextFactory<ApplicationDbContext> contextF
{ {
await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); await using var context = await contextFactory.CreateDbContextAsync(cancellationToken);
// TODO: refactor to use TenantUser var tenantUser = await context.TenantUsers.AsNoTracking()
var user = await context.Users.AsNoTracking() .Include(i => i.User)
.FirstOrDefaultAsync(f => f.Id == userId, cancellationToken); .FirstOrDefaultAsync(f => f.UserId == userId, cancellationToken);
return Result.FailIf(user == null, NotFoundError.New) return Result.FailIf(tenantUser == null, NotFoundError.New)
.ToResult(user?.Map()!); .ToResult(tenantUser!.User?.Map()!);
})); }));
} }