Add user profile picture URL synced from the identity provider on login

This commit is contained in:
2026-06-01 01:47:47 +02:00
parent 7c44e6aa73
commit 11af429ecd
7 changed files with 709 additions and 1 deletions
@@ -0,0 +1,13 @@
using Ardalis.Result;
using Mediator;
namespace Musify.Application.Users.Commands
{
public record SyncUserCommand(
long Id,
string Name,
string? FirstName,
string? SecondName,
string? ProfilePictureUrl)
: ICommand<Result>;
}
@@ -0,0 +1,74 @@
using Ardalis.Result;
using Mediator;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using Musify.Application.Contracts;
using Musify.Application.Users.Commands;
using Musify.Domain.Entities;
namespace Musify.Application.Users.Handlers
{
public class SyncUserCommandHandler(IDatabase database, ILogger<SyncUserCommandHandler> logger)
: ICommandHandler<SyncUserCommand, Result>
{
public async ValueTask<Result> Handle(SyncUserCommand request, CancellationToken cancellationToken)
{
var user = await database.Users
.SingleOrDefaultAsync(u => u.Id == request.Id, cancellationToken);
if (user is null)
{
await database.Users.AddAsync(new User
{
Id = request.Id,
Name = request.Name,
NormalizedName = request.Name.ToUpperInvariant(),
FirstName = request.FirstName,
SecondName = request.SecondName,
ProfilePictureUrl = request.ProfilePictureUrl
}, cancellationToken);
await database.SaveChangesAsync(cancellationToken);
logger.LogInformation("Provisioned user {UserId}", request.Id);
return Result.Success();
}
var hasChanges = false;
if (user.Name != request.Name)
{
user.Name = request.Name;
user.NormalizedName = request.Name.ToUpperInvariant();
hasChanges = true;
}
if (user.FirstName != request.FirstName)
{
user.FirstName = request.FirstName;
hasChanges = true;
}
if (user.SecondName != request.SecondName)
{
user.SecondName = request.SecondName;
hasChanges = true;
}
if (user.ProfilePictureUrl != request.ProfilePictureUrl)
{
user.ProfilePictureUrl = request.ProfilePictureUrl;
hasChanges = true;
}
if (hasChanges)
{
user.UpdatedAt = DateTime.UtcNow;
await database.SaveChangesAsync(cancellationToken);
logger.LogInformation("Synced profile for user {UserId}", request.Id);
}
return Result.Success();
}
}
}
@@ -7,6 +7,7 @@ namespace Musify.Application.Users.Responses
string Name,
string? FirstName,
string? SecondName,
string? ProfilePictureUrl,
DateTime CreatedAt,
DateTime UpdatedAt)
{
@@ -17,6 +18,7 @@ namespace Musify.Application.Users.Responses
user.Name,
user.FirstName,
user.SecondName,
user.ProfilePictureUrl,
user.CreatedAt,
user.UpdatedAt);
}