diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs index ed454c1598..9c07101616 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs @@ -25,6 +25,8 @@ public class GlobalCmsKitFeatures : GlobalModuleFeatures public MenuFeature Menu => GetFeature(); + public GlobalResourcesFeature GlobalResources => GetFeature(); + public GlobalCmsKitFeatures([NotNull] GlobalFeatureManager featureManager) : base(featureManager) { @@ -37,5 +39,6 @@ public class GlobalCmsKitFeatures : GlobalModuleFeatures AddFeature(new BlogsFeature(this)); AddFeature(new CmsUserFeature(this)); AddFeature(new MenuFeature(this)); + AddFeature(new GlobalResourcesFeature(this)); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalResourcesFeature.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalResourcesFeature.cs new file mode 100644 index 0000000000..7e8a9518f8 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalResourcesFeature.cs @@ -0,0 +1,16 @@ +using JetBrains.Annotations; +using Volo.Abp.GlobalFeatures; + +namespace Volo.CmsKit.GlobalFeatures; + +[GlobalFeatureName(Name)] +public class GlobalResourcesFeature : GlobalFeature +{ + public const string Name = "CmsKit.GlobalResources"; + + internal GlobalResourcesFeature( + [NotNull] GlobalCmsKitFeatures cmsKit + ) : base(cmsKit) + { + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalResources/GlobalResourceConsts.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalResources/GlobalResourceConsts.cs new file mode 100644 index 0000000000..3485542969 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalResources/GlobalResourceConsts.cs @@ -0,0 +1,12 @@ +namespace Volo.CmsKit.GlobalResources; + +public class GlobalResourceConsts +{ + public const string GlobalStyleName = "GlobalStyle"; + + public const string GlobalScriptName = "GlobalScripit"; + + public static int MaxNameLength { get; set; } = 128; + + public static int MaxValueLength { get; set; } = int.MaxValue; +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/GlobalResources/GlobalResource.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/GlobalResources/GlobalResource.cs new file mode 100644 index 0000000000..0b52594434 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/GlobalResources/GlobalResource.cs @@ -0,0 +1,40 @@ +using System; +using JetBrains.Annotations; +using Volo.Abp; +using Volo.Abp.Domain.Entities.Auditing; +using Volo.Abp.MultiTenancy; + +namespace Volo.CmsKit.GlobalResources; + +public class GlobalResource : AuditedAggregateRoot, IMultiTenant +{ + public virtual string Name { get; } + + public virtual string Value { get; private set; } + + public virtual Guid? TenantId { get; protected set; } + + + protected GlobalResource() + { + } + + internal GlobalResource( + Guid id, + [NotNull] string name, + [CanBeNull] string value, + Guid? tenantId = null) : base(id) + { + Name = Check.NotNullOrEmpty(name, nameof(name), GlobalResourceConsts.MaxNameLength); + Value = Check.Length(value, nameof(value), GlobalResourceConsts.MaxValueLength); + + TenantId = tenantId; + } + + public virtual void SetValue(string value) + { + Check.Length(value, nameof(value), GlobalResourceConsts.MaxValueLength); + + Value = value; + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/GlobalResources/GlobalResourceManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/GlobalResources/GlobalResourceManager.cs new file mode 100644 index 0000000000..c1834ea4ff --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/GlobalResources/GlobalResourceManager.cs @@ -0,0 +1,41 @@ +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Domain.Services; + +namespace Volo.CmsKit.GlobalResources; + +public class GlobalResourceManager : DomainService +{ + private readonly IGlobalResourceRepository _globalResourceRepository; + + public GlobalResourceManager(IGlobalResourceRepository globalResourceRepository) + { + _globalResourceRepository = globalResourceRepository; + } + + public virtual async Task SetGlobalStyleAsync(string value) + { + return await SetGlobalResourceAsync(GlobalResourceConsts.GlobalStyleName, value); + } + + public virtual async Task SetGlobalScriptAsync(string value) + { + return await SetGlobalResourceAsync(GlobalResourceConsts.GlobalScriptName, value); + } + + protected virtual async Task SetGlobalResourceAsync(string name, string value) + { + var resource = await _globalResourceRepository.FindByName(name); + + if (resource == null) + { + return await _globalResourceRepository.InsertAsync( + new GlobalResource(GuidGenerator.Create(), name, value, CurrentTenant.Id) + ); + } + + resource.SetValue(value); + + return await _globalResourceRepository.UpdateAsync(resource); + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/GlobalResources/IGlobalResourceRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/GlobalResources/IGlobalResourceRepository.cs new file mode 100644 index 0000000000..36b1406e98 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/GlobalResources/IGlobalResourceRepository.cs @@ -0,0 +1,12 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Volo.Abp.Domain.Repositories; + +namespace Volo.CmsKit.GlobalResources; + +public interface IGlobalResourceRepository: IBasicRepository +{ + Task FindByName([NotNull] string name, CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContext.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContext.cs index 2ceb102267..8f501f4c98 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContext.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContext.cs @@ -3,6 +3,7 @@ using Volo.Abp.Data; using Volo.Abp.EntityFrameworkCore; using Volo.CmsKit.Blogs; using Volo.CmsKit.Comments; +using Volo.CmsKit.GlobalResources; using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.Menus; using Volo.CmsKit.Pages; @@ -28,6 +29,7 @@ public class CmsKitDbContext : AbpDbContext, ICmsKitDbContext public DbSet BlogFeatures { get; set; } public DbSet MediaDescriptors { get; set; } public DbSet MenuItems { get; set; } + public DbSet GlobalResources { get; set; } public CmsKitDbContext(DbContextOptions options) : base(options) diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs index 31424f6548..9ab103fefc 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs @@ -6,6 +6,7 @@ using Volo.Abp.Users.EntityFrameworkCore; using Volo.CmsKit.Blogs; using Volo.CmsKit.Comments; using Volo.CmsKit.GlobalFeatures; +using Volo.CmsKit.GlobalResources; using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.Menus; using Volo.CmsKit.Pages; @@ -264,6 +265,24 @@ public static class CmsKitDbContextModelCreatingExtensions builder.Ignore(); } + if (GlobalFeatureManager.Instance.IsEnabled()) + { + builder.Entity(b => + { + b.ToTable(CmsKitDbProperties.DbTablePrefix + "GlobalResources", CmsKitDbProperties.DbSchema); + + b.ConfigureByConvention(); + + b.Property(x => x.Name).IsRequired().HasMaxLength(GlobalResourceConsts.MaxNameLength); + + b.Property(x => x.Value).IsRequired().HasMaxLength(GlobalResourceConsts.MaxValueLength); + }); + } + else + { + builder.Ignore(); + } + builder.TryConfigureObjectExtensions(); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitEntityFrameworkCoreModule.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitEntityFrameworkCoreModule.cs index 06afae9cd7..649da3c4cb 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitEntityFrameworkCoreModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitEntityFrameworkCoreModule.cs @@ -4,6 +4,7 @@ using Volo.Abp.Modularity; using Volo.Abp.Users.EntityFrameworkCore; using Volo.CmsKit.Blogs; using Volo.CmsKit.Comments; +using Volo.CmsKit.GlobalResources; using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.Pages; using Volo.CmsKit.Ratings; @@ -35,6 +36,7 @@ public class CmsKitEntityFrameworkCoreModule : AbpModule options.AddRepository(); options.AddRepository(); options.AddRepository(); + options.AddRepository(); }); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/ICmsKitDbContext.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/ICmsKitDbContext.cs index b67b1a5d68..a405612f39 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/ICmsKitDbContext.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/ICmsKitDbContext.cs @@ -3,6 +3,7 @@ using Volo.Abp.Data; using Volo.Abp.EntityFrameworkCore; using Volo.CmsKit.Blogs; using Volo.CmsKit.Comments; +using Volo.CmsKit.GlobalResources; using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.Menus; using Volo.CmsKit.Pages; @@ -27,4 +28,5 @@ public interface ICmsKitDbContext : IEfCoreDbContext DbSet BlogPosts { get; } DbSet MediaDescriptors { get; } DbSet MenuItems { get; } + DbSet GlobalResources { get; } } diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/GlobalResources/EfCoreGlobalResourceRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/GlobalResources/EfCoreGlobalResourceRepository.cs new file mode 100644 index 0000000000..dcf85e9e56 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/GlobalResources/EfCoreGlobalResourceRepository.cs @@ -0,0 +1,24 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; +using Volo.CmsKit.EntityFrameworkCore; + +namespace Volo.CmsKit.GlobalResources; + +public class EfCoreGlobalResourceRepository: EfCoreRepository, IGlobalResourceRepository +{ + public EfCoreGlobalResourceRepository(IDbContextProvider dbContextProvider) : base(dbContextProvider) + { + + } + + public Task FindByName(string name, + CancellationToken cancellationToken = default) + { + Check.NotNullOrEmpty(name, nameof(name)); + return FindAsync(x => x.Name == name, cancellationToken: GetCancellationToken(cancellationToken)); + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContext.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContext.cs index 8aaef9ab35..36c9cf882c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContext.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContext.cs @@ -3,6 +3,7 @@ using Volo.Abp.Data; using Volo.Abp.MongoDB; using Volo.CmsKit.Blogs; using Volo.CmsKit.Comments; +using Volo.CmsKit.GlobalResources; using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.Menus; using Volo.CmsKit.Pages; @@ -41,6 +42,8 @@ public class CmsKitMongoDbContext : AbpMongoDbContext, ICmsKitMongoDbContext public IMongoCollection MenuItems => Collection(); + public IMongoCollection GlobalResources => Collection(); + protected override void CreateModel(IMongoModelBuilder modelBuilder) { base.CreateModel(modelBuilder); diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContextExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContextExtensions.cs index daeb68af6c..7b7edcce0d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContextExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContextExtensions.cs @@ -2,6 +2,7 @@ using Volo.Abp.MongoDB; using Volo.CmsKit.Blogs; using Volo.CmsKit.Comments; +using Volo.CmsKit.GlobalResources; using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.Menus; using Volo.CmsKit.Pages; @@ -78,5 +79,10 @@ public static class CmsKitMongoDbContextExtensions { x.CollectionName = CmsKitDbProperties.DbTablePrefix + "MenuItems"; }); + + builder.Entity(x => + { + x.CollectionName = CmsKitDbProperties.DbTablePrefix + "GlobalResources"; + }); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbModule.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbModule.cs index caf5580a92..704c61bad9 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbModule.cs @@ -4,10 +4,12 @@ using Volo.Abp.MongoDB; using Volo.Abp.Users.MongoDB; using Volo.CmsKit.Blogs; using Volo.CmsKit.Comments; +using Volo.CmsKit.GlobalResources; using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.Menus; using Volo.CmsKit.MongoDB.Blogs; using Volo.CmsKit.MongoDB.Comments; +using Volo.CmsKit.MongoDB.GlobalResources; using Volo.CmsKit.MongoDB.MediaDescriptors; using Volo.CmsKit.MongoDB.Menus; using Volo.CmsKit.MongoDB.Pages; @@ -45,6 +47,7 @@ public class CmsKitMongoDbModule : AbpModule options.AddRepository(); options.AddRepository(); options.AddRepository(); + options.AddRepository(); }); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/GlobalResources/MongoGlobalResourceRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/GlobalResources/MongoGlobalResourceRepository.cs new file mode 100644 index 0000000000..9a2f5f8dcf --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/GlobalResources/MongoGlobalResourceRepository.cs @@ -0,0 +1,25 @@ +using System; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using MongoDB.Driver; +using Volo.Abp; +using Volo.Abp.Domain.Repositories.MongoDB; +using Volo.Abp.MongoDB; +using Volo.CmsKit.GlobalResources; + +namespace Volo.CmsKit.MongoDB.GlobalResources; + +public class MongoGlobalResourceRepository: MongoDbRepository, IGlobalResourceRepository +{ + public MongoGlobalResourceRepository(IMongoDbContextProvider dbContextProvider) : base(dbContextProvider) + { + } + + public Task FindByName(string name, + CancellationToken cancellationToken = default) + { + Check.NotNullOrEmpty(name, nameof(name)); + return FindAsync(x => x.Name == name, cancellationToken: GetCancellationToken(cancellationToken)); + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/ICmsKitMongoDbContext.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/ICmsKitMongoDbContext.cs index 40977c6a90..a2dff419e2 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/ICmsKitMongoDbContext.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/ICmsKitMongoDbContext.cs @@ -3,6 +3,7 @@ using Volo.Abp.Data; using Volo.Abp.MongoDB; using Volo.CmsKit.Blogs; using Volo.CmsKit.Comments; +using Volo.CmsKit.GlobalResources; using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.Menus; using Volo.CmsKit.Pages; @@ -40,4 +41,6 @@ public interface ICmsKitMongoDbContext : IAbpMongoDbContext IMongoCollection MediaDescriptors { get; } IMongoCollection MenuItems { get; } + + IMongoCollection GlobalResources { get; } }