diff --git a/src/Backend/MyMusicLibrary.API/Controllers/MusicController.cs b/src/Backend/MyMusicLibrary.API/Controllers/MusicController.cs index 43c1868..b3fbe17 100644 --- a/src/Backend/MyMusicLibrary.API/Controllers/MusicController.cs +++ b/src/Backend/MyMusicLibrary.API/Controllers/MusicController.cs @@ -6,6 +6,7 @@ using MyMusicLibrary.Application.UseCases.Music.GetById; using MyMusicLibrary.Application.UseCases.Music.Register; using MyMusicLibrary.Application.UseCases.Music.Search; +using MyMusicLibrary.Application.UseCases.Music.Update; using MyMusicLibrary.Application.UseCases.Music.Upload; using MyMusicLibrary.Communication.Request; using MyMusicLibrary.Communication.Responses; @@ -105,4 +106,14 @@ public async Task Upload([FromServices] IUploadMusicUseCase useCa return BadRequest(ex.Message); } } + + [HttpPut("update")] + [ProducesResponseType(typeof(ResponseProfileMusicJson), StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task Update([FromServices] IUpdateMusicUseCase useCase, [FromBody] RequestUpdateMusic request) + { + var result = await useCase.Execute(request); + return Ok(result); + } } diff --git a/src/Backend/MyMusicLibrary.API/MyMusicLibrary.API.csproj b/src/Backend/MyMusicLibrary.API/MyMusicLibrary.API.csproj index eb13dc1..508da6f 100644 --- a/src/Backend/MyMusicLibrary.API/MyMusicLibrary.API.csproj +++ b/src/Backend/MyMusicLibrary.API/MyMusicLibrary.API.csproj @@ -5,6 +5,7 @@ enable enable false + true diff --git a/src/Backend/MyMusicLibrary.Application/DependencyInjectionExtension.cs b/src/Backend/MyMusicLibrary.Application/DependencyInjectionExtension.cs index 95d1f5a..64273f9 100644 --- a/src/Backend/MyMusicLibrary.Application/DependencyInjectionExtension.cs +++ b/src/Backend/MyMusicLibrary.Application/DependencyInjectionExtension.cs @@ -12,6 +12,7 @@ using MyMusicLibrary.Application.UseCases.Music.GetById; using MyMusicLibrary.Application.UseCases.Music.Register; using MyMusicLibrary.Application.UseCases.Music.Search; +using MyMusicLibrary.Application.UseCases.Music.Update; using MyMusicLibrary.Application.UseCases.Music.Upload; using MyMusicLibrary.Application.UseCases.Playlist.AddMusicToPlaylist; using MyMusicLibrary.Application.UseCases.Playlist.Create; @@ -78,5 +79,6 @@ private static void AddUseCases(IServiceCollection services) services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); } } diff --git a/src/Backend/MyMusicLibrary.Application/UseCases/Music/Update/IUpdateMusicUseCase.cs b/src/Backend/MyMusicLibrary.Application/UseCases/Music/Update/IUpdateMusicUseCase.cs new file mode 100644 index 0000000..84c8f04 --- /dev/null +++ b/src/Backend/MyMusicLibrary.Application/UseCases/Music/Update/IUpdateMusicUseCase.cs @@ -0,0 +1,8 @@ +using MyMusicLibrary.Communication.Request; +using MyMusicLibrary.Communication.Responses; + +namespace MyMusicLibrary.Application.UseCases.Music.Update; +public interface IUpdateMusicUseCase +{ + Task Execute(RequestUpdateMusic request); +} diff --git a/src/Backend/MyMusicLibrary.Application/UseCases/Music/Update/UpdateMusicUseCase.cs b/src/Backend/MyMusicLibrary.Application/UseCases/Music/Update/UpdateMusicUseCase.cs new file mode 100644 index 0000000..b0ba9a4 --- /dev/null +++ b/src/Backend/MyMusicLibrary.Application/UseCases/Music/Update/UpdateMusicUseCase.cs @@ -0,0 +1,61 @@ +using MyMusicLibrary.Communication.Request; +using MyMusicLibrary.Communication.Responses; +using MyMusicLibrary.Domain.Repositories.Music; +using MyMusicLibrary.Domain.Repositories.UnitOfWork; +using MyMusicLibrary.Domain.Services.LoggedUser; +using MyMusicLibrary.Domain.Services.Storage.Aws; +using MyMusicLibrary.Exceptions; +using MyMusicLibrary.Exceptions.ExceptionsBase; + +namespace MyMusicLibrary.Application.UseCases.Music.Update; +public class UpdateMusicUseCase : IUpdateMusicUseCase +{ + private readonly IMusicWriteOnlyRepository _musicWriteOnlyRepository; + private readonly ILoggedUser _loggedUser; + private readonly IMusicReadOnlyRepository _musicReadOnlyRepository; + private readonly IUnitOfWork _unitOfWork; + private readonly IS3Service _s3Service; + + public UpdateMusicUseCase(IMusicWriteOnlyRepository musicWriteOnlyRepository, + ILoggedUser loggedUser, + IMusicReadOnlyRepository musicReadOnlyRepository, + IUnitOfWork unitOfWork, + IS3Service s3Service) + { + _musicWriteOnlyRepository = musicWriteOnlyRepository; + _loggedUser = loggedUser; + _musicReadOnlyRepository = musicReadOnlyRepository; + _unitOfWork = unitOfWork; + _s3Service = s3Service; + } + + public async Task Execute(RequestUpdateMusic request) + { + var user = await _loggedUser.User(); + + var music = await _musicReadOnlyRepository.GetById(user, request.MusicId); + if (music is null) + throw new NotFoundException(ResourceMessagesException.MUSIC_EMPTY); + + var oldKey = music.MusicKey!; + var extension = Path.GetExtension(oldKey); + var folder = Path.GetDirectoryName(oldKey)?.Replace("\\", "/"); + var newKey = string.IsNullOrEmpty(folder) + ? $"{request.Name}{extension}" + : $"{folder}/{request.Name}{extension}"; + + await _s3Service.RenameFileAsync(oldKey, newKey); + + music.Name = request.Name; + music.MusicKey = newKey; + + await _musicWriteOnlyRepository.Update(user, music); + await _unitOfWork.Commit(); + + return new ResponseProfileMusicJson() + { + Name = music.Name + }; + } + +} diff --git a/src/Backend/MyMusicLibrary.Domain/Repositories/Music/IMusicWriteOnlyRepository.cs b/src/Backend/MyMusicLibrary.Domain/Repositories/Music/IMusicWriteOnlyRepository.cs index 3c0fefc..fbe595d 100644 --- a/src/Backend/MyMusicLibrary.Domain/Repositories/Music/IMusicWriteOnlyRepository.cs +++ b/src/Backend/MyMusicLibrary.Domain/Repositories/Music/IMusicWriteOnlyRepository.cs @@ -5,4 +5,5 @@ public interface IMusicWriteOnlyRepository Task Delete(long musicId); Task AddMusicFavorite(Entities.UserFavoritesMusic musicFavorite); Task UnfavoriteMusic(long musicId); + Task Update(Entities.User user, Entities.Music music); } diff --git a/src/Backend/MyMusicLibrary.Domain/Services/Storage/Aws/IS3Service.cs b/src/Backend/MyMusicLibrary.Domain/Services/Storage/Aws/IS3Service.cs index 7032fe5..829fc17 100644 --- a/src/Backend/MyMusicLibrary.Domain/Services/Storage/Aws/IS3Service.cs +++ b/src/Backend/MyMusicLibrary.Domain/Services/Storage/Aws/IS3Service.cs @@ -7,4 +7,5 @@ public interface IS3Service Task UploadFileAsync(IFormFile file); Task DeleteFile(string key); Task GetFileUrl(string key); + Task RenameFileAsync(string oldKey, string newKey); } diff --git a/src/Backend/MyMusicLibrary.Infrastructure/DataAccess/Repositories/Music/MusicWriteOnlyRepository.cs b/src/Backend/MyMusicLibrary.Infrastructure/DataAccess/Repositories/Music/MusicWriteOnlyRepository.cs index c8d56b6..2f4e5c8 100644 --- a/src/Backend/MyMusicLibrary.Infrastructure/DataAccess/Repositories/Music/MusicWriteOnlyRepository.cs +++ b/src/Backend/MyMusicLibrary.Infrastructure/DataAccess/Repositories/Music/MusicWriteOnlyRepository.cs @@ -37,4 +37,16 @@ public async Task UnfavoriteMusic(long musicId) _dbContext.UserFavoritesMusic.Remove(music!); } + + public async Task Update(Domain.Entities.User user, Domain.Entities.Music music) + { + var musicUpdate = await _dbContext.Music + .Where(m => m.Id == music.Id && m.UserId == user.Id) + .FirstOrDefaultAsync(); + + if (musicUpdate is null) + return; + + _dbContext.Music.Update(musicUpdate); + } } diff --git a/src/Backend/MyMusicLibrary.Infrastructure/Services/Storage/Aws/S3Service.cs b/src/Backend/MyMusicLibrary.Infrastructure/Services/Storage/Aws/S3Service.cs index c2292cb..b0f26b2 100644 --- a/src/Backend/MyMusicLibrary.Infrastructure/Services/Storage/Aws/S3Service.cs +++ b/src/Backend/MyMusicLibrary.Infrastructure/Services/Storage/Aws/S3Service.cs @@ -73,4 +73,28 @@ public async Task GetFileUrl(string key) return await Task.FromResult(new S3UrlDto(url: url)); } + + public async Task RenameFileAsync(string oldKey, string newKey) + { + // Copia o arquivo existente para o novo nome + var copyRequest = new CopyObjectRequest + { + SourceBucket = bucketName, + SourceKey = oldKey, + DestinationBucket = bucketName, + DestinationKey = newKey + }; + + await _s3Client.CopyObjectAsync(copyRequest); + + // Remove o arquivo antigo + var deleteRequest = new DeleteObjectRequest + { + BucketName = bucketName, + Key = oldKey + }; + + await _s3Client.DeleteObjectAsync(deleteRequest); + } + } diff --git a/src/Shared/MyMusicLibrary.Communication/Request/RequestUpdateMusic.cs b/src/Shared/MyMusicLibrary.Communication/Request/RequestUpdateMusic.cs new file mode 100644 index 0000000..8cdd61a --- /dev/null +++ b/src/Shared/MyMusicLibrary.Communication/Request/RequestUpdateMusic.cs @@ -0,0 +1,6 @@ +namespace MyMusicLibrary.Communication.Request; +public class RequestUpdateMusic +{ + public long MusicId { get; set; } + public string Name { get; set; } = string.Empty; +}