use file-scoped namespacing for cmsKit module

pull/10696/head
Ahmet Çotur 4 years ago
parent 3bcb45c934
commit 229452046d

@ -35,160 +35,159 @@ using Volo.Abp.Security.Claims;
using Volo.Abp.SettingManagement.EntityFrameworkCore;
using Volo.Abp.VirtualFileSystem;
namespace Volo.CmsKit
namespace Volo.CmsKit;
[DependsOn(
typeof(CmsKitApplicationModule),
typeof(CmsKitEntityFrameworkCoreModule),
typeof(CmsKitHttpApiModule),
typeof(AbpAspNetCoreMvcUiMultiTenancyModule),
typeof(AbpAutofacModule),
typeof(AbpCachingStackExchangeRedisModule),
typeof(AbpEntityFrameworkCoreSqlServerModule),
typeof(AbpAuditLoggingEntityFrameworkCoreModule),
typeof(AbpPermissionManagementEntityFrameworkCoreModule),
typeof(AbpSettingManagementEntityFrameworkCoreModule),
typeof(AbpAspNetCoreSerilogModule),
typeof(BlobStoringDatabaseEntityFrameworkCoreModule)
)]
public class CmsKitHttpApiHostModule : AbpModule
{
[DependsOn(
typeof(CmsKitApplicationModule),
typeof(CmsKitEntityFrameworkCoreModule),
typeof(CmsKitHttpApiModule),
typeof(AbpAspNetCoreMvcUiMultiTenancyModule),
typeof(AbpAutofacModule),
typeof(AbpCachingStackExchangeRedisModule),
typeof(AbpEntityFrameworkCoreSqlServerModule),
typeof(AbpAuditLoggingEntityFrameworkCoreModule),
typeof(AbpPermissionManagementEntityFrameworkCoreModule),
typeof(AbpSettingManagementEntityFrameworkCoreModule),
typeof(AbpAspNetCoreSerilogModule),
typeof(BlobStoringDatabaseEntityFrameworkCoreModule)
)]
public class CmsKitHttpApiHostModule : AbpModule
private const string DefaultCorsPolicyName = "Default";
public override void PreConfigureServices(ServiceConfigurationContext context)
{
FeatureConfigurer.Configure();
}
public override void ConfigureServices(ServiceConfigurationContext context)
{
private const string DefaultCorsPolicyName = "Default";
var hostingEnvironment = context.Services.GetHostingEnvironment();
var configuration = context.Services.GetConfiguration();
public override void PreConfigureServices(ServiceConfigurationContext context)
Configure<AbpDbContextOptions>(options =>
{
FeatureConfigurer.Configure();
}
options.UseSqlServer();
});
public override void ConfigureServices(ServiceConfigurationContext context)
Configure<AbpMultiTenancyOptions>(options =>
{
var hostingEnvironment = context.Services.GetHostingEnvironment();
var configuration = context.Services.GetConfiguration();
options.IsEnabled = MultiTenancyConsts.IsEnabled;
});
Configure<AbpDbContextOptions>(options =>
if (hostingEnvironment.IsDevelopment())
{
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.UseSqlServer();
options.FileSets.ReplaceEmbeddedByPhysical<CmsKitDomainSharedModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Volo.CmsKit.Domain.Shared", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<CmsKitDomainModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Volo.CmsKit.Domain", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<CmsKitApplicationContractsModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Volo.CmsKit.Application.Contracts", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<CmsKitApplicationModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Volo.CmsKit.Application", Path.DirectorySeparatorChar)));
});
}
Configure<AbpMultiTenancyOptions>(options =>
context.Services.AddSwaggerGen(
options =>
{
options.IsEnabled = MultiTenancyConsts.IsEnabled;
options.SwaggerDoc("v1", new OpenApiInfo { Title = "CmsKit API", Version = "v1" });
options.DocInclusionPredicate((docName, description) => true);
options.CustomSchemaIds(type => type.FullName);
});
if (hostingEnvironment.IsDevelopment())
{
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.ReplaceEmbeddedByPhysical<CmsKitDomainSharedModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Volo.CmsKit.Domain.Shared", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<CmsKitDomainModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Volo.CmsKit.Domain", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<CmsKitApplicationContractsModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Volo.CmsKit.Application.Contracts", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<CmsKitApplicationModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Volo.CmsKit.Application", Path.DirectorySeparatorChar)));
});
}
context.Services.AddSwaggerGen(
options =>
{
options.SwaggerDoc("v1", new OpenApiInfo { Title = "CmsKit API", Version = "v1" });
options.DocInclusionPredicate((docName, description) => true);
options.CustomSchemaIds(type => type.FullName);
});
Configure<AbpLocalizationOptions>(options =>
Configure<AbpLocalizationOptions>(options =>
{
options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
options.Languages.Add(new LanguageInfo("en", "en", "English"));
options.Languages.Add(new LanguageInfo("hu", "hu", "Magyar"));
options.Languages.Add(new LanguageInfo("fi", "fi", "Finnish"));
options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
options.Languages.Add(new LanguageInfo("hi", "hi", "Hindi", "in"));
options.Languages.Add(new LanguageInfo("is", "is", "Icelandic", "is"));
options.Languages.Add(new LanguageInfo("it", "it", "Italiano", "it"));
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português"));
options.Languages.Add(new LanguageInfo("ro-RO", "ro-RO", "Română"));
options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
options.Languages.Add(new LanguageInfo("sk", "sk", "Slovak"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));
options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中文"));
});
context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
options.Languages.Add(new LanguageInfo("en", "en", "English"));
options.Languages.Add(new LanguageInfo("hu", "hu", "Magyar"));
options.Languages.Add(new LanguageInfo("fi", "fi", "Finnish"));
options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
options.Languages.Add(new LanguageInfo("hi", "hi", "Hindi", "in"));
options.Languages.Add(new LanguageInfo("is", "is", "Icelandic", "is"));
options.Languages.Add(new LanguageInfo("it", "it", "Italiano", "it"));
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português"));
options.Languages.Add(new LanguageInfo("ro-RO", "ro-RO", "Română"));
options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
options.Languages.Add(new LanguageInfo("sk", "sk", "Slovak"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));
options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中文"));
options.Authority = configuration["AuthServer:Authority"];
options.RequireHttpsMetadata = false;
options.Audience = "CmsKit";
});
context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Authority = configuration["AuthServer:Authority"];
options.RequireHttpsMetadata = false;
options.Audience = "CmsKit";
});
Configure<AbpDistributedCacheOptions>(options =>
{
options.KeyPrefix = "CmsKit:";
});
if (!hostingEnvironment.IsDevelopment())
{
var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]);
context.Services
.AddDataProtection()
.PersistKeysToStackExchangeRedis(redis, "CmsKit-Protection-Keys");
}
Configure<AbpDistributedCacheOptions>(options =>
context.Services.AddCors(options =>
{
options.AddPolicy(DefaultCorsPolicyName, builder =>
{
options.KeyPrefix = "CmsKit:";
builder
.WithOrigins(
configuration["App:CorsOrigins"]
.Split(",", StringSplitOptions.RemoveEmptyEntries)
.Select(o => o.RemovePostFix("/"))
.ToArray()
)
.WithAbpExposedHeaders()
.SetIsOriginAllowedToAllowWildcardSubdomains()
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials();
});
});
}
if (!hostingEnvironment.IsDevelopment())
{
var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]);
context.Services
.AddDataProtection()
.PersistKeysToStackExchangeRedis(redis, "CmsKit-Protection-Keys");
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
var app = context.GetApplicationBuilder();
var env = context.GetEnvironment();
context.Services.AddCors(options =>
{
options.AddPolicy(DefaultCorsPolicyName, builder =>
{
builder
.WithOrigins(
configuration["App:CorsOrigins"]
.Split(",", StringSplitOptions.RemoveEmptyEntries)
.Select(o => o.RemovePostFix("/"))
.ToArray()
)
.WithAbpExposedHeaders()
.SetIsOriginAllowedToAllowWildcardSubdomains()
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials();
});
});
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)
else
{
var app = context.GetApplicationBuilder();
var env = context.GetEnvironment();
app.UseErrorPage();
app.UseHsts();
}
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseErrorPage();
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseCorrelationId();
app.UseStaticFiles();
app.UseRouting();
app.UseCors(DefaultCorsPolicyName);
app.UseAuthentication();
if (MultiTenancyConsts.IsEnabled)
{
app.UseMultiTenancy();
}
app.UseAbpRequestLocalization();
app.UseAuthorization();
app.UseSwagger();
app.UseSwaggerUI(options =>
{
options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support APP API");
});
app.UseAuditing();
app.UseAbpSerilogEnrichers();
app.UseConfiguredEndpoints();
app.UseHttpsRedirection();
app.UseCorrelationId();
app.UseStaticFiles();
app.UseRouting();
app.UseCors(DefaultCorsPolicyName);
app.UseAuthentication();
if (MultiTenancyConsts.IsEnabled)
{
app.UseMultiTenancy();
}
app.UseAbpRequestLocalization();
app.UseAuthorization();
app.UseSwagger();
app.UseSwaggerUI(options =>
{
options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support APP API");
});
app.UseAuditing();
app.UseAbpSerilogEnrichers();
app.UseConfiguredEndpoints();
}
}

@ -1,13 +1,12 @@
using Microsoft.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc;
namespace Volo.CmsKit.Controllers
namespace Volo.CmsKit.Controllers;
public class HomeController : AbpController
{
public class HomeController : AbpController
public ActionResult Index()
{
public ActionResult Index()
{
return Redirect("~/swagger");
}
return Redirect("~/swagger");
}
}

@ -2,22 +2,21 @@
using Volo.Abp.BlobStoring.Database.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
namespace Volo.CmsKit.EntityFrameworkCore
namespace Volo.CmsKit.EntityFrameworkCore;
public class CmsKitHttpApiHostMigrationsDbContext : AbpDbContext<CmsKitHttpApiHostMigrationsDbContext>
{
public class CmsKitHttpApiHostMigrationsDbContext : AbpDbContext<CmsKitHttpApiHostMigrationsDbContext>
public CmsKitHttpApiHostMigrationsDbContext(DbContextOptions<CmsKitHttpApiHostMigrationsDbContext> options)
: base(options)
{
public CmsKitHttpApiHostMigrationsDbContext(DbContextOptions<CmsKitHttpApiHostMigrationsDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ConfigureCmsKit();
modelBuilder.ConfigureBlobStoring();
}
modelBuilder.ConfigureCmsKit();
modelBuilder.ConfigureBlobStoring();
}
}

@ -3,29 +3,28 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration;
namespace Volo.CmsKit.EntityFrameworkCore
namespace Volo.CmsKit.EntityFrameworkCore;
public class CmsKitHttpApiHostMigrationsDbContextFactory : IDesignTimeDbContextFactory<CmsKitHttpApiHostMigrationsDbContext>
{
public class CmsKitHttpApiHostMigrationsDbContextFactory : IDesignTimeDbContextFactory<CmsKitHttpApiHostMigrationsDbContext>
public CmsKitHttpApiHostMigrationsDbContext CreateDbContext(string[] args)
{
public CmsKitHttpApiHostMigrationsDbContext CreateDbContext(string[] args)
{
FeatureConfigurer.Configure();
FeatureConfigurer.Configure();
var configuration = BuildConfiguration();
var configuration = BuildConfiguration();
var builder = new DbContextOptionsBuilder<CmsKitHttpApiHostMigrationsDbContext>()
.UseSqlServer(configuration.GetConnectionString("CmsKit"));
var builder = new DbContextOptionsBuilder<CmsKitHttpApiHostMigrationsDbContext>()
.UseSqlServer(configuration.GetConnectionString("CmsKit"));
return new CmsKitHttpApiHostMigrationsDbContext(builder.Options);
}
return new CmsKitHttpApiHostMigrationsDbContext(builder.Options);
}
private static IConfigurationRoot BuildConfiguration()
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false);
private static IConfigurationRoot BuildConfiguration()
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false);
return builder.Build();
}
return builder.Build();
}
}

@ -1,472 +1,456 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
namespace Volo.CmsKit.Migrations
namespace Volo.CmsKit.Migrations;
public partial class Initial : Migration
{
public partial class Initial : Migration
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "AbpBlobContainers",
columns: table => new {
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
Name = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: false),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_AbpBlobContainers", x => x.Id);
});
migrationBuilder.CreateTable(
name: "CmsBlogFeatures",
columns: table => new {
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
BlogId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
FeatureName = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
IsEnabled = table.Column<bool>(type: "bit", nullable: false),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
IsDeleted = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
DeleterId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
DeletionTime = table.Column<DateTime>(type: "datetime2", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsBlogFeatures", x => x.Id);
});
migrationBuilder.CreateTable(
name: "CmsBlogs",
columns: table => new {
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
Name = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
Slug = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
IsDeleted = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
DeleterId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
DeletionTime = table.Column<DateTime>(type: "datetime2", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsBlogs", x => x.Id);
});
migrationBuilder.CreateTable(
name: "CmsComments",
columns: table => new {
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
EntityType = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
EntityId = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
Text = table.Column<string>(type: "nvarchar(512)", maxLength: 512, nullable: false),
RepliedCommentId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsComments", x => x.Id);
});
migrationBuilder.CreateTable(
name: "CmsEntityTags",
columns: table => new {
TagId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
EntityId = table.Column<string>(type: "nvarchar(450)", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsEntityTags", x => new { x.EntityId, x.TagId });
});
migrationBuilder.CreateTable(
name: "CmsMediaDescriptors",
columns: table => new {
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
EntityType = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
Name = table.Column<string>(type: "nvarchar(255)", maxLength: 255, nullable: false),
MimeType = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: false),
Size = table.Column<long>(type: "bigint", maxLength: 2147483647, nullable: false),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
IsDeleted = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
DeleterId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
DeletionTime = table.Column<DateTime>(type: "datetime2", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsMediaDescriptors", x => x.Id);
});
migrationBuilder.CreateTable(
name: "CmsMenus",
columns: table => new {
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
Name = table.Column<string>(type: "nvarchar(max)", nullable: true),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
IsDeleted = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
DeleterId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
DeletionTime = table.Column<DateTime>(type: "datetime2", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsMenus", x => x.Id);
});
migrationBuilder.CreateTable(
name: "CmsPages",
columns: table => new {
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
Title = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: false),
Slug = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: false),
Content = table.Column<string>(type: "nvarchar(max)", maxLength: 2147483647, nullable: true),
Script = table.Column<string>(type: "nvarchar(max)", nullable: true),
Style = table.Column<string>(type: "nvarchar(max)", nullable: true),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
IsDeleted = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
DeleterId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
DeletionTime = table.Column<DateTime>(type: "datetime2", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsPages", x => x.Id);
});
migrationBuilder.CreateTable(
name: "CmsRatings",
columns: table => new {
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
EntityType = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
EntityId = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
StarCount = table.Column<short>(type: "smallint", nullable: false),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsRatings", x => x.Id);
});
migrationBuilder.CreateTable(
name: "CmsTags",
columns: table => new {
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
EntityType = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
Name = table.Column<string>(type: "nvarchar(32)", maxLength: 32, nullable: false),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
IsDeleted = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
DeleterId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
DeletionTime = table.Column<DateTime>(type: "datetime2", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsTags", x => x.Id);
});
migrationBuilder.CreateTable(
name: "CmsUserReactions",
columns: table => new {
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
EntityType = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
EntityId = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
ReactionName = table.Column<string>(type: "nvarchar(32)", maxLength: 32, nullable: false),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsUserReactions", x => x.Id);
});
migrationBuilder.CreateTable(
name: "CmsUsers",
columns: table => new {
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
UserName = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: false),
Email = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: false),
Name = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: true),
Surname = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: true),
EmailConfirmed = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
PhoneNumber = table.Column<string>(type: "nvarchar(16)", maxLength: 16, nullable: true),
PhoneNumberConfirmed = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsUsers", x => x.Id);
});
migrationBuilder.CreateTable(
name: "AbpBlobs",
columns: table => new {
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
ContainerId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
Name = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: false),
Content = table.Column<byte[]>(type: "varbinary(max)", maxLength: 2147483647, nullable: true),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_AbpBlobs", x => x.Id);
table.ForeignKey(
name: "FK_AbpBlobs_AbpBlobContainers_ContainerId",
column: x => x.ContainerId,
principalTable: "AbpBlobContainers",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "CmsMenuItems",
columns: table => new {
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
MenuId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
ParentId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
DisplayName = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
IsActive = table.Column<bool>(type: "bit", nullable: false),
Url = table.Column<string>(type: "nvarchar(1024)", maxLength: 1024, nullable: false),
Icon = table.Column<string>(type: "nvarchar(max)", nullable: true),
Order = table.Column<int>(type: "int", nullable: false),
Target = table.Column<string>(type: "nvarchar(max)", nullable: true),
ElementId = table.Column<string>(type: "nvarchar(max)", nullable: true),
CssClass = table.Column<string>(type: "nvarchar(max)", nullable: true),
RequiredPermissionName = table.Column<string>(type: "nvarchar(max)", nullable: true),
PageId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsMenuItems", x => x.Id);
table.ForeignKey(
name: "FK_CmsMenuItems_CmsMenus_MenuId",
column: x => x.MenuId,
principalTable: "CmsMenus",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "CmsBlogPosts",
columns: table => new {
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
BlogId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
Title = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
Slug = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: false),
ShortDescription = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: true),
Content = table.Column<string>(type: "nvarchar(max)", maxLength: 2147483647, nullable: true),
CoverImageMediaId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
AuthorId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
IsDeleted = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
DeleterId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
DeletionTime = table.Column<DateTime>(type: "datetime2", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsBlogPosts", x => x.Id);
table.ForeignKey(
name: "FK_CmsBlogPosts_CmsUsers_AuthorId",
column: x => x.AuthorId,
principalTable: "CmsUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_AbpBlobContainers_TenantId_Name",
table: "AbpBlobContainers",
columns: new[] { "TenantId", "Name" });
migrationBuilder.CreateIndex(
name: "IX_AbpBlobs_ContainerId",
table: "AbpBlobs",
column: "ContainerId");
migrationBuilder.CreateIndex(
name: "IX_AbpBlobs_TenantId_ContainerId_Name",
table: "AbpBlobs",
columns: new[] { "TenantId", "ContainerId", "Name" });
migrationBuilder.CreateIndex(
name: "IX_CmsBlogPosts_AuthorId",
table: "CmsBlogPosts",
column: "AuthorId");
migrationBuilder.CreateIndex(
name: "IX_CmsBlogPosts_Slug_BlogId",
table: "CmsBlogPosts",
columns: new[] { "Slug", "BlogId" });
migrationBuilder.CreateIndex(
name: "IX_CmsComments_TenantId_EntityType_EntityId",
table: "CmsComments",
columns: new[] { "TenantId", "EntityType", "EntityId" });
migrationBuilder.CreateIndex(
name: "IX_CmsComments_TenantId_RepliedCommentId",
table: "CmsComments",
columns: new[] { "TenantId", "RepliedCommentId" });
migrationBuilder.CreateIndex(
name: "IX_CmsEntityTags_TenantId_EntityId_TagId",
table: "CmsEntityTags",
columns: new[] { "TenantId", "EntityId", "TagId" });
migrationBuilder.CreateIndex(
name: "IX_CmsMenuItems_MenuId",
table: "CmsMenuItems",
column: "MenuId");
migrationBuilder.CreateIndex(
name: "IX_CmsPages_TenantId_Slug",
table: "CmsPages",
columns: new[] { "TenantId", "Slug" });
migrationBuilder.CreateIndex(
name: "IX_CmsRatings_TenantId_EntityType_EntityId_CreatorId",
table: "CmsRatings",
columns: new[] { "TenantId", "EntityType", "EntityId", "CreatorId" });
migrationBuilder.CreateIndex(
name: "IX_CmsTags_TenantId_Name",
table: "CmsTags",
columns: new[] { "TenantId", "Name" });
migrationBuilder.CreateIndex(
name: "IX_CmsUserReactions_TenantId_CreatorId_EntityType_EntityId_ReactionName",
table: "CmsUserReactions",
columns: new[] { "TenantId", "CreatorId", "EntityType", "EntityId", "ReactionName" });
migrationBuilder.CreateIndex(
name: "IX_CmsUserReactions_TenantId_EntityType_EntityId_ReactionName",
table: "CmsUserReactions",
columns: new[] { "TenantId", "EntityType", "EntityId", "ReactionName" });
migrationBuilder.CreateIndex(
name: "IX_CmsUsers_TenantId_Email",
table: "CmsUsers",
columns: new[] { "TenantId", "Email" });
migrationBuilder.CreateIndex(
name: "IX_CmsUsers_TenantId_UserName",
table: "CmsUsers",
columns: new[] { "TenantId", "UserName" });
}
protected override void Down(MigrationBuilder migrationBuilder)
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "AbpBlobContainers",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
Name = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: false),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_AbpBlobContainers", x => x.Id);
});
migrationBuilder.CreateTable(
name: "CmsBlogFeatures",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
BlogId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
FeatureName = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
IsEnabled = table.Column<bool>(type: "bit", nullable: false),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
IsDeleted = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
DeleterId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
DeletionTime = table.Column<DateTime>(type: "datetime2", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsBlogFeatures", x => x.Id);
});
migrationBuilder.CreateTable(
name: "CmsBlogs",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
Name = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
Slug = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
IsDeleted = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
DeleterId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
DeletionTime = table.Column<DateTime>(type: "datetime2", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsBlogs", x => x.Id);
});
migrationBuilder.CreateTable(
name: "CmsComments",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
EntityType = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
EntityId = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
Text = table.Column<string>(type: "nvarchar(512)", maxLength: 512, nullable: false),
RepliedCommentId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsComments", x => x.Id);
});
migrationBuilder.CreateTable(
name: "CmsEntityTags",
columns: table => new
{
TagId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
EntityId = table.Column<string>(type: "nvarchar(450)", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsEntityTags", x => new { x.EntityId, x.TagId });
});
migrationBuilder.CreateTable(
name: "CmsMediaDescriptors",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
EntityType = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
Name = table.Column<string>(type: "nvarchar(255)", maxLength: 255, nullable: false),
MimeType = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: false),
Size = table.Column<long>(type: "bigint", maxLength: 2147483647, nullable: false),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
IsDeleted = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
DeleterId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
DeletionTime = table.Column<DateTime>(type: "datetime2", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsMediaDescriptors", x => x.Id);
});
migrationBuilder.CreateTable(
name: "CmsMenus",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
Name = table.Column<string>(type: "nvarchar(max)", nullable: true),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
IsDeleted = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
DeleterId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
DeletionTime = table.Column<DateTime>(type: "datetime2", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsMenus", x => x.Id);
});
migrationBuilder.CreateTable(
name: "CmsPages",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
Title = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: false),
Slug = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: false),
Content = table.Column<string>(type: "nvarchar(max)", maxLength: 2147483647, nullable: true),
Script = table.Column<string>(type: "nvarchar(max)", nullable: true),
Style = table.Column<string>(type: "nvarchar(max)", nullable: true),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
IsDeleted = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
DeleterId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
DeletionTime = table.Column<DateTime>(type: "datetime2", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsPages", x => x.Id);
});
migrationBuilder.CreateTable(
name: "CmsRatings",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
EntityType = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
EntityId = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
StarCount = table.Column<short>(type: "smallint", nullable: false),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsRatings", x => x.Id);
});
migrationBuilder.CreateTable(
name: "CmsTags",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
EntityType = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
Name = table.Column<string>(type: "nvarchar(32)", maxLength: 32, nullable: false),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
IsDeleted = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
DeleterId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
DeletionTime = table.Column<DateTime>(type: "datetime2", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsTags", x => x.Id);
});
migrationBuilder.CreateTable(
name: "CmsUserReactions",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
EntityType = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
EntityId = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
ReactionName = table.Column<string>(type: "nvarchar(32)", maxLength: 32, nullable: false),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsUserReactions", x => x.Id);
});
migrationBuilder.CreateTable(
name: "CmsUsers",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
UserName = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: false),
Email = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: false),
Name = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: true),
Surname = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: true),
EmailConfirmed = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
PhoneNumber = table.Column<string>(type: "nvarchar(16)", maxLength: 16, nullable: true),
PhoneNumberConfirmed = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsUsers", x => x.Id);
});
migrationBuilder.CreateTable(
name: "AbpBlobs",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
ContainerId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
Name = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: false),
Content = table.Column<byte[]>(type: "varbinary(max)", maxLength: 2147483647, nullable: true),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_AbpBlobs", x => x.Id);
table.ForeignKey(
name: "FK_AbpBlobs_AbpBlobContainers_ContainerId",
column: x => x.ContainerId,
principalTable: "AbpBlobContainers",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "CmsMenuItems",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
MenuId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
ParentId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
DisplayName = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
IsActive = table.Column<bool>(type: "bit", nullable: false),
Url = table.Column<string>(type: "nvarchar(1024)", maxLength: 1024, nullable: false),
Icon = table.Column<string>(type: "nvarchar(max)", nullable: true),
Order = table.Column<int>(type: "int", nullable: false),
Target = table.Column<string>(type: "nvarchar(max)", nullable: true),
ElementId = table.Column<string>(type: "nvarchar(max)", nullable: true),
CssClass = table.Column<string>(type: "nvarchar(max)", nullable: true),
RequiredPermissionName = table.Column<string>(type: "nvarchar(max)", nullable: true),
PageId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsMenuItems", x => x.Id);
table.ForeignKey(
name: "FK_CmsMenuItems_CmsMenus_MenuId",
column: x => x.MenuId,
principalTable: "CmsMenus",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "CmsBlogPosts",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
BlogId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
Title = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
Slug = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: false),
ShortDescription = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: true),
Content = table.Column<string>(type: "nvarchar(max)", maxLength: 2147483647, nullable: true),
CoverImageMediaId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
AuthorId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
IsDeleted = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
DeleterId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
DeletionTime = table.Column<DateTime>(type: "datetime2", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsBlogPosts", x => x.Id);
table.ForeignKey(
name: "FK_CmsBlogPosts_CmsUsers_AuthorId",
column: x => x.AuthorId,
principalTable: "CmsUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_AbpBlobContainers_TenantId_Name",
table: "AbpBlobContainers",
columns: new[] { "TenantId", "Name" });
migrationBuilder.CreateIndex(
name: "IX_AbpBlobs_ContainerId",
table: "AbpBlobs",
column: "ContainerId");
migrationBuilder.CreateIndex(
name: "IX_AbpBlobs_TenantId_ContainerId_Name",
table: "AbpBlobs",
columns: new[] { "TenantId", "ContainerId", "Name" });
migrationBuilder.CreateIndex(
name: "IX_CmsBlogPosts_AuthorId",
table: "CmsBlogPosts",
column: "AuthorId");
migrationBuilder.CreateIndex(
name: "IX_CmsBlogPosts_Slug_BlogId",
table: "CmsBlogPosts",
columns: new[] { "Slug", "BlogId" });
migrationBuilder.CreateIndex(
name: "IX_CmsComments_TenantId_EntityType_EntityId",
table: "CmsComments",
columns: new[] { "TenantId", "EntityType", "EntityId" });
migrationBuilder.CreateIndex(
name: "IX_CmsComments_TenantId_RepliedCommentId",
table: "CmsComments",
columns: new[] { "TenantId", "RepliedCommentId" });
migrationBuilder.CreateIndex(
name: "IX_CmsEntityTags_TenantId_EntityId_TagId",
table: "CmsEntityTags",
columns: new[] { "TenantId", "EntityId", "TagId" });
migrationBuilder.CreateIndex(
name: "IX_CmsMenuItems_MenuId",
table: "CmsMenuItems",
column: "MenuId");
migrationBuilder.CreateIndex(
name: "IX_CmsPages_TenantId_Slug",
table: "CmsPages",
columns: new[] { "TenantId", "Slug" });
migrationBuilder.CreateIndex(
name: "IX_CmsRatings_TenantId_EntityType_EntityId_CreatorId",
table: "CmsRatings",
columns: new[] { "TenantId", "EntityType", "EntityId", "CreatorId" });
migrationBuilder.CreateIndex(
name: "IX_CmsTags_TenantId_Name",
table: "CmsTags",
columns: new[] { "TenantId", "Name" });
migrationBuilder.CreateIndex(
name: "IX_CmsUserReactions_TenantId_CreatorId_EntityType_EntityId_ReactionName",
table: "CmsUserReactions",
columns: new[] { "TenantId", "CreatorId", "EntityType", "EntityId", "ReactionName" });
migrationBuilder.CreateIndex(
name: "IX_CmsUserReactions_TenantId_EntityType_EntityId_ReactionName",
table: "CmsUserReactions",
columns: new[] { "TenantId", "EntityType", "EntityId", "ReactionName" });
migrationBuilder.CreateIndex(
name: "IX_CmsUsers_TenantId_Email",
table: "CmsUsers",
columns: new[] { "TenantId", "Email" });
migrationBuilder.CreateIndex(
name: "IX_CmsUsers_TenantId_UserName",
table: "CmsUsers",
columns: new[] { "TenantId", "UserName" });
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "AbpBlobs");
migrationBuilder.DropTable(
name: "CmsBlogFeatures");
migrationBuilder.DropTable(
name: "CmsBlogPosts");
migrationBuilder.DropTable(
name: "CmsBlogs");
migrationBuilder.DropTable(
name: "CmsComments");
migrationBuilder.DropTable(
name: "CmsEntityTags");
migrationBuilder.DropTable(
name: "CmsMediaDescriptors");
migrationBuilder.DropTable(
name: "CmsMenuItems");
migrationBuilder.DropTable(
name: "CmsPages");
migrationBuilder.DropTable(
name: "AbpBlobs");
migrationBuilder.DropTable(
name: "CmsBlogFeatures");
migrationBuilder.DropTable(
name: "CmsBlogPosts");
migrationBuilder.DropTable(
name: "CmsBlogs");
migrationBuilder.DropTable(
name: "CmsComments");
migrationBuilder.DropTable(
name: "CmsEntityTags");
migrationBuilder.DropTable(
name: "CmsMediaDescriptors");
migrationBuilder.DropTable(
name: "CmsMenuItems");
migrationBuilder.DropTable(
name: "CmsPages");
migrationBuilder.DropTable(
name: "CmsRatings");
migrationBuilder.DropTable(
name: "CmsTags");
migrationBuilder.DropTable(
name: "CmsRatings");
migrationBuilder.DropTable(
name: "CmsTags");
migrationBuilder.DropTable(
name: "CmsUserReactions");
migrationBuilder.DropTable(
name: "CmsUserReactions");
migrationBuilder.DropTable(
name: "AbpBlobContainers");
migrationBuilder.DropTable(
name: "AbpBlobContainers");
migrationBuilder.DropTable(
name: "CmsUsers");
migrationBuilder.DropTable(
name: "CmsUsers");
migrationBuilder.DropTable(
name: "CmsMenus");
}
migrationBuilder.DropTable(
name: "CmsMenus");
}
}

@ -5,47 +5,46 @@ using Microsoft.Extensions.Hosting;
using Serilog;
using Serilog.Events;
namespace Volo.CmsKit
namespace Volo.CmsKit;
public class Program
{
public class Program
public static int Main(string[] args)
{
public static int Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
Log.Logger = new LoggerConfiguration()
#if DEBUG
.MinimumLevel.Debug()
#else
.MinimumLevel.Information()
#endif
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.File("Logs/logs.txt")
.CreateLogger();
.Enrich.FromLogContext()
.WriteTo.File("Logs/logs.txt")
.CreateLogger();
try
{
Log.Information("Starting web host.");
CreateHostBuilder(args).Build().Run();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly!");
return 1;
}
finally
{
Log.CloseAndFlush();
}
try
{
Log.Information("Starting web host.");
CreateHostBuilder(args).Build().Run();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly!");
return 1;
}
finally
{
Log.CloseAndFlush();
}
internal static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseAutofac()
.UseSerilog();
}
internal static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseAutofac()
.UseSerilog();
}

@ -4,18 +4,17 @@ using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
namespace Volo.CmsKit
namespace Volo.CmsKit;
public class Startup
{
public class Startup
public void ConfigureServices(IServiceCollection services)
{
public void ConfigureServices(IServiceCollection services)
{
services.AddApplication<CmsKitHttpApiHostModule>();
}
services.AddApplication<CmsKitHttpApiHostModule>();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
{
app.InitializeApplication();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
{
app.InitializeApplication();
}
}

@ -44,193 +44,192 @@ using Volo.Abp.TenantManagement.EntityFrameworkCore;
using Volo.Abp.Threading;
using Volo.Abp.UI.Navigation.Urls;
namespace Volo.CmsKit
namespace Volo.CmsKit;
[DependsOn(
typeof(AbpAccountWebIdentityServerModule),
typeof(AbpAccountApplicationModule),
typeof(AbpAccountHttpApiModule),
typeof(AbpAspNetCoreMvcUiMultiTenancyModule),
typeof(AbpAspNetCoreMvcModule),
typeof(AbpAspNetCoreMvcUiBasicThemeModule),
typeof(AbpAuditLoggingEntityFrameworkCoreModule),
typeof(AbpAutofacModule),
typeof(AbpCachingStackExchangeRedisModule),
typeof(AbpEntityFrameworkCoreSqlServerModule),
typeof(AbpIdentityEntityFrameworkCoreModule),
typeof(AbpIdentityApplicationModule),
typeof(AbpIdentityHttpApiModule),
typeof(AbpIdentityServerEntityFrameworkCoreModule),
typeof(AbpPermissionManagementDomainIdentityModule),
typeof(AbpPermissionManagementEntityFrameworkCoreModule),
typeof(AbpPermissionManagementApplicationModule),
typeof(AbpPermissionManagementHttpApiModule),
typeof(AbpSettingManagementEntityFrameworkCoreModule),
typeof(AbpFeatureManagementApplicationModule),
typeof(AbpTenantManagementEntityFrameworkCoreModule),
typeof(AbpTenantManagementApplicationModule),
typeof(AbpTenantManagementHttpApiModule),
typeof(AbpAspNetCoreAuthenticationJwtBearerModule),
typeof(CmsKitApplicationContractsModule),
typeof(AbpAspNetCoreSerilogModule)
)]
public class CmsKitIdentityServerModule : AbpModule
{
[DependsOn(
typeof(AbpAccountWebIdentityServerModule),
typeof(AbpAccountApplicationModule),
typeof(AbpAccountHttpApiModule),
typeof(AbpAspNetCoreMvcUiMultiTenancyModule),
typeof(AbpAspNetCoreMvcModule),
typeof(AbpAspNetCoreMvcUiBasicThemeModule),
typeof(AbpAuditLoggingEntityFrameworkCoreModule),
typeof(AbpAutofacModule),
typeof(AbpCachingStackExchangeRedisModule),
typeof(AbpEntityFrameworkCoreSqlServerModule),
typeof(AbpIdentityEntityFrameworkCoreModule),
typeof(AbpIdentityApplicationModule),
typeof(AbpIdentityHttpApiModule),
typeof(AbpIdentityServerEntityFrameworkCoreModule),
typeof(AbpPermissionManagementDomainIdentityModule),
typeof(AbpPermissionManagementEntityFrameworkCoreModule),
typeof(AbpPermissionManagementApplicationModule),
typeof(AbpPermissionManagementHttpApiModule),
typeof(AbpSettingManagementEntityFrameworkCoreModule),
typeof(AbpFeatureManagementApplicationModule),
typeof(AbpTenantManagementEntityFrameworkCoreModule),
typeof(AbpTenantManagementApplicationModule),
typeof(AbpTenantManagementHttpApiModule),
typeof(AbpAspNetCoreAuthenticationJwtBearerModule),
typeof(CmsKitApplicationContractsModule),
typeof(AbpAspNetCoreSerilogModule)
)]
public class CmsKitIdentityServerModule : AbpModule
private const string DefaultCorsPolicyName = "Default";
public override void PreConfigureServices(ServiceConfigurationContext context)
{
private const string DefaultCorsPolicyName = "Default";
FeatureConfigurer.Configure();
}
public override void PreConfigureServices(ServiceConfigurationContext context)
{
FeatureConfigurer.Configure();
}
public override void ConfigureServices(ServiceConfigurationContext context)
{
var hostingEnvironment = context.Services.GetHostingEnvironment();
var configuration = context.Services.GetConfiguration();
public override void ConfigureServices(ServiceConfigurationContext context)
Configure<AbpDbContextOptions>(options =>
{
var hostingEnvironment = context.Services.GetHostingEnvironment();
var configuration = context.Services.GetConfiguration();
options.UseSqlServer();
});
Configure<AbpDbContextOptions>(options =>
context.Services.AddSwaggerGen(
options =>
{
options.UseSqlServer();
options.SwaggerDoc("v1", new OpenApiInfo { Title = "CmsKit API", Version = "v1" });
options.DocInclusionPredicate((docName, description) => true);
options.CustomSchemaIds(type => type.FullName);
});
context.Services.AddSwaggerGen(
options =>
{
options.SwaggerDoc("v1", new OpenApiInfo { Title = "CmsKit API", Version = "v1" });
options.DocInclusionPredicate((docName, description) => true);
options.CustomSchemaIds(type => type.FullName);
});
Configure<AbpLocalizationOptions>(options =>
{
options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
options.Languages.Add(new LanguageInfo("en", "en", "English"));
options.Languages.Add(new LanguageInfo("hu", "hu", "Magyar"));
options.Languages.Add(new LanguageInfo("fi", "fi", "Finnish"));
options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
options.Languages.Add(new LanguageInfo("hi", "hi", "Hindi", "in"));
options.Languages.Add(new LanguageInfo("is", "is", "Icelandic", "is"));
options.Languages.Add(new LanguageInfo("it", "it", "Italiano", "it"));
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português"));
options.Languages.Add(new LanguageInfo("ro-RO", "ro-RO", "Română"));
options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
options.Languages.Add(new LanguageInfo("sk", "sk", "Slovak"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));
options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中文"));
});
Configure<AbpAuditingOptions>(options =>
{
Configure<AbpLocalizationOptions>(options =>
{
options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
options.Languages.Add(new LanguageInfo("en", "en", "English"));
options.Languages.Add(new LanguageInfo("hu", "hu", "Magyar"));
options.Languages.Add(new LanguageInfo("fi", "fi", "Finnish"));
options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
options.Languages.Add(new LanguageInfo("hi", "hi", "Hindi", "in"));
options.Languages.Add(new LanguageInfo("is", "is", "Icelandic", "is"));
options.Languages.Add(new LanguageInfo("it", "it", "Italiano", "it"));
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português"));
options.Languages.Add(new LanguageInfo("ro-RO", "ro-RO", "Română"));
options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
options.Languages.Add(new LanguageInfo("sk", "sk", "Slovak"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));
options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中文"));
});
Configure<AbpAuditingOptions>(options =>
{
//options.IsEnabledForGetRequests = true;
options.ApplicationName = "AuthServer";
});
});
Configure<AppUrlOptions>(options =>
{
options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"];
});
context.Services.AddAuthentication()
.AddJwtBearer(options =>
{
options.Authority = configuration["AuthServer:Authority"];
options.RequireHttpsMetadata = false;
options.Audience = configuration["AuthServer:ApiName"];
});
Configure<AppUrlOptions>(options =>
{
options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"];
});
Configure<AbpDistributedCacheOptions>(options =>
context.Services.AddAuthentication()
.AddJwtBearer(options =>
{
options.KeyPrefix = "CmsKit:";
options.Authority = configuration["AuthServer:Authority"];
options.RequireHttpsMetadata = false;
options.Audience = configuration["AuthServer:ApiName"];
});
Configure<AbpMultiTenancyOptions>(options =>
{
options.IsEnabled = MultiTenancyConsts.IsEnabled;
});
Configure<AbpDistributedCacheOptions>(options =>
{
options.KeyPrefix = "CmsKit:";
});
if (!hostingEnvironment.IsDevelopment())
{
var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]);
context.Services
.AddDataProtection()
.PersistKeysToStackExchangeRedis(redis, "CmsKit-Protection-Keys");
}
Configure<AbpMultiTenancyOptions>(options =>
{
options.IsEnabled = MultiTenancyConsts.IsEnabled;
});
context.Services.AddCors(options =>
{
options.AddPolicy(DefaultCorsPolicyName, builder =>
{
builder
.WithOrigins(
configuration["App:CorsOrigins"]
.Split(",", StringSplitOptions.RemoveEmptyEntries)
.Select(o => o.RemovePostFix("/"))
.ToArray()
)
.WithAbpExposedHeaders()
.SetIsOriginAllowedToAllowWildcardSubdomains()
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials();
});
});
if (!hostingEnvironment.IsDevelopment())
{
var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]);
context.Services
.AddDataProtection()
.PersistKeysToStackExchangeRedis(redis, "CmsKit-Protection-Keys");
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)
context.Services.AddCors(options =>
{
var app = context.GetApplicationBuilder();
var env = context.GetEnvironment();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
options.AddPolicy(DefaultCorsPolicyName, builder =>
{
app.UseErrorPage();
app.UseHsts();
}
builder
.WithOrigins(
configuration["App:CorsOrigins"]
.Split(",", StringSplitOptions.RemoveEmptyEntries)
.Select(o => o.RemovePostFix("/"))
.ToArray()
)
.WithAbpExposedHeaders()
.SetIsOriginAllowedToAllowWildcardSubdomains()
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials();
});
});
}
app.UseHttpsRedirection();
app.UseCorrelationId();
app.UseStaticFiles();
app.UseRouting();
app.UseCors(DefaultCorsPolicyName);
app.UseAuthentication();
app.UseJwtTokenMiddleware();
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
var app = context.GetApplicationBuilder();
var env = context.GetEnvironment();
if (MultiTenancyConsts.IsEnabled)
{
app.UseMultiTenancy();
}
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseErrorPage();
app.UseHsts();
}
app.UseAbpRequestLocalization();
app.UseIdentityServer();
app.UseAuthorization();
app.UseSwagger();
app.UseSwaggerUI(options =>
{
options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support APP API");
});
app.UseAuditing();
app.UseAbpSerilogEnrichers();
app.UseConfiguredEndpoints();
app.UseHttpsRedirection();
app.UseCorrelationId();
app.UseStaticFiles();
app.UseRouting();
app.UseCors(DefaultCorsPolicyName);
app.UseAuthentication();
app.UseJwtTokenMiddleware();
SeedData(context);
if (MultiTenancyConsts.IsEnabled)
{
app.UseMultiTenancy();
}
private void SeedData(ApplicationInitializationContext context)
app.UseAbpRequestLocalization();
app.UseIdentityServer();
app.UseAuthorization();
app.UseSwagger();
app.UseSwaggerUI(options =>
{
options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support APP API");
});
app.UseAuditing();
app.UseAbpSerilogEnrichers();
app.UseConfiguredEndpoints();
SeedData(context);
}
private void SeedData(ApplicationInitializationContext context)
{
AsyncHelper.RunSync(async () =>
{
AsyncHelper.RunSync(async () =>
using (var scope = context.ServiceProvider.CreateScope())
{
using (var scope = context.ServiceProvider.CreateScope())
{
await scope.ServiceProvider
.GetRequiredService<IDataSeeder>()
.SeedAsync();
}
});
}
await scope.ServiceProvider
.GetRequiredService<IDataSeeder>()
.SeedAsync();
}
});
}
}

@ -7,26 +7,25 @@ using Volo.Abp.PermissionManagement.EntityFrameworkCore;
using Volo.Abp.SettingManagement.EntityFrameworkCore;
using Volo.Abp.TenantManagement.EntityFrameworkCore;
namespace Volo.CmsKit.EntityFrameworkCore
namespace Volo.CmsKit.EntityFrameworkCore;
public class IdentityServerHostMigrationsDbContext : AbpDbContext<IdentityServerHostMigrationsDbContext>
{
public class IdentityServerHostMigrationsDbContext : AbpDbContext<IdentityServerHostMigrationsDbContext>
public IdentityServerHostMigrationsDbContext(DbContextOptions<IdentityServerHostMigrationsDbContext> options)
: base(options)
{
public IdentityServerHostMigrationsDbContext(DbContextOptions<IdentityServerHostMigrationsDbContext> options)
: base(options)
{
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ConfigurePermissionManagement();
modelBuilder.ConfigureSettingManagement();
modelBuilder.ConfigureAuditLogging();
modelBuilder.ConfigureIdentity();
modelBuilder.ConfigureIdentityServer();
modelBuilder.ConfigureTenantManagement();
}
modelBuilder.ConfigurePermissionManagement();
modelBuilder.ConfigureSettingManagement();
modelBuilder.ConfigureAuditLogging();
modelBuilder.ConfigureIdentity();
modelBuilder.ConfigureIdentityServer();
modelBuilder.ConfigureTenantManagement();
}
}

@ -3,29 +3,28 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration;
namespace Volo.CmsKit.EntityFrameworkCore
namespace Volo.CmsKit.EntityFrameworkCore;
public class IdentityServerHostMigrationsDbContextFactory : IDesignTimeDbContextFactory<IdentityServerHostMigrationsDbContext>
{
public class IdentityServerHostMigrationsDbContextFactory : IDesignTimeDbContextFactory<IdentityServerHostMigrationsDbContext>
public IdentityServerHostMigrationsDbContext CreateDbContext(string[] args)
{
public IdentityServerHostMigrationsDbContext CreateDbContext(string[] args)
{
FeatureConfigurer.Configure();
FeatureConfigurer.Configure();
var configuration = BuildConfiguration();
var configuration = BuildConfiguration();
var builder = new DbContextOptionsBuilder<IdentityServerHostMigrationsDbContext>()
.UseSqlServer(configuration.GetConnectionString("Default"));
var builder = new DbContextOptionsBuilder<IdentityServerHostMigrationsDbContext>()
.UseSqlServer(configuration.GetConnectionString("Default"));
return new IdentityServerHostMigrationsDbContext(builder.Options);
}
return new IdentityServerHostMigrationsDbContext(builder.Options);
}
private static IConfigurationRoot BuildConfiguration()
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false);
private static IConfigurationRoot BuildConfiguration()
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false);
return builder.Build();
}
return builder.Build();
}
}

@ -12,45 +12,45 @@ using Volo.Abp.IdentityServer.IdentityResources;
using Volo.Abp.PermissionManagement;
using Volo.Abp.Uow;
namespace Volo.CmsKit.IdentityServer
namespace Volo.CmsKit.IdentityServer;
public class IdentityServerDataSeedContributor : IDataSeedContributor, ITransientDependency
{
public class IdentityServerDataSeedContributor : IDataSeedContributor, ITransientDependency
private readonly IApiResourceRepository _apiResourceRepository;
private readonly IClientRepository _clientRepository;
private readonly IIdentityResourceDataSeeder _identityResourceDataSeeder;
private readonly IGuidGenerator _guidGenerator;
private readonly IPermissionDataSeeder _permissionDataSeeder;
private readonly IConfiguration _configuration;
public IdentityServerDataSeedContributor(
IClientRepository clientRepository,
IApiResourceRepository apiResourceRepository,
IIdentityResourceDataSeeder identityResourceDataSeeder,
IGuidGenerator guidGenerator,
IPermissionDataSeeder permissionDataSeeder,
IConfiguration configuration)
{
private readonly IApiResourceRepository _apiResourceRepository;
private readonly IClientRepository _clientRepository;
private readonly IIdentityResourceDataSeeder _identityResourceDataSeeder;
private readonly IGuidGenerator _guidGenerator;
private readonly IPermissionDataSeeder _permissionDataSeeder;
private readonly IConfiguration _configuration;
public IdentityServerDataSeedContributor(
IClientRepository clientRepository,
IApiResourceRepository apiResourceRepository,
IIdentityResourceDataSeeder identityResourceDataSeeder,
IGuidGenerator guidGenerator,
IPermissionDataSeeder permissionDataSeeder,
IConfiguration configuration)
{
_clientRepository = clientRepository;
_apiResourceRepository = apiResourceRepository;
_identityResourceDataSeeder = identityResourceDataSeeder;
_guidGenerator = guidGenerator;
_permissionDataSeeder = permissionDataSeeder;
_configuration = configuration;
}
_clientRepository = clientRepository;
_apiResourceRepository = apiResourceRepository;
_identityResourceDataSeeder = identityResourceDataSeeder;
_guidGenerator = guidGenerator;
_permissionDataSeeder = permissionDataSeeder;
_configuration = configuration;
}
[UnitOfWork]
public virtual async Task SeedAsync(DataSeedContext context)
{
await _identityResourceDataSeeder.CreateStandardResourcesAsync();
await CreateApiResourcesAsync();
await CreateClientsAsync();
}
[UnitOfWork]
public virtual async Task SeedAsync(DataSeedContext context)
{
await _identityResourceDataSeeder.CreateStandardResourcesAsync();
await CreateApiResourcesAsync();
await CreateClientsAsync();
}
private async Task CreateApiResourcesAsync()
private async Task CreateApiResourcesAsync()
{
var commonApiUserClaims = new[]
{
var commonApiUserClaims = new[]
{
"email",
"email_verified",
"name",
@ -59,41 +59,41 @@ namespace Volo.CmsKit.IdentityServer
"role"
};
await CreateApiResourceAsync("CmsKit", commonApiUserClaims);
await CreateApiResourceAsync("CmsKit", commonApiUserClaims);
}
private async Task<ApiResource> CreateApiResourceAsync(string name, IEnumerable<string> claims)
{
var apiResource = await _apiResourceRepository.FindByNameAsync(name);
if (apiResource == null)
{
apiResource = await _apiResourceRepository.InsertAsync(
new ApiResource(
_guidGenerator.Create(),
name,
name + " API"
),
autoSave: true
);
}
private async Task<ApiResource> CreateApiResourceAsync(string name, IEnumerable<string> claims)
foreach (var claim in claims)
{
var apiResource = await _apiResourceRepository.FindByNameAsync(name);
if (apiResource == null)
if (apiResource.FindClaim(claim) == null)
{
apiResource = await _apiResourceRepository.InsertAsync(
new ApiResource(
_guidGenerator.Create(),
name,
name + " API"
),
autoSave: true
);
apiResource.AddUserClaim(claim);
}
}
foreach (var claim in claims)
{
if (apiResource.FindClaim(claim) == null)
{
apiResource.AddUserClaim(claim);
}
}
return await _apiResourceRepository.UpdateAsync(apiResource);
}
return await _apiResourceRepository.UpdateAsync(apiResource);
}
private async Task CreateClientsAsync()
{
const string commonSecret = "E5Xd4yMqjP5kjWFKrYgySBju6JVfCzMyFp7n2QmMrME=";
private async Task CreateClientsAsync()
var commonScopes = new[]
{
const string commonSecret = "E5Xd4yMqjP5kjWFKrYgySBju6JVfCzMyFp7n2QmMrME=";
var commonScopes = new[]
{
"email",
"openid",
"profile",
@ -103,117 +103,116 @@ namespace Volo.CmsKit.IdentityServer
"CmsKit"
};
var configurationSection = _configuration.GetSection("IdentityServer:Clients");
var configurationSection = _configuration.GetSection("IdentityServer:Clients");
//Web Client
var webClientId = configurationSection["CmsKit_Web:ClientId"];
if (!webClientId.IsNullOrWhiteSpace())
{
var webClientRootUrl = configurationSection["CmsKit_Web:RootUrl"].EnsureEndsWith('/');
await CreateClientAsync(
webClientId,
commonScopes,
new[] { "hybrid" },
commonSecret,
redirectUri: $"{webClientRootUrl}signin-oidc",
postLogoutRedirectUri: $"{webClientRootUrl}signout-callback-oidc"
);
}
//Web Client
var webClientId = configurationSection["CmsKit_Web:ClientId"];
if (!webClientId.IsNullOrWhiteSpace())
{
var webClientRootUrl = configurationSection["CmsKit_Web:RootUrl"].EnsureEndsWith('/');
await CreateClientAsync(
webClientId,
commonScopes,
new[] { "hybrid" },
commonSecret,
redirectUri: $"{webClientRootUrl}signin-oidc",
postLogoutRedirectUri: $"{webClientRootUrl}signout-callback-oidc"
);
}
//Console Test Client
var consoleClientId = configurationSection["CmsKit_ConsoleTestApp:ClientId"];
if (!consoleClientId.IsNullOrWhiteSpace())
{
await CreateClientAsync(
consoleClientId,
commonScopes,
new[] { "password", "client_credentials" },
commonSecret
);
}
//Console Test Client
var consoleClientId = configurationSection["CmsKit_ConsoleTestApp:ClientId"];
if (!consoleClientId.IsNullOrWhiteSpace())
{
await CreateClientAsync(
consoleClientId,
commonScopes,
new[] { "password", "client_credentials" },
commonSecret
);
}
}
private async Task<Client> CreateClientAsync(
string name,
IEnumerable<string> scopes,
IEnumerable<string> grantTypes,
string secret,
string redirectUri = null,
string postLogoutRedirectUri = null,
IEnumerable<string> permissions = null)
private async Task<Client> CreateClientAsync(
string name,
IEnumerable<string> scopes,
IEnumerable<string> grantTypes,
string secret,
string redirectUri = null,
string postLogoutRedirectUri = null,
IEnumerable<string> permissions = null)
{
var client = await _clientRepository.FindByClientIdAsync(name);
if (client == null)
{
var client = await _clientRepository.FindByClientIdAsync(name);
if (client == null)
{
client = await _clientRepository.InsertAsync(
new Client(
_guidGenerator.Create(),
name
)
{
ClientName = name,
ProtocolType = "oidc",
Description = name,
AlwaysIncludeUserClaimsInIdToken = true,
AllowOfflineAccess = true,
AbsoluteRefreshTokenLifetime = 31536000, //365 days
client = await _clientRepository.InsertAsync(
new Client(
_guidGenerator.Create(),
name
)
{
ClientName = name,
ProtocolType = "oidc",
Description = name,
AlwaysIncludeUserClaimsInIdToken = true,
AllowOfflineAccess = true,
AbsoluteRefreshTokenLifetime = 31536000, //365 days
AccessTokenLifetime = 31536000, //365 days
AuthorizationCodeLifetime = 300,
IdentityTokenLifetime = 300,
RequireConsent = false
},
autoSave: true
);
}
foreach (var scope in scopes)
{
if (client.FindScope(scope) == null)
{
client.AddScope(scope);
}
}
IdentityTokenLifetime = 300,
RequireConsent = false
},
autoSave: true
);
}
foreach (var grantType in grantTypes)
foreach (var scope in scopes)
{
if (client.FindScope(scope) == null)
{
if (client.FindGrantType(grantType) == null)
{
client.AddGrantType(grantType);
}
client.AddScope(scope);
}
}
if (client.FindSecret(secret) == null)
foreach (var grantType in grantTypes)
{
if (client.FindGrantType(grantType) == null)
{
client.AddSecret(secret);
client.AddGrantType(grantType);
}
}
if (redirectUri != null)
{
if (client.FindRedirectUri(redirectUri) == null)
{
client.AddRedirectUri(redirectUri);
}
}
if (client.FindSecret(secret) == null)
{
client.AddSecret(secret);
}
if (postLogoutRedirectUri != null)
if (redirectUri != null)
{
if (client.FindRedirectUri(redirectUri) == null)
{
if (client.FindPostLogoutRedirectUri(postLogoutRedirectUri) == null)
{
client.AddPostLogoutRedirectUri(postLogoutRedirectUri);
}
client.AddRedirectUri(redirectUri);
}
}
if (permissions != null)
if (postLogoutRedirectUri != null)
{
if (client.FindPostLogoutRedirectUri(postLogoutRedirectUri) == null)
{
await _permissionDataSeeder.SeedAsync(
ClientPermissionValueProvider.ProviderName,
name,
permissions,
null
);
client.AddPostLogoutRedirectUri(postLogoutRedirectUri);
}
}
return await _clientRepository.UpdateAsync(client);
if (permissions != null)
{
await _permissionDataSeeder.SeedAsync(
ClientPermissionValueProvider.ProviderName,
name,
permissions,
null
);
}
return await _clientRepository.UpdateAsync(client);
}
}

@ -1,11 +1,10 @@
using Volo.Abp.AspNetCore.Mvc.UI.RazorPages;
namespace Volo.CmsKit.Pages
namespace Volo.CmsKit.Pages;
public class IndexModel : AbpPageModel
{
public class IndexModel : AbpPageModel
public void OnGet()
{
public void OnGet()
{
}
}
}
}

@ -5,47 +5,46 @@ using Microsoft.Extensions.Hosting;
using Serilog;
using Serilog.Events;
namespace Volo.CmsKit
namespace Volo.CmsKit;
public class Program
{
public class Program
public static int Main(string[] args)
{
public static int Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
Log.Logger = new LoggerConfiguration()
#if DEBUG
.MinimumLevel.Debug()
#else
.MinimumLevel.Information()
#endif
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.File("Logs/logs.txt")
.CreateLogger();
.Enrich.FromLogContext()
.WriteTo.File("Logs/logs.txt")
.CreateLogger();
try
{
Log.Information("Starting web host.");
CreateHostBuilder(args).Build().Run();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly!");
return 1;
}
finally
{
Log.CloseAndFlush();
}
try
{
Log.Information("Starting web host.");
CreateHostBuilder(args).Build().Run();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly!");
return 1;
}
finally
{
Log.CloseAndFlush();
}
internal static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseAutofac()
.UseSerilog();
}
internal static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseAutofac()
.UseSerilog();
}

@ -4,18 +4,17 @@ using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
namespace Volo.CmsKit
namespace Volo.CmsKit;
public class Startup
{
public class Startup
public void ConfigureServices(IServiceCollection services)
{
public void ConfigureServices(IServiceCollection services)
{
services.AddApplication<CmsKitIdentityServerModule>();
}
services.AddApplication<CmsKitIdentityServerModule>();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
{
app.InitializeApplication();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
{
app.InitializeApplication();
}
}

@ -1,11 +1,10 @@
using Volo.Abp.Ui.Branding;
using Volo.Abp.DependencyInjection;
namespace Volo.CmsKit
namespace Volo.CmsKit;
[Dependency(ReplaceServices = true)]
public class CmsKitBrandingProvider : DefaultBrandingProvider
{
[Dependency(ReplaceServices = true)]
public class CmsKitBrandingProvider : DefaultBrandingProvider
{
public override string AppName => "CmsKit";
}
public override string AppName => "CmsKit";
}

@ -1,12 +1,11 @@
using AutoMapper;
namespace Volo.CmsKit
namespace Volo.CmsKit;
public class CmsKitWebAutoMapperProfile : Profile
{
public class CmsKitWebAutoMapperProfile : Profile
public CmsKitWebAutoMapperProfile()
{
public CmsKitWebAutoMapperProfile()
{
//Define your AutoMapper configuration here for the Web project.
}
//Define your AutoMapper configuration here for the Web project.
}
}

@ -9,49 +9,48 @@ using Volo.CmsKit.Localization;
using Volo.Abp.UI.Navigation;
using Volo.Abp.Users;
namespace Volo.CmsKit
namespace Volo.CmsKit;
public class CmsKitWebHostMenuContributor : IMenuContributor
{
public class CmsKitWebHostMenuContributor : IMenuContributor
private readonly IConfiguration _configuration;
public CmsKitWebHostMenuContributor(IConfiguration configuration)
{
private readonly IConfiguration _configuration;
_configuration = configuration;
}
public CmsKitWebHostMenuContributor(IConfiguration configuration)
public Task ConfigureMenuAsync(MenuConfigurationContext context)
{
if (context.Menu.Name == StandardMenus.User)
{
_configuration = configuration;
AddLogoutItemToMenu(context);
}
public Task ConfigureMenuAsync(MenuConfigurationContext context)
{
if (context.Menu.Name == StandardMenus.User)
{
AddLogoutItemToMenu(context);
}
return Task.CompletedTask;
}
return Task.CompletedTask;
}
private void AddLogoutItemToMenu(MenuConfigurationContext context)
{
var l = context.GetLocalizer<CmsKitResource>();
context.Menu.Items.Add(new ApplicationMenuItem(
"Account.Manage",
l["MyAccount"],
$"{_configuration["AuthServer:Authority"].EnsureEndsWith('/')}Account/Manage",
icon: "fa fa-cog",
order: int.MaxValue - 1001,
null,
"_blank"
).RequireAuthenticated());
context.Menu.Items.Add(new ApplicationMenuItem(
"Account.Logout",
l["Logout"],
"~/Account/Logout",
"fas fa-power-off",
order: int.MaxValue - 1000
).RequireAuthenticated());
}
private void AddLogoutItemToMenu(MenuConfigurationContext context)
{
var l = context.GetLocalizer<CmsKitResource>();
context.Menu.Items.Add(new ApplicationMenuItem(
"Account.Manage",
l["MyAccount"],
$"{_configuration["AuthServer:Authority"].EnsureEndsWith('/')}Account/Manage",
icon: "fa fa-cog",
order: int.MaxValue - 1001,
null,
"_blank"
).RequireAuthenticated());
context.Menu.Items.Add(new ApplicationMenuItem(
"Account.Logout",
l["Logout"],
"~/Account/Logout",
"fas fa-power-off",
order: int.MaxValue - 1000
).RequireAuthenticated());
}
}

@ -42,207 +42,206 @@ using Volo.Abp.UI;
using Volo.Abp.UI.Navigation;
using Volo.Abp.VirtualFileSystem;
namespace Volo.CmsKit
namespace Volo.CmsKit;
[DependsOn(
typeof(CmsKitWebModule),
typeof(CmsKitHttpApiClientModule),
typeof(AbpAspNetCoreAuthenticationOAuthModule),
typeof(AbpAspNetCoreMvcClientModule),
typeof(AbpAspNetCoreMvcUiBasicThemeModule),
typeof(AbpAutofacModule),
typeof(AbpCachingStackExchangeRedisModule),
typeof(AbpHttpClientIdentityModelWebModule),
typeof(AbpIdentityWebModule),
typeof(AbpIdentityHttpApiClientModule),
typeof(AbpTenantManagementWebModule),
typeof(AbpTenantManagementHttpApiClientModule),
typeof(AbpFeatureManagementHttpApiClientModule),
typeof(AbpPermissionManagementHttpApiClientModule),
typeof(AbpAspNetCoreSerilogModule)
)]
public class CmsKitWebHostModule : AbpModule
{
[DependsOn(
typeof(CmsKitWebModule),
typeof(CmsKitHttpApiClientModule),
typeof(AbpAspNetCoreAuthenticationOAuthModule),
typeof(AbpAspNetCoreMvcClientModule),
typeof(AbpAspNetCoreMvcUiBasicThemeModule),
typeof(AbpAutofacModule),
typeof(AbpCachingStackExchangeRedisModule),
typeof(AbpHttpClientIdentityModelWebModule),
typeof(AbpIdentityWebModule),
typeof(AbpIdentityHttpApiClientModule),
typeof(AbpTenantManagementWebModule),
typeof(AbpTenantManagementHttpApiClientModule),
typeof(AbpFeatureManagementHttpApiClientModule),
typeof(AbpPermissionManagementHttpApiClientModule),
typeof(AbpAspNetCoreSerilogModule)
)]
public class CmsKitWebHostModule : AbpModule
public override void PreConfigureServices(ServiceConfigurationContext context)
{
public override void PreConfigureServices(ServiceConfigurationContext context)
FeatureConfigurer.Configure();
context.Services.PreConfigure<AbpMvcDataAnnotationsLocalizationOptions>(options =>
{
FeatureConfigurer.Configure();
options.AddAssemblyResource(
typeof(CmsKitResource),
typeof(CmsKitDomainSharedModule).Assembly,
typeof(CmsKitApplicationContractsModule).Assembly,
typeof(CmsKitWebHostModule).Assembly
);
});
}
context.Services.PreConfigure<AbpMvcDataAnnotationsLocalizationOptions>(options =>
{
options.AddAssemblyResource(
typeof(CmsKitResource),
typeof(CmsKitDomainSharedModule).Assembly,
typeof(CmsKitApplicationContractsModule).Assembly,
typeof(CmsKitWebHostModule).Assembly
);
});
}
public override void ConfigureServices(ServiceConfigurationContext context)
{
var hostingEnvironment = context.Services.GetHostingEnvironment();
var configuration = context.Services.GetConfiguration();
ConfigureMenu(configuration);
ConfigureCache(configuration);
ConfigureUrls(configuration);
ConfigureAuthentication(context, configuration);
ConfigureAutoMapper();
ConfigureVirtualFileSystem(hostingEnvironment);
ConfigureSwaggerServices(context.Services);
ConfigureMultiTenancy();
ConfigureRedis(context, configuration, hostingEnvironment);
}
public override void ConfigureServices(ServiceConfigurationContext context)
private void ConfigureMenu(IConfiguration configuration)
{
Configure<AbpNavigationOptions>(options =>
{
var hostingEnvironment = context.Services.GetHostingEnvironment();
var configuration = context.Services.GetConfiguration();
ConfigureMenu(configuration);
ConfigureCache(configuration);
ConfigureUrls(configuration);
ConfigureAuthentication(context, configuration);
ConfigureAutoMapper();
ConfigureVirtualFileSystem(hostingEnvironment);
ConfigureSwaggerServices(context.Services);
ConfigureMultiTenancy();
ConfigureRedis(context, configuration, hostingEnvironment);
}
options.MenuContributors.Add(new CmsKitWebHostMenuContributor(configuration));
});
}
private void ConfigureMenu(IConfiguration configuration)
private void ConfigureCache(IConfiguration configuration)
{
Configure<AbpDistributedCacheOptions>(options =>
{
Configure<AbpNavigationOptions>(options =>
{
options.MenuContributors.Add(new CmsKitWebHostMenuContributor(configuration));
});
}
options.KeyPrefix = "CmsKit:";
});
}
private void ConfigureCache(IConfiguration configuration)
private void ConfigureUrls(IConfiguration configuration)
{
Configure<AppUrlOptions>(options =>
{
Configure<AbpDistributedCacheOptions>(options =>
{
options.KeyPrefix = "CmsKit:";
});
}
options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"];
});
}
private void ConfigureUrls(IConfiguration configuration)
private void ConfigureMultiTenancy()
{
Configure<AbpMultiTenancyOptions>(options =>
{
Configure<AppUrlOptions>(options =>
{
options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"];
});
}
options.IsEnabled = MultiTenancyConsts.IsEnabled;
});
}
private void ConfigureMultiTenancy()
{
Configure<AbpMultiTenancyOptions>(options =>
private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration)
{
context.Services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies", options =>
{
options.ExpireTimeSpan = TimeSpan.FromDays(365);
})
.AddOpenIdConnect("oidc", options =>
{
options.IsEnabled = MultiTenancyConsts.IsEnabled;
options.Authority = configuration["AuthServer:Authority"];
options.RequireHttpsMetadata = false;
options.ResponseType = OpenIdConnectResponseType.CodeIdToken;
options.ClientId = configuration["AuthServer:ClientId"];
options.ClientSecret = configuration["AuthServer:ClientSecret"];
options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = true;
options.Scope.Add("role");
options.Scope.Add("email");
options.Scope.Add("phone");
options.Scope.Add("CmsKit");
options.ClaimActions.MapJsonKey(AbpClaimTypes.UserName, "name");
options.ClaimActions.DeleteClaim("name");
});
}
}
private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration)
private void ConfigureAutoMapper()
{
Configure<AbpAutoMapperOptions>(options =>
{
context.Services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies", options =>
{
options.ExpireTimeSpan = TimeSpan.FromDays(365);
})
.AddOpenIdConnect("oidc", options =>
{
options.Authority = configuration["AuthServer:Authority"];
options.RequireHttpsMetadata = false;
options.ResponseType = OpenIdConnectResponseType.CodeIdToken;
options.ClientId = configuration["AuthServer:ClientId"];
options.ClientSecret = configuration["AuthServer:ClientSecret"];
options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = true;
options.Scope.Add("role");
options.Scope.Add("email");
options.Scope.Add("phone");
options.Scope.Add("CmsKit");
options.ClaimActions.MapJsonKey(AbpClaimTypes.UserName, "name");
options.ClaimActions.DeleteClaim("name");
});
}
options.AddMaps<CmsKitWebHostModule>();
});
}
private void ConfigureAutoMapper()
private void ConfigureVirtualFileSystem(IWebHostEnvironment hostingEnvironment)
{
if (hostingEnvironment.IsDevelopment())
{
Configure<AbpAutoMapperOptions>(options =>
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.AddMaps<CmsKitWebHostModule>();
options.FileSets.ReplaceEmbeddedByPhysical<CmsKitDomainSharedModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Volo.CmsKit.Domain", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<CmsKitApplicationContractsModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Volo.CmsKit.Application.Contracts", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<CmsKitWebModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Volo.CmsKit.Web", Path.DirectorySeparatorChar)));
});
}
}
private void ConfigureVirtualFileSystem(IWebHostEnvironment hostingEnvironment)
{
if (hostingEnvironment.IsDevelopment())
private void ConfigureSwaggerServices(IServiceCollection services)
{
services.AddSwaggerGen(
options =>
{
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.ReplaceEmbeddedByPhysical<CmsKitDomainSharedModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Volo.CmsKit.Domain", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<CmsKitApplicationContractsModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Volo.CmsKit.Application.Contracts", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<CmsKitWebModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Volo.CmsKit.Web", Path.DirectorySeparatorChar)));
});
options.SwaggerDoc("v1", new OpenApiInfo { Title = "CmsKit API", Version = "v1" });
options.DocInclusionPredicate((docName, description) => true);
options.CustomSchemaIds(type => type.FullName);
}
}
);
}
private void ConfigureSwaggerServices(IServiceCollection services)
private void ConfigureRedis(
ServiceConfigurationContext context,
IConfiguration configuration,
IWebHostEnvironment hostingEnvironment)
{
if (!hostingEnvironment.IsDevelopment())
{
services.AddSwaggerGen(
options =>
{
options.SwaggerDoc("v1", new OpenApiInfo { Title = "CmsKit API", Version = "v1" });
options.DocInclusionPredicate((docName, description) => true);
options.CustomSchemaIds(type => type.FullName);
}
);
var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]);
context.Services
.AddDataProtection()
.PersistKeysToStackExchangeRedis(redis, "CmsKit-Protection-Keys");
}
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
var app = context.GetApplicationBuilder();
var env = context.GetEnvironment();
private void ConfigureRedis(
ServiceConfigurationContext context,
IConfiguration configuration,
IWebHostEnvironment hostingEnvironment)
if (env.IsDevelopment())
{
if (!hostingEnvironment.IsDevelopment())
{
var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]);
context.Services
.AddDataProtection()
.PersistKeysToStackExchangeRedis(redis, "CmsKit-Protection-Keys");
}
app.UseDeveloperExceptionPage();
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)
else
{
var app = context.GetApplicationBuilder();
var env = context.GetEnvironment();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseErrorPage();
app.UseHsts();
}
app.UseErrorPage();
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
if (MultiTenancyConsts.IsEnabled)
{
app.UseMultiTenancy();
}
if (MultiTenancyConsts.IsEnabled)
{
app.UseMultiTenancy();
}
app.UseAbpRequestLocalization();
app.UseAuthorization();
app.UseAbpRequestLocalization();
app.UseAuthorization();
app.UseSwagger();
app.UseSwaggerUI(options =>
{
options.SwaggerEndpoint("/swagger/v1/swagger.json", "CmsKit API");
});
app.UseSwagger();
app.UseSwaggerUI(options =>
{
options.SwaggerEndpoint("/swagger/v1/swagger.json", "CmsKit API");
});
app.UseAuditing();
app.UseAbpSerilogEnrichers();
app.UseConfiguredEndpoints();
}
app.UseAuditing();
app.UseAbpSerilogEnrichers();
app.UseConfiguredEndpoints();
}
}

@ -1,9 +1,8 @@
using Volo.Abp.AspNetCore.Mvc.Authentication;
namespace Volo.CmsKit.Controllers
namespace Volo.CmsKit.Controllers;
public class AccountController : ChallengeAccountController
{
public class AccountController : ChallengeAccountController
{
}
}

@ -1,13 +1,12 @@
using Volo.CmsKit.Localization;
using Volo.Abp.AspNetCore.Mvc.UI.RazorPages;
namespace Volo.CmsKit.Pages
namespace Volo.CmsKit.Pages;
public abstract class CmsKitPageModel : AbpPageModel
{
public abstract class CmsKitPageModel : AbpPageModel
protected CmsKitPageModel()
{
protected CmsKitPageModel()
{
LocalizationResourceType = typeof(CmsKitResource);
}
LocalizationResourceType = typeof(CmsKitResource);
}
}
}

@ -1,18 +1,17 @@
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
namespace Volo.CmsKit.Pages
namespace Volo.CmsKit.Pages;
public class IndexModel : CmsKitPageModel
{
public class IndexModel : CmsKitPageModel
public void OnGet()
{
public void OnGet()
{
}
public async Task OnPostLoginAsync()
{
await HttpContext.ChallengeAsync("oidc");
}
}
}
public async Task OnPostLoginAsync()
{
await HttpContext.ChallengeAsync("oidc");
}
}

@ -5,47 +5,46 @@ using Microsoft.Extensions.Hosting;
using Serilog;
using Serilog.Events;
namespace Volo.CmsKit
namespace Volo.CmsKit;
public class Program
{
public class Program
public static int Main(string[] args)
{
public static int Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
Log.Logger = new LoggerConfiguration()
#if DEBUG
.MinimumLevel.Debug()
#else
.MinimumLevel.Information()
#endif
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.File("Logs/logs.txt")
.CreateLogger();
.Enrich.FromLogContext()
.WriteTo.File("Logs/logs.txt")
.CreateLogger();
try
{
Log.Information("Starting web host.");
CreateHostBuilder(args).Build().Run();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly!");
return 1;
}
finally
{
Log.CloseAndFlush();
}
try
{
Log.Information("Starting web host.");
CreateHostBuilder(args).Build().Run();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly!");
return 1;
}
finally
{
Log.CloseAndFlush();
}
internal static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseAutofac()
.UseSerilog();
}
internal static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseAutofac()
.UseSerilog();
}

@ -2,18 +2,17 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
namespace Volo.CmsKit
namespace Volo.CmsKit;
public class Startup
{
public class Startup
public void ConfigureServices(IServiceCollection services)
{
public void ConfigureServices(IServiceCollection services)
{
services.AddApplication<CmsKitWebHostModule>();
}
services.AddApplication<CmsKitWebHostModule>();
}
public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
app.InitializeApplication();
}
public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
app.InitializeApplication();
}
}

@ -47,193 +47,192 @@ using Volo.CmsKit.MediaDescriptors;
using Volo.CmsKit.Reactions;
using Volo.CmsKit.Ratings;
namespace Volo.CmsKit
namespace Volo.CmsKit;
[DependsOn(
typeof(CmsKitWebModule),
typeof(CmsKitApplicationModule),
typeof(CmsKitHttpApiModule),
typeof(CmsKitEntityFrameworkCoreModule),
typeof(AbpAuditLoggingEntityFrameworkCoreModule),
typeof(AbpAutofacModule),
typeof(AbpAccountWebModule),
typeof(AbpAccountApplicationModule),
typeof(AbpAccountHttpApiModule),
typeof(AbpEntityFrameworkCoreSqlServerModule),
typeof(AbpSettingManagementEntityFrameworkCoreModule),
typeof(AbpPermissionManagementEntityFrameworkCoreModule),
typeof(AbpPermissionManagementApplicationModule),
typeof(AbpPermissionManagementHttpApiModule),
typeof(AbpIdentityWebModule),
typeof(AbpIdentityApplicationModule),
typeof(AbpIdentityHttpApiModule),
typeof(AbpIdentityEntityFrameworkCoreModule),
typeof(AbpPermissionManagementDomainIdentityModule),
typeof(AbpFeatureManagementApplicationModule),
typeof(AbpFeatureManagementHttpApiModule),
typeof(AbpFeatureManagementEntityFrameworkCoreModule),
typeof(AbpFeatureManagementWebModule),
typeof(AbpTenantManagementWebModule),
typeof(AbpTenantManagementApplicationModule),
typeof(AbpTenantManagementHttpApiModule),
typeof(AbpTenantManagementEntityFrameworkCoreModule),
typeof(AbpAspNetCoreMvcUiBasicThemeModule),
typeof(AbpAspNetCoreSerilogModule),
typeof(BlobStoringDatabaseEntityFrameworkCoreModule),
typeof(AbpSwashbuckleModule)
)]
public class CmsKitWebUnifiedModule : AbpModule
{
[DependsOn(
typeof(CmsKitWebModule),
typeof(CmsKitApplicationModule),
typeof(CmsKitHttpApiModule),
typeof(CmsKitEntityFrameworkCoreModule),
typeof(AbpAuditLoggingEntityFrameworkCoreModule),
typeof(AbpAutofacModule),
typeof(AbpAccountWebModule),
typeof(AbpAccountApplicationModule),
typeof(AbpAccountHttpApiModule),
typeof(AbpEntityFrameworkCoreSqlServerModule),
typeof(AbpSettingManagementEntityFrameworkCoreModule),
typeof(AbpPermissionManagementEntityFrameworkCoreModule),
typeof(AbpPermissionManagementApplicationModule),
typeof(AbpPermissionManagementHttpApiModule),
typeof(AbpIdentityWebModule),
typeof(AbpIdentityApplicationModule),
typeof(AbpIdentityHttpApiModule),
typeof(AbpIdentityEntityFrameworkCoreModule),
typeof(AbpPermissionManagementDomainIdentityModule),
typeof(AbpFeatureManagementApplicationModule),
typeof(AbpFeatureManagementHttpApiModule),
typeof(AbpFeatureManagementEntityFrameworkCoreModule),
typeof(AbpFeatureManagementWebModule),
typeof(AbpTenantManagementWebModule),
typeof(AbpTenantManagementApplicationModule),
typeof(AbpTenantManagementHttpApiModule),
typeof(AbpTenantManagementEntityFrameworkCoreModule),
typeof(AbpAspNetCoreMvcUiBasicThemeModule),
typeof(AbpAspNetCoreSerilogModule),
typeof(BlobStoringDatabaseEntityFrameworkCoreModule),
typeof(AbpSwashbuckleModule)
)]
public class CmsKitWebUnifiedModule : AbpModule
public override void PreConfigureServices(ServiceConfigurationContext context)
{
public override void PreConfigureServices(ServiceConfigurationContext context)
{
FeatureConfigurer.Configure();
}
FeatureConfigurer.Configure();
}
public override void ConfigureServices(ServiceConfigurationContext context)
{
var hostingEnvironment = context.Services.GetHostingEnvironment();
var configuration = context.Services.GetConfiguration();
public override void ConfigureServices(ServiceConfigurationContext context)
{
var hostingEnvironment = context.Services.GetHostingEnvironment();
var configuration = context.Services.GetConfiguration();
ConfigureCmsKit(context);
ConfigureCmsKit(context);
Configure<AbpDbContextOptions>(options =>
{
options.UseSqlServer();
});
Configure<AbpDbContextOptions>(options =>
{
options.UseSqlServer();
});
if (hostingEnvironment.IsDevelopment())
if (hostingEnvironment.IsDevelopment())
{
Configure<AbpVirtualFileSystemOptions>(options =>
{
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.ReplaceEmbeddedByPhysical<AbpAspNetCoreMvcUiThemeSharedModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}framework/src{0}Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<CmsKitDomainSharedModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Volo.CmsKit.Domain.Shared", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<CmsKitDomainModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Volo.CmsKit.Domain", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<AbpAspNetCoreMvcUiThemeSharedModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}framework/src{0}Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<CmsKitCommonWebModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Volo.CmsKit.Common.Web", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<CmsKitPublicWebModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Volo.CmsKit.Public.Web", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<CmsKitAdminWebModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Volo.CmsKit.Admin.Web", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<CmsKitDomainSharedModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Volo.CmsKit.Domain.Shared", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<CmsKitDomainModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Volo.CmsKit.Domain", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<CmsKitApplicationContractsModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Volo.CmsKit.Application.Contracts", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<CmsKitApplicationModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Volo.CmsKit.Application", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<CmsKitWebModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Volo.CmsKit.Web", Path.DirectorySeparatorChar)));
});
}
options.FileSets.ReplaceEmbeddedByPhysical<CmsKitCommonWebModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Volo.CmsKit.Common.Web", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<CmsKitPublicWebModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Volo.CmsKit.Public.Web", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<CmsKitAdminWebModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Volo.CmsKit.Admin.Web", Path.DirectorySeparatorChar)));
context.Services.AddSwaggerGen(
options =>
{
options.SwaggerDoc("v1", new OpenApiInfo { Title = "CmsKit API", Version = "v1" });
options.DocInclusionPredicate((docName, description) => true);
options.CustomSchemaIds(type => type.FullName);
});
Configure<AbpLocalizationOptions>(options =>
{
options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
options.Languages.Add(new LanguageInfo("en", "en", "English"));
options.Languages.Add(new LanguageInfo("hu", "hu", "Magyar"));
options.Languages.Add(new LanguageInfo("fi", "fi", "Finnish"));
options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
options.Languages.Add(new LanguageInfo("hi", "hi", "Hindi", "in"));
options.Languages.Add(new LanguageInfo("is", "is", "Icelandic", "is"));
options.Languages.Add(new LanguageInfo("it", "it", "Italiano", "it"));
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português (Brasil)"));
options.Languages.Add(new LanguageInfo("ro-RO", "ro-RO", "Română"));
options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
options.Languages.Add(new LanguageInfo("sk", "sk", "Slovak"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));
options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中文"));
options.FileSets.ReplaceEmbeddedByPhysical<CmsKitApplicationContractsModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Volo.CmsKit.Application.Contracts", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<CmsKitApplicationModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Volo.CmsKit.Application", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<CmsKitWebModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Volo.CmsKit.Web", Path.DirectorySeparatorChar)));
});
}
Configure<AbpMultiTenancyOptions>(options =>
context.Services.AddSwaggerGen(
options =>
{
options.IsEnabled = MultiTenancyConsts.IsEnabled;
options.SwaggerDoc("v1", new OpenApiInfo { Title = "CmsKit API", Version = "v1" });
options.DocInclusionPredicate((docName, description) => true);
options.CustomSchemaIds(type => type.FullName);
});
}
private void ConfigureCmsKit(ServiceConfigurationContext context)
Configure<AbpLocalizationOptions>(options =>
{
Configure<CmsKitTagOptions>(options =>
{
options.EntityTypes.Add(new TagEntityTypeDefiniton("quote"));
});
options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
options.Languages.Add(new LanguageInfo("en", "en", "English"));
options.Languages.Add(new LanguageInfo("hu", "hu", "Magyar"));
options.Languages.Add(new LanguageInfo("fi", "fi", "Finnish"));
options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
options.Languages.Add(new LanguageInfo("hi", "hi", "Hindi", "in"));
options.Languages.Add(new LanguageInfo("is", "is", "Icelandic", "is"));
options.Languages.Add(new LanguageInfo("it", "it", "Italiano", "it"));
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português (Brasil)"));
options.Languages.Add(new LanguageInfo("ro-RO", "ro-RO", "Română"));
options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
options.Languages.Add(new LanguageInfo("sk", "sk", "Slovak"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));
options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中文"));
});
Configure<AbpMultiTenancyOptions>(options =>
{
options.IsEnabled = MultiTenancyConsts.IsEnabled;
});
}
Configure<CmsKitCommentOptions>(options =>
{
options.EntityTypes.Add(new CommentEntityTypeDefinition("quote"));
});
private void ConfigureCmsKit(ServiceConfigurationContext context)
{
Configure<CmsKitTagOptions>(options =>
{
options.EntityTypes.Add(new TagEntityTypeDefiniton("quote"));
});
Configure<CmsKitMediaOptions>(options =>
{
options.EntityTypes.Add(new MediaDescriptorDefinition("quote"));
});
Configure<CmsKitCommentOptions>(options =>
{
options.EntityTypes.Add(new CommentEntityTypeDefinition("quote"));
});
Configure<CmsKitReactionOptions>(options =>
{
options.EntityTypes.Add(
new ReactionEntityTypeDefinition("quote",
reactions: new[]
{
Configure<CmsKitMediaOptions>(options =>
{
options.EntityTypes.Add(new MediaDescriptorDefinition("quote"));
});
Configure<CmsKitReactionOptions>(options =>
{
options.EntityTypes.Add(
new ReactionEntityTypeDefinition("quote",
reactions: new[]
{
new ReactionDefinition(StandardReactions.ThumbsUp),
new ReactionDefinition(StandardReactions.ThumbsDown),
}));
});
Configure<CmsKitRatingOptions>(options =>
{
options.EntityTypes.Add(new RatingEntityTypeDefinition("quote"));
});
}
}));
});
public override void OnApplicationInitialization(ApplicationInitializationContext context)
Configure<CmsKitRatingOptions>(options =>
{
var app = context.GetApplicationBuilder();
var env = context.GetEnvironment();
options.EntityTypes.Add(new RatingEntityTypeDefinition("quote"));
});
}
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseErrorPage();
app.UseHsts();
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
var app = context.GetApplicationBuilder();
var env = context.GetEnvironment();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseErrorPage();
app.UseHsts();
}
if (MultiTenancyConsts.IsEnabled)
{
app.UseMultiTenancy();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAbpRequestLocalization();
app.UseAuthorization();
if (MultiTenancyConsts.IsEnabled)
{
app.UseMultiTenancy();
}
app.UseSwagger();
app.UseAbpSwaggerUI(options =>
{
options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support APP API");
});
app.UseAbpRequestLocalization();
app.UseAuthorization();
app.UseSwagger();
app.UseAbpSwaggerUI(options =>
{
options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support APP API");
});
app.UseAuditing();
app.UseAbpSerilogEnrichers();
app.UseConfiguredEndpoints();
app.UseAuditing();
app.UseAbpSerilogEnrichers();
app.UseConfiguredEndpoints();
using (var scope = context.ServiceProvider.CreateScope())
using (var scope = context.ServiceProvider.CreateScope())
{
AsyncHelper.RunSync(async () =>
{
AsyncHelper.RunSync(async () =>
{
await scope.ServiceProvider
.GetRequiredService<IDataSeeder>()
.SeedAsync();
});
}
await scope.ServiceProvider
.GetRequiredService<IDataSeeder>()
.SeedAsync();
});
}
}
}

@ -8,28 +8,27 @@ using Volo.Abp.PermissionManagement.EntityFrameworkCore;
using Volo.Abp.SettingManagement.EntityFrameworkCore;
using Volo.Abp.TenantManagement.EntityFrameworkCore;
namespace Volo.CmsKit.EntityFrameworkCore
namespace Volo.CmsKit.EntityFrameworkCore;
public class UnifiedDbContext : AbpDbContext<UnifiedDbContext>
{
public class UnifiedDbContext : AbpDbContext<UnifiedDbContext>
public UnifiedDbContext(DbContextOptions<UnifiedDbContext> options)
: base(options)
{
public UnifiedDbContext(DbContextOptions<UnifiedDbContext> options)
: base(options)
{
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ConfigurePermissionManagement();
modelBuilder.ConfigureSettingManagement();
modelBuilder.ConfigureAuditLogging();
modelBuilder.ConfigureIdentity();
modelBuilder.ConfigureTenantManagement();
modelBuilder.ConfigureFeatureManagement();
modelBuilder.ConfigureCmsKit();
modelBuilder.ConfigureBlobStoring();
}
modelBuilder.ConfigurePermissionManagement();
modelBuilder.ConfigureSettingManagement();
modelBuilder.ConfigureAuditLogging();
modelBuilder.ConfigureIdentity();
modelBuilder.ConfigureTenantManagement();
modelBuilder.ConfigureFeatureManagement();
modelBuilder.ConfigureCmsKit();
modelBuilder.ConfigureBlobStoring();
}
}

@ -3,29 +3,28 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration;
namespace Volo.CmsKit.EntityFrameworkCore
namespace Volo.CmsKit.EntityFrameworkCore;
public class UnifiedDbContextFactory : IDesignTimeDbContextFactory<UnifiedDbContext>
{
public class UnifiedDbContextFactory : IDesignTimeDbContextFactory<UnifiedDbContext>
public UnifiedDbContext CreateDbContext(string[] args)
{
public UnifiedDbContext CreateDbContext(string[] args)
{
FeatureConfigurer.Configure();
FeatureConfigurer.Configure();
var configuration = BuildConfiguration();
var configuration = BuildConfiguration();
var builder = new DbContextOptionsBuilder<UnifiedDbContext>()
.UseSqlServer(configuration.GetConnectionString("Default"));
var builder = new DbContextOptionsBuilder<UnifiedDbContext>()
.UseSqlServer(configuration.GetConnectionString("Default"));
return new UnifiedDbContext(builder.Options);
}
return new UnifiedDbContext(builder.Options);
}
private static IConfigurationRoot BuildConfiguration()
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false);
private static IConfigurationRoot BuildConfiguration()
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false);
return builder.Build();
}
return builder.Build();
}
}

@ -1,9 +1,8 @@
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace Volo.CmsKit.Pages
namespace Volo.CmsKit.Pages;
public class IndexModel : PageModel
{
public class IndexModel : PageModel
{
}
}

@ -5,44 +5,43 @@ using Microsoft.Extensions.Hosting;
using Serilog;
using Serilog.Events;
namespace Volo.CmsKit
namespace Volo.CmsKit;
public class Program
{
public class Program
public static int Main(string[] args)
{
public static int Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.Console()
.WriteTo.File("Logs/logs.txt")
.CreateLogger();
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.Console()
.WriteTo.File("Logs/logs.txt")
.CreateLogger();
try
{
Log.Information("Starting web host.");
CreateHostBuilder(args).Build().Run();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly!");
return 1;
}
finally
{
Log.CloseAndFlush();
}
try
{
Log.Information("Starting web host.");
CreateHostBuilder(args).Build().Run();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly!");
return 1;
}
finally
{
Log.CloseAndFlush();
}
internal static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseAutofac()
.UseSerilog();
}
internal static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseAutofac()
.UseSerilog();
}

@ -3,18 +3,17 @@ using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
namespace Volo.CmsKit
namespace Volo.CmsKit;
public class Startup
{
public class Startup
public void ConfigureServices(IServiceCollection services)
{
public void ConfigureServices(IServiceCollection services)
{
services.AddApplication<CmsKitWebUnifiedModule>();
}
services.AddApplication<CmsKitWebUnifiedModule>();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
{
app.InitializeApplication();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
{
app.InitializeApplication();
}
}

@ -2,14 +2,13 @@
using Volo.Abp.Application.Dtos;
using Volo.Abp.Domain.Entities;
namespace Volo.CmsKit.Admin.Blogs
namespace Volo.CmsKit.Admin.Blogs;
[Serializable]
public class BlogDto : EntityDto<Guid>, IHasConcurrencyStamp
{
[Serializable]
public class BlogDto : EntityDto<Guid>, IHasConcurrencyStamp
{
public string Name { get; set; }
public string Name { get; set; }
public string Slug { get; set; }
public string ConcurrencyStamp { get; set; }
}
public string Slug { get; set; }
public string ConcurrencyStamp { get; set; }
}

@ -1,14 +1,13 @@
using System;
using System.ComponentModel.DataAnnotations;
namespace Volo.CmsKit.Admin.Blogs
namespace Volo.CmsKit.Admin.Blogs;
[Serializable]
public class BlogFeatureInputDto
{
[Serializable]
public class BlogFeatureInputDto
{
[Required]
public string FeatureName { get; set; }
public bool IsEnabled { get; set; }
}
[Required]
public string FeatureName { get; set; }
public bool IsEnabled { get; set; }
}

@ -1,11 +1,10 @@
using System;
using Volo.Abp.Application.Dtos;
namespace Volo.CmsKit.Admin.Blogs
namespace Volo.CmsKit.Admin.Blogs;
[Serializable]
public class BlogGetListInput : PagedAndSortedResultRequestDto
{
[Serializable]
public class BlogGetListInput : PagedAndSortedResultRequestDto
{
public string Filter { get; set; }
}
public string Filter { get; set; }
}

@ -3,27 +3,26 @@ using Volo.Abp.Application.Dtos;
using Volo.Abp.Auditing;
using Volo.Abp.Domain.Entities;
namespace Volo.CmsKit.Admin.Blogs
namespace Volo.CmsKit.Admin.Blogs;
[Serializable]
public class BlogPostDto : EntityDto<Guid>, IHasCreationTime, IHasModificationTime, IHasConcurrencyStamp
{
[Serializable]
public class BlogPostDto : EntityDto<Guid>, IHasCreationTime, IHasModificationTime, IHasConcurrencyStamp
{
public Guid BlogId { get; set; }
public Guid BlogId { get; set; }
public string Title { get; set; }
public string Slug { get; set; }
public string Title { get; set; }
public string ShortDescription { get; set; }
public string Slug { get; set; }
public string ShortDescription { get; set; }
public string Content { get; set; }
public string Content { get; set; }
public Guid? CoverImageMediaId { get; set; }
public Guid? CoverImageMediaId { get; set; }
public DateTime CreationTime { get; set; }
public DateTime CreationTime { get; set; }
public DateTime? LastModificationTime { get; set; }
public DateTime? LastModificationTime { get; set; }
public string ConcurrencyStamp { get; set; }
}
public string ConcurrencyStamp { get; set; }
}

@ -1,12 +1,11 @@
using System;
using Volo.Abp.Application.Dtos;
namespace Volo.CmsKit.Admin.Blogs
namespace Volo.CmsKit.Admin.Blogs;
public class BlogPostGetListInput : PagedAndSortedResultRequestDto
{
public class BlogPostGetListInput : PagedAndSortedResultRequestDto
{
public string Filter { get; set; }
public string Filter { get; set; }
public Guid? BlogId { get; set; }
}
}
public Guid? BlogId { get; set; }
}

@ -2,27 +2,26 @@
using Volo.Abp.Application.Dtos;
using Volo.Abp.Auditing;
namespace Volo.CmsKit.Admin.Blogs
namespace Volo.CmsKit.Admin.Blogs;
[Serializable]
public class BlogPostListDto : EntityDto<Guid>, IHasCreationTime, IHasModificationTime
{
[Serializable]
public class BlogPostListDto : EntityDto<Guid>, IHasCreationTime, IHasModificationTime
{
public Guid BlogId { get; set; }
public Guid BlogId { get; set; }
public string BlogName { get; set; }
public string Title { get; set; }
public string BlogName { get; set; }
public string Slug { get; set; }
public string Title { get; set; }
public string ShortDescription { get; set; }
public string Slug { get; set; }
public string ShortDescription { get; set; }
public string Content { get; set; }
public string Content { get; set; }
public Guid? CoverImageMediaId { get; set; }
public Guid? CoverImageMediaId { get; set; }
public DateTime CreationTime { get; set; }
public DateTime CreationTime { get; set; }
public DateTime? LastModificationTime { get; set; }
}
}
public DateTime? LastModificationTime { get; set; }
}

@ -2,16 +2,15 @@
using Volo.Abp.Validation;
using Volo.CmsKit.Blogs;
namespace Volo.CmsKit.Admin.Blogs
namespace Volo.CmsKit.Admin.Blogs;
public class CreateBlogDto
{
public class CreateBlogDto
{
[Required]
[DynamicMaxLength(typeof(BlogConsts), nameof(BlogConsts.MaxNameLength))]
public string Name { get; set; }
[Required]
[DynamicMaxLength(typeof(BlogConsts), nameof(BlogConsts.MaxNameLength))]
public string Name { get; set; }
[Required]
[DynamicMaxLength(typeof(BlogConsts), nameof(BlogConsts.MaxSlugLength))]
public string Slug { get; set; }
}
}
[Required]
[DynamicMaxLength(typeof(BlogConsts), nameof(BlogConsts.MaxSlugLength))]
public string Slug { get; set; }
}

@ -3,28 +3,27 @@ using System.ComponentModel.DataAnnotations;
using Volo.Abp.Validation;
using Volo.CmsKit.Blogs;
namespace Volo.CmsKit.Admin.Blogs
namespace Volo.CmsKit.Admin.Blogs;
[Serializable]
public class CreateBlogPostDto
{
[Serializable]
public class CreateBlogPostDto
{
[Required]
public Guid BlogId { get; set; }
[Required]
public Guid BlogId { get; set; }
[Required]
[DynamicMaxLength(typeof(BlogPostConsts), nameof(BlogPostConsts.MaxTitleLength))]
public string Title { get; set; }
[Required]
[DynamicMaxLength(typeof(BlogPostConsts), nameof(BlogPostConsts.MaxTitleLength))]
public string Title { get; set; }
[Required]
[DynamicStringLength(typeof(BlogPostConsts), nameof(BlogPostConsts.MaxSlugLength), nameof(BlogPostConsts.MinSlugLength))]
public string Slug { get; set; }
[Required]
[DynamicStringLength(typeof(BlogPostConsts), nameof(BlogPostConsts.MaxSlugLength), nameof(BlogPostConsts.MinSlugLength))]
public string Slug { get; set; }
[DynamicMaxLength(typeof(BlogPostConsts), nameof(BlogPostConsts.MaxShortDescriptionLength))]
public string ShortDescription { get; set; }
[DynamicMaxLength(typeof(BlogPostConsts), nameof(BlogPostConsts.MaxShortDescriptionLength))]
public string ShortDescription { get; set; }
[DynamicMaxLength(typeof(BlogPostConsts), nameof(BlogPostConsts.MaxContentLength))]
public string Content { get; set; }
[DynamicMaxLength(typeof(BlogPostConsts), nameof(BlogPostConsts.MaxContentLength))]
public string Content { get; set; }
public Guid? CoverImageMediaId { get; set; }
}
public Guid? CoverImageMediaId { get; set; }
}

@ -1,9 +1,8 @@
using System;
using Volo.Abp.Application.Services;
namespace Volo.CmsKit.Admin.Blogs
namespace Volo.CmsKit.Admin.Blogs;
public interface IBlogAdminAppService : ICrudAppService<BlogDto, Guid, BlogGetListInput, CreateBlogDto, UpdateBlogDto>
{
public interface IBlogAdminAppService : ICrudAppService<BlogDto, Guid, BlogGetListInput, CreateBlogDto, UpdateBlogDto>
{
}
}

@ -6,12 +6,11 @@ using System.Threading.Tasks;
using Volo.Abp.Application.Services;
using Volo.CmsKit.Blogs;
namespace Volo.CmsKit.Admin.Blogs
namespace Volo.CmsKit.Admin.Blogs;
public interface IBlogFeatureAdminAppService : IApplicationService
{
public interface IBlogFeatureAdminAppService : IApplicationService
{
Task SetAsync(Guid blogId, BlogFeatureInputDto dto);
Task SetAsync(Guid blogId, BlogFeatureInputDto dto);
Task<List<BlogFeatureDto>> GetListAsync(Guid blogId);
}
Task<List<BlogFeatureDto>> GetListAsync(Guid blogId);
}

@ -1,16 +1,15 @@
using System;
using Volo.Abp.Application.Services;
namespace Volo.CmsKit.Admin.Blogs
namespace Volo.CmsKit.Admin.Blogs;
public interface IBlogPostAdminAppService
: ICrudAppService<
BlogPostDto,
BlogPostListDto,
Guid,
BlogPostGetListInput,
CreateBlogPostDto,
UpdateBlogPostDto>
{
public interface IBlogPostAdminAppService
: ICrudAppService<
BlogPostDto,
BlogPostListDto,
Guid,
BlogPostGetListInput,
CreateBlogPostDto,
UpdateBlogPostDto>
{
}
}

@ -3,18 +3,17 @@ using Volo.Abp.Domain.Entities;
using Volo.Abp.Validation;
using Volo.CmsKit.Blogs;
namespace Volo.CmsKit.Admin.Blogs
namespace Volo.CmsKit.Admin.Blogs;
public class UpdateBlogDto : IHasConcurrencyStamp
{
public class UpdateBlogDto : IHasConcurrencyStamp
{
[Required]
[DynamicMaxLength(typeof(BlogConsts), nameof(BlogConsts.MaxNameLength))]
public string Name { get; set; }
[Required]
[DynamicMaxLength(typeof(BlogConsts), nameof(BlogConsts.MaxNameLength))]
public string Name { get; set; }
[Required]
[DynamicMaxLength(typeof(BlogConsts), nameof(BlogConsts.MaxSlugLength))]
public string Slug { get; set; }
[Required]
[DynamicMaxLength(typeof(BlogConsts), nameof(BlogConsts.MaxSlugLength))]
public string Slug { get; set; }
public string ConcurrencyStamp { get; set; }
}
}
public string ConcurrencyStamp { get; set; }
}

@ -4,27 +4,26 @@ using Volo.Abp.Domain.Entities;
using Volo.Abp.Validation;
using Volo.CmsKit.Blogs;
namespace Volo.CmsKit.Admin.Blogs
namespace Volo.CmsKit.Admin.Blogs;
[Serializable]
public class UpdateBlogPostDto : IHasConcurrencyStamp
{
[Serializable]
public class UpdateBlogPostDto : IHasConcurrencyStamp
{
[Required]
[DynamicMaxLength(typeof(BlogPostConsts), nameof(BlogPostConsts.MaxTitleLength))]
public string Title { get; set; }
[Required]
[DynamicMaxLength(typeof(BlogPostConsts), nameof(BlogPostConsts.MaxTitleLength))]
public string Title { get; set; }
[Required]
[DynamicStringLength(typeof(BlogPostConsts), nameof(BlogPostConsts.MaxSlugLength), nameof(BlogPostConsts.MinSlugLength))]
public string Slug { get; set; }
[Required]
[DynamicStringLength(typeof(BlogPostConsts), nameof(BlogPostConsts.MaxSlugLength), nameof(BlogPostConsts.MinSlugLength))]
public string Slug { get; set; }
[DynamicMaxLength(typeof(BlogPostConsts), nameof(BlogPostConsts.MaxShortDescriptionLength))]
public string ShortDescription { get; set; }
[DynamicMaxLength(typeof(BlogPostConsts), nameof(BlogPostConsts.MaxShortDescriptionLength))]
public string ShortDescription { get; set; }
[DynamicMaxLength(typeof(BlogPostConsts), nameof(BlogPostConsts.MaxContentLength))]
public string Content { get; set; }
[DynamicMaxLength(typeof(BlogPostConsts), nameof(BlogPostConsts.MaxContentLength))]
public string Content { get; set; }
public Guid? CoverImageMediaId { get; set; }
public Guid? CoverImageMediaId { get; set; }
public string ConcurrencyStamp { get; set; }
}
public string ConcurrencyStamp { get; set; }
}

@ -1,12 +1,11 @@
using Volo.Abp.Modularity;
namespace Volo.CmsKit.Admin
namespace Volo.CmsKit.Admin;
[DependsOn(
typeof(CmsKitCommonApplicationContractsModule)
)]
public class CmsKitAdminApplicationContractsModule : AbpModule
{
[DependsOn(
typeof(CmsKitCommonApplicationContractsModule)
)]
public class CmsKitAdminApplicationContractsModule : AbpModule
{
}
}

@ -1,9 +1,8 @@
namespace Volo.CmsKit.Admin
namespace Volo.CmsKit.Admin;
public class CmsKitAdminRemoteServiceConsts
{
public class CmsKitAdminRemoteServiceConsts
{
public const string RemoteServiceName = "CmsKitAdmin";
public const string RemoteServiceName = "CmsKitAdmin";
public const string ModuleName = "cms-kit-admin";
}
public const string ModuleName = "cms-kit-admin";
}

@ -1,16 +1,15 @@
using System;
namespace Volo.CmsKit.Admin.Comments
namespace Volo.CmsKit.Admin.Comments;
[Serializable]
public class CmsUserDto
{
[Serializable]
public class CmsUserDto
{
public Guid Id { get; set; }
public Guid Id { get; set; }
public string UserName { get; set; }
public string UserName { get; set; }
public string Name { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
}
}
public string Surname { get; set; }
}

@ -1,22 +1,21 @@
using System;
namespace Volo.CmsKit.Admin.Comments
namespace Volo.CmsKit.Admin.Comments;
[Serializable]
public class CommentDto
{
[Serializable]
public class CommentDto
{
public Guid Id { get; set; }
public Guid Id { get; set; }
public string EntityType { get; set; }
public string EntityType { get; set; }
public string EntityId { get; set; }
public string EntityId { get; set; }
public string Text { get; set; }
public string Text { get; set; }
public Guid? RepliedCommentId { get; set; }
public Guid? RepliedCommentId { get; set; }
public Guid CreatorId { get; set; }
public Guid CreatorId { get; set; }
public DateTime CreationTime { get; set; }
}
}
public DateTime CreationTime { get; set; }
}

@ -1,21 +1,20 @@
using System;
using Volo.Abp.Application.Dtos;
namespace Volo.CmsKit.Admin.Comments
namespace Volo.CmsKit.Admin.Comments;
[Serializable]
public class CommentGetListInput : PagedAndSortedResultRequestDto
{
[Serializable]
public class CommentGetListInput : PagedAndSortedResultRequestDto
{
public string EntityType { get; set; }
public string EntityType { get; set; }
public string Text { get; set; }
public string Text { get; set; }
public Guid? RepliedCommentId { get; set; }
public Guid? RepliedCommentId { get; set; }
public string Author { get; set; }
public string Author { get; set; }
public DateTime? CreationStartDate { get; set; }
public DateTime? CreationStartDate { get; set; }
public DateTime? CreationEndDate { get; set; }
}
}
public DateTime? CreationEndDate { get; set; }
}

@ -2,25 +2,24 @@
using System.Collections.Generic;
using Volo.CmsKit.Users;
namespace Volo.CmsKit.Admin.Comments
namespace Volo.CmsKit.Admin.Comments;
[Serializable]
public class CommentWithAuthorDto
{
[Serializable]
public class CommentWithAuthorDto
{
public Guid Id { get; set; }
public Guid Id { get; set; }
public string EntityType { get; set; }
public string EntityType { get; set; }
public string EntityId { get; set; }
public string EntityId { get; set; }
public string Text { get; set; }
public string Text { get; set; }
public Guid? RepliedCommentId { get; set; }
public Guid? RepliedCommentId { get; set; }
public Guid CreatorId { get; set; }
public Guid CreatorId { get; set; }
public DateTime CreationTime { get; set; }
public DateTime CreationTime { get; set; }
public CmsUserDto Author { get; set; }
}
}
public CmsUserDto Author { get; set; }
}

@ -3,14 +3,13 @@ using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace Volo.CmsKit.Admin.Comments
namespace Volo.CmsKit.Admin.Comments;
public interface ICommentAdminAppService : IApplicationService
{
public interface ICommentAdminAppService : IApplicationService
{
Task<PagedResultDto<CommentWithAuthorDto>> GetListAsync(CommentGetListInput input);
Task<PagedResultDto<CommentWithAuthorDto>> GetListAsync(CommentGetListInput input);
Task<CommentWithAuthorDto> GetAsync(Guid id);
Task<CommentWithAuthorDto> GetAsync(Guid id);
Task DeleteAsync(Guid id);
}
}
Task DeleteAsync(Guid id);
}

@ -3,14 +3,13 @@ using Volo.Abp.Content;
using Volo.Abp.Validation;
using Volo.CmsKit.MediaDescriptors;
namespace Volo.CmsKit.Admin.MediaDescriptors
namespace Volo.CmsKit.Admin.MediaDescriptors;
public class CreateMediaInputWithStream
{
public class CreateMediaInputWithStream
{
[Required]
[DynamicStringLength(typeof(MediaDescriptorConsts), nameof(MediaDescriptorConsts.MaxNameLength))]
public string Name { get; set; }
[Required]
[DynamicStringLength(typeof(MediaDescriptorConsts), nameof(MediaDescriptorConsts.MaxNameLength))]
public string Name { get; set; }
public IRemoteStreamContent File { get; set; }
}
}
public IRemoteStreamContent File { get; set; }
}

@ -2,12 +2,11 @@
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
namespace Volo.CmsKit.Admin.MediaDescriptors
namespace Volo.CmsKit.Admin.MediaDescriptors;
public interface IMediaDescriptorAdminAppService : IApplicationService
{
public interface IMediaDescriptorAdminAppService : IApplicationService
{
Task<MediaDescriptorDto> CreateAsync(string entityType, CreateMediaInputWithStream inputStream);
Task DeleteAsync(Guid id);
}
}
Task<MediaDescriptorDto> CreateAsync(string entityType, CreateMediaInputWithStream inputStream);
Task DeleteAsync(Guid id);
}

@ -1,15 +1,14 @@
using System;
using Volo.Abp.Application.Dtos;
namespace Volo.CmsKit.Admin.MediaDescriptors
namespace Volo.CmsKit.Admin.MediaDescriptors;
[Serializable]
public class MediaDescriptorDto : EntityDto<Guid>
{
[Serializable]
public class MediaDescriptorDto : EntityDto<Guid>
{
public string Name { get; set; }
public string MimeType { get; set; }
public int Size { get; set; }
}
}
public string Name { get; set; }
public string MimeType { get; set; }
public int Size { get; set; }
}

@ -4,22 +4,21 @@ using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.CmsKit.Menus;
namespace Volo.CmsKit.Admin.Menus
namespace Volo.CmsKit.Admin.Menus;
public interface IMenuItemAdminAppService : IApplicationService
{
public interface IMenuItemAdminAppService : IApplicationService
{
Task<ListResultDto<MenuItemDto>> GetListAsync();
Task<ListResultDto<MenuItemDto>> GetListAsync();
Task<MenuItemDto> GetAsync(Guid id);
Task<MenuItemDto> CreateAsync(MenuItemCreateInput input);
Task<MenuItemDto> GetAsync(Guid id);
Task<MenuItemDto> CreateAsync(MenuItemCreateInput input);
Task<MenuItemDto> UpdateAsync(Guid id, MenuItemUpdateInput input);
Task<MenuItemDto> UpdateAsync(Guid id, MenuItemUpdateInput input);
Task DeleteAsync(Guid id);
Task DeleteAsync(Guid id);
Task MoveMenuItemAsync(Guid id, MenuItemMoveInput input);
Task MoveMenuItemAsync(Guid id, MenuItemMoveInput input);
Task<PagedResultDto<PageLookupDto>> GetPageLookupAsync(PageLookupInputDto input);
}
Task<PagedResultDto<PageLookupDto>> GetPageLookupAsync(PageLookupInputDto input);
}

@ -4,11 +4,10 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Volo.CmsKit.Admin.Menus
namespace Volo.CmsKit.Admin.Menus;
[Serializable]
public class MenuCreateInput
{
[Serializable]
public class MenuCreateInput
{
public string Name { get; set; }
}
public string Name { get; set; }
}

@ -1,30 +1,29 @@
using System;
using System.ComponentModel.DataAnnotations;
namespace Volo.CmsKit.Admin.Menus
namespace Volo.CmsKit.Admin.Menus;
[Serializable]
public class MenuItemCreateInput
{
[Serializable]
public class MenuItemCreateInput
{
public Guid? ParentId { get; set; }
public Guid? ParentId { get; set; }
[Required]
public string DisplayName { get; set; }
[Required]
public string DisplayName { get; set; }
public bool IsActive { get; set; }
public bool IsActive { get; set; }
public string Url { get; set; }
public string Url { get; set; }
public string Icon { get; set; }
public string Icon { get; set; }
public int Order { get; set; }
public int Order { get; set; }
public string Target { get; set; }
public string Target { get; set; }
public string ElementId { get; set; }
public string ElementId { get; set; }
public string CssClass { get; set; }
public string CssClass { get; set; }
public Guid? PageId { get; set; }
}
public Guid? PageId { get; set; }
}

@ -4,13 +4,12 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Volo.CmsKit.Admin.Menus
namespace Volo.CmsKit.Admin.Menus;
[Serializable]
public class MenuItemMoveInput
{
[Serializable]
public class MenuItemMoveInput
{
public Guid? NewParentId { get; set; }
public Guid? NewParentId { get; set; }
public int Position { get; set; }
}
public int Position { get; set; }
}

@ -2,28 +2,27 @@
using System.ComponentModel.DataAnnotations;
using Volo.Abp.Domain.Entities;
namespace Volo.CmsKit.Admin.Menus
namespace Volo.CmsKit.Admin.Menus;
[Serializable]
public class MenuItemUpdateInput : IHasConcurrencyStamp
{
[Serializable]
public class MenuItemUpdateInput : IHasConcurrencyStamp
{
[Required]
public string DisplayName { get; set; }
[Required]
public string DisplayName { get; set; }
public bool IsActive { get; set; }
public bool IsActive { get; set; }
public string Url { get; set; }
public string Url { get; set; }
public string Icon { get; set; }
public string Icon { get; set; }
public string Target { get; set; }
public string Target { get; set; }
public string ElementId { get; set; }
public string ElementId { get; set; }
public string CssClass { get; set; }
public string CssClass { get; set; }
public Guid? PageId { get; set; }
public Guid? PageId { get; set; }
public string ConcurrencyStamp { get; set; }
}
}
public string ConcurrencyStamp { get; set; }
}

@ -4,11 +4,10 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Volo.CmsKit.Admin.Menus
namespace Volo.CmsKit.Admin.Menus;
[Serializable]
public class MenuUpdateInput
{
[Serializable]
public class MenuUpdateInput
{
public string Name { get; set; }
}
public string Name { get; set; }
}

@ -1,12 +1,11 @@
using System;
using Volo.Abp.Application.Dtos;
namespace Volo.CmsKit.Admin.Menus
namespace Volo.CmsKit.Admin.Menus;
public class PageLookupDto : EntityDto<Guid>
{
public class PageLookupDto : EntityDto<Guid>
{
public string Title { get; set; }
public string Title { get; set; }
public string Slug { get; set; }
}
}
public string Slug { get; set; }
}

@ -1,11 +1,10 @@
using System;
using Volo.Abp.Application.Dtos;
namespace Volo.CmsKit.Admin.Menus
namespace Volo.CmsKit.Admin.Menus;
[Serializable]
public class PageLookupInputDto : PagedAndSortedResultRequestDto
{
[Serializable]
public class PageLookupInputDto: PagedAndSortedResultRequestDto
{
public string Filter { get; set; }
}
}
public string Filter { get; set; }
}

@ -1,10 +1,9 @@
using System;
namespace Volo.CmsKit.Admin.Menus
namespace Volo.CmsKit.Admin.Menus;
[Serializable]
public class UpdateMainMenuInput
{
[Serializable]
public class UpdateMainMenuInput
{
public bool IsMainMenu { get; set; }
}
}
public bool IsMainMenu { get; set; }
}

@ -3,26 +3,25 @@ using System.ComponentModel.DataAnnotations;
using Volo.Abp.Validation;
using Volo.CmsKit.Pages;
namespace Volo.CmsKit.Admin.Pages
namespace Volo.CmsKit.Admin.Pages;
[Serializable]
public class CreatePageInputDto
{
[Serializable]
public class CreatePageInputDto
{
[Required]
[DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxTitleLength))]
public string Title { get; set; }
[Required]
[DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxTitleLength))]
public string Title { get; set; }
[Required]
[DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxSlugLength))]
public string Slug { get; set; }
[Required]
[DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxSlugLength))]
public string Slug { get; set; }
[DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxContentLength))]
public string Content { get; set; }
[DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxContentLength))]
public string Content { get; set; }
[DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxScriptLength))]
public string Script { get; set; }
[DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxScriptLength))]
public string Script { get; set; }
[DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxStyleLength))]
public string Style { get; set; }
}
}
[DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxStyleLength))]
public string Style { get; set; }
}

@ -1,11 +1,10 @@
using System;
using Volo.Abp.Application.Dtos;
namespace Volo.CmsKit.Admin.Pages
namespace Volo.CmsKit.Admin.Pages;
[Serializable]
public class GetPagesInputDto : PagedAndSortedResultRequestDto
{
[Serializable]
public class GetPagesInputDto : PagedAndSortedResultRequestDto
{
public string Filter { get; set; }
}
}
public string Filter { get; set; }
}

@ -4,9 +4,8 @@ using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.Content;
namespace Volo.CmsKit.Admin.Pages
namespace Volo.CmsKit.Admin.Pages;
public interface IPageAdminAppService : ICrudAppService<PageDto, PageDto, Guid, GetPagesInputDto, CreatePageInputDto, UpdatePageInputDto>
{
public interface IPageAdminAppService : ICrudAppService<PageDto, PageDto, Guid, GetPagesInputDto, CreatePageInputDto, UpdatePageInputDto>
{
}
}
}

@ -2,21 +2,20 @@
using Volo.Abp.Application.Dtos;
using Volo.Abp.Domain.Entities;
namespace Volo.CmsKit.Admin.Pages
namespace Volo.CmsKit.Admin.Pages;
[Serializable]
public class PageDto : AuditedEntityDto<Guid>, IHasConcurrencyStamp
{
[Serializable]
public class PageDto : AuditedEntityDto<Guid>, IHasConcurrencyStamp
{
public string Title { get; set; }
public string Title { get; set; }
public string Slug { get; set; }
public string Slug { get; set; }
public string Content { get; set; }
public string Content { get; set; }
public string Script { get; set; }
public string Script { get; set; }
public string Style { get; set; }
public string Style { get; set; }
public string ConcurrencyStamp { get; set; }
}
}
public string ConcurrencyStamp { get; set; }
}

@ -4,28 +4,27 @@ using Volo.Abp.Domain.Entities;
using Volo.Abp.Validation;
using Volo.CmsKit.Pages;
namespace Volo.CmsKit.Admin.Pages
namespace Volo.CmsKit.Admin.Pages;
[Serializable]
public class UpdatePageInputDto : IHasConcurrencyStamp
{
[Serializable]
public class UpdatePageInputDto : IHasConcurrencyStamp
{
[Required]
[DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxTitleLength))]
public string Title { get; set; }
[Required]
[DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxTitleLength))]
public string Title { get; set; }
[Required]
[DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxSlugLength))]
public string Slug { get; set; }
[Required]
[DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxSlugLength))]
public string Slug { get; set; }
[DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxContentLength))]
public string Content { get; set; }
[DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxContentLength))]
public string Content { get; set; }
[DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxScriptLength))]
public string Script { get; set; }
[DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxScriptLength))]
public string Script { get; set; }
[DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxStyleLength))]
public string Style { get; set; }
[DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxStyleLength))]
public string Style { get; set; }
public string ConcurrencyStamp { get; set; }
}
}
public string ConcurrencyStamp { get; set; }
}

@ -1,18 +1,17 @@
using System;
using System.ComponentModel.DataAnnotations;
namespace Volo.CmsKit.Admin.Tags
namespace Volo.CmsKit.Admin.Tags;
[Serializable]
public class EntityTagCreateDto
{
[Serializable]
public class EntityTagCreateDto
{
[Required]
public string TagName { get; set; }
[Required]
public string TagName { get; set; }
[Required]
public string EntityType { get; set; }
[Required]
public string EntityType { get; set; }
[Required]
public string EntityId { get; set; }
}
[Required]
public string EntityId { get; set; }
}

@ -1,18 +1,17 @@
using System;
using System.ComponentModel.DataAnnotations;
namespace Volo.CmsKit.Admin.Tags
namespace Volo.CmsKit.Admin.Tags;
[Serializable]
public class EntityTagRemoveDto
{
[Serializable]
public class EntityTagRemoveDto
{
[Required]
public Guid TagId { get; set; }
[Required]
public Guid TagId { get; set; }
[Required]
public string EntityType { get; set; }
[Required]
public string EntityType { get; set; }
[Required]
public string EntityId { get; set; }
}
[Required]
public string EntityId { get; set; }
}

@ -4,13 +4,12 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Volo.CmsKit.Admin.Tags
namespace Volo.CmsKit.Admin.Tags;
[Serializable]
public class EntityTagSetDto
{
[Serializable]
public class EntityTagSetDto
{
public string EntityId { get; set; }
public string EntityType { get; set; }
public List<string> Tags { get; set; }
}
public string EntityId { get; set; }
public string EntityType { get; set; }
public List<string> Tags { get; set; }
}

@ -1,14 +1,13 @@
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
namespace Volo.CmsKit.Admin.Tags
namespace Volo.CmsKit.Admin.Tags;
public interface IEntityTagAdminAppService : IApplicationService
{
public interface IEntityTagAdminAppService : IApplicationService
{
Task AddTagToEntityAsync(EntityTagCreateDto input);
Task AddTagToEntityAsync(EntityTagCreateDto input);
Task RemoveTagFromEntityAsync(EntityTagRemoveDto input);
Task RemoveTagFromEntityAsync(EntityTagRemoveDto input);
Task SetEntityTagsAsync(EntityTagSetDto input);
}
Task SetEntityTagsAsync(EntityTagSetDto input);
}

@ -4,10 +4,9 @@ using System.Threading.Tasks;
using Volo.Abp.Application.Services;
using Volo.CmsKit.Tags;
namespace Volo.CmsKit.Admin.Tags
namespace Volo.CmsKit.Admin.Tags;
public interface ITagAdminAppService : ICrudAppService<TagDto, Guid, TagGetListInput, TagCreateDto, TagUpdateDto>
{
public interface ITagAdminAppService : ICrudAppService<TagDto, Guid, TagGetListInput, TagCreateDto, TagUpdateDto>
{
Task<List<TagDefinitionDto>> GetTagDefinitionsAsync();
}
Task<List<TagDefinitionDto>> GetTagDefinitionsAsync();
}

@ -3,17 +3,16 @@ using System.ComponentModel.DataAnnotations;
using Volo.Abp.Validation;
using Volo.CmsKit.Tags;
namespace Volo.CmsKit.Admin.Tags
namespace Volo.CmsKit.Admin.Tags;
[Serializable]
public class TagCreateDto
{
[Serializable]
public class TagCreateDto
{
[Required]
[DynamicMaxLength(typeof(TagConsts), nameof(TagConsts.MaxEntityTypeLength))]
public string EntityType { get; set; }
[Required]
[DynamicMaxLength(typeof(TagConsts), nameof(TagConsts.MaxEntityTypeLength))]
public string EntityType { get; set; }
[Required]
[DynamicMaxLength(typeof(TagConsts), nameof(TagConsts.MaxNameLength))]
public string Name { get; set; }
}
[Required]
[DynamicMaxLength(typeof(TagConsts), nameof(TagConsts.MaxNameLength))]
public string Name { get; set; }
}

@ -1,12 +1,11 @@
using System;
namespace Volo.CmsKit.Admin.Tags
namespace Volo.CmsKit.Admin.Tags;
[Serializable]
public class TagDefinitionDto
{
[Serializable]
public class TagDefinitionDto
{
public string EntityType { get; set; }
public string EntityType { get; set; }
public string DisplayName { get; set; }
}
public string DisplayName { get; set; }
}

@ -1,11 +1,10 @@
using System;
using Volo.Abp.Application.Dtos;
namespace Volo.CmsKit.Admin.Tags
namespace Volo.CmsKit.Admin.Tags;
[Serializable]
public class TagGetListInput : PagedAndSortedResultRequestDto
{
[Serializable]
public class TagGetListInput : PagedAndSortedResultRequestDto
{
public string Filter { get; set; }
}
public string Filter { get; set; }
}

@ -4,15 +4,14 @@ using Volo.Abp.Domain.Entities;
using Volo.Abp.Validation;
using Volo.CmsKit.Tags;
namespace Volo.CmsKit.Admin.Tags
namespace Volo.CmsKit.Admin.Tags;
[Serializable]
public class TagUpdateDto : IHasConcurrencyStamp
{
[Serializable]
public class TagUpdateDto : IHasConcurrencyStamp
{
[Required]
[DynamicMaxLength(typeof(TagConsts), nameof(TagConsts.MaxNameLength))]
public string Name { get; set; }
[Required]
[DynamicMaxLength(typeof(TagConsts), nameof(TagConsts.MaxNameLength))]
public string Name { get; set; }
public string ConcurrencyStamp { get; set; }
}
public string ConcurrencyStamp { get; set; }
}

@ -5,71 +5,70 @@ using Volo.Abp.Localization;
using Volo.CmsKit.GlobalFeatures;
using Volo.CmsKit.Localization;
namespace Volo.CmsKit.Permissions
namespace Volo.CmsKit.Permissions;
public class CmsKitAdminPermissionDefinitionProvider : PermissionDefinitionProvider
{
public class CmsKitAdminPermissionDefinitionProvider : PermissionDefinitionProvider
public override void Define(IPermissionDefinitionContext context)
{
public override void Define(IPermissionDefinitionContext context)
{
var cmsGroup = context.GetGroupOrNull(CmsKitAdminPermissions.GroupName) ?? context.AddGroup(CmsKitAdminPermissions.GroupName, L("Permission:CmsKit"));
var cmsGroup = context.GetGroupOrNull(CmsKitAdminPermissions.GroupName) ?? context.AddGroup(CmsKitAdminPermissions.GroupName, L("Permission:CmsKit"));
var contentGroup = cmsGroup.AddPermission(CmsKitAdminPermissions.Comments.Default, L("Permission:Comments"))
.RequireGlobalFeatures(typeof(CommentsFeature));
contentGroup.AddChild(CmsKitAdminPermissions.Comments.Delete, L("Permission:Comments.Delete"))
.RequireGlobalFeatures(typeof(CommentsFeature));
var contentGroup = cmsGroup.AddPermission(CmsKitAdminPermissions.Comments.Default, L("Permission:Comments"))
.RequireGlobalFeatures(typeof(CommentsFeature));
contentGroup.AddChild(CmsKitAdminPermissions.Comments.Delete, L("Permission:Comments.Delete"))
.RequireGlobalFeatures(typeof(CommentsFeature));
var tagGroup = cmsGroup.AddPermission(CmsKitAdminPermissions.Tags.Default, L("Permission:TagManagement"))
.RequireGlobalFeatures(typeof(TagsFeature));
tagGroup.AddChild(CmsKitAdminPermissions.Tags.Create, L("Permission:TagManagement.Create"))
.RequireGlobalFeatures(typeof(TagsFeature));
tagGroup.AddChild(CmsKitAdminPermissions.Tags.Update, L("Permission:TagManagement.Update"))
.RequireGlobalFeatures(typeof(TagsFeature));
tagGroup.AddChild(CmsKitAdminPermissions.Tags.Delete, L("Permission:TagManagement.Delete"))
.RequireGlobalFeatures(typeof(TagsFeature));
var tagGroup = cmsGroup.AddPermission(CmsKitAdminPermissions.Tags.Default, L("Permission:TagManagement"))
.RequireGlobalFeatures(typeof(TagsFeature));
tagGroup.AddChild(CmsKitAdminPermissions.Tags.Create, L("Permission:TagManagement.Create"))
.RequireGlobalFeatures(typeof(TagsFeature));
tagGroup.AddChild(CmsKitAdminPermissions.Tags.Update, L("Permission:TagManagement.Update"))
.RequireGlobalFeatures(typeof(TagsFeature));
tagGroup.AddChild(CmsKitAdminPermissions.Tags.Delete, L("Permission:TagManagement.Delete"))
.RequireGlobalFeatures(typeof(TagsFeature));
var pageManagement = cmsGroup.AddPermission(CmsKitAdminPermissions.Pages.Default, L("Permission:PageManagement"))
.RequireGlobalFeatures(typeof(PagesFeature));
pageManagement.AddChild(CmsKitAdminPermissions.Pages.Create, L("Permission:PageManagement:Create"))
.RequireGlobalFeatures(typeof(PagesFeature));
pageManagement.AddChild(CmsKitAdminPermissions.Pages.Update, L("Permission:PageManagement:Update"))
.RequireGlobalFeatures(typeof(PagesFeature));
pageManagement.AddChild(CmsKitAdminPermissions.Pages.Delete, L("Permission:PageManagement:Delete"))
.RequireGlobalFeatures(typeof(PagesFeature));
var pageManagement = cmsGroup.AddPermission(CmsKitAdminPermissions.Pages.Default, L("Permission:PageManagement"))
.RequireGlobalFeatures(typeof(PagesFeature));
pageManagement.AddChild(CmsKitAdminPermissions.Pages.Create, L("Permission:PageManagement:Create"))
.RequireGlobalFeatures(typeof(PagesFeature));
pageManagement.AddChild(CmsKitAdminPermissions.Pages.Update, L("Permission:PageManagement:Update"))
.RequireGlobalFeatures(typeof(PagesFeature));
pageManagement.AddChild(CmsKitAdminPermissions.Pages.Delete, L("Permission:PageManagement:Delete"))
.RequireGlobalFeatures(typeof(PagesFeature));
var blogManagement = cmsGroup.AddPermission(CmsKitAdminPermissions.Blogs.Default, L("Permission:BlogManagement"))
.RequireGlobalFeatures(typeof(BlogsFeature));
blogManagement.AddChild(CmsKitAdminPermissions.Blogs.Create, L("Permission:BlogManagement.Create"))
.RequireGlobalFeatures(typeof(BlogsFeature));
blogManagement.AddChild(CmsKitAdminPermissions.Blogs.Update, L("Permission:BlogManagement.Update"))
.RequireGlobalFeatures(typeof(BlogsFeature));
blogManagement.AddChild(CmsKitAdminPermissions.Blogs.Delete, L("Permission:BlogManagement.Delete"))
.RequireGlobalFeatures(typeof(BlogsFeature));
blogManagement.AddChild(CmsKitAdminPermissions.Blogs.Features, L("Permission:BlogManagement.Features"))
.RequireGlobalFeatures(typeof(BlogsFeature));
var blogManagement = cmsGroup.AddPermission(CmsKitAdminPermissions.Blogs.Default, L("Permission:BlogManagement"))
.RequireGlobalFeatures(typeof(BlogsFeature));
blogManagement.AddChild(CmsKitAdminPermissions.Blogs.Create, L("Permission:BlogManagement.Create"))
.RequireGlobalFeatures(typeof(BlogsFeature));
blogManagement.AddChild(CmsKitAdminPermissions.Blogs.Update, L("Permission:BlogManagement.Update"))
.RequireGlobalFeatures(typeof(BlogsFeature));
blogManagement.AddChild(CmsKitAdminPermissions.Blogs.Delete, L("Permission:BlogManagement.Delete"))
.RequireGlobalFeatures(typeof(BlogsFeature));
blogManagement.AddChild(CmsKitAdminPermissions.Blogs.Features, L("Permission:BlogManagement.Features"))
.RequireGlobalFeatures(typeof(BlogsFeature));
var blogPostManagement = cmsGroup.AddPermission(CmsKitAdminPermissions.BlogPosts.Default, L("Permission:BlogPostManagement"))
.RequireGlobalFeatures(typeof(BlogsFeature));
blogPostManagement.AddChild(CmsKitAdminPermissions.BlogPosts.Create, L("Permission:BlogPostManagement.Create"))
.RequireGlobalFeatures(typeof(BlogsFeature));
blogPostManagement.AddChild(CmsKitAdminPermissions.BlogPosts.Update, L("Permission:BlogPostManagement.Update"))
.RequireGlobalFeatures(typeof(BlogsFeature));
blogPostManagement.AddChild(CmsKitAdminPermissions.BlogPosts.Delete, L("Permission:BlogPostManagement.Delete"))
.RequireGlobalFeatures(typeof(BlogsFeature));
var blogPostManagement = cmsGroup.AddPermission(CmsKitAdminPermissions.BlogPosts.Default, L("Permission:BlogPostManagement"))
.RequireGlobalFeatures(typeof(BlogsFeature));
blogPostManagement.AddChild(CmsKitAdminPermissions.BlogPosts.Create, L("Permission:BlogPostManagement.Create"))
.RequireGlobalFeatures(typeof(BlogsFeature));
blogPostManagement.AddChild(CmsKitAdminPermissions.BlogPosts.Update, L("Permission:BlogPostManagement.Update"))
.RequireGlobalFeatures(typeof(BlogsFeature));
blogPostManagement.AddChild(CmsKitAdminPermissions.BlogPosts.Delete, L("Permission:BlogPostManagement.Delete"))
.RequireGlobalFeatures(typeof(BlogsFeature));
var menuManagement = cmsGroup.AddPermission(CmsKitAdminPermissions.Menus.Default, L("Permission:MenuManagement"))
.RequireGlobalFeatures(typeof(MenuFeature));
var menuManagement = cmsGroup.AddPermission(CmsKitAdminPermissions.Menus.Default, L("Permission:MenuManagement"))
.RequireGlobalFeatures(typeof(MenuFeature));
menuManagement.AddChild(CmsKitAdminPermissions.Menus.Create, L("Permission:MenuManagement.Create"))
.RequireGlobalFeatures(typeof(MenuFeature));
menuManagement.AddChild(CmsKitAdminPermissions.Menus.Update, L("Permission:MenuManagement.Update"))
.RequireGlobalFeatures(typeof(MenuFeature));
menuManagement.AddChild(CmsKitAdminPermissions.Menus.Delete, L("Permission:MenuManagement.Delete"))
.RequireGlobalFeatures(typeof(MenuFeature));
}
menuManagement.AddChild(CmsKitAdminPermissions.Menus.Create, L("Permission:MenuManagement.Create"))
.RequireGlobalFeatures(typeof(MenuFeature));
menuManagement.AddChild(CmsKitAdminPermissions.Menus.Update, L("Permission:MenuManagement.Update"))
.RequireGlobalFeatures(typeof(MenuFeature));
menuManagement.AddChild(CmsKitAdminPermissions.Menus.Delete, L("Permission:MenuManagement.Delete"))
.RequireGlobalFeatures(typeof(MenuFeature));
}
private static LocalizableString L(string name)
{
return LocalizableString.Create<CmsKitResource>(name);
}
private static LocalizableString L(string name)
{
return LocalizableString.Create<CmsKitResource>(name);
}
}

@ -1,64 +1,63 @@
using Volo.Abp.Reflection;
namespace Volo.CmsKit.Permissions
namespace Volo.CmsKit.Permissions;
public class CmsKitAdminPermissions
{
public class CmsKitAdminPermissions
{
public const string GroupName = "CmsKit";
public const string GroupName = "CmsKit";
public static class Comments
{
public const string Default = GroupName + ".Comments";
public const string Delete = Default + ".Delete";
}
public static class Comments
{
public const string Default = GroupName + ".Comments";
public const string Delete = Default + ".Delete";
}
public static class Tags
{
public const string Default = GroupName + ".Tags";
public const string Create = Default + ".Create";
public const string Update = Default + ".Update";
public const string Delete = Default + ".Delete";
}
public static class Tags
{
public const string Default = GroupName + ".Tags";
public const string Create = Default + ".Create";
public const string Update = Default + ".Update";
public const string Delete = Default + ".Delete";
}
public static class Contents
{
public const string Default = GroupName + ".Contents";
public const string Create = Default + ".Create";
public const string Update = Default + ".Update";
public const string Delete = Default + ".Delete";
}
public static class Contents
{
public const string Default = GroupName + ".Contents";
public const string Create = Default + ".Create";
public const string Update = Default + ".Update";
public const string Delete = Default + ".Delete";
}
public static class Pages
{
public const string Default = GroupName + ".Pages";
public const string Create = Default + ".Create";
public const string Update = Default + ".Update";
public const string Delete = Default + ".Delete";
}
public static class Pages
{
public const string Default = GroupName + ".Pages";
public const string Create = Default + ".Create";
public const string Update = Default + ".Update";
public const string Delete = Default + ".Delete";
}
public static class Blogs
{
public const string Default = GroupName + ".Blogs";
public const string Create = Default + ".Create";
public const string Update = Default + ".Update";
public const string Delete = Default + ".Delete";
public const string Features = Default + ".Features";
}
public static class Blogs
{
public const string Default = GroupName + ".Blogs";
public const string Create = Default + ".Create";
public const string Update = Default + ".Update";
public const string Delete = Default + ".Delete";
public const string Features = Default + ".Features";
}
public static class BlogPosts
{
public const string Default = GroupName + ".BlogPosts";
public const string Create = Default + ".Create";
public const string Update = Default + ".Update";
public const string Delete = Default + ".Delete";
}
public static class BlogPosts
{
public const string Default = GroupName + ".BlogPosts";
public const string Create = Default + ".Create";
public const string Update = Default + ".Update";
public const string Delete = Default + ".Delete";
}
public static class Menus
{
public const string Default = GroupName + ".Menus";
public const string Create = Default + ".Create";
public const string Update = Default + ".Update";
public const string Delete = Default + ".Delete";
}
public static class Menus
{
public const string Default = GroupName + ".Menus";
public const string Create = Default + ".Create";
public const string Update = Default + ".Update";
public const string Delete = Default + ".Delete";
}
}

@ -9,76 +9,75 @@ using Volo.CmsKit.Blogs;
using Volo.CmsKit.GlobalFeatures;
using Volo.CmsKit.Permissions;
namespace Volo.CmsKit.Admin.Blogs
namespace Volo.CmsKit.Admin.Blogs;
[RequiresGlobalFeature(typeof(BlogsFeature))]
[Authorize(CmsKitAdminPermissions.Blogs.Default)]
public class BlogAdminAppService : CmsKitAdminAppServiceBase, IBlogAdminAppService
{
[RequiresGlobalFeature(typeof(BlogsFeature))]
[Authorize(CmsKitAdminPermissions.Blogs.Default)]
public class BlogAdminAppService : CmsKitAdminAppServiceBase, IBlogAdminAppService
protected IBlogRepository BlogRepository { get; }
protected BlogManager BlogManager { get; }
protected BlogFeatureManager BlogFeatureManager { get; }
public BlogAdminAppService(
IBlogRepository blogRepository,
BlogManager blogManager,
BlogFeatureManager blogFeatureManager = null)
{
protected IBlogRepository BlogRepository { get; }
protected BlogManager BlogManager { get; }
protected BlogFeatureManager BlogFeatureManager{ get; }
public BlogAdminAppService(
IBlogRepository blogRepository,
BlogManager blogManager,
BlogFeatureManager blogFeatureManager = null)
{
BlogRepository = blogRepository;
BlogManager = blogManager;
BlogFeatureManager = blogFeatureManager;
}
BlogRepository = blogRepository;
BlogManager = blogManager;
BlogFeatureManager = blogFeatureManager;
}
public virtual async Task<BlogDto> GetAsync(Guid id)
{
var blog = await BlogRepository.GetAsync(id);
public virtual async Task<BlogDto> GetAsync(Guid id)
{
var blog = await BlogRepository.GetAsync(id);
return ObjectMapper.Map<Blog, BlogDto>(blog);
}
return ObjectMapper.Map<Blog, BlogDto>(blog);
}
public virtual async Task<PagedResultDto<BlogDto>> GetListAsync(BlogGetListInput input)
{
var totalCount = await BlogRepository.GetCountAsync(input.Filter);
public virtual async Task<PagedResultDto<BlogDto>> GetListAsync(BlogGetListInput input)
{
var totalCount = await BlogRepository.GetCountAsync(input.Filter);
var blogs = await BlogRepository.GetListAsync(
input.Filter,
input.Sorting,
input.MaxResultCount,
input.SkipCount);
var blogs = await BlogRepository.GetListAsync(
input.Filter,
input.Sorting,
input.MaxResultCount,
input.SkipCount);
return new PagedResultDto<BlogDto>(totalCount, ObjectMapper.Map<List<Blog>, List<BlogDto>>(blogs));
}
return new PagedResultDto<BlogDto>(totalCount, ObjectMapper.Map<List<Blog>, List<BlogDto>>(blogs));
}
[Authorize(CmsKitAdminPermissions.Blogs.Create)]
public virtual async Task<BlogDto> CreateAsync(CreateBlogDto input)
{
var blog = await BlogManager.CreateAsync(input.Name, input.Slug);
[Authorize(CmsKitAdminPermissions.Blogs.Create)]
public virtual async Task<BlogDto> CreateAsync(CreateBlogDto input)
{
var blog = await BlogManager.CreateAsync(input.Name, input.Slug);
await BlogRepository.InsertAsync(blog, autoSave: true);
await BlogRepository.InsertAsync(blog, autoSave: true);
await BlogFeatureManager.SetDefaultsAsync(blog.Id);
await BlogFeatureManager.SetDefaultsAsync(blog.Id);
return ObjectMapper.Map<Blog, BlogDto>(blog);
}
return ObjectMapper.Map<Blog, BlogDto>(blog);
}
[Authorize(CmsKitAdminPermissions.Blogs.Update)]
public virtual async Task<BlogDto> UpdateAsync(Guid id, UpdateBlogDto input)
{
var blog = await BlogRepository.GetAsync(id);
[Authorize(CmsKitAdminPermissions.Blogs.Update)]
public virtual async Task<BlogDto> UpdateAsync(Guid id, UpdateBlogDto input)
{
var blog = await BlogRepository.GetAsync(id);
blog = await BlogManager.UpdateAsync(blog, input.Name, input.Slug);
blog = await BlogManager.UpdateAsync(blog, input.Name, input.Slug);
blog.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
blog.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
await BlogRepository.UpdateAsync(blog);
await BlogRepository.UpdateAsync(blog);
return ObjectMapper.Map<Blog, BlogDto>(blog);
}
return ObjectMapper.Map<Blog, BlogDto>(blog);
}
[Authorize(CmsKitAdminPermissions.Blogs.Delete)]
public virtual Task DeleteAsync(Guid id)
{
return BlogRepository.DeleteAsync(id);
}
[Authorize(CmsKitAdminPermissions.Blogs.Delete)]
public virtual Task DeleteAsync(Guid id)
{
return BlogRepository.DeleteAsync(id);
}
}

@ -8,38 +8,37 @@ using Volo.CmsKit.Blogs;
using Volo.CmsKit.GlobalFeatures;
using Volo.CmsKit.Permissions;
namespace Volo.CmsKit.Admin.Blogs
namespace Volo.CmsKit.Admin.Blogs;
[RequiresGlobalFeature(typeof(BlogsFeature))]
[Authorize(CmsKitAdminPermissions.Blogs.Features)]
public class BlogFeatureAdminAppService : CmsKitAdminAppServiceBase, IBlogFeatureAdminAppService
{
[RequiresGlobalFeature(typeof(BlogsFeature))]
[Authorize(CmsKitAdminPermissions.Blogs.Features)]
public class BlogFeatureAdminAppService : CmsKitAdminAppServiceBase, IBlogFeatureAdminAppService
{
protected IBlogFeatureRepository BlogFeatureRepository { get; }
protected IBlogFeatureRepository BlogFeatureRepository { get; }
protected BlogFeatureManager BlogFeatureManager { get; }
protected BlogFeatureManager BlogFeatureManager { get; }
protected IDistributedEventBus EventBus { get; }
protected IDistributedEventBus EventBus { get; }
public BlogFeatureAdminAppService(
IBlogFeatureRepository blogFeatureRepository,
BlogFeatureManager blogFeatureManager,
IDistributedEventBus eventBus)
{
BlogFeatureRepository = blogFeatureRepository;
BlogFeatureManager = blogFeatureManager;
EventBus = eventBus;
}
public BlogFeatureAdminAppService(
IBlogFeatureRepository blogFeatureRepository,
BlogFeatureManager blogFeatureManager,
IDistributedEventBus eventBus)
{
BlogFeatureRepository = blogFeatureRepository;
BlogFeatureManager = blogFeatureManager;
EventBus = eventBus;
}
public virtual async Task<List<BlogFeatureDto>> GetListAsync(Guid blogId)
{
var blogFeatures = await BlogFeatureRepository.GetListAsync(blogId);
public virtual async Task<List<BlogFeatureDto>> GetListAsync(Guid blogId)
{
var blogFeatures = await BlogFeatureRepository.GetListAsync(blogId);
return ObjectMapper.Map<List<BlogFeature>, List<BlogFeatureDto>>(blogFeatures);
}
return ObjectMapper.Map<List<BlogFeature>, List<BlogFeatureDto>>(blogFeatures);
}
public virtual Task SetAsync(Guid blogId, BlogFeatureInputDto dto)
{
return BlogFeatureManager.SetAsync(blogId, dto.FeatureName, dto.IsEnabled);
}
public virtual Task SetAsync(Guid blogId, BlogFeatureInputDto dto)
{
return BlogFeatureManager.SetAsync(blogId, dto.FeatureName, dto.IsEnabled);
}
}

@ -11,103 +11,102 @@ using Volo.CmsKit.GlobalFeatures;
using Volo.CmsKit.Permissions;
using Volo.CmsKit.Users;
namespace Volo.CmsKit.Admin.Blogs
namespace Volo.CmsKit.Admin.Blogs;
[RequiresGlobalFeature(typeof(BlogsFeature))]
[Authorize(CmsKitAdminPermissions.BlogPosts.Default)]
public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppService
{
[RequiresGlobalFeature(typeof(BlogsFeature))]
[Authorize(CmsKitAdminPermissions.BlogPosts.Default)]
public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppService
protected BlogPostManager BlogPostManager { get; }
protected IBlogPostRepository BlogPostRepository { get; }
protected IBlogRepository BlogRepository { get; }
protected ICmsUserLookupService UserLookupService { get; }
public BlogPostAdminAppService(
BlogPostManager blogPostManager,
IBlogPostRepository blogPostRepository,
IBlogRepository blogRepository,
ICmsUserLookupService userLookupService)
{
protected BlogPostManager BlogPostManager { get; }
protected IBlogPostRepository BlogPostRepository { get; }
protected IBlogRepository BlogRepository { get; }
protected ICmsUserLookupService UserLookupService { get; }
public BlogPostAdminAppService(
BlogPostManager blogPostManager,
IBlogPostRepository blogPostRepository,
IBlogRepository blogRepository,
ICmsUserLookupService userLookupService)
{
BlogPostManager = blogPostManager;
BlogPostRepository = blogPostRepository;
BlogRepository = blogRepository;
UserLookupService = userLookupService;
}
BlogPostManager = blogPostManager;
BlogPostRepository = blogPostRepository;
BlogRepository = blogRepository;
UserLookupService = userLookupService;
}
[Authorize(CmsKitAdminPermissions.BlogPosts.Create)]
public virtual async Task<BlogPostDto> CreateAsync(CreateBlogPostDto input)
{
var author = await UserLookupService.GetByIdAsync(CurrentUser.GetId());
[Authorize(CmsKitAdminPermissions.BlogPosts.Create)]
public virtual async Task<BlogPostDto> CreateAsync(CreateBlogPostDto input)
{
var author = await UserLookupService.GetByIdAsync(CurrentUser.GetId());
var blog = await BlogRepository.GetAsync(input.BlogId);
var blog = await BlogRepository.GetAsync(input.BlogId);
var blogPost = await BlogPostManager.CreateAsync(
author,
blog,
input.Title,
input.Slug,
input.ShortDescription,
input.Content,
input.CoverImageMediaId);
var blogPost = await BlogPostManager.CreateAsync(
author,
blog,
input.Title,
input.Slug,
input.ShortDescription,
input.Content,
input.CoverImageMediaId);
await BlogPostRepository.InsertAsync(blogPost);
await BlogPostRepository.InsertAsync(blogPost);
return ObjectMapper.Map<BlogPost, BlogPostDto>(blogPost);
}
return ObjectMapper.Map<BlogPost, BlogPostDto>(blogPost);
}
[Authorize(CmsKitAdminPermissions.BlogPosts.Update)]
public virtual async Task<BlogPostDto> UpdateAsync(Guid id, UpdateBlogPostDto input)
{
var blogPost = await BlogPostRepository.GetAsync(id);
blogPost.SetTitle(input.Title);
blogPost.SetShortDescription(input.ShortDescription);
blogPost.SetContent(input.Content);
blogPost.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
blogPost.CoverImageMediaId = input.CoverImageMediaId;
[Authorize(CmsKitAdminPermissions.BlogPosts.Update)]
public virtual async Task<BlogPostDto> UpdateAsync(Guid id, UpdateBlogPostDto input)
if (blogPost.Slug != input.Slug)
{
var blogPost = await BlogPostRepository.GetAsync(id);
await BlogPostManager.SetSlugUrlAsync(blogPost, input.Slug);
}
blogPost.SetTitle(input.Title);
blogPost.SetShortDescription(input.ShortDescription);
blogPost.SetContent(input.Content);
blogPost.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
blogPost.CoverImageMediaId = input.CoverImageMediaId;
await BlogPostRepository.UpdateAsync(blogPost);
if (blogPost.Slug != input.Slug)
{
await BlogPostManager.SetSlugUrlAsync(blogPost, input.Slug);
}
return ObjectMapper.Map<BlogPost, BlogPostDto>(blogPost);
}
await BlogPostRepository.UpdateAsync(blogPost);
[Authorize(CmsKitAdminPermissions.BlogPosts.Default)]
public virtual async Task<BlogPostDto> GetAsync(Guid id)
{
var blogPost = await BlogPostRepository.GetAsync(id);
return ObjectMapper.Map<BlogPost, BlogPostDto>(blogPost);
}
return ObjectMapper.Map<BlogPost, BlogPostDto>(blogPost);
}
[Authorize(CmsKitAdminPermissions.BlogPosts.Default)]
public virtual async Task<BlogPostDto> GetAsync(Guid id)
{
var blogPost = await BlogPostRepository.GetAsync(id);
[Authorize(CmsKitAdminPermissions.BlogPosts.Default)]
public virtual async Task<PagedResultDto<BlogPostListDto>> GetListAsync(BlogPostGetListInput input)
{
var blogs = (await BlogRepository.GetListAsync()).ToDictionary(x => x.Id);
return ObjectMapper.Map<BlogPost, BlogPostDto>(blogPost);
}
var blogPosts = await BlogPostRepository.GetListAsync(input.Filter, input.BlogId, input.MaxResultCount, input.SkipCount, input.Sorting);
[Authorize(CmsKitAdminPermissions.BlogPosts.Default)]
public virtual async Task<PagedResultDto<BlogPostListDto>> GetListAsync(BlogPostGetListInput input)
{
var blogs = (await BlogRepository.GetListAsync()).ToDictionary(x => x.Id);
var blogPosts = await BlogPostRepository.GetListAsync(input.Filter, input.BlogId, input.MaxResultCount, input.SkipCount, input.Sorting);
var count = await BlogPostRepository.GetCountAsync(input.Filter);
var count = await BlogPostRepository.GetCountAsync(input.Filter);
var dtoList = blogPosts.Select(x =>
{
var dto = ObjectMapper.Map<BlogPost, BlogPostListDto>(x);
dto.BlogName = blogs[x.BlogId].Name;
var dtoList = blogPosts.Select(x =>
{
var dto = ObjectMapper.Map<BlogPost, BlogPostListDto>(x);
dto.BlogName = blogs[x.BlogId].Name;
return dto;
}).ToList();
return dto;
}).ToList();
return new PagedResultDto<BlogPostListDto>(count, dtoList);
}
return new PagedResultDto<BlogPostListDto>(count, dtoList);
}
[Authorize(CmsKitAdminPermissions.BlogPosts.Delete)]
public virtual async Task DeleteAsync(Guid id)
{
await BlogPostRepository.DeleteAsync(id);
}
[Authorize(CmsKitAdminPermissions.BlogPosts.Delete)]
public virtual async Task DeleteAsync(Guid id)
{
await BlogPostRepository.DeleteAsync(id);
}
}

@ -7,33 +7,32 @@ using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Authorization;
namespace Volo.CmsKit.Admin
namespace Volo.CmsKit.Admin;
public abstract class CmsKitAdminAppServiceBase : CmsKitAppServiceBase
{
public abstract class CmsKitAdminAppServiceBase : CmsKitAppServiceBase
protected CmsKitAdminAppServiceBase()
{
protected CmsKitAdminAppServiceBase()
{
ObjectMapperContext = typeof(CmsKitAdminApplicationModule);
}
ObjectMapperContext = typeof(CmsKitAdminApplicationModule);
}
/// <summary>
/// Checks given policies until finding granted policy. If none of them is granted, throws <see cref="AbpAuthorizationException"/>
/// </summary>
/// <param name="policies">Policies to be checked.</param>
/// <exception cref="AbpAuthorizationException">Thrown when none of policies is granted.</exception>
protected async Task CheckAnyOfPoliciesAsync([NotNull] IEnumerable<string> policies)
{
Check.NotNull(policies, nameof(policies));
/// <summary>
/// Checks given policies until finding granted policy. If none of them is granted, throws <see cref="AbpAuthorizationException"/>
/// </summary>
/// <param name="policies">Policies to be checked.</param>
/// <exception cref="AbpAuthorizationException">Thrown when none of policies is granted.</exception>
protected async Task CheckAnyOfPoliciesAsync([NotNull] IEnumerable<string> policies)
{
Check.NotNull(policies, nameof(policies));
foreach (var policy in policies)
foreach (var policy in policies)
{
if (await AuthorizationService.IsGrantedAsync(policy))
{
if (await AuthorizationService.IsGrantedAsync(policy))
{
return;
}
return;
}
throw new AbpAuthorizationException();
}
throw new AbpAuthorizationException();
}
}

@ -14,36 +14,35 @@ using Volo.CmsKit.Users;
using Volo.CmsKit.Menus;
using Volo.CmsKit.Admin.Menus;
namespace Volo.CmsKit.Admin
namespace Volo.CmsKit.Admin;
public class CmsKitAdminApplicationAutoMapperProfile : Profile
{
public class CmsKitAdminApplicationAutoMapperProfile : Profile
public CmsKitAdminApplicationAutoMapperProfile()
{
public CmsKitAdminApplicationAutoMapperProfile()
{
CreateMap<CmsUser, Comments.CmsUserDto>();
CreateMap<CmsUser, Comments.CmsUserDto>();
CreateMap<Comment, CommentDto>();
CreateMap<Comment, CommentWithAuthorDto>()
.Ignore(x => x.Author);
CreateMap<Comment, CommentDto>();
CreateMap<Comment, CommentWithAuthorDto>()
.Ignore(x => x.Author);
CreateMap<Page, PageDto>();
CreateMap<Page, PageLookupDto>();
CreateMap<Page, PageDto>();
CreateMap<Page, PageLookupDto>();
CreateMap<BlogPost, BlogPostDto>(MemberList.Destination);
CreateMap<BlogPost, BlogPostListDto>()
.Ignore(d => d.BlogName);
CreateMap<CreateBlogPostDto, BlogPost>(MemberList.Source);
CreateMap<UpdateBlogPostDto, BlogPost>(MemberList.Source);
CreateMap<BlogPost, BlogPostDto>(MemberList.Destination);
CreateMap<BlogPost, BlogPostListDto>()
.Ignore(d => d.BlogName);
CreateMap<CreateBlogPostDto, BlogPost>(MemberList.Source);
CreateMap<UpdateBlogPostDto, BlogPost>(MemberList.Source);
CreateMap<Blog, BlogDto>();
CreateMap<Blog, BlogDto>();
CreateMap<TagEntityTypeDefiniton, TagDefinitionDto>(MemberList.Destination);
CreateMap<TagEntityTypeDefiniton, TagDefinitionDto>(MemberList.Destination);
CreateMap<Tag, TagDto>();
CreateMap<Tag, TagDto>();
CreateMap<MediaDescriptor, MediaDescriptorDto>();
CreateMap<MediaDescriptor, MediaDescriptorDto>();
CreateMap<MenuItem, MenuItemDto>();
}
CreateMap<MenuItem, MenuItemDto>();
}
}

@ -13,114 +13,113 @@ using Volo.CmsKit.Pages;
using Volo.CmsKit.Permissions;
using Volo.CmsKit.Tags;
namespace Volo.CmsKit.Admin
namespace Volo.CmsKit.Admin;
[DependsOn(
typeof(CmsKitAdminApplicationContractsModule),
typeof(AbpAutoMapperModule),
typeof(CmsKitCommonApplicationModule)
)]
public class CmsKitAdminApplicationModule : AbpModule
{
[DependsOn(
typeof(CmsKitAdminApplicationContractsModule),
typeof(AbpAutoMapperModule),
typeof(CmsKitCommonApplicationModule)
)]
public class CmsKitAdminApplicationModule : AbpModule
public override void ConfigureServices(ServiceConfigurationContext context)
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddAutoMapperObjectMapper<CmsKitAdminApplicationModule>();
context.Services.AddAutoMapperObjectMapper<CmsKitAdminApplicationModule>();
ConfigureTagOptions();
ConfigureTagOptions();
ConfigureCommentOptions();
ConfigureCommentOptions();
Configure<AbpAutoMapperOptions>(options =>
{
options.AddMaps<CmsKitAdminApplicationModule>(validate: true);
});
}
Configure<AbpAutoMapperOptions>(options =>
{
options.AddMaps<CmsKitAdminApplicationModule>(validate: true);
});
}
private void ConfigureTagOptions()
private void ConfigureTagOptions()
{
Configure<CmsKitTagOptions>(opts =>
{
Configure<CmsKitTagOptions>(opts =>
if (GlobalFeatureManager.Instance.IsEnabled<BlogsFeature>())
{
if (GlobalFeatureManager.Instance.IsEnabled<BlogsFeature>())
{
opts.EntityTypes.AddIfNotContains(
new TagEntityTypeDefiniton(
BlogPostConsts.EntityType,
LocalizableString.Create<CmsKitResource>("BlogPost"),
createPolicies: new[]
{
opts.EntityTypes.AddIfNotContains(
new TagEntityTypeDefiniton(
BlogPostConsts.EntityType,
LocalizableString.Create<CmsKitResource>("BlogPost"),
createPolicies: new[]
{
CmsKitAdminPermissions.BlogPosts.Create,
CmsKitAdminPermissions.BlogPosts.Update
},
updatePolicies: new[]
{
},
updatePolicies: new[]
{
CmsKitAdminPermissions.BlogPosts.Create,
CmsKitAdminPermissions.BlogPosts.Update
},
deletePolicies: new[]
{
},
deletePolicies: new[]
{
CmsKitAdminPermissions.BlogPosts.Create,
CmsKitAdminPermissions.BlogPosts.Update
}));
}
});
}));
}
});
if (GlobalFeatureManager.Instance.IsEnabled<MediaFeature>())
if (GlobalFeatureManager.Instance.IsEnabled<MediaFeature>())
{
Configure<CmsKitMediaOptions>(options =>
{
Configure<CmsKitMediaOptions>(options =>
if (GlobalFeatureManager.Instance.IsEnabled<BlogsFeature>())
{
if (GlobalFeatureManager.Instance.IsEnabled<BlogsFeature>())
{
options.EntityTypes.AddIfNotContains(
new MediaDescriptorDefinition(
BlogPostConsts.EntityType,
createPolicies: new[]
{
options.EntityTypes.AddIfNotContains(
new MediaDescriptorDefinition(
BlogPostConsts.EntityType,
createPolicies: new[]
{
CmsKitAdminPermissions.BlogPosts.Create,
CmsKitAdminPermissions.BlogPosts.Update
},
deletePolicies: new[]
{
},
deletePolicies: new[]
{
CmsKitAdminPermissions.BlogPosts.Create,
CmsKitAdminPermissions.BlogPosts.Update,
CmsKitAdminPermissions.BlogPosts.Delete
}));
}
}));
}
if (GlobalFeatureManager.Instance.IsEnabled<PagesFeature>())
{
options.EntityTypes.AddIfNotContains(
new MediaDescriptorDefinition(
PageConsts.EntityType,
createPolicies: new[]
{
if (GlobalFeatureManager.Instance.IsEnabled<PagesFeature>())
{
options.EntityTypes.AddIfNotContains(
new MediaDescriptorDefinition(
PageConsts.EntityType,
createPolicies: new[]
{
CmsKitAdminPermissions.Pages.Create,
CmsKitAdminPermissions.Pages.Update
},
deletePolicies: new[]
{
},
deletePolicies: new[]
{
CmsKitAdminPermissions.Pages.Create,
CmsKitAdminPermissions.Pages.Update,
CmsKitAdminPermissions.Pages.Delete
}));
}
});
}
}));
}
});
}
}
private void ConfigureCommentOptions()
private void ConfigureCommentOptions()
{
if (GlobalFeatureManager.Instance.IsEnabled<CommentsFeature>())
{
if (GlobalFeatureManager.Instance.IsEnabled<CommentsFeature>())
Configure<CmsKitCommentOptions>(options =>
{
Configure<CmsKitCommentOptions>(options =>
if (GlobalFeatureManager.Instance.IsEnabled<BlogsFeature>())
{
if (GlobalFeatureManager.Instance.IsEnabled<BlogsFeature>())
{
options.EntityTypes.AddIfNotContains(
new CommentEntityTypeDefinition(BlogPostConsts.EntityType));
options.EntityTypes.AddIfNotContains(
new CommentEntityTypeDefinition(BlogPostConsts.EntityType));
}
});
}
}
});
}
}
}

@ -9,67 +9,66 @@ using Volo.CmsKit.GlobalFeatures;
using Volo.CmsKit.Permissions;
using Volo.CmsKit.Users;
namespace Volo.CmsKit.Admin.Comments
namespace Volo.CmsKit.Admin.Comments;
[RequiresGlobalFeature(typeof(CommentsFeature))]
[Authorize(CmsKitAdminPermissions.Comments.Default)]
public class CommentAdminAppService : CmsKitAdminAppServiceBase, ICommentAdminAppService
{
[RequiresGlobalFeature(typeof(CommentsFeature))]
[Authorize(CmsKitAdminPermissions.Comments.Default)]
public class CommentAdminAppService : CmsKitAdminAppServiceBase, ICommentAdminAppService
{
protected ICommentRepository CommentRepository { get; }
protected ICommentRepository CommentRepository { get; }
public CommentAdminAppService(ICommentRepository commentRepository)
{
CommentRepository = commentRepository;
}
public CommentAdminAppService(ICommentRepository commentRepository)
{
CommentRepository = commentRepository;
}
public virtual async Task<PagedResultDto<CommentWithAuthorDto>> GetListAsync(CommentGetListInput input)
{
var totalCount = await CommentRepository.GetCountAsync(
input.Text,
input.EntityType,
input.RepliedCommentId,
input.Author,
input.CreationStartDate,
input.CreationEndDate);
public virtual async Task<PagedResultDto<CommentWithAuthorDto>> GetListAsync(CommentGetListInput input)
{
var totalCount = await CommentRepository.GetCountAsync(
input.Text,
input.EntityType,
input.RepliedCommentId,
input.Author,
input.CreationStartDate,
input.CreationEndDate);
var comments = await CommentRepository.GetListAsync(
input.Text,
input.EntityType,
input.RepliedCommentId,
input.Author,
input.CreationStartDate,
input.CreationEndDate,
input.Sorting,
input.MaxResultCount,
input.SkipCount
);
var comments = await CommentRepository.GetListAsync(
input.Text,
input.EntityType,
input.RepliedCommentId,
input.Author,
input.CreationStartDate,
input.CreationEndDate,
input.Sorting,
input.MaxResultCount,
input.SkipCount
);
var dtos = comments.Select(queryResultItem =>
{
var dto = ObjectMapper.Map<Comment, CommentWithAuthorDto>(queryResultItem.Comment);
dto.Author = ObjectMapper.Map<CmsUser, CmsUserDto>(queryResultItem.Author);
var dtos = comments.Select(queryResultItem =>
{
var dto = ObjectMapper.Map<Comment, CommentWithAuthorDto>(queryResultItem.Comment);
dto.Author = ObjectMapper.Map<CmsUser, CmsUserDto>(queryResultItem.Author);
return dto;
}).ToList();
return dto;
}).ToList();
return new PagedResultDto<CommentWithAuthorDto>(totalCount, dtos);
}
return new PagedResultDto<CommentWithAuthorDto>(totalCount, dtos);
}
public virtual async Task<CommentWithAuthorDto> GetAsync(Guid id)
{
var comment = await CommentRepository.GetWithAuthorAsync(id);
public virtual async Task<CommentWithAuthorDto> GetAsync(Guid id)
{
var comment = await CommentRepository.GetWithAuthorAsync(id);
var dto = ObjectMapper.Map<Comment, CommentWithAuthorDto>(comment.Comment);
dto.Author = ObjectMapper.Map<CmsUser, CmsUserDto>(comment.Author);
var dto = ObjectMapper.Map<Comment, CommentWithAuthorDto>(comment.Comment);
dto.Author = ObjectMapper.Map<CmsUser, CmsUserDto>(comment.Author);
return dto;
}
return dto;
}
[Authorize(CmsKitAdminPermissions.Comments.Delete)]
public virtual async Task DeleteAsync(Guid id)
{
var comment = await CommentRepository.GetAsync(id);
await CommentRepository.DeleteWithRepliesAsync(comment);
}
[Authorize(CmsKitAdminPermissions.Comments.Delete)]
public virtual async Task DeleteAsync(Guid id)
{
var comment = await CommentRepository.GetAsync(id);
await CommentRepository.DeleteWithRepliesAsync(comment);
}
}
}

@ -5,54 +5,53 @@ using Volo.Abp.GlobalFeatures;
using Volo.CmsKit.GlobalFeatures;
using Volo.CmsKit.MediaDescriptors;
namespace Volo.CmsKit.Admin.MediaDescriptors
namespace Volo.CmsKit.Admin.MediaDescriptors;
[RequiresGlobalFeature(typeof(MediaFeature))]
public class MediaDescriptorAdminAppService : CmsKitAdminAppServiceBase, IMediaDescriptorAdminAppService
{
[RequiresGlobalFeature(typeof(MediaFeature))]
public class MediaDescriptorAdminAppService : CmsKitAdminAppServiceBase, IMediaDescriptorAdminAppService
protected IBlobContainer<MediaContainer> MediaContainer { get; }
protected IMediaDescriptorRepository MediaDescriptorRepository { get; }
protected MediaDescriptorManager MediaDescriptorManager { get; }
protected IMediaDescriptorDefinitionStore MediaDescriptorDefinitionStore { get; }
public MediaDescriptorAdminAppService(
IBlobContainer<MediaContainer> mediaContainer,
IMediaDescriptorRepository mediaDescriptorRepository,
MediaDescriptorManager mediaDescriptorManager,
IMediaDescriptorDefinitionStore mediaDescriptorDefinitionStore)
{
MediaContainer = mediaContainer;
MediaDescriptorRepository = mediaDescriptorRepository;
MediaDescriptorManager = mediaDescriptorManager;
MediaDescriptorDefinitionStore = mediaDescriptorDefinitionStore;
}
public virtual async Task<MediaDescriptorDto> CreateAsync(string entityType, CreateMediaInputWithStream inputStream)
{
var definition = await MediaDescriptorDefinitionStore.GetAsync(entityType);
/* TODO: Shouldn't CreatePolicies be a dictionary and we check for inputStream.EntityType? */
await CheckAnyOfPoliciesAsync(definition.CreatePolicies);
var newEntity = await MediaDescriptorManager.CreateAsync(entityType, inputStream.Name, inputStream.File.ContentType, inputStream.File.ContentLength ?? 0);
await MediaContainer.SaveAsync(newEntity.Id.ToString(), inputStream.File.GetStream());
await MediaDescriptorRepository.InsertAsync(newEntity);
return ObjectMapper.Map<MediaDescriptor, MediaDescriptorDto>(newEntity);
}
public virtual async Task DeleteAsync(Guid id)
{
protected IBlobContainer<MediaContainer> MediaContainer { get; }
protected IMediaDescriptorRepository MediaDescriptorRepository { get; }
protected MediaDescriptorManager MediaDescriptorManager { get; }
protected IMediaDescriptorDefinitionStore MediaDescriptorDefinitionStore { get; }
public MediaDescriptorAdminAppService(
IBlobContainer<MediaContainer> mediaContainer,
IMediaDescriptorRepository mediaDescriptorRepository,
MediaDescriptorManager mediaDescriptorManager,
IMediaDescriptorDefinitionStore mediaDescriptorDefinitionStore)
{
MediaContainer = mediaContainer;
MediaDescriptorRepository = mediaDescriptorRepository;
MediaDescriptorManager = mediaDescriptorManager;
MediaDescriptorDefinitionStore = mediaDescriptorDefinitionStore;
}
public virtual async Task<MediaDescriptorDto> CreateAsync(string entityType, CreateMediaInputWithStream inputStream)
{
var definition = await MediaDescriptorDefinitionStore.GetAsync(entityType);
/* TODO: Shouldn't CreatePolicies be a dictionary and we check for inputStream.EntityType? */
await CheckAnyOfPoliciesAsync(definition.CreatePolicies);
var newEntity = await MediaDescriptorManager.CreateAsync(entityType, inputStream.Name, inputStream.File.ContentType, inputStream.File.ContentLength ?? 0);
await MediaContainer.SaveAsync(newEntity.Id.ToString(), inputStream.File.GetStream());
await MediaDescriptorRepository.InsertAsync(newEntity);
return ObjectMapper.Map<MediaDescriptor, MediaDescriptorDto>(newEntity);
}
public virtual async Task DeleteAsync(Guid id)
{
var mediaDescriptor = await MediaDescriptorRepository.GetAsync(id);
var definition = await MediaDescriptorDefinitionStore.GetAsync(mediaDescriptor.EntityType);
/* TODO: Shouldn't DeletePolicies be a dictionary and we check for inputStream.EntityType? */
await CheckAnyOfPoliciesAsync(definition.DeletePolicies);
await MediaContainer.DeleteAsync(id.ToString());
await MediaDescriptorRepository.DeleteAsync(id);
}
var mediaDescriptor = await MediaDescriptorRepository.GetAsync(id);
var definition = await MediaDescriptorDefinitionStore.GetAsync(mediaDescriptor.EntityType);
/* TODO: Shouldn't DeletePolicies be a dictionary and we check for inputStream.EntityType? */
await CheckAnyOfPoliciesAsync(definition.DeletePolicies);
await MediaContainer.DeleteAsync(id.ToString());
await MediaDescriptorRepository.DeleteAsync(id);
}
}

@ -12,122 +12,121 @@ using Volo.CmsKit.Menus;
using Volo.CmsKit.Pages;
using Volo.CmsKit.Permissions;
namespace Volo.CmsKit.Admin.Menus
namespace Volo.CmsKit.Admin.Menus;
[RequiresGlobalFeature(typeof(MenuFeature))]
[Authorize(CmsKitAdminPermissions.Menus.Default)]
public class MenuItemAdminAppService : CmsKitAdminAppServiceBase, IMenuItemAdminAppService
{
[RequiresGlobalFeature(typeof(MenuFeature))]
[Authorize(CmsKitAdminPermissions.Menus.Default)]
public class MenuItemAdminAppService : CmsKitAdminAppServiceBase, IMenuItemAdminAppService
protected MenuItemManager MenuManager { get; }
protected IMenuItemRepository MenuItemRepository { get; }
protected IPageRepository PageRepository { get; }
public MenuItemAdminAppService(
MenuItemManager menuManager,
IMenuItemRepository menuRepository,
IPageRepository pageRepository)
{
protected MenuItemManager MenuManager { get; }
protected IMenuItemRepository MenuItemRepository { get; }
protected IPageRepository PageRepository { get; }
public MenuItemAdminAppService(
MenuItemManager menuManager,
IMenuItemRepository menuRepository,
IPageRepository pageRepository)
{
MenuManager = menuManager;
MenuItemRepository = menuRepository;
PageRepository = pageRepository;
}
MenuManager = menuManager;
MenuItemRepository = menuRepository;
PageRepository = pageRepository;
}
public virtual async Task<ListResultDto<MenuItemDto>> GetListAsync()
{
var menuItems = await MenuItemRepository.GetListAsync();
public virtual async Task<ListResultDto<MenuItemDto>> GetListAsync()
{
var menuItems = await MenuItemRepository.GetListAsync();
return new ListResultDto<MenuItemDto>(
ObjectMapper.Map<List<MenuItem>, List<MenuItemDto>>(menuItems)
);
}
return new ListResultDto<MenuItemDto>(
ObjectMapper.Map<List<MenuItem>, List<MenuItemDto>>(menuItems)
public virtual async Task<MenuItemDto> GetAsync(Guid id)
{
var menu = await MenuItemRepository.GetAsync(id);
return ObjectMapper.Map<MenuItem, MenuItemDto>(menu);
}
[Authorize(CmsKitAdminPermissions.Menus.Create)]
public virtual async Task<MenuItemDto> CreateAsync(MenuItemCreateInput input)
{
var menuItem = new MenuItem(
GuidGenerator.Create(),
input.DisplayName,
input.Url.IsNullOrEmpty() ? "#" : input.Url,
input.IsActive,
input.ParentId,
input.Icon,
input.Order,
input.Target,
input.ElementId,
input.CssClass,
CurrentTenant.Id
);
}
public virtual async Task<MenuItemDto> GetAsync(Guid id)
if (input.PageId.HasValue)
{
var menu = await MenuItemRepository.GetAsync(id);
return ObjectMapper.Map<MenuItem, MenuItemDto>(menu);
MenuManager.SetPageUrl(menuItem, await PageRepository.GetAsync(input.PageId.Value));
}
[Authorize(CmsKitAdminPermissions.Menus.Create)]
public virtual async Task<MenuItemDto> CreateAsync(MenuItemCreateInput input)
{
var menuItem = new MenuItem(
GuidGenerator.Create(),
input.DisplayName,
input.Url.IsNullOrEmpty() ? "#" : input.Url,
input.IsActive,
input.ParentId,
input.Icon,
input.Order,
input.Target,
input.ElementId,
input.CssClass,
CurrentTenant.Id
);
if (input.PageId.HasValue)
{
MenuManager.SetPageUrl(menuItem, await PageRepository.GetAsync(input.PageId.Value));
}
await MenuItemRepository.InsertAsync(menuItem);
return ObjectMapper.Map<MenuItem, MenuItemDto>(menuItem);
}
await MenuItemRepository.InsertAsync(menuItem);
[Authorize(CmsKitAdminPermissions.Menus.Update)]
public virtual async Task<MenuItemDto> UpdateAsync(Guid id, MenuItemUpdateInput input)
{
var menuItem = await MenuItemRepository.GetAsync(id);
if (input.PageId.HasValue)
{
MenuManager.SetPageUrl(menuItem, await PageRepository.GetAsync(input.PageId.Value));
}
else
{
menuItem.SetUrl(input.Url);
}
menuItem.SetDisplayName(input.DisplayName);
menuItem.IsActive = input.IsActive;
menuItem.Icon = input.Icon;
menuItem.Target = input.Target;
menuItem.ElementId = input.ElementId;
menuItem.CssClass = input.CssClass;
menuItem.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
await MenuItemRepository.UpdateAsync(menuItem);
return ObjectMapper.Map<MenuItem, MenuItemDto>(menuItem);
}
return ObjectMapper.Map<MenuItem, MenuItemDto>(menuItem);
}
[Authorize(CmsKitAdminPermissions.Menus.Update)]
public virtual async Task<MenuItemDto> UpdateAsync(Guid id, MenuItemUpdateInput input)
{
var menuItem = await MenuItemRepository.GetAsync(id);
[Authorize(CmsKitAdminPermissions.Menus.Delete)]
public virtual Task DeleteAsync(Guid id)
if (input.PageId.HasValue)
{
return MenuItemRepository.DeleteAsync(id);
MenuManager.SetPageUrl(menuItem, await PageRepository.GetAsync(input.PageId.Value));
}
[Authorize(CmsKitAdminPermissions.Menus.Update)]
public virtual Task MoveMenuItemAsync(Guid id, MenuItemMoveInput input)
else
{
return MenuManager.MoveAsync(id, input.NewParentId, input.Position);
menuItem.SetUrl(input.Url);
}
public virtual async Task<PagedResultDto<PageLookupDto>> GetPageLookupAsync(PageLookupInputDto input)
{
var count = await PageRepository.GetCountAsync(input.Filter);
menuItem.SetDisplayName(input.DisplayName);
menuItem.IsActive = input.IsActive;
menuItem.Icon = input.Icon;
menuItem.Target = input.Target;
menuItem.ElementId = input.ElementId;
menuItem.CssClass = input.CssClass;
menuItem.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
var pages = await PageRepository.GetListAsync(
input.Filter,
input.MaxResultCount,
input.SkipCount,
input.Sorting
);
await MenuItemRepository.UpdateAsync(menuItem);
return new PagedResultDto<PageLookupDto>(
count,
ObjectMapper.Map<List<Page>, List<PageLookupDto>>(pages)
);
}
return ObjectMapper.Map<MenuItem, MenuItemDto>(menuItem);
}
[Authorize(CmsKitAdminPermissions.Menus.Delete)]
public virtual Task DeleteAsync(Guid id)
{
return MenuItemRepository.DeleteAsync(id);
}
[Authorize(CmsKitAdminPermissions.Menus.Update)]
public virtual Task MoveMenuItemAsync(Guid id, MenuItemMoveInput input)
{
return MenuManager.MoveAsync(id, input.NewParentId, input.Position);
}
public virtual async Task<PagedResultDto<PageLookupDto>> GetPageLookupAsync(PageLookupInputDto input)
{
var count = await PageRepository.GetCountAsync(input.Filter);
var pages = await PageRepository.GetListAsync(
input.Filter,
input.MaxResultCount,
input.SkipCount,
input.Sorting
);
return new PagedResultDto<PageLookupDto>(
count,
ObjectMapper.Map<List<Page>, List<PageLookupDto>>(pages)
);
}
}
}

@ -11,79 +11,78 @@ using Volo.CmsKit.GlobalFeatures;
using Volo.CmsKit.Pages;
using Volo.CmsKit.Permissions;
namespace Volo.CmsKit.Admin.Pages
namespace Volo.CmsKit.Admin.Pages;
[RequiresGlobalFeature(typeof(PagesFeature))]
[Authorize(CmsKitAdminPermissions.Pages.Default)]
public class PageAdminAppService : CmsKitAdminAppServiceBase, IPageAdminAppService
{
[RequiresGlobalFeature(typeof(PagesFeature))]
[Authorize(CmsKitAdminPermissions.Pages.Default)]
public class PageAdminAppService : CmsKitAdminAppServiceBase, IPageAdminAppService
protected IPageRepository PageRepository { get; }
protected PageManager PageManager { get; }
public PageAdminAppService(
IPageRepository pageRepository,
PageManager pageManager)
{
PageRepository = pageRepository;
PageManager = pageManager;
}
public virtual async Task<PageDto> GetAsync(Guid id)
{
var page = await PageRepository.GetAsync(id);
return ObjectMapper.Map<Page, PageDto>(page);
}
public virtual async Task<PagedResultDto<PageDto>> GetListAsync(GetPagesInputDto input)
{
var count = await PageRepository.GetCountAsync(input.Filter);
var pages = await PageRepository.GetListAsync(
input.Filter,
input.MaxResultCount,
input.SkipCount,
input.Sorting
);
return new PagedResultDto<PageDto>(
count,
ObjectMapper.Map<List<Page>, List<PageDto>>(pages)
);
}
[Authorize(CmsKitAdminPermissions.Pages.Create)]
public virtual async Task<PageDto> CreateAsync(CreatePageInputDto input)
{
var page = await PageManager.CreateAsync(input.Title, input.Slug, input.Content, input.Script, input.Style);
await PageRepository.InsertAsync(page);
return ObjectMapper.Map<Page, PageDto>(page);
}
[Authorize(CmsKitAdminPermissions.Pages.Update)]
public virtual async Task<PageDto> UpdateAsync(Guid id, UpdatePageInputDto input)
{
var page = await PageRepository.GetAsync(id);
await PageManager.SetSlugAsync(page, input.Slug);
page.SetTitle(input.Title);
page.SetContent(input.Content);
page.SetScript(input.Script);
page.SetStyle(input.Style);
page.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
await PageRepository.UpdateAsync(page);
return ObjectMapper.Map<Page, PageDto>(page);
}
[Authorize(CmsKitAdminPermissions.Pages.Delete)]
public virtual async Task DeleteAsync(Guid id)
{
protected IPageRepository PageRepository { get; }
protected PageManager PageManager { get; }
public PageAdminAppService(
IPageRepository pageRepository,
PageManager pageManager)
{
PageRepository = pageRepository;
PageManager = pageManager;
}
public virtual async Task<PageDto> GetAsync(Guid id)
{
var page = await PageRepository.GetAsync(id);
return ObjectMapper.Map<Page, PageDto>(page);
}
public virtual async Task<PagedResultDto<PageDto>> GetListAsync(GetPagesInputDto input)
{
var count = await PageRepository.GetCountAsync(input.Filter);
var pages = await PageRepository.GetListAsync(
input.Filter,
input.MaxResultCount,
input.SkipCount,
input.Sorting
);
return new PagedResultDto<PageDto>(
count,
ObjectMapper.Map<List<Page>, List<PageDto>>(pages)
);
}
[Authorize(CmsKitAdminPermissions.Pages.Create)]
public virtual async Task<PageDto> CreateAsync(CreatePageInputDto input)
{
var page = await PageManager.CreateAsync(input.Title, input.Slug, input.Content, input.Script, input.Style);
await PageRepository.InsertAsync(page);
return ObjectMapper.Map<Page, PageDto>(page);
}
[Authorize(CmsKitAdminPermissions.Pages.Update)]
public virtual async Task<PageDto> UpdateAsync(Guid id, UpdatePageInputDto input)
{
var page = await PageRepository.GetAsync(id);
await PageManager.SetSlugAsync(page, input.Slug);
page.SetTitle(input.Title);
page.SetContent(input.Content);
page.SetScript(input.Script);
page.SetStyle(input.Style);
page.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
await PageRepository.UpdateAsync(page);
return ObjectMapper.Map<Page, PageDto>(page);
}
[Authorize(CmsKitAdminPermissions.Pages.Delete)]
public virtual async Task DeleteAsync(Guid id)
{
await PageRepository.DeleteAsync(id);
}
await PageRepository.DeleteAsync(id);
}
}

@ -3,66 +3,65 @@ using Volo.Abp.GlobalFeatures;
using Volo.CmsKit.GlobalFeatures;
using Volo.CmsKit.Tags;
namespace Volo.CmsKit.Admin.Tags
namespace Volo.CmsKit.Admin.Tags;
[RequiresGlobalFeature(typeof(TagsFeature))]
public class EntityTagAdminAppService : CmsKitAdminAppServiceBase, IEntityTagAdminAppService
{
[RequiresGlobalFeature(typeof(TagsFeature))]
public class EntityTagAdminAppService : CmsKitAdminAppServiceBase, IEntityTagAdminAppService
{
protected ITagDefinitionStore TagDefinitionStore { get; }
protected EntityTagManager EntityTagManager { get; }
protected TagManager TagManager { get; }
protected ITagRepository TagRepository { get; }
protected IEntityTagRepository EntityTagRepository { get; }
protected ITagDefinitionStore TagDefinitionStore { get; }
protected EntityTagManager EntityTagManager { get; }
protected TagManager TagManager { get; }
protected ITagRepository TagRepository { get; }
protected IEntityTagRepository EntityTagRepository { get; }
public EntityTagAdminAppService(
ITagDefinitionStore tagDefinitionStore,
EntityTagManager entityTagManager,
TagManager tagManager,
ITagRepository tagRepository,
IEntityTagRepository entityTagRepository)
{
TagDefinitionStore = tagDefinitionStore;
EntityTagManager = entityTagManager;
TagManager = tagManager;
TagRepository = tagRepository;
EntityTagRepository = entityTagRepository;
}
public EntityTagAdminAppService(
ITagDefinitionStore tagDefinitionStore,
EntityTagManager entityTagManager,
TagManager tagManager,
ITagRepository tagRepository,
IEntityTagRepository entityTagRepository)
{
TagDefinitionStore = tagDefinitionStore;
EntityTagManager = entityTagManager;
TagManager = tagManager;
TagRepository = tagRepository;
EntityTagRepository = entityTagRepository;
}
public virtual async Task AddTagToEntityAsync(EntityTagCreateDto input)
{
var definition = await TagDefinitionStore.GetAsync(input.EntityType);
public virtual async Task AddTagToEntityAsync(EntityTagCreateDto input)
{
var definition = await TagDefinitionStore.GetAsync(input.EntityType);
await CheckAnyOfPoliciesAsync(definition.CreatePolicies);
await CheckAnyOfPoliciesAsync(definition.CreatePolicies);
var tag = await TagManager.GetOrAddAsync(input.EntityType, input.TagName);
var tag = await TagManager.GetOrAddAsync(input.EntityType, input.TagName);
await EntityTagManager.AddTagToEntityAsync(
tag.Id,
input.EntityType,
input.EntityId,
CurrentTenant?.Id);
}
await EntityTagManager.AddTagToEntityAsync(
tag.Id,
input.EntityType,
input.EntityId,
CurrentTenant?.Id);
}
public virtual async Task RemoveTagFromEntityAsync(EntityTagRemoveDto input)
{
var definition = await TagDefinitionStore.GetAsync(input.EntityType);
public virtual async Task RemoveTagFromEntityAsync(EntityTagRemoveDto input)
{
var definition = await TagDefinitionStore.GetAsync(input.EntityType);
await CheckAnyOfPoliciesAsync(definition.DeletePolicies);
await CheckAnyOfPoliciesAsync(definition.DeletePolicies);
await EntityTagManager.RemoveTagFromEntityAsync(
input.TagId,
input.EntityType,
input.EntityId,
CurrentTenant?.Id);
}
await EntityTagManager.RemoveTagFromEntityAsync(
input.TagId,
input.EntityType,
input.EntityId,
CurrentTenant?.Id);
}
public virtual async Task SetEntityTagsAsync(EntityTagSetDto input)
{
var definition = await TagDefinitionStore.GetAsync(input.EntityType);
public virtual async Task SetEntityTagsAsync(EntityTagSetDto input)
{
var definition = await TagDefinitionStore.GetAsync(input.EntityType);
await CheckAnyOfPoliciesAsync(definition.UpdatePolicies);
await CheckAnyOfPoliciesAsync(definition.UpdatePolicies);
await EntityTagManager.SetEntityTagsAsync(input.EntityType, input.EntityId, input.Tags);
}
await EntityTagManager.SetEntityTagsAsync(input.EntityType, input.EntityId, input.Tags);
}
}

@ -11,95 +11,94 @@ using Volo.CmsKit.GlobalFeatures;
using Volo.CmsKit.Permissions;
using Volo.CmsKit.Tags;
namespace Volo.CmsKit.Admin.Tags
namespace Volo.CmsKit.Admin.Tags;
[Authorize(CmsKitAdminPermissions.Tags.Default)]
[RequiresGlobalFeature(typeof(TagsFeature))]
public class TagAdminAppService : CmsKitAppServiceBase, ITagAdminAppService
{
protected ITagRepository Repository { get; }
protected TagManager TagManager { get; }
protected ITagDefinitionStore TagDefinitionStore { get; }
protected IStringLocalizerFactory StringLocalizerFactory { get; }
public TagAdminAppService(
ITagRepository repository,
TagManager tagManager,
ITagDefinitionStore tagDefinitionStore,
IStringLocalizerFactory stringLocalizerFactory)
{
Repository = repository;
TagManager = tagManager;
TagDefinitionStore = tagDefinitionStore;
StringLocalizerFactory = stringLocalizerFactory;
}
[Authorize(CmsKitAdminPermissions.Tags.Create)]
public async Task<TagDto> CreateAsync(TagCreateDto input)
{
var tag = await TagManager.CreateAsync(
GuidGenerator.Create(),
input.EntityType,
input.Name);
await Repository.InsertAsync(tag);
return ObjectMapper.Map<Tag, TagDto>(tag);
}
[Authorize(CmsKitAdminPermissions.Tags.Update)]
public async Task<TagDto> UpdateAsync(Guid id, TagUpdateDto input)
{
var tag = await TagManager.UpdateAsync(
id,
input.Name);
tag.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
await Repository.UpdateAsync(tag);
return ObjectMapper.Map<Tag, TagDto>(tag);
}
[Authorize(CmsKitAdminPermissions.Tags.Default)]
public virtual async Task<List<TagDefinitionDto>> GetTagDefinitionsAsync()
{
var definitions = await TagDefinitionStore.GetTagEntityTypeDefinitionListAsync();
return definitions
.Select(s =>
new TagDefinitionDto
{
EntityType = s.EntityType,
DisplayName = s.DisplayName?.Localize(StringLocalizerFactory) ?? s.EntityType
})
.ToList();
}
[Authorize(CmsKitAdminPermissions.Tags.Default)]
public async Task<TagDto> GetAsync(Guid id)
{
var tag = await Repository.GetAsync(id);
return ObjectMapper.Map<Tag, TagDto>(tag);
}
[Authorize(CmsKitAdminPermissions.Tags.Default)]
[RequiresGlobalFeature(typeof(TagsFeature))]
public class TagAdminAppService : CmsKitAppServiceBase, ITagAdminAppService
public async Task<PagedResultDto<TagDto>> GetListAsync(TagGetListInput input)
{
var tags = await Repository.GetListAsync(input.Filter);
var count = await Repository.GetCountAsync(input.Filter);
return new PagedResultDto<TagDto>(
count,
ObjectMapper.Map<List<Tag>, List<TagDto>>(tags)
);
}
[Authorize(CmsKitAdminPermissions.Tags.Delete)]
public async Task DeleteAsync(Guid id)
{
protected ITagRepository Repository { get; }
protected TagManager TagManager { get; }
protected ITagDefinitionStore TagDefinitionStore { get; }
protected IStringLocalizerFactory StringLocalizerFactory { get; }
public TagAdminAppService(
ITagRepository repository,
TagManager tagManager,
ITagDefinitionStore tagDefinitionStore,
IStringLocalizerFactory stringLocalizerFactory)
{
Repository = repository;
TagManager = tagManager;
TagDefinitionStore = tagDefinitionStore;
StringLocalizerFactory = stringLocalizerFactory;
}
[Authorize(CmsKitAdminPermissions.Tags.Create)]
public async Task<TagDto> CreateAsync(TagCreateDto input)
{
var tag = await TagManager.CreateAsync(
GuidGenerator.Create(),
input.EntityType,
input.Name);
await Repository.InsertAsync(tag);
return ObjectMapper.Map<Tag, TagDto>(tag);
}
[Authorize(CmsKitAdminPermissions.Tags.Update)]
public async Task<TagDto> UpdateAsync(Guid id, TagUpdateDto input)
{
var tag = await TagManager.UpdateAsync(
id,
input.Name);
tag.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
await Repository.UpdateAsync(tag);
return ObjectMapper.Map<Tag, TagDto>(tag);
}
[Authorize(CmsKitAdminPermissions.Tags.Default)]
public virtual async Task<List<TagDefinitionDto>> GetTagDefinitionsAsync()
{
var definitions = await TagDefinitionStore.GetTagEntityTypeDefinitionListAsync();
return definitions
.Select(s =>
new TagDefinitionDto
{
EntityType = s.EntityType,
DisplayName = s.DisplayName?.Localize(StringLocalizerFactory) ?? s.EntityType
})
.ToList();
}
[Authorize(CmsKitAdminPermissions.Tags.Default)]
public async Task<TagDto> GetAsync(Guid id)
{
var tag = await Repository.GetAsync(id);
return ObjectMapper.Map<Tag, TagDto>(tag);
}
[Authorize(CmsKitAdminPermissions.Tags.Default)]
public async Task<PagedResultDto<TagDto>> GetListAsync(TagGetListInput input)
{
var tags = await Repository.GetListAsync(input.Filter);
var count = await Repository.GetCountAsync(input.Filter);
return new PagedResultDto<TagDto>(
count,
ObjectMapper.Map<List<Tag>, List<TagDto>>(tags)
);
}
[Authorize(CmsKitAdminPermissions.Tags.Delete)]
public async Task DeleteAsync(Guid id)
{
await Repository.DeleteAsync(id);
}
await Repository.DeleteAsync(id);
}
}

@ -1,8 +1,7 @@
// This file is part of BlogAdminClientProxy, you can customize it here
// ReSharper disable once CheckNamespace
namespace Volo.CmsKit.Admin.Blogs.ClientProxies
namespace Volo.CmsKit.Admin.Blogs.ClientProxies;
public partial class BlogAdminClientProxy
{
public partial class BlogAdminClientProxy
{
}
}

@ -1,8 +1,7 @@
// This file is part of BlogFeatureAdminClientProxy, you can customize it here
// ReSharper disable once CheckNamespace
namespace Volo.CmsKit.Admin.Blogs.ClientProxies
namespace Volo.CmsKit.Admin.Blogs.ClientProxies;
public partial class BlogFeatureAdminClientProxy
{
public partial class BlogFeatureAdminClientProxy
{
}
}

@ -1,8 +1,7 @@
// This file is part of BlogPostAdminClientProxy, you can customize it here
// ReSharper disable once CheckNamespace
namespace Volo.CmsKit.Admin.Blogs.ClientProxies
namespace Volo.CmsKit.Admin.Blogs.ClientProxies;
public partial class BlogPostAdminClientProxy
{
public partial class BlogPostAdminClientProxy
{
}
}

@ -1,8 +1,7 @@
// This file is part of CommentAdminClientProxy, you can customize it here
// ReSharper disable once CheckNamespace
namespace Volo.CmsKit.Admin.Comments.ClientProxies
namespace Volo.CmsKit.Admin.Comments.ClientProxies;
public partial class CommentAdminClientProxy
{
public partial class CommentAdminClientProxy
{
}
}

@ -1,8 +1,7 @@
// This file is part of EntityTagAdminClientProxy, you can customize it here
// ReSharper disable once CheckNamespace
namespace Volo.CmsKit.Admin.Tags.ClientProxies
namespace Volo.CmsKit.Admin.Tags.ClientProxies;
public partial class EntityTagAdminClientProxy
{
public partial class EntityTagAdminClientProxy
{
}
}

@ -1,8 +1,7 @@
// This file is part of MediaDescriptorAdminClientProxy, you can customize it here
// ReSharper disable once CheckNamespace
namespace Volo.CmsKit.Admin.MediaDescriptors.ClientProxies
namespace Volo.CmsKit.Admin.MediaDescriptors.ClientProxies;
public partial class MediaDescriptorAdminClientProxy
{
public partial class MediaDescriptorAdminClientProxy
{
}
}

@ -1,8 +1,7 @@
// This file is part of MenuItemAdminClientProxy, you can customize it here
// ReSharper disable once CheckNamespace
namespace Volo.CmsKit.Admin.Menus.ClientProxies
namespace Volo.CmsKit.Admin.Menus.ClientProxies;
public partial class MenuItemAdminClientProxy
{
public partial class MenuItemAdminClientProxy
{
}
}

@ -1,8 +1,7 @@
// This file is part of PageAdminClientProxy, you can customize it here
// ReSharper disable once CheckNamespace
namespace Volo.CmsKit.Admin.Pages.ClientProxies
namespace Volo.CmsKit.Admin.Pages.ClientProxies;
public partial class PageAdminClientProxy
{
public partial class PageAdminClientProxy
{
}
}

@ -1,8 +1,7 @@
// This file is part of TagAdminClientProxy, you can customize it here
// ReSharper disable once CheckNamespace
namespace Volo.CmsKit.Admin.Tags.ClientProxies
namespace Volo.CmsKit.Admin.Tags.ClientProxies;
public partial class TagAdminClientProxy
{
public partial class TagAdminClientProxy
{
}
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save