diff --git a/api/src/Kurs.Platform.Application/Activity/ActivityAppService.cs b/api/src/Kurs.Platform.Application/Activity/ActivityAppService.cs index 3ff8a13b..36fd258e 100644 --- a/api/src/Kurs.Platform.Application/Activity/ActivityAppService.cs +++ b/api/src/Kurs.Platform.Application/Activity/ActivityAppService.cs @@ -10,11 +10,9 @@ using Kurs.Platform.Entities; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Logging; using Volo.Abp; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; -using Volo.Abp.BlobStoring; using Volo.Abp.Domain.Repositories; using Volo.Abp.Identity; @@ -27,17 +25,17 @@ public class ActivityAppService : CrudAppService< Guid, ActivityListRequestDto> { - private readonly IBlobContainer _activityBlobContainer; private readonly IRepository _repositoryUser; + private readonly BlobManager _blobContainer; public ActivityAppService( IRepository repo, - IBlobContainer activityBlobContainer, - IRepository repositoryUser + IRepository repositoryUser, + BlobManager blobContainer ) : base(repo) { - _activityBlobContainer = activityBlobContainer; _repositoryUser = repositoryUser; + _blobContainer = blobContainer; // CreatePolicyName = $"{AppCodes.Listforms.Listform}.Create"; // UpdatePolicyName = $"{AppCodes.Listforms.Listform}.Update"; @@ -55,7 +53,7 @@ public class ActivityAppService : CrudAppService< if (string.IsNullOrWhiteSpace(savedFileName)) throw new UserFriendlyException("Dosya adı geçersiz"); - var stream = await _activityBlobContainer.GetAsync(savedFileName); + var stream = await _blobContainer.GetAsync(BlobContainerNames.Activity, savedFileName); if (stream == null) throw new UserFriendlyException("Dosya bulunamadı"); @@ -132,7 +130,8 @@ public class ActivityAppService : CrudAppService< await using var stream = file.GetStream(); var savedFileName = $"{Guid.NewGuid()}_{file.FileName}"; - await _activityBlobContainer.SaveAsync( + await _blobContainer.SaveAsync( + BlobContainerNames.Activity, savedFileName, stream, true diff --git a/api/src/Kurs.Platform.Application/Identity/PlatformProfileAppService.cs b/api/src/Kurs.Platform.Application/Identity/PlatformProfileAppService.cs index 52aa3dca..abc35a79 100644 --- a/api/src/Kurs.Platform.Application/Identity/PlatformProfileAppService.cs +++ b/api/src/Kurs.Platform.Application/Identity/PlatformProfileAppService.cs @@ -7,7 +7,6 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using Volo.Abp; using Volo.Abp.Account; -using Volo.Abp.BlobStoring; using Volo.Abp.DependencyInjection; using Volo.Abp.Identity; using Volo.Abp.Users; @@ -21,15 +20,15 @@ namespace Kurs.Platform.Identity; [Route("/api/account/my-profile")] public class PlatformProfileAppService : ProfileAppService, IProfileAppService { - private readonly IBlobContainer avatarBlobContainer; + public BlobManager _blobCdnManager { get; } public PlatformProfileAppService( IdentityUserManager userManager, IOptions identityOptions, - IBlobContainer avatarBlobContainer + BlobManager blobCdnManager ) : base(userManager, identityOptions) { - this.avatarBlobContainer = avatarBlobContainer; + _blobCdnManager = blobCdnManager; } [RemoteService(false)] @@ -63,11 +62,11 @@ public class PlatformProfileAppService : ProfileAppService, IProfileAppService var fileName = $"{user.Id}.jpg"; if (input.Avatar is null || input.Avatar.ContentLength == 0) { - await avatarBlobContainer.DeleteAsync(fileName); + await _blobCdnManager.DeleteAsync(BlobContainerNames.Avatar, fileName); } else { - await avatarBlobContainer.SaveAsync(fileName, input.Avatar.GetStream(), true); + await _blobCdnManager.SaveAsync(BlobContainerNames.Avatar, fileName, input.Avatar.GetStream()); } user.Name = input.Name; diff --git a/api/src/Kurs.Platform.Application/ListForms/ListFormImportAppService.cs b/api/src/Kurs.Platform.Application/ListForms/ListFormImportAppService.cs index edeecb72..18c4912a 100644 --- a/api/src/Kurs.Platform.Application/ListForms/ListFormImportAppService.cs +++ b/api/src/Kurs.Platform.Application/ListForms/ListFormImportAppService.cs @@ -12,7 +12,6 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Volo.Abp; -using Volo.Abp.BlobStoring; using Volo.Abp.Content; using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories; @@ -25,21 +24,21 @@ public class ListFormImportAppService : PlatformAppService, IImportAppService { private readonly IRepository _importSessionRepository; private readonly IRepository _importSessionExecuteRepository; - private readonly IBlobContainer _importBlobContainer; private readonly IListFormAuthorizationManager _authManager; private readonly IQueryManager _qManager; + private readonly BlobManager _blobContainer; public ListFormImportAppService( IRepository importSessionRepository, IRepository importSessionExecuteRepository, - IBlobContainer importBlobContainer, IListFormAuthorizationManager authManager, - IQueryManager qManager + IQueryManager qManager, + BlobManager blobContainer ) { _importSessionRepository = importSessionRepository; _importSessionExecuteRepository = importSessionExecuteRepository; - _importBlobContainer = importBlobContainer; + _blobContainer = blobContainer; _authManager = authManager; _qManager = qManager; } @@ -74,7 +73,7 @@ public class ListFormImportAppService : PlatformAppService, IImportAppService try { - await _importBlobContainer.SaveAsync(blobName, file.GetStream(), overrideExisting: true); + await _blobContainer.SaveAsync(BlobContainerNames.Import, blobName, file.GetStream(), true); } catch (Exception ex) { diff --git a/api/src/Kurs.Platform.Domain.Shared/PlatformConsts.cs b/api/src/Kurs.Platform.Domain.Shared/PlatformConsts.cs index f2d304a4..7c8c7773 100644 --- a/api/src/Kurs.Platform.Domain.Shared/PlatformConsts.cs +++ b/api/src/Kurs.Platform.Domain.Shared/PlatformConsts.cs @@ -1365,13 +1365,6 @@ public static class PlatformConsts public const string dxTextBox = "dxTextBox"; } - public static class BlobContainers - { - public const string AvatarContainer = "Avatar"; - public const string ImportContainer = "Import"; - public const string ActivityContainer = "Activity"; - } - public static readonly ReadOnlyCollection Languages = new( [ new LanguageInfo(LanguageCodes.Ar, LanguageCodes.Ar, LanguageNames.Ar), @@ -1413,7 +1406,7 @@ public static class PlatformConsts new SelectListItem { Value = LanguageCodes.Tr, Text = LanguageNames.Tr }, new SelectListItem { Value = LanguageCodes.Zh, Text = LanguageNames.Zh }, ]; - + public static class CustomEndpointConsts { public static class ParameterTypes diff --git a/api/src/Kurs.Platform.Domain/BlobStoring/ActivityBlobContainer.cs b/api/src/Kurs.Platform.Domain/BlobStoring/ActivityBlobContainer.cs deleted file mode 100644 index 27c96415..00000000 --- a/api/src/Kurs.Platform.Domain/BlobStoring/ActivityBlobContainer.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Volo.Abp.BlobStoring; - -namespace Kurs.Platform.BlobStoring; - -[BlobContainerName(PlatformConsts.BlobContainers.ActivityContainer)] -public class ActivityBlobContainer -{ -} diff --git a/api/src/Kurs.Platform.Domain/BlobStoring/AvatarBlobContainer.cs b/api/src/Kurs.Platform.Domain/BlobStoring/AvatarBlobContainer.cs deleted file mode 100644 index 672ffbb4..00000000 --- a/api/src/Kurs.Platform.Domain/BlobStoring/AvatarBlobContainer.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Volo.Abp.BlobStoring; - -namespace Kurs.Platform.BlobStoring; - -[BlobContainerName(PlatformConsts.BlobContainers.AvatarContainer)] -public class AvatarBlobContainer -{ -} diff --git a/api/src/Kurs.Platform.Domain/BlobStoring/BlobContainerNames.cs b/api/src/Kurs.Platform.Domain/BlobStoring/BlobContainerNames.cs new file mode 100644 index 00000000..6af2bf72 --- /dev/null +++ b/api/src/Kurs.Platform.Domain/BlobStoring/BlobContainerNames.cs @@ -0,0 +1,8 @@ +namespace Kurs.Platform.BlobStoring; + +public static class BlobContainerNames +{ + public const string Avatar = "avatar"; + public const string Import = "import"; + public const string Activity = "activity"; +} \ No newline at end of file diff --git a/api/src/Kurs.Platform.Domain/BlobStoring/BlobManager.cs b/api/src/Kurs.Platform.Domain/BlobStoring/BlobManager.cs new file mode 100644 index 00000000..7044803c --- /dev/null +++ b/api/src/Kurs.Platform.Domain/BlobStoring/BlobManager.cs @@ -0,0 +1,42 @@ +using System.IO; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Volo.Abp.BlobStoring; +using Volo.Abp.Domain.Services; + +namespace Kurs.Platform.BlobStoring; + +[Authorize] +public class BlobManager : DomainService +{ + private readonly IBlobContainerFactory _blobContainerFactory; + + public BlobManager(IBlobContainerFactory blobContainerFactory) + { + _blobContainerFactory = blobContainerFactory; + } + + private IBlobContainer GetContainer(string containerName) + { + // containerName bir sınıfa bağlı değil, sadece string + return _blobContainerFactory.Create(containerName); + } + + public async Task SaveAsync(string containerName, string blobName, Stream bytes, bool overrideExisting = true) + { + var container = GetContainer(containerName); + await container.SaveAsync(blobName, bytes, overrideExisting); + } + + public async Task GetAsync(string containerName, string blobName) + { + var container = GetContainer(containerName); + return await container.GetAsync(blobName); + } + + public async Task DeleteAsync(string containerName, string blobName) + { + var container = GetContainer(containerName); + await container.DeleteAsync(blobName); + } +} diff --git a/api/src/Kurs.Platform.Domain/BlobStoring/ImportBlobContainer.cs b/api/src/Kurs.Platform.Domain/BlobStoring/ImportBlobContainer.cs deleted file mode 100644 index 5cfe85aa..00000000 --- a/api/src/Kurs.Platform.Domain/BlobStoring/ImportBlobContainer.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Volo.Abp.BlobStoring; - -namespace Kurs.Platform.BlobStoring; - -[BlobContainerName(PlatformConsts.BlobContainers.ImportContainer)] -public class ImportBlobContainer -{ -} diff --git a/api/src/Kurs.Platform.Domain/PlatformDomainModule.cs b/api/src/Kurs.Platform.Domain/PlatformDomainModule.cs index 5f4f77e1..40330052 100644 --- a/api/src/Kurs.Platform.Domain/PlatformDomainModule.cs +++ b/api/src/Kurs.Platform.Domain/PlatformDomainModule.cs @@ -1,5 +1,4 @@ -using System; -using Kurs.Languages; +using Kurs.Languages; using Kurs.Sender; using Kurs.MailQueue; using Kurs.Notifications.Domain; @@ -14,7 +13,6 @@ using Volo.Abp.OpenIddict; using Volo.Abp.PermissionManagement.Identity; using Volo.Abp.PermissionManagement.OpenIddict; using Volo.Abp.TenantManagement; -using Volo.Abp.Timing; using Volo.Abp.BlobStoring; using Volo.Abp.BlobStoring.FileSystem; diff --git a/api/src/Kurs.Platform.HttpApi.Host/PlatformHttpApiHostModule.cs b/api/src/Kurs.Platform.HttpApi.Host/PlatformHttpApiHostModule.cs index 7218524e..23fe7f68 100644 --- a/api/src/Kurs.Platform.HttpApi.Host/PlatformHttpApiHostModule.cs +++ b/api/src/Kurs.Platform.HttpApi.Host/PlatformHttpApiHostModule.cs @@ -7,7 +7,6 @@ using Hangfire.PostgreSql; using Kurs.Languages; using Kurs.MailQueue; using Kurs.Notifications.Application; -using Kurs.Platform.BlobStoring; using Kurs.Platform.Classrooms; using Kurs.Platform.EntityFrameworkCore; using Kurs.Platform.Extensions; @@ -37,7 +36,6 @@ using Volo.Abp.AspNetCore.Mvc.UI.Bundling; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling; using Volo.Abp.AspNetCore.Serilog; -using Volo.Abp.Auditing; using Volo.Abp.Autofac; using Volo.Abp.BackgroundWorkers.Hangfire; using Volo.Abp.BlobStoring; @@ -48,7 +46,6 @@ using Volo.Abp.Identity; using Volo.Abp.Modularity; using Volo.Abp.Security.Claims; using Volo.Abp.Swashbuckle; -using Volo.Abp.Timing; using Volo.Abp.UI.Navigation.Urls; using Volo.Abp.VirtualFileSystem; using static Kurs.Platform.PlatformConsts; @@ -107,7 +104,7 @@ public class PlatformHttpApiHostModule : AbpModule //TenantLocalization Middleware kaydı context.Services.AddTransient(); context.Services.AddTransient(); - + ConfigureAuthentication(context); ConfigureBundles(); ConfigureUrls(configuration); @@ -333,13 +330,15 @@ public class PlatformHttpApiHostModule : AbpModule private void ConfigureBlobStoring(IConfiguration configuration) { - var root = configuration["App:CdnPath"]; - Configure(options => { - options.Containers.Configure(c => c.UseFileSystem(fs => fs.BasePath = root)); - options.Containers.Configure(c => c.UseFileSystem(fs => fs.BasePath = root)); - options.Containers.Configure(c => c.UseFileSystem(fs => fs.BasePath = root)); + options.Containers.ConfigureDefault(container => + { + container.UseFileSystem(fileSystem => + { + fileSystem.BasePath = configuration["App:CdnPath"]; + }); + }); }); } diff --git a/api/src/Kurs.Platform.HttpApi.Host/appsettings.json b/api/src/Kurs.Platform.HttpApi.Host/appsettings.json index dbafadfb..67b82f3d 100644 --- a/api/src/Kurs.Platform.HttpApi.Host/appsettings.json +++ b/api/src/Kurs.Platform.HttpApi.Host/appsettings.json @@ -5,7 +5,7 @@ "CorsOrigins": "http://localhost,http://localhost:3000,http://localhost:4200", "RedirectAllowedUrls": "http://localhost:4200,http://localhost:4200/authentication/callback", "AttachmentsPath": "C:\\Private\\Projects\\sozsoft\\configs\\mail-queue\\attachments", - "CdnPath": "C:\\Private\\Projects\\sozsoft\\configs\\docker\\data\\cdn", + "CdnPath": "C:\\Private\\Projects\\sozsoft\\configs\\docker\\cdn", "Version": "1.0.1" }, "ConnectionStrings": {