From 9b6992b1308f943673357911ee9b5d8b185506bc Mon Sep 17 00:00:00 2001 From: kolosovpetro Date: Mon, 24 Apr 2023 17:36:16 +0200 Subject: [PATCH] blob images seed --- .../Interfaces/IBlobService.cs | 4 +- MangoAPI.Application/Services/BlobService.cs | 67 +++++++++++++++++-- .../UpdateChannelPictureCommandHandler.cs | 2 +- .../UpdateProfilePictureCommandHandler.cs | 4 +- .../AzureBlobInitializer.cs | 30 ++------- .../Constants/EnvironmentConstants.cs | 8 ++- .../Constants/GreetingsConstants.cs | 2 +- .../Constants/ResponseMessageCodes.cs | 2 - MangoAPI.Domain/Constants/RoutingConstants.cs | 4 +- MangoAPI.Presentation/Startup.cs | 15 ++++- MangoAPI.Presentation/appsettings.json | 4 +- 11 files changed, 98 insertions(+), 44 deletions(-) diff --git a/MangoAPI.Application/Interfaces/IBlobService.cs b/MangoAPI.Application/Interfaces/IBlobService.cs index 4b4bd8257..60694b0c1 100644 --- a/MangoAPI.Application/Interfaces/IBlobService.cs +++ b/MangoAPI.Application/Interfaces/IBlobService.cs @@ -5,9 +5,11 @@ namespace MangoAPI.Application.Interfaces; public interface IBlobService { - string GetBlobAsync(string fileName); + Task GetBlobUrlAsync(string fileName); Task UploadFileBlobAsync(Stream stream, string contentType, string uniqueName); Task DeleteBlobAsync(string fileName); + + bool UploadFolderToBlob(string folderPath); } \ No newline at end of file diff --git a/MangoAPI.Application/Services/BlobService.cs b/MangoAPI.Application/Services/BlobService.cs index 559a0afd3..724c72c46 100644 --- a/MangoAPI.Application/Services/BlobService.cs +++ b/MangoAPI.Application/Services/BlobService.cs @@ -18,19 +18,31 @@ public BlobService(BlobServiceClient blobClient, IBlobServiceSettings blobServic this.blobServiceSettings = blobServiceSettings; } - public string GetBlobAsync(string fileName) + public async Task GetBlobUrlAsync(string fileName) { - var containerClient = blobClient.GetBlobContainerClient(blobServiceSettings.MangoBlobContainerName); + var containerClient = await GetContainerClientAsync(blobServiceSettings.MangoBlobContainerName); var client = containerClient.GetBlobClient(fileName); - return client.Uri.AbsoluteUri; + var blobExists = await client.ExistsAsync(); + + if (!blobExists.Value) + { + throw new FileNotFoundException("Blob file was not found at storage account."); + } + + var blobUrl = $"{blobServiceSettings.MangoBlobAccess}/{fileName}"; + + return blobUrl; } public async Task UploadFileBlobAsync(Stream stream, string contentType, string uniqueName) { var blobContainerName = blobServiceSettings.MangoBlobContainerName; - var containerClient = GetContainerClient(blobContainerName); + + var containerClient = await GetContainerClientAsync(blobContainerName); + var client = containerClient.GetBlobClient(uniqueName); + var headers = new BlobHttpHeaders { ContentType = contentType }; var result = await client.UploadAsync(stream, headers); @@ -52,11 +64,56 @@ public async Task DeleteBlobAsync(string fileName) return result.Value; } + public bool UploadFolderToBlob(string folderPath) + { + var containerClient = GetContainerClient(blobServiceSettings.MangoBlobContainerName); + + var combinePath = Path.Combine(AppContext.BaseDirectory, folderPath); + + var files = Directory.GetFiles(combinePath); + + foreach (var file in files) + { + var fileName = Path.GetFileName(file); + + var client = containerClient.GetBlobClient(fileName); + + var fileExists = client.Exists(); + + if (fileExists.Value) + { + continue; + } + + using var stream = File.OpenRead(file); + + var headers = new BlobHttpHeaders { ContentType = "image/jpg" }; + + client.Upload(stream, headers); + } + + return true; + } + + private async Task GetContainerClientAsync(string blobContainerName) + { + var containerClient = blobClient.GetBlobContainerClient(blobContainerName); + + await containerClient.CreateIfNotExistsAsync(); + + await containerClient.SetAccessPolicyAsync(PublicAccessType.BlobContainer); + + return containerClient; + } + private BlobContainerClient GetContainerClient(string blobContainerName) { var containerClient = blobClient.GetBlobContainerClient(blobContainerName); + containerClient.CreateIfNotExists(); + containerClient.SetAccessPolicy(PublicAccessType.BlobContainer); + return containerClient; } -} +} \ No newline at end of file diff --git a/MangoAPI.BusinessLogic/ApiCommands/Communities/UpdateChannelPictureCommandHandler.cs b/MangoAPI.BusinessLogic/ApiCommands/Communities/UpdateChannelPictureCommandHandler.cs index cecca094d..210f893d4 100644 --- a/MangoAPI.BusinessLogic/ApiCommands/Communities/UpdateChannelPictureCommandHandler.cs +++ b/MangoAPI.BusinessLogic/ApiCommands/Communities/UpdateChannelPictureCommandHandler.cs @@ -62,7 +62,7 @@ public async Task> Handle( await dbContext.SaveChangesAsync(cancellationToken); - var blobUrl = blobService.GetBlobAsync(uniqueFileName); + var blobUrl = await blobService.GetBlobUrlAsync(uniqueFileName); var response = UpdateChannelPictureResponse.FromSuccess(blobUrl, uniqueFileName); return responseFactory.SuccessResponse(response); diff --git a/MangoAPI.BusinessLogic/ApiCommands/Users/UpdateProfilePictureCommandHandler.cs b/MangoAPI.BusinessLogic/ApiCommands/Users/UpdateProfilePictureCommandHandler.cs index 521a751de..f3537d2ed 100644 --- a/MangoAPI.BusinessLogic/ApiCommands/Users/UpdateProfilePictureCommandHandler.cs +++ b/MangoAPI.BusinessLogic/ApiCommands/Users/UpdateProfilePictureCommandHandler.cs @@ -45,6 +45,7 @@ public async Task> Handle( } var file = request.PictureFile; + var uniqueFileName = FileNameHelper.CreateUniqueFileName(file.FileName); await blobService.UploadFileBlobAsync(file.OpenReadStream(), request.ContentType, uniqueFileName); @@ -55,7 +56,8 @@ public async Task> Handle( await dbContext.SaveChangesAsync(cancellationToken); - var newUserPictureUrl = blobService.GetBlobAsync(uniqueFileName); + var newUserPictureUrl = await blobService.GetBlobUrlAsync(uniqueFileName); + var response = UpdateProfilePictureResponse.FromSuccess(newUserPictureUrl, uniqueFileName); return responseFactory.SuccessResponse(response); diff --git a/MangoAPI.BusinessLogic/DependencyInjection/AzureBlobInitializer.cs b/MangoAPI.BusinessLogic/DependencyInjection/AzureBlobInitializer.cs index b75e070ae..2320d1c2a 100644 --- a/MangoAPI.BusinessLogic/DependencyInjection/AzureBlobInitializer.cs +++ b/MangoAPI.BusinessLogic/DependencyInjection/AzureBlobInitializer.cs @@ -1,42 +1,20 @@ -using Azure.Storage.Blobs; -using Azure.Storage.Blobs.Models; using MangoAPI.Application.Interfaces; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; -using System; -using System.IO; namespace MangoAPI.BusinessLogic.DependencyInjection; public static class AzureBlobInitializer { + private const string SeedImagesFolder = "../../../../img/seed_images"; + public static void InitializeAzureBlob(this IApplicationBuilder app) { using var serviceScope = app.ApplicationServices.GetRequiredService() .CreateScope(); - var blobClient = serviceScope.ServiceProvider.GetService(); - var blobServiceSettings = serviceScope.ServiceProvider.GetService(); - - var containerClient = blobClient.GetBlobContainerClient(blobServiceSettings.MangoBlobContainerName); - containerClient.CreateIfNotExists(); - containerClient.SetAccessPolicy(PublicAccessType.BlobContainer); - - var files = Directory.GetFiles(Path.Combine(AppContext.BaseDirectory, "../../../../img/seed_images")); - foreach (var filePath in files) - { - var fileName = filePath.Split(@"\")[^1]; - var client = containerClient.GetBlobClient(fileName); - var result = client.Exists(); - if (result.Value) - { - continue; - } - - using var stream = File.OpenRead(filePath); + var blobService = serviceScope.ServiceProvider.GetService(); - var headers = new BlobHttpHeaders { ContentType = "image/jpg" }; - client.Upload(stream, headers); - } + blobService.UploadFolderToBlob(SeedImagesFolder); } } \ No newline at end of file diff --git a/MangoAPI.Domain/Constants/EnvironmentConstants.cs b/MangoAPI.Domain/Constants/EnvironmentConstants.cs index 40f6947d0..8c853dab3 100644 --- a/MangoAPI.Domain/Constants/EnvironmentConstants.cs +++ b/MangoAPI.Domain/Constants/EnvironmentConstants.cs @@ -21,6 +21,10 @@ public static class EnvironmentConstants public const string BlobContainer = "BlobContainer"; public const string BlobAccess = "BlobAccess"; - + public const string MangoUserPassword = "MangoUserPassword"; -} + + public const string MigrateDatabase = "MigrateDatabase"; + + public const string InitializeBlob = "InitializeBlob"; +} \ No newline at end of file diff --git a/MangoAPI.Domain/Constants/GreetingsConstants.cs b/MangoAPI.Domain/Constants/GreetingsConstants.cs index a0a6964b2..d6e1232ad 100644 --- a/MangoAPI.Domain/Constants/GreetingsConstants.cs +++ b/MangoAPI.Domain/Constants/GreetingsConstants.cs @@ -5,6 +5,6 @@ public static class GreetingsConstants public const string Hello = "Greetings, new user! I'm glad you decided to join our messenger. " + "Here you will be able to communicate with your friends and family and receive interesting information. " + "I hope you will have a lot of fun using our messenger. You are welcome!"; - + public const string Guide = "How to use the messenger: https://www.youtube.com/watch?v=3lh3we1DrEY"; } \ No newline at end of file diff --git a/MangoAPI.Domain/Constants/ResponseMessageCodes.cs b/MangoAPI.Domain/Constants/ResponseMessageCodes.cs index bb2fad7eb..7fc15f0a2 100644 --- a/MangoAPI.Domain/Constants/ResponseMessageCodes.cs +++ b/MangoAPI.Domain/Constants/ResponseMessageCodes.cs @@ -20,7 +20,6 @@ public static class ResponseMessageCodes public const string ContactNotFound = "CONTACT_NOT_FOUND"; public const string CannotAddSelfToContacts = "CANNOT_ADD_SELF_TO_CONTACTS"; public const string CannotCreateSelfChat = "CANNOT_CREATE_SELF_CHAT"; - public const string MaximumOwnerChatsExceeded100 = "MAXIMUM_OWNER_CHATS_EXCEEDED_100"; public const string InvalidRequestModel = "INVALID_REQUEST_FORMAT"; public const string KeyExchangeRequestNotFound = "KEY_EXCHANGE_REQUEST_NOT_FOUND"; public const string MessageNotFound = "MESSAGE_NOT_FOUND"; @@ -42,7 +41,6 @@ public static class ResponseMessageCodes { ContactNotFound, "User is not found in your contact list." }, { CannotAddSelfToContacts, "You cannot add yourself to the contacts." }, { CannotCreateSelfChat, "You cannot create a direct chat with yourself." }, - { MaximumOwnerChatsExceeded100, "One user cannot create more than 100 channels." }, { InvalidRequestModel, "Invalid request format. Correct input data and try again." }, { KeyExchangeRequestNotFound, diff --git a/MangoAPI.Domain/Constants/RoutingConstants.cs b/MangoAPI.Domain/Constants/RoutingConstants.cs index 98bf034ca..e1dc89bff 100644 --- a/MangoAPI.Domain/Constants/RoutingConstants.cs +++ b/MangoAPI.Domain/Constants/RoutingConstants.cs @@ -9,8 +9,8 @@ public static class RoutingConstants public const string Settings = "/settings"; public const string CreateGroup = "/createGroup"; - + public const string Register = "/register"; - + public const string Login = "/login"; } \ No newline at end of file diff --git a/MangoAPI.Presentation/Startup.cs b/MangoAPI.Presentation/Startup.cs index 2a756dea1..ad836ebe4 100644 --- a/MangoAPI.Presentation/Startup.cs +++ b/MangoAPI.Presentation/Startup.cs @@ -79,8 +79,19 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) app.Map(RoutingConstants.Register, builder => builder.UseSpa(spa => spa.Options.SourcePath = "/wwwroot")); app.Map(RoutingConstants.Login, builder => builder.UseSpa(spa => spa.Options.SourcePath = "/wwwroot")); - app.MigrateDatabase(); - app.InitializeAzureBlob(); + var shouldMigrateDatabase = configuration.GetValue(EnvironmentConstants.MigrateDatabase); + + if (shouldMigrateDatabase) + { + app.MigrateDatabase(); + } + + var shouldInitializeBlob = configuration.GetValue(EnvironmentConstants.InitializeBlob); + + if (shouldInitializeBlob) + { + app.InitializeAzureBlob(); + } } public void ConfigureServices(IServiceCollection services) diff --git a/MangoAPI.Presentation/appsettings.json b/MangoAPI.Presentation/appsettings.json index 9a020e4d9..273516ca9 100644 --- a/MangoAPI.Presentation/appsettings.json +++ b/MangoAPI.Presentation/appsettings.json @@ -26,5 +26,7 @@ "BlobUrl": "AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;DefaultEndpointsProtocol=http;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;TableEndpoint=http://127.0.0.1:10002/devstoreaccount1;", "BlobContainer": "mangocontainer", "BlobAccess": "http://127.0.0.1:10000/devstoreaccount1/mangocontainer", - "MangoUserPassword": "124fjfklse423342" + "MangoUserPassword": "124fjfklse423342", + "MigrateDatabase": true, + "InitializeBlob": true }