Logs for blob storage and some improvements

This commit is contained in:
Dominic Villemure
2024-07-09 23:45:51 -04:00
parent 349999722b
commit 86c9fb51fa
11 changed files with 133 additions and 69 deletions

View File

@@ -1,7 +1,8 @@
using Hutopy.Application.Common.Interfaces;
using Microsoft.AspNetCore.Http;
namespace Hutopy.Application.Users.Commands;
public record CreateUserCommand : IRequest<Guid>
public record CreateUserCommand : IRequest<IResult>
{
public required string FirstName { get; init; }
public required string LastName { get; init; }
@@ -10,7 +11,7 @@ public record CreateUserCommand : IRequest<Guid>
public required string Password { get; init; }
}
public class CreateUserCommandHandler : IRequestHandler<CreateUserCommand, Guid>
public class CreateUserCommandHandler : IRequestHandler<CreateUserCommand, IResult>
{
private readonly IApplicationDbContext _context;
private readonly IIdentityService _identityService;
@@ -21,7 +22,7 @@ public class CreateUserCommandHandler : IRequestHandler<CreateUserCommand, Guid>
_identityService = identityService;
}
public async Task<Guid> Handle(CreateUserCommand request, CancellationToken cancellationToken)
public async Task<IResult> Handle(CreateUserCommand request, CancellationToken cancellationToken)
{
await _identityService.CreateUserAsync(request.EmailAddress, request.UserName, request.FirstName, request.LastName, request.Password);
@@ -29,6 +30,6 @@ public class CreateUserCommandHandler : IRequestHandler<CreateUserCommand, Guid>
await _context.SaveChangesAsync(cancellationToken);
return new Guid(user?.Id ?? string.Empty);
return Results.Ok(new Guid(user?.Id ?? string.Empty));
}
}

View File

@@ -2,10 +2,11 @@ using System.ComponentModel.DataAnnotations.Schema;
using Hutopy.Application.Common.Interfaces;
using Hutopy.Application.Common.Models;
using Hutopy.Application.Users.Models;
using Microsoft.AspNetCore.Http;
namespace Hutopy.Application.Users.Commands;
public class UpdateCurrentUserCommand : IRequest<string>
public class UpdateCurrentUserCommand : IRequest<IResult>
{
public required string FirstName { get; init; }
public required string LastName { get; init; }
@@ -32,13 +33,13 @@ public class UpdateCurrentUserCommand : IRequest<string>
}
public class UpdateCurrentUserCommandHandler(IApplicationDbContext context, IIdentityService identityService, IMapper mapper) :
IRequestHandler<UpdateCurrentUserCommand, string>
IRequestHandler<UpdateCurrentUserCommand, IResult>
{
public async Task<string> Handle(UpdateCurrentUserCommand request, CancellationToken cancellationToken)
public async Task<IResult> Handle(UpdateCurrentUserCommand request, CancellationToken cancellationToken)
{
var identityUser = await identityService.GetCurrentUserAsync();
if (identityUser?.Id is null) return string.Empty;
if (identityUser?.Id is null) return Results.Problem("Current user not found.");
var userModel = mapper.Map<UserModel>(request);
userModel.Id = identityUser.Id;
@@ -46,8 +47,8 @@ public class UpdateCurrentUserCommandHandler(IApplicationDbContext context, IIde
var result = await identityService.UpdateCurrentUserAsync(userModel);
await context.SaveChangesAsync(cancellationToken);
return result.GetValueOrDefault();
return result.Succeeded ? Results.Ok(result.GetValueOrDefault()) : Results.Problem(result.GetErrorsAsString());
}
}

View File

@@ -1,37 +1,50 @@
using Hutopy.Application.AzureBlobStorage.Constants;
using Hutopy.Application.Common.Interfaces;
using Microsoft.AspNetCore.Http;
namespace Hutopy.Application.Users.Commands;
/// <summary>
/// Upload a banner picture. If the user has the url already, set the BannerPictureUrl in the user only without upload.
/// </summary>
public class UploadBannerPictureCommand : IRequest<string>
public class UploadBannerPictureCommand : IRequest<IResult>
{
public required Stream BannerPicture { get; init; }
public string BannerPictureUrl { get; init; } = string.Empty;
}
public class UploadBannerPictureCommandHandler(IIdentityService identityService, IAzureBlobStorageService azureBlobStorageService) : IRequestHandler<UploadBannerPictureCommand, string>
public class UploadBannerPictureCommandHandler(IIdentityService identityService, IAzureBlobStorageService azureBlobStorageService) : IRequestHandler<UploadBannerPictureCommand, IResult>
{
public async Task<string> Handle(UploadBannerPictureCommand request, CancellationToken cancellationToken)
public async Task<IResult> Handle(UploadBannerPictureCommand request, CancellationToken cancellationToken)
{
// If an url to the picture is provided, use it right away and don't upload anything.
if (!string.IsNullOrEmpty(request.BannerPictureUrl))
{
await identityService.UpdateCurrentUserBannerPictureUrlAsync(request.BannerPictureUrl);
return request.BannerPictureUrl;
return Results.Ok(request.BannerPictureUrl);
}
var identityUser = await identityService.GetCurrentUserAsync();
var currentUserId = new Guid(identityUser?.Id ?? "").ToString();
var blobName = $"{currentUserId}/{SubDirectoryNames.Profile}/{CommonFileNames.BannerPicture}";
var url = await azureBlobStorageService.UploadFileAsync(ContainerNames.Users, blobName, request.BannerPicture, ContentTypes.ImagePng);
await identityService.UpdateCurrentUserBannerPictureUrlAsync(url);
try
{
var url = await azureBlobStorageService.UploadFileAsync(ContainerNames.Users, blobName, request.BannerPicture, ContentTypes.ImagePng);
await identityService.UpdateCurrentUserBannerPictureUrlAsync(url);
return url;
return Results.Ok(url);
}
catch (InvalidOperationException ex)
{
return Results.BadRequest(ex.Message);
}
catch (Exception)
{
return Results.StatusCode(StatusCodes.Status500InternalServerError);
}
}
}

View File

@@ -1,25 +1,27 @@
using Hutopy.Application.AzureBlobStorage.Constants;
using Hutopy.Application.Common.Interfaces;
using Microsoft.AspNetCore.Http;
namespace Hutopy.Application.Users.Commands;
/// <summary>
/// Upload a profile picture. If the user has the url already, set the ProfilePictureUrl in the user only without upload.
/// </summary>
public class UploadProfilePictureCommand : IRequest<string>
public class UploadProfilePictureCommand : IRequest<IResult>
{
public required Stream ProfilePicture { get; init; }
public string ProfilePictureUrl { get; init; } = string.Empty;
}
public class UploadProfilePictureCommandHandler(IIdentityService identityService, IAzureBlobStorageService azureBlobStorageService) : IRequestHandler<UploadProfilePictureCommand, string>
public class UploadProfilePictureCommandHandler(IIdentityService identityService, IAzureBlobStorageService azureBlobStorageService) : IRequestHandler<UploadProfilePictureCommand, IResult>
{
public async Task<string> Handle(UploadProfilePictureCommand request, CancellationToken cancellationToken)
public async Task<IResult> Handle(UploadProfilePictureCommand request, CancellationToken cancellationToken)
{
// If an url to the picture is provided, use it right away and don't upload anything.
if (!string.IsNullOrEmpty(request.ProfilePictureUrl))
{
await identityService.UpdateCurrentUserProfilePictureUrlAsync(request.ProfilePictureUrl);
return request.ProfilePictureUrl;
return Results.Ok(request.ProfilePictureUrl);
}
var identityUser = await identityService.GetCurrentUserAsync();
@@ -31,7 +33,7 @@ public class UploadProfilePictureCommandHandler(IIdentityService identityService
await identityService.UpdateCurrentUserProfilePictureUrlAsync(url);
return url;
return Results.Ok(url);
}
}

View File

@@ -1,26 +1,28 @@
using Hutopy.Application.AzureBlobStorage.Constants;
using Hutopy.Application.Common.Interfaces;
using Microsoft.AspNetCore.Http;
namespace Hutopy.Application.Users.Commands;
/// <summary>
/// Upload a website icon. If the user has the url already, set the WebsitePictureUrl in the user only without upload.
/// </summary>
public class UploadWebsiteIconCommand : IRequest<string>
public class UploadWebsiteIconCommand : IRequest<IResult>
{
public required Stream WebsiteIcon { get; init; }
public string WebsitePictureUrl { get; init; } = string.Empty;
}
public class UploadWebsiteIconCommandHandler(IIdentityService identityService, IAzureBlobStorageService azureBlobStorageService) : IRequestHandler<UploadWebsiteIconCommand, string>
public class UploadWebsiteIconCommandHandler(IIdentityService identityService, IAzureBlobStorageService azureBlobStorageService) : IRequestHandler<UploadWebsiteIconCommand, IResult>
{
public async Task<string> Handle(UploadWebsiteIconCommand request, CancellationToken cancellationToken)
public async Task<IResult> Handle(UploadWebsiteIconCommand request, CancellationToken cancellationToken)
{
// If an url to the picture is provided, use it right away and don't upload anything.
if (!string.IsNullOrEmpty(request.WebsitePictureUrl))
{
await identityService.UpdateCurrentUserWebsiteIconUrlAsync(request.WebsitePictureUrl);
return request.WebsitePictureUrl;
return Results.Ok(request.WebsitePictureUrl);
}
var identityUser = await identityService.GetCurrentUserAsync();
@@ -32,7 +34,7 @@ public class UploadWebsiteIconCommandHandler(IIdentityService identityService, I
await identityService.UpdateCurrentUserWebsiteIconUrlAsync(url);
return url;
return Results.Ok(request.WebsitePictureUrl);
}
}