From 886f84cfabefcf06bab00724d572c42e3b07b36b Mon Sep 17 00:00:00 2001 From: Berkan Sasmaz Date: Fri, 16 Jul 2021 14:51:19 +0300 Subject: [PATCH 1/9] fix: resolve version mismatch --- src/EventHub.Admin.Web/EventHub.Admin.Web.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/EventHub.Admin.Web/EventHub.Admin.Web.csproj b/src/EventHub.Admin.Web/EventHub.Admin.Web.csproj index 51d7080..aaa7547 100644 --- a/src/EventHub.Admin.Web/EventHub.Admin.Web.csproj +++ b/src/EventHub.Admin.Web/EventHub.Admin.Web.csproj @@ -11,8 +11,8 @@ - - + + From fa03c0ccc9607f83378a048ec4d6960bbf907ef4 Mon Sep 17 00:00:00 2001 From: Berkan Sasmaz Date: Tue, 27 Jul 2021 17:16:32 +0300 Subject: [PATCH 2/9] Add MemberCount to Organization --- .../Organizations/Organization.cs | 2 + ...ed_MemberCount_To_Organization.Designer.cs | 2628 +++++++++++++++++ ...70707_Added_MemberCount_To_Organization.cs | 24 + .../EventHubDbContextModelSnapshot.cs | 5 +- 4 files changed, 2658 insertions(+), 1 deletion(-) create mode 100644 src/EventHub.EntityFrameworkCore/Migrations/20210727070707_Added_MemberCount_To_Organization.Designer.cs create mode 100644 src/EventHub.EntityFrameworkCore/Migrations/20210727070707_Added_MemberCount_To_Organization.cs diff --git a/src/EventHub.Domain/Organizations/Organization.cs b/src/EventHub.Domain/Organizations/Organization.cs index 88db74b..557f988 100644 --- a/src/EventHub.Domain/Organizations/Organization.cs +++ b/src/EventHub.Domain/Organizations/Organization.cs @@ -26,6 +26,8 @@ namespace EventHub.Organizations public string MediumUsername { get; set; } + public int MemberCount { get; internal set; } + private Organization() { } diff --git a/src/EventHub.EntityFrameworkCore/Migrations/20210727070707_Added_MemberCount_To_Organization.Designer.cs b/src/EventHub.EntityFrameworkCore/Migrations/20210727070707_Added_MemberCount_To_Organization.Designer.cs new file mode 100644 index 0000000..183e466 --- /dev/null +++ b/src/EventHub.EntityFrameworkCore/Migrations/20210727070707_Added_MemberCount_To_Organization.Designer.cs @@ -0,0 +1,2628 @@ +// +using System; +using EventHub.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using Volo.Abp.EntityFrameworkCore; + +namespace EventHub.Migrations +{ + [DbContext(typeof(EventHubDbContext))] + [Migration("20210727070707_Added_MemberCount_To_Organization")] + partial class Added_MemberCount_To_Organization + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.PostgreSql) + .HasAnnotation("Relational:MaxIdentifierLength", 63) + .HasAnnotation("ProductVersion", "5.0.8") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + modelBuilder.Entity("EventHub.Countries.Country", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("EhCountries"); + }); + + modelBuilder.Entity("EventHub.Events.Event", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("Capacity") + .HasColumnType("integer"); + + b.Property("City") + .HasMaxLength(32) + .HasColumnType("character varying(32)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CountryId") + .HasColumnType("uuid"); + + b.Property("CountryName") + .HasColumnType("text"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("EndTime") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsEmailSentToMembers") + .HasColumnType("boolean"); + + b.Property("IsOnline") + .HasColumnType("boolean"); + + b.Property("IsRemindingEmailSent") + .HasColumnType("boolean"); + + b.Property("IsTimingChangeEmailSent") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(true); + + b.Property("Language") + .HasMaxLength(16) + .HasColumnType("character varying(16)"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("OnlineLink") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("OrganizationId") + .HasColumnType("uuid"); + + b.Property("StartTime") + .HasColumnType("timestamp without time zone"); + + b.Property("TimingChangeCount") + .HasColumnType("integer"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Url") + .IsRequired() + .HasMaxLength(69) + .HasColumnType("character varying(69)"); + + b.Property("UrlCode") + .IsRequired() + .HasMaxLength(8) + .HasColumnType("character varying(8)"); + + b.HasKey("Id"); + + b.HasIndex("CountryId"); + + b.HasIndex("IsEmailSentToMembers"); + + b.HasIndex("StartTime"); + + b.HasIndex("UrlCode"); + + b.HasIndex("IsRemindingEmailSent", "StartTime"); + + b.HasIndex("OrganizationId", "StartTime"); + + b.ToTable("EhEvents"); + }); + + modelBuilder.Entity("EventHub.Events.Registrations.EventRegistration", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("EventId") + .HasColumnType("uuid"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.HasIndex("EventId", "UserId"); + + b.ToTable("EhEventRegistrations"); + }); + + modelBuilder.Entity("EventHub.Organizations.Memberships.OrganizationMembership", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("OrganizationId") + .HasColumnType("uuid"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.HasIndex("OrganizationId", "UserId"); + + b.ToTable("EhOrganizationMemberships"); + }); + + modelBuilder.Entity("EventHub.Organizations.Organization", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .IsRequired() + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("FacebookUsername") + .HasColumnType("text"); + + b.Property("GitHubUsername") + .HasColumnType("text"); + + b.Property("InstagramUsername") + .HasColumnType("text"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("MediumUsername") + .HasColumnType("text"); + + b.Property("MemberCount") + .HasColumnType("integer"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("character varying(32)"); + + b.Property("OwnerUserId") + .HasColumnType("uuid"); + + b.Property("TwitterUsername") + .HasColumnType("text"); + + b.Property("Website") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("DisplayName"); + + b.HasIndex("Name"); + + b.HasIndex("OwnerUserId"); + + b.ToTable("EhOrganizations"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("character varying(96)") + .HasColumnName("ApplicationName"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .HasColumnName("BrowserInfo"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("ClientId"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("ClientIpAddress"); + + b.Property("ClientName") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("ClientName"); + + b.Property("Comments") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("Comments"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("CorrelationId"); + + b.Property("Exceptions") + .HasColumnType("text"); + + b.Property("ExecutionDuration") + .HasColumnType("integer") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("HttpMethod") + .HasMaxLength(16) + .HasColumnType("character varying(16)") + .HasColumnName("HttpMethod"); + + b.Property("HttpStatusCode") + .HasColumnType("integer") + .HasColumnName("HttpStatusCode"); + + b.Property("ImpersonatorTenantId") + .HasColumnType("uuid") + .HasColumnName("ImpersonatorTenantId"); + + b.Property("ImpersonatorUserId") + .HasColumnType("uuid") + .HasColumnName("ImpersonatorUserId"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasColumnType("text"); + + b.Property("Url") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("Url"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("UserId"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "ExecutionTime"); + + b.HasIndex("TenantId", "UserId", "ExecutionTime"); + + b.ToTable("AbpAuditLogs"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AuditLogId") + .HasColumnType("uuid") + .HasColumnName("AuditLogId"); + + b.Property("ExecutionDuration") + .HasColumnType("integer") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("ExecutionTime"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("MethodName") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("MethodName"); + + b.Property("Parameters") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)") + .HasColumnName("Parameters"); + + b.Property("ServiceName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("ServiceName"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime"); + + b.ToTable("AbpAuditLogActions"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AuditLogId") + .HasColumnType("uuid") + .HasColumnName("AuditLogId"); + + b.Property("ChangeTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("ChangeTime"); + + b.Property("ChangeType") + .HasColumnType("smallint") + .HasColumnName("ChangeType"); + + b.Property("EntityId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("EntityId"); + + b.Property("EntityTenantId") + .HasColumnType("uuid"); + + b.Property("EntityTypeFullName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("EntityTypeFullName"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "EntityTypeFullName", "EntityId"); + + b.ToTable("AbpEntityChanges"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("EntityChangeId") + .HasColumnType("uuid"); + + b.Property("NewValue") + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .HasColumnName("NewValue"); + + b.Property("OriginalValue") + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .HasColumnName("OriginalValue"); + + b.Property("PropertyName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("PropertyName"); + + b.Property("PropertyTypeFullName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("PropertyTypeFullName"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("EntityChangeId"); + + b.ToTable("AbpEntityPropertyChanges"); + }); + + modelBuilder.Entity("Volo.Abp.BackgroundJobs.BackgroundJobRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsAbandoned") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("JobArgs") + .IsRequired() + .HasMaxLength(1048576) + .HasColumnType("character varying(1048576)"); + + b.Property("JobName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("LastTryTime") + .HasColumnType("timestamp without time zone"); + + b.Property("NextTryTime") + .HasColumnType("timestamp without time zone"); + + b.Property("Priority") + .ValueGeneratedOnAdd() + .HasColumnType("smallint") + .HasDefaultValue((byte)15); + + b.Property("TryCount") + .ValueGeneratedOnAdd() + .HasColumnType("smallint") + .HasDefaultValue((short)0); + + b.HasKey("Id"); + + b.HasIndex("IsAbandoned", "NextTryTime"); + + b.ToTable("AbpBackgroundJobs"); + }); + + modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ContainerId") + .HasColumnType("uuid"); + + b.Property("Content") + .HasMaxLength(2147483647) + .HasColumnType("bytea"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("ContainerId"); + + b.HasIndex("TenantId", "ContainerId", "Name"); + + b.ToTable("AbpBlobs"); + }); + + modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlobContainer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name"); + + b.ToTable("AbpBlobContainers"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsStatic") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Regex") + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("RegexDescription") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Required") + .HasColumnType("boolean"); + + b.Property("ValueType") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("AbpClaimTypes"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityLinkUser", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("SourceTenantId") + .HasColumnType("uuid"); + + b.Property("SourceUserId") + .HasColumnType("uuid"); + + b.Property("TargetTenantId") + .HasColumnType("uuid"); + + b.Property("TargetUserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId") + .IsUnique(); + + b.ToTable("AbpLinkUsers"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDefault") + .HasColumnType("boolean") + .HasColumnName("IsDefault"); + + b.Property("IsPublic") + .HasColumnType("boolean") + .HasColumnName("IsPublic"); + + b.Property("IsStatic") + .HasColumnType("boolean") + .HasColumnName("IsStatic"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName"); + + b.ToTable("AbpRoles"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AbpRoleClaims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("Action") + .HasMaxLength(96) + .HasColumnType("character varying(96)"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("character varying(96)"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Identity") + .HasMaxLength(96) + .HasColumnType("character varying(96)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Action"); + + b.HasIndex("TenantId", "ApplicationName"); + + b.HasIndex("TenantId", "Identity"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSecurityLogs"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("AccessFailedCount") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(0) + .HasColumnName("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("Email"); + + b.Property("EmailConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsExternal") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsExternal"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("LockoutEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("LockoutEnabled"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("Name"); + + b.Property("NormalizedEmail") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("NormalizedEmail"); + + b.Property("NormalizedUserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("NormalizedUserName"); + + b.Property("PasswordHash") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("PasswordHash"); + + b.Property("PhoneNumber") + .HasMaxLength(16) + .HasColumnType("character varying(16)") + .HasColumnName("PhoneNumber"); + + b.Property("PhoneNumberConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); + + b.Property("SecurityStamp") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("SecurityStamp"); + + b.Property("Surname") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("Surname"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("TwoFactorEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("TwoFactorEnabled"); + + b.Property("UserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("Email"); + + b.HasIndex("NormalizedEmail"); + + b.HasIndex("NormalizedUserName"); + + b.HasIndex("UserName"); + + b.ToTable("AbpUsers"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AbpUserClaims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ProviderDisplayName") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(196) + .HasColumnType("character varying(196)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "LoginProvider"); + + b.HasIndex("LoginProvider", "ProviderKey"); + + b.ToTable("AbpUserLogins"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uuid"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "UserId"); + + b.HasIndex("UserId", "OrganizationUnitId"); + + b.ToTable("AbpUserOrganizationUnits"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId"); + + b.ToTable("AbpUserRoles"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AbpUserTokens"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(95) + .HasColumnType("character varying(95)") + .HasColumnName("Code"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("DisplayName"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("ParentId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("Code"); + + b.HasIndex("ParentId"); + + b.ToTable("AbpOrganizationUnits"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uuid"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "RoleId"); + + b.HasIndex("RoleId", "OrganizationUnitId"); + + b.ToTable("AbpOrganizationUnitRoles"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResource", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AllowedAccessTokenSigningAlgorithms") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("DisplayName") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ShowInDiscoveryDocument") + .HasColumnType("boolean"); + + b.HasKey("Id"); + + b.ToTable("IdentityServerApiResources"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceClaim", b => + { + b.Property("ApiResourceId") + .HasColumnType("uuid"); + + b.Property("Type") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.HasKey("ApiResourceId", "Type"); + + b.ToTable("IdentityServerApiResourceClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceProperty", b => + { + b.Property("ApiResourceId") + .HasColumnType("uuid"); + + b.Property("Key") + .HasMaxLength(250) + .HasColumnType("character varying(250)"); + + b.Property("Value") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.HasKey("ApiResourceId", "Key", "Value"); + + b.ToTable("IdentityServerApiResourceProperties"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceScope", b => + { + b.Property("ApiResourceId") + .HasColumnType("uuid"); + + b.Property("Scope") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.HasKey("ApiResourceId", "Scope"); + + b.ToTable("IdentityServerApiResourceScopes"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceSecret", b => + { + b.Property("ApiResourceId") + .HasColumnType("uuid"); + + b.Property("Type") + .HasMaxLength(250) + .HasColumnType("character varying(250)"); + + b.Property("Value") + .HasMaxLength(4000) + .HasColumnType("character varying(4000)"); + + b.Property("Description") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("Expiration") + .HasColumnType("timestamp without time zone"); + + b.HasKey("ApiResourceId", "Type", "Value"); + + b.ToTable("IdentityServerApiResourceSecrets"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScope", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("DisplayName") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Emphasize") + .HasColumnType("boolean"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Required") + .HasColumnType("boolean"); + + b.Property("ShowInDiscoveryDocument") + .HasColumnType("boolean"); + + b.HasKey("Id"); + + b.ToTable("IdentityServerApiScopes"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScopeClaim", b => + { + b.Property("ApiScopeId") + .HasColumnType("uuid"); + + b.Property("Type") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.HasKey("ApiScopeId", "Type"); + + b.ToTable("IdentityServerApiScopeClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScopeProperty", b => + { + b.Property("ApiScopeId") + .HasColumnType("uuid"); + + b.Property("Key") + .HasMaxLength(250) + .HasColumnType("character varying(250)"); + + b.Property("Value") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.HasKey("ApiScopeId", "Key", "Value"); + + b.ToTable("IdentityServerApiScopeProperties"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.Client", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AbsoluteRefreshTokenLifetime") + .HasColumnType("integer"); + + b.Property("AccessTokenLifetime") + .HasColumnType("integer"); + + b.Property("AccessTokenType") + .HasColumnType("integer"); + + b.Property("AllowAccessTokensViaBrowser") + .HasColumnType("boolean"); + + b.Property("AllowOfflineAccess") + .HasColumnType("boolean"); + + b.Property("AllowPlainTextPkce") + .HasColumnType("boolean"); + + b.Property("AllowRememberConsent") + .HasColumnType("boolean"); + + b.Property("AllowedIdentityTokenSigningAlgorithms") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("AlwaysIncludeUserClaimsInIdToken") + .HasColumnType("boolean"); + + b.Property("AlwaysSendClientClaims") + .HasColumnType("boolean"); + + b.Property("AuthorizationCodeLifetime") + .HasColumnType("integer"); + + b.Property("BackChannelLogoutSessionRequired") + .HasColumnType("boolean"); + + b.Property("BackChannelLogoutUri") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("ClientClaimsPrefix") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ClientId") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ClientName") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ClientUri") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ConsentLifetime") + .HasColumnType("integer"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("DeviceCodeLifetime") + .HasColumnType("integer"); + + b.Property("EnableLocalLogin") + .HasColumnType("boolean"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("FrontChannelLogoutSessionRequired") + .HasColumnType("boolean"); + + b.Property("FrontChannelLogoutUri") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("IdentityTokenLifetime") + .HasColumnType("integer"); + + b.Property("IncludeJwtId") + .HasColumnType("boolean"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("LogoUri") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("PairWiseSubjectSalt") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProtocolType") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("RefreshTokenExpiration") + .HasColumnType("integer"); + + b.Property("RefreshTokenUsage") + .HasColumnType("integer"); + + b.Property("RequireClientSecret") + .HasColumnType("boolean"); + + b.Property("RequireConsent") + .HasColumnType("boolean"); + + b.Property("RequirePkce") + .HasColumnType("boolean"); + + b.Property("RequireRequestObject") + .HasColumnType("boolean"); + + b.Property("SlidingRefreshTokenLifetime") + .HasColumnType("integer"); + + b.Property("UpdateAccessTokenClaimsOnRefresh") + .HasColumnType("boolean"); + + b.Property("UserCodeType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("UserSsoLifetime") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.ToTable("IdentityServerClients"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientClaim", b => + { + b.Property("ClientId") + .HasColumnType("uuid"); + + b.Property("Type") + .HasMaxLength(250) + .HasColumnType("character varying(250)"); + + b.Property("Value") + .HasMaxLength(250) + .HasColumnType("character varying(250)"); + + b.HasKey("ClientId", "Type", "Value"); + + b.ToTable("IdentityServerClientClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientCorsOrigin", b => + { + b.Property("ClientId") + .HasColumnType("uuid"); + + b.Property("Origin") + .HasMaxLength(150) + .HasColumnType("character varying(150)"); + + b.HasKey("ClientId", "Origin"); + + b.ToTable("IdentityServerClientCorsOrigins"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientGrantType", b => + { + b.Property("ClientId") + .HasColumnType("uuid"); + + b.Property("GrantType") + .HasMaxLength(250) + .HasColumnType("character varying(250)"); + + b.HasKey("ClientId", "GrantType"); + + b.ToTable("IdentityServerClientGrantTypes"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientIdPRestriction", b => + { + b.Property("ClientId") + .HasColumnType("uuid"); + + b.Property("Provider") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.HasKey("ClientId", "Provider"); + + b.ToTable("IdentityServerClientIdPRestrictions"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientPostLogoutRedirectUri", b => + { + b.Property("ClientId") + .HasColumnType("uuid"); + + b.Property("PostLogoutRedirectUri") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.HasKey("ClientId", "PostLogoutRedirectUri"); + + b.ToTable("IdentityServerClientPostLogoutRedirectUris"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientProperty", b => + { + b.Property("ClientId") + .HasColumnType("uuid"); + + b.Property("Key") + .HasMaxLength(250) + .HasColumnType("character varying(250)"); + + b.Property("Value") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.HasKey("ClientId", "Key", "Value"); + + b.ToTable("IdentityServerClientProperties"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientRedirectUri", b => + { + b.Property("ClientId") + .HasColumnType("uuid"); + + b.Property("RedirectUri") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.HasKey("ClientId", "RedirectUri"); + + b.ToTable("IdentityServerClientRedirectUris"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientScope", b => + { + b.Property("ClientId") + .HasColumnType("uuid"); + + b.Property("Scope") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.HasKey("ClientId", "Scope"); + + b.ToTable("IdentityServerClientScopes"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientSecret", b => + { + b.Property("ClientId") + .HasColumnType("uuid"); + + b.Property("Type") + .HasMaxLength(250) + .HasColumnType("character varying(250)"); + + b.Property("Value") + .HasMaxLength(4000) + .HasColumnType("character varying(4000)"); + + b.Property("Description") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("Expiration") + .HasColumnType("timestamp without time zone"); + + b.HasKey("ClientId", "Type", "Value"); + + b.ToTable("IdentityServerClientSecrets"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Devices.DeviceFlowCodes", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ClientId") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("Data") + .IsRequired() + .HasMaxLength(50000) + .HasColumnType("character varying(50000)"); + + b.Property("Description") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("DeviceCode") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Expiration") + .IsRequired() + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("SessionId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("SubjectId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("UserCode") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.HasKey("Id"); + + b.HasIndex("DeviceCode") + .IsUnique(); + + b.HasIndex("Expiration"); + + b.HasIndex("UserCode"); + + b.ToTable("IdentityServerDeviceFlowCodes"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Grants.PersistedGrant", b => + { + b.Property("Key") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ClientId") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ConsumedTime") + .HasColumnType("timestamp without time zone"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone"); + + b.Property("Data") + .IsRequired() + .HasMaxLength(50000) + .HasColumnType("character varying(50000)"); + + b.Property("Description") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Expiration") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("SessionId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("SubjectId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.HasKey("Key"); + + b.HasIndex("Expiration"); + + b.HasIndex("SubjectId", "ClientId", "Type"); + + b.HasIndex("SubjectId", "SessionId", "Type"); + + b.ToTable("IdentityServerPersistedGrants"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResource", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("DisplayName") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Emphasize") + .HasColumnType("boolean"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Required") + .HasColumnType("boolean"); + + b.Property("ShowInDiscoveryDocument") + .HasColumnType("boolean"); + + b.HasKey("Id"); + + b.ToTable("IdentityServerIdentityResources"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResourceClaim", b => + { + b.Property("IdentityResourceId") + .HasColumnType("uuid"); + + b.Property("Type") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.HasKey("IdentityResourceId", "Type"); + + b.ToTable("IdentityServerIdentityResourceClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResourceProperty", b => + { + b.Property("IdentityResourceId") + .HasColumnType("uuid"); + + b.Property("Key") + .HasMaxLength(250) + .HasColumnType("character varying(250)"); + + b.Property("Value") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.HasKey("IdentityResourceId", "Key", "Value"); + + b.ToTable("IdentityServerIdentityResourceProperties"); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ProviderName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey"); + + b.ToTable("AbpPermissionGrants"); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey"); + + b.ToTable("AbpSettings"); + }); + + modelBuilder.Entity("EventHub.Events.Event", b => + { + b.HasOne("EventHub.Countries.Country", null) + .WithMany() + .HasForeignKey("CountryId") + .OnDelete(DeleteBehavior.NoAction); + + b.HasOne("EventHub.Organizations.Organization", null) + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + }); + + modelBuilder.Entity("EventHub.Events.Registrations.EventRegistration", b => + { + b.HasOne("EventHub.Events.Event", null) + .WithMany() + .HasForeignKey("EventId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + }); + + modelBuilder.Entity("EventHub.Organizations.Memberships.OrganizationMembership", b => + { + b.HasOne("EventHub.Organizations.Organization", null) + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + }); + + modelBuilder.Entity("EventHub.Organizations.Organization", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("OwnerUserId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("Actions") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("EntityChanges") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.EntityChange", null) + .WithMany("PropertyChanges") + .HasForeignKey("EntityChangeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlob", b => + { + b.HasOne("Volo.Abp.BlobStoring.Database.DatabaseBlobContainer", null) + .WithMany() + .HasForeignKey("ContainerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Claims") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Logins") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("OrganizationUnits") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Roles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Tokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("ParentId"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany("Roles") + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceClaim", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) + .WithMany("UserClaims") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceProperty", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) + .WithMany("Properties") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceScope", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) + .WithMany("Scopes") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceSecret", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) + .WithMany("Secrets") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScopeClaim", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiScope", null) + .WithMany("UserClaims") + .HasForeignKey("ApiScopeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScopeProperty", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiScope", null) + .WithMany("Properties") + .HasForeignKey("ApiScopeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientClaim", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) + .WithMany("Claims") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientCorsOrigin", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) + .WithMany("AllowedCorsOrigins") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientGrantType", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) + .WithMany("AllowedGrantTypes") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientIdPRestriction", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) + .WithMany("IdentityProviderRestrictions") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientPostLogoutRedirectUri", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) + .WithMany("PostLogoutRedirectUris") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientProperty", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) + .WithMany("Properties") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientRedirectUri", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) + .WithMany("RedirectUris") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientScope", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) + .WithMany("AllowedScopes") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientSecret", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) + .WithMany("ClientSecrets") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResourceClaim", b => + { + b.HasOne("Volo.Abp.IdentityServer.IdentityResources.IdentityResource", null) + .WithMany("UserClaims") + .HasForeignKey("IdentityResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResourceProperty", b => + { + b.HasOne("Volo.Abp.IdentityServer.IdentityResources.IdentityResource", null) + .WithMany("Properties") + .HasForeignKey("IdentityResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Navigation("Actions"); + + b.Navigation("EntityChanges"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Navigation("PropertyChanges"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Navigation("Claims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("OrganizationUnits"); + + b.Navigation("Roles"); + + b.Navigation("Tokens"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Navigation("Roles"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResource", b => + { + b.Navigation("Properties"); + + b.Navigation("Scopes"); + + b.Navigation("Secrets"); + + b.Navigation("UserClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScope", b => + { + b.Navigation("Properties"); + + b.Navigation("UserClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.Client", b => + { + b.Navigation("AllowedCorsOrigins"); + + b.Navigation("AllowedGrantTypes"); + + b.Navigation("AllowedScopes"); + + b.Navigation("Claims"); + + b.Navigation("ClientSecrets"); + + b.Navigation("IdentityProviderRestrictions"); + + b.Navigation("PostLogoutRedirectUris"); + + b.Navigation("Properties"); + + b.Navigation("RedirectUris"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResource", b => + { + b.Navigation("Properties"); + + b.Navigation("UserClaims"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/EventHub.EntityFrameworkCore/Migrations/20210727070707_Added_MemberCount_To_Organization.cs b/src/EventHub.EntityFrameworkCore/Migrations/20210727070707_Added_MemberCount_To_Organization.cs new file mode 100644 index 0000000..d926cb7 --- /dev/null +++ b/src/EventHub.EntityFrameworkCore/Migrations/20210727070707_Added_MemberCount_To_Organization.cs @@ -0,0 +1,24 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace EventHub.Migrations +{ + public partial class Added_MemberCount_To_Organization : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "MemberCount", + table: "EhOrganizations", + type: "integer", + nullable: false, + defaultValue: 0); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "MemberCount", + table: "EhOrganizations"); + } + } +} diff --git a/src/EventHub.EntityFrameworkCore/Migrations/EventHubDbContextModelSnapshot.cs b/src/EventHub.EntityFrameworkCore/Migrations/EventHubDbContextModelSnapshot.cs index c1e1de6..9e891c7 100644 --- a/src/EventHub.EntityFrameworkCore/Migrations/EventHubDbContextModelSnapshot.cs +++ b/src/EventHub.EntityFrameworkCore/Migrations/EventHubDbContextModelSnapshot.cs @@ -18,7 +18,7 @@ namespace EventHub.Migrations modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.PostgreSql) .HasAnnotation("Relational:MaxIdentifierLength", 63) - .HasAnnotation("ProductVersion", "5.0.7") + .HasAnnotation("ProductVersion", "5.0.8") .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); modelBuilder.Entity("EventHub.Countries.Country", b => @@ -310,6 +310,9 @@ namespace EventHub.Migrations b.Property("MediumUsername") .HasColumnType("text"); + b.Property("MemberCount") + .HasColumnType("integer"); + b.Property("Name") .IsRequired() .HasMaxLength(32) From 891e62cc44141a36e854dd5e10ad51327f07b485 Mon Sep 17 00:00:00 2001 From: Berkan Sasmaz Date: Tue, 27 Jul 2021 17:16:51 +0300 Subject: [PATCH 3/9] Create OrganizationMembershipChangedEventHandler --- ...ganizationMembershipChangedEventHandler.cs | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 src/EventHub.Domain/Organizations/Memberships/OrganizationMembershipChangedEventHandler.cs diff --git a/src/EventHub.Domain/Organizations/Memberships/OrganizationMembershipChangedEventHandler.cs b/src/EventHub.Domain/Organizations/Memberships/OrganizationMembershipChangedEventHandler.cs new file mode 100644 index 0000000..4625fd1 --- /dev/null +++ b/src/EventHub.Domain/Organizations/Memberships/OrganizationMembershipChangedEventHandler.cs @@ -0,0 +1,40 @@ +using System; +using System.Threading.Tasks; +using EventHub.Organizations; +using EventHub.Organizations.Memberships; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Entities.Events; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.EventBus; + +namespace EventHub.Domain.Organizations.Memberships +{ + public class OrganizationMembershipChangedEventHandler : ILocalEventHandler>, + ILocalEventHandler>, ITransientDependency + { + private readonly IRepository _organizationRepository; + + public OrganizationMembershipChangedEventHandler(IRepository organizationRepository) + { + _organizationRepository = organizationRepository; + } + + public async Task HandleEventAsync(EntityCreatedEventData eventData) + { + var organization = await _organizationRepository.GetAsync(eventData.Entity.OrganizationId); + + organization.MemberCount++; + + await _organizationRepository.UpdateAsync(organization); + } + + public async Task HandleEventAsync(EntityDeletedEventData eventData) + { + var organization = await _organizationRepository.GetAsync(eventData.Entity.OrganizationId); + + organization.MemberCount--; + + await _organizationRepository.UpdateAsync(organization); + } + } +} From a66596387cce4f5c739dda37931ff5f06abc64a3 Mon Sep 17 00:00:00 2001 From: Berkan Sasmaz Date: Tue, 27 Jul 2021 17:20:46 +0300 Subject: [PATCH 4/9] Feature(Admin-Backend): Create necessary backend for organization admin ui --- .../Organizations/IOrganizationAppService.cs | 19 +++ .../Organizations/OrganizationInListDto.cs | 14 ++ .../OrganizationListFilterDto.cs | 16 ++ .../Organizations/OrganizationProfileDto.cs | 32 ++++ .../Organizations/UpdateOrganizationDto.cs | 45 ++++++ .../EventHubPermissionDefinitionProvider.cs | 8 +- .../Permissions/EventHubPermissions.cs | 9 +- .../EventHubAdminAppService.cs | 13 ++ .../EventHubAdminApplicationModule.cs | 11 +- .../EventHubApplicationAutoMapperProfile.cs | 20 +++ .../Organizations/OrganizationAppService.cs | 138 ++++++++++++++++++ .../Controllers/OrganizationController.cs | 50 +++++++ .../EventHubBlazorAutoMapperProfile.cs | 3 +- .../Organizations/OrganizationContst.cs | 3 +- 14 files changed, 373 insertions(+), 8 deletions(-) create mode 100644 src/EventHub.Admin.Application.Contracts/Organizations/IOrganizationAppService.cs create mode 100644 src/EventHub.Admin.Application.Contracts/Organizations/OrganizationInListDto.cs create mode 100644 src/EventHub.Admin.Application.Contracts/Organizations/OrganizationListFilterDto.cs create mode 100644 src/EventHub.Admin.Application.Contracts/Organizations/OrganizationProfileDto.cs create mode 100644 src/EventHub.Admin.Application.Contracts/Organizations/UpdateOrganizationDto.cs create mode 100644 src/EventHub.Admin.Application/EventHubAdminAppService.cs create mode 100644 src/EventHub.Admin.Application/EventHubApplicationAutoMapperProfile.cs create mode 100644 src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs create mode 100644 src/EventHub.Admin.HttpApi.Host/Controllers/OrganizationController.cs diff --git a/src/EventHub.Admin.Application.Contracts/Organizations/IOrganizationAppService.cs b/src/EventHub.Admin.Application.Contracts/Organizations/IOrganizationAppService.cs new file mode 100644 index 0000000..e2ac1ce --- /dev/null +++ b/src/EventHub.Admin.Application.Contracts/Organizations/IOrganizationAppService.cs @@ -0,0 +1,19 @@ +using System; +using System.Threading.Tasks; +using EventHub.Admin.Application.Contracts.Organizations; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; + +namespace EventHub.Admin.Organizations +{ + public interface IOrganizationAppService : IApplicationService + { + Task> GetListAsync(OrganizationListFilterDto input); + + Task GetAsync(Guid id); + + Task UpdateAsync(Guid id, UpdateOrganizationDto input); + + Task DeleteAsync(Guid id); + } +} diff --git a/src/EventHub.Admin.Application.Contracts/Organizations/OrganizationInListDto.cs b/src/EventHub.Admin.Application.Contracts/Organizations/OrganizationInListDto.cs new file mode 100644 index 0000000..796ed3d --- /dev/null +++ b/src/EventHub.Admin.Application.Contracts/Organizations/OrganizationInListDto.cs @@ -0,0 +1,14 @@ +using System; +using Volo.Abp.Application.Dtos; + +namespace EventHub.Admin.Organizations +{ + public class OrganizationInListDto : EntityDto + { + public string Name { get; set; } + + public string DisplayName { get; set; } + + public int MemberCount { get; set; } + } +} diff --git a/src/EventHub.Admin.Application.Contracts/Organizations/OrganizationListFilterDto.cs b/src/EventHub.Admin.Application.Contracts/Organizations/OrganizationListFilterDto.cs new file mode 100644 index 0000000..d9acaf1 --- /dev/null +++ b/src/EventHub.Admin.Application.Contracts/Organizations/OrganizationListFilterDto.cs @@ -0,0 +1,16 @@ +using System; +using Volo.Abp.Application.Dtos; + +namespace EventHub.Admin.Application.Contracts.Organizations +{ + public class OrganizationListFilterDto : PagedAndSortedResultRequestDto + { + public string? Name { get; set; } + + public string? DisplayName { get; set; } + + public int? MinMemberCount { get; set; } + + public int? MaxMemberCount { get; set; } + } +} diff --git a/src/EventHub.Admin.Application.Contracts/Organizations/OrganizationProfileDto.cs b/src/EventHub.Admin.Application.Contracts/Organizations/OrganizationProfileDto.cs new file mode 100644 index 0000000..86b469c --- /dev/null +++ b/src/EventHub.Admin.Application.Contracts/Organizations/OrganizationProfileDto.cs @@ -0,0 +1,32 @@ +using System; +using Volo.Abp.Application.Dtos; + +namespace EventHub.Admin.Organizations +{ + public class OrganizationProfileDto : EntityDto + { + public string Name { get; set; } + + public string DisplayName { get; set; } + + public byte[] ProfilePictureContent { get; set; } + + public string OwnerUserName { get; set; } + + public string OwnerEmail { get; set; } + + public string Description { get; set; } + + public string Website { get; set; } + + public string TwitterUsername { get; set; } + + public string GitHubUsername { get; set; } + + public string FacebookUsername { get; set; } + + public string InstagramUsername { get; set; } + + public string MediumUsername { get; set; } + } +} \ No newline at end of file diff --git a/src/EventHub.Admin.Application.Contracts/Organizations/UpdateOrganizationDto.cs b/src/EventHub.Admin.Application.Contracts/Organizations/UpdateOrganizationDto.cs new file mode 100644 index 0000000..fcc0ce9 --- /dev/null +++ b/src/EventHub.Admin.Application.Contracts/Organizations/UpdateOrganizationDto.cs @@ -0,0 +1,45 @@ +using System; +using System.ComponentModel.DataAnnotations; +using EventHub.Organizations; +using JetBrains.Annotations; + +namespace EventHub.Admin.Organizations +{ + public class UpdateOrganizationDto + { + [Required] + [StringLength(OrganizationConsts.MaxDisplayNameLength, MinimumLength = OrganizationConsts.MinDisplayNameLength)] + public string DisplayName { get; set; } + + [Required] + [StringLength(OrganizationConsts.MaxDescriptionNameLength, MinimumLength = OrganizationConsts.MinDescriptionNameLength)] + public string Description { get; set; } + + [CanBeNull] + public byte[] ProfilePictureContent { get; set; } + + [CanBeNull] + [StringLength(OrganizationConsts.MaxWebsiteLength)] + public string Website { get; set; } + + [CanBeNull] + [StringLength(OrganizationConsts.MaxTwitterUsernameLength)] + public string TwitterUsername { get; set; } + + [CanBeNull] + [StringLength(OrganizationConsts.MaxGitHubUsernameLength)] + public string GitHubUsername { get; set; } + + [CanBeNull] + [StringLength(OrganizationConsts.MaxFacebookUsernameLength)] + public string FacebookUsername { get; set; } + + [CanBeNull] + [StringLength(OrganizationConsts.MaxInstagramUsernameLength)] + public string InstagramUsername { get; set; } + + [CanBeNull] + [StringLength(OrganizationConsts.MaxMediumUsernameLength)] + public string MediumUsername { get; set; } + } +} \ No newline at end of file diff --git a/src/EventHub.Admin.Application.Contracts/Permissions/EventHubPermissionDefinitionProvider.cs b/src/EventHub.Admin.Application.Contracts/Permissions/EventHubPermissionDefinitionProvider.cs index e0f7571..469f16e 100644 --- a/src/EventHub.Admin.Application.Contracts/Permissions/EventHubPermissionDefinitionProvider.cs +++ b/src/EventHub.Admin.Application.Contracts/Permissions/EventHubPermissionDefinitionProvider.cs @@ -8,10 +8,12 @@ namespace EventHub.Admin.Permissions { public override void Define(IPermissionDefinitionContext context) { - var myGroup = context.AddGroup(EventHubPermissions.GroupName); + var eventHubGroup = context.AddGroup(EventHubPermissions.GroupName); - //Define your own permissions here. Example: - //myGroup.AddPermission(EventHubPermissions.MyPermission1, L("Permission:MyPermission1")); + var tenantsPermission = eventHubGroup.AddPermission(EventHubPermissions.Organizations.Default, L("Permission:OrganizationManagement")); + tenantsPermission.AddChild(EventHubPermissions.Organizations.Create, L("Permission:Create")); + tenantsPermission.AddChild(EventHubPermissions.Organizations.Update, L("Permission:Edit")); + tenantsPermission.AddChild(EventHubPermissions.Organizations.Delete, L("Permission:Delete")); } private static LocalizableString L(string name) diff --git a/src/EventHub.Admin.Application.Contracts/Permissions/EventHubPermissions.cs b/src/EventHub.Admin.Application.Contracts/Permissions/EventHubPermissions.cs index b7fbe16..ecae825 100644 --- a/src/EventHub.Admin.Application.Contracts/Permissions/EventHubPermissions.cs +++ b/src/EventHub.Admin.Application.Contracts/Permissions/EventHubPermissions.cs @@ -4,7 +4,12 @@ { public const string GroupName = "EventHub"; - //Add your own permission names. Example: - //public const string MyPermission1 = GroupName + ".MyPermission1"; + public static class Organizations + { + public const string Default = GroupName + ".Organizations"; + public const string Create = Default + ".Create"; + public const string Update = Default + ".Update"; + public const string Delete = Default + ".Delete"; + } } } \ No newline at end of file diff --git a/src/EventHub.Admin.Application/EventHubAdminAppService.cs b/src/EventHub.Admin.Application/EventHubAdminAppService.cs new file mode 100644 index 0000000..3ef4f1b --- /dev/null +++ b/src/EventHub.Admin.Application/EventHubAdminAppService.cs @@ -0,0 +1,13 @@ +using EventHub.Localization; +using Volo.Abp.Application.Services; + +namespace EventHub.Admin.Application +{ + public class EventHubAdminAppService : ApplicationService + { + public EventHubAdminAppService() + { + LocalizationResource = typeof(EventHubResource); + } + } +} diff --git a/src/EventHub.Admin.Application/EventHubAdminApplicationModule.cs b/src/EventHub.Admin.Application/EventHubAdminApplicationModule.cs index b046665..64fc7dc 100644 --- a/src/EventHub.Admin.Application/EventHubAdminApplicationModule.cs +++ b/src/EventHub.Admin.Application/EventHubAdminApplicationModule.cs @@ -1,4 +1,5 @@ using Volo.Abp.Account; +using Volo.Abp.AutoMapper; using Volo.Abp.Identity; using Volo.Abp.Modularity; using Volo.Abp.PermissionManagement; @@ -10,9 +11,17 @@ namespace EventHub.Admin typeof(AbpAccountApplicationModule), typeof(EventHubAdminApplicationContractsModule), typeof(AbpIdentityApplicationModule), - typeof(AbpPermissionManagementApplicationModule) + typeof(AbpPermissionManagementApplicationModule), + typeof(AbpAutoMapperModule) )] public class EventHubAdminApplicationModule : AbpModule { + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.AddProfile(validate: true); + }); + } } } \ No newline at end of file diff --git a/src/EventHub.Admin.Application/EventHubApplicationAutoMapperProfile.cs b/src/EventHub.Admin.Application/EventHubApplicationAutoMapperProfile.cs new file mode 100644 index 0000000..6b20518 --- /dev/null +++ b/src/EventHub.Admin.Application/EventHubApplicationAutoMapperProfile.cs @@ -0,0 +1,20 @@ +using AutoMapper; +using EventHub.Admin.Organizations; +using EventHub.Organizations; +using Volo.Abp.AutoMapper; + +namespace EventHub.Admin +{ + public class EventHubAdminApplicationAutoMapperProfile : Profile + { + public EventHubAdminApplicationAutoMapperProfile() + { + CreateMap(); + + CreateMap() + .Ignore(x => x.OwnerUserName) + .Ignore(x => x.OwnerEmail) + .Ignore(x => x.ProfilePictureContent); + } + } +} diff --git a/src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs b/src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs new file mode 100644 index 0000000..fc164c1 --- /dev/null +++ b/src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs @@ -0,0 +1,138 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading.Tasks; +using EventHub.Admin.Application; +using EventHub.Admin.Application.Contracts.Organizations; +using EventHub.Admin.Permissions; +using EventHub.Organizations; +using EventHub.Organizations.Memberships; +using EventHub.Users; +using Microsoft.AspNetCore.Authorization; +using Volo.Abp.Application.Dtos; +using Volo.Abp.BlobStoring; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.Identity; +using Volo.Abp.Identity.Settings; + +namespace EventHub.Admin.Organizations +{ + [Authorize(EventHubPermissions.Organizations.Default)] + public class OrganizationAppService : EventHubAdminAppService, IOrganizationAppService + { + private readonly IRepository _organizationRepository; + private readonly IRepository _identityUserRepository; + private readonly IBlobContainer _organizationBlobContainer; + + public OrganizationAppService( + IRepository organizationRepository, + IRepository identityUserRepository, + IBlobContainer organizationBlobContainer) + { + _organizationRepository = organizationRepository; + _identityUserRepository = identityUserRepository; + _organizationBlobContainer = organizationBlobContainer; + } + + public async Task> GetListAsync(OrganizationListFilterDto input) + { + var query = await _organizationRepository.GetQueryableAsync(); + + if (!input.Name.IsNullOrWhiteSpace()) + { + query = query.Where(o => o.Name.Contains(input.Name)); + } + + if (!input.DisplayName.IsNullOrWhiteSpace()) + { + query = query.Where(o => o.DisplayName.Contains(input.DisplayName)); + } + + if (!input.DisplayName.IsNullOrWhiteSpace()) + { + query = query.Where(o => o.DisplayName.Contains(input.DisplayName)); + } + + if (input.MinMemberCount != null) + { + query = query.Where(o => o.MemberCount >= input.MinMemberCount); + } + + if (input.MaxMemberCount != null) + { + query = query.Where(o => o.MemberCount <= input.MaxMemberCount); + } + + var totalCount = await AsyncExecuter.CountAsync(query); + + query = query.OrderBy(string.IsNullOrWhiteSpace(input.Sorting) ? OrganizationConsts.DefaultSorting : input.Sorting); + + query = query.PageBy(input); + + var organizationListDto = ObjectMapper + .Map, List>(await AsyncExecuter.ToListAsync(query)); + + return new PagedResultDto(totalCount, organizationListDto); + } + + public async Task GetAsync(Guid id) + { + var organization = await _organizationRepository.GetAsync(id); + + var dto = ObjectMapper.Map(organization); + + var user = await _identityUserRepository.GetAsync(organization.OwnerUserId); + dto.OwnerUserName = user.UserName; + dto.OwnerEmail = user.Email; + + dto.ProfilePictureContent = await GetCoverImageAsync(id); + + return dto; + } + + public async Task UpdateAsync(Guid id, UpdateOrganizationDto input) + { + var organization = await _organizationRepository.GetAsync(id); + + organization.SetDisplayName(input.DisplayName); + organization.SetDescription(input.Description); + + organization.Website = input.Website; + organization.TwitterUsername = input.TwitterUsername; + organization.GitHubUsername = input.GitHubUsername; + organization.FacebookUsername = input.FacebookUsername; + organization.InstagramUsername = input.InstagramUsername; + organization.MediumUsername = input.MediumUsername; + + if (input.ProfilePictureContent?.Length > 0) + { + await SaveCoverImageAsync(organization.Id, input.ProfilePictureContent); + } + + await _organizationRepository.UpdateAsync(organization); + + return ObjectMapper.Map(organization); + } + + [Authorize(EventHubPermissions.Organizations.Delete)] + public async Task DeleteAsync(Guid id) + { + await _organizationRepository.DeleteAsync(id); + } + + private async Task GetCoverImageAsync(Guid id) + { + var blobName = id.ToString(); + + return await _organizationBlobContainer.GetAllBytesOrNullAsync(blobName); + } + + private async Task SaveCoverImageAsync(Guid id, byte[] coverImageContent) + { + var blobName = id.ToString(); + + await _organizationBlobContainer.SaveAsync(blobName, coverImageContent, overrideExisting: true); + } + } +} diff --git a/src/EventHub.Admin.HttpApi.Host/Controllers/OrganizationController.cs b/src/EventHub.Admin.HttpApi.Host/Controllers/OrganizationController.cs new file mode 100644 index 0000000..93984b7 --- /dev/null +++ b/src/EventHub.Admin.HttpApi.Host/Controllers/OrganizationController.cs @@ -0,0 +1,50 @@ +using System; +using System.Threading.Tasks; +using EventHub.Admin.Application.Contracts.Organizations; +using EventHub.Admin.Organizations; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.Application.Dtos; +using Volo.Abp.AspNetCore.Mvc; + +namespace EventHub.Admin.Controllers +{ + [Controller] + [Area("eventhub-admin")] + [ControllerName("Organization")] + [Route("/api/eventhub/organizations")] + public class OrganizationController : AbpController, IOrganizationAppService + { + private readonly IOrganizationAppService _organizationAppService; + + public OrganizationController(IOrganizationAppService organizationAppService) + { + _organizationAppService = organizationAppService; + } + + [HttpGet] + public Task> GetListAsync(OrganizationListFilterDto input) + { + return _organizationAppService.GetListAsync(input); + } + + [HttpGet] + [Route("{id}")] + public Task GetAsync(Guid id) + { + return _organizationAppService.GetAsync(id); + } + + [HttpPut] + public Task UpdateAsync(Guid id, UpdateOrganizationDto input) + { + return _organizationAppService.UpdateAsync(id, input); + } + + [HttpDelete] + [Route("{id}")] + public Task DeleteAsync(Guid id) + { + return _organizationAppService.DeleteAsync(id); + } + } +} \ No newline at end of file diff --git a/src/EventHub.Admin.Web/EventHubBlazorAutoMapperProfile.cs b/src/EventHub.Admin.Web/EventHubBlazorAutoMapperProfile.cs index 3cdc492..c0b5d01 100644 --- a/src/EventHub.Admin.Web/EventHubBlazorAutoMapperProfile.cs +++ b/src/EventHub.Admin.Web/EventHubBlazorAutoMapperProfile.cs @@ -1,4 +1,5 @@ using AutoMapper; +using EventHub.Admin.Organizations; namespace EventHub.Admin.Web { @@ -6,7 +7,7 @@ namespace EventHub.Admin.Web { public EventHubBlazorAutoMapperProfile() { - //Define your AutoMapper configuration here for the Blazor project. + CreateMap(); } } } diff --git a/src/EventHub.Domain.Shared/Organizations/OrganizationContst.cs b/src/EventHub.Domain.Shared/Organizations/OrganizationContst.cs index 7b9fedc..712dcf6 100644 --- a/src/EventHub.Domain.Shared/Organizations/OrganizationContst.cs +++ b/src/EventHub.Domain.Shared/Organizations/OrganizationContst.cs @@ -2,6 +2,8 @@ { public static class OrganizationConsts { + public const string DefaultSorting = "CreationTime desc"; + public const int MinNameLength = 2; public const int MaxNameLength = 32; @@ -24,6 +26,5 @@ public const int MaxInstagramUsernameLength = 24; public const int MaxMediumUsernameLength = 24; - } } From 7d3425c977a19d8cbdbb4344b68c24f78875647a Mon Sep 17 00:00:00 2001 From: Berkan Sasmaz Date: Wed, 28 Jul 2021 18:24:00 +0300 Subject: [PATCH 5/9] Feat(Admin): Manage organizations --- .../Organizations/IOrganizationAppService.cs | 1 - .../IOrganizationMembershipAppService.cs | 11 + .../Memberships/OrganizationMemberDto.cs | 16 ++ .../OrganizationMemberListFilterDto.cs | 12 + .../OrganizationListFilterDto.cs | 7 +- .../Organizations/UpdateOrganizationDto.cs | 1 - .../EventHubPermissionDefinitionProvider.cs | 9 +- .../Permissions/EventHubPermissions.cs | 5 + .../EventHubAdminAppService.cs | 4 +- .../EventHubApplicationAutoMapperProfile.cs | 4 + .../OrganizationMembershipAppService.cs | 52 ++++ .../Organizations/OrganizationAppService.cs | 19 +- .../OrganizationMembershipController.cs | 28 ++ .../OrganizationController.cs | 3 +- .../Menus/EventHubMenuContributor.cs | 20 +- src/EventHub.Admin.Web/Menus/EventHubMenus.cs | 8 +- .../Pages/OrganizationManagement.razor | 255 ++++++++++++++++++ .../Pages/OrganizationManagement.razor.cs | 162 +++++++++++ .../OrganizationMembershipManagement.razor | 63 +++++ .../OrganizationMembershipManagement.razor.cs | 76 ++++++ .../OrganizationMembershipAppService.cs | 1 - .../IOrganizationMembershipRepository.cs | 24 ++ .../OrganizationMembershipRepository.cs | 64 +++++ 23 files changed, 812 insertions(+), 33 deletions(-) create mode 100644 src/EventHub.Admin.Application.Contracts/Organizations/Memberships/IOrganizationMembershipAppService.cs create mode 100644 src/EventHub.Admin.Application.Contracts/Organizations/Memberships/OrganizationMemberDto.cs create mode 100644 src/EventHub.Admin.Application.Contracts/Organizations/Memberships/OrganizationMemberListFilterDto.cs create mode 100644 src/EventHub.Admin.Application/Organizations/Memberships/OrganizationMembershipAppService.cs create mode 100644 src/EventHub.Admin.HttpApi.Host/Controllers/Organizations/Memberships/OrganizationMembershipController.cs rename src/EventHub.Admin.HttpApi.Host/Controllers/{ => Organizations}/OrganizationController.cs (93%) create mode 100644 src/EventHub.Admin.Web/Pages/OrganizationManagement.razor create mode 100644 src/EventHub.Admin.Web/Pages/OrganizationManagement.razor.cs create mode 100644 src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor create mode 100644 src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor.cs create mode 100644 src/EventHub.Domain/Organizations/Memberships/IOrganizationMembershipRepository.cs create mode 100644 src/EventHub.EntityFrameworkCore/EntityFrameworkCore/Organizations/Memberships/OrganizationMembershipRepository.cs diff --git a/src/EventHub.Admin.Application.Contracts/Organizations/IOrganizationAppService.cs b/src/EventHub.Admin.Application.Contracts/Organizations/IOrganizationAppService.cs index e2ac1ce..0a1a715 100644 --- a/src/EventHub.Admin.Application.Contracts/Organizations/IOrganizationAppService.cs +++ b/src/EventHub.Admin.Application.Contracts/Organizations/IOrganizationAppService.cs @@ -1,6 +1,5 @@ using System; using System.Threading.Tasks; -using EventHub.Admin.Application.Contracts.Organizations; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; diff --git a/src/EventHub.Admin.Application.Contracts/Organizations/Memberships/IOrganizationMembershipAppService.cs b/src/EventHub.Admin.Application.Contracts/Organizations/Memberships/IOrganizationMembershipAppService.cs new file mode 100644 index 0000000..b471473 --- /dev/null +++ b/src/EventHub.Admin.Application.Contracts/Organizations/Memberships/IOrganizationMembershipAppService.cs @@ -0,0 +1,11 @@ +using System.Threading.Tasks; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; + +namespace EventHub.Admin.Organizations.Memberships +{ + public interface IOrganizationMembershipAppService : IApplicationService + { + Task> GetListAsync(OrganizationMemberListFilterDto input); + } +} \ No newline at end of file diff --git a/src/EventHub.Admin.Application.Contracts/Organizations/Memberships/OrganizationMemberDto.cs b/src/EventHub.Admin.Application.Contracts/Organizations/Memberships/OrganizationMemberDto.cs new file mode 100644 index 0000000..f356ca1 --- /dev/null +++ b/src/EventHub.Admin.Application.Contracts/Organizations/Memberships/OrganizationMemberDto.cs @@ -0,0 +1,16 @@ +using System; +using Volo.Abp.Application.Dtos; + +namespace EventHub.Admin.Organizations.Memberships +{ + public class OrganizationMemberDto : EntityDto + { + public string UserName { get; set; } + + public string Email { get; set; } + + public string Name { get; set; } + + public string Surname { get; set; } + } +} \ No newline at end of file diff --git a/src/EventHub.Admin.Application.Contracts/Organizations/Memberships/OrganizationMemberListFilterDto.cs b/src/EventHub.Admin.Application.Contracts/Organizations/Memberships/OrganizationMemberListFilterDto.cs new file mode 100644 index 0000000..8c6cce2 --- /dev/null +++ b/src/EventHub.Admin.Application.Contracts/Organizations/Memberships/OrganizationMemberListFilterDto.cs @@ -0,0 +1,12 @@ +using System; +using Volo.Abp.Application.Dtos; + +namespace EventHub.Admin.Organizations.Memberships +{ + public class OrganizationMemberListFilterDto : PagedResultRequestDto + { + public Guid? OrganizationId { get; set; } + + public string UserName { get; set; } + } +} \ No newline at end of file diff --git a/src/EventHub.Admin.Application.Contracts/Organizations/OrganizationListFilterDto.cs b/src/EventHub.Admin.Application.Contracts/Organizations/OrganizationListFilterDto.cs index d9acaf1..43c2a65 100644 --- a/src/EventHub.Admin.Application.Contracts/Organizations/OrganizationListFilterDto.cs +++ b/src/EventHub.Admin.Application.Contracts/Organizations/OrganizationListFilterDto.cs @@ -1,13 +1,12 @@ -using System; using Volo.Abp.Application.Dtos; -namespace EventHub.Admin.Application.Contracts.Organizations +namespace EventHub.Admin.Organizations { public class OrganizationListFilterDto : PagedAndSortedResultRequestDto { - public string? Name { get; set; } + public string Name { get; set; } - public string? DisplayName { get; set; } + public string DisplayName { get; set; } public int? MinMemberCount { get; set; } diff --git a/src/EventHub.Admin.Application.Contracts/Organizations/UpdateOrganizationDto.cs b/src/EventHub.Admin.Application.Contracts/Organizations/UpdateOrganizationDto.cs index fcc0ce9..c90c59b 100644 --- a/src/EventHub.Admin.Application.Contracts/Organizations/UpdateOrganizationDto.cs +++ b/src/EventHub.Admin.Application.Contracts/Organizations/UpdateOrganizationDto.cs @@ -1,4 +1,3 @@ -using System; using System.ComponentModel.DataAnnotations; using EventHub.Organizations; using JetBrains.Annotations; diff --git a/src/EventHub.Admin.Application.Contracts/Permissions/EventHubPermissionDefinitionProvider.cs b/src/EventHub.Admin.Application.Contracts/Permissions/EventHubPermissionDefinitionProvider.cs index 469f16e..b9790b9 100644 --- a/src/EventHub.Admin.Application.Contracts/Permissions/EventHubPermissionDefinitionProvider.cs +++ b/src/EventHub.Admin.Application.Contracts/Permissions/EventHubPermissionDefinitionProvider.cs @@ -10,10 +10,11 @@ namespace EventHub.Admin.Permissions { var eventHubGroup = context.AddGroup(EventHubPermissions.GroupName); - var tenantsPermission = eventHubGroup.AddPermission(EventHubPermissions.Organizations.Default, L("Permission:OrganizationManagement")); - tenantsPermission.AddChild(EventHubPermissions.Organizations.Create, L("Permission:Create")); - tenantsPermission.AddChild(EventHubPermissions.Organizations.Update, L("Permission:Edit")); - tenantsPermission.AddChild(EventHubPermissions.Organizations.Delete, L("Permission:Delete")); + var organizationsPermission = eventHubGroup.AddPermission(EventHubPermissions.Organizations.Default, L("Permission:OrganizationManagement")); + organizationsPermission.AddChild(EventHubPermissions.Organizations.Create, L("Permission:Create")); + organizationsPermission.AddChild(EventHubPermissions.Organizations.Update, L("Permission:Edit")); + organizationsPermission.AddChild(EventHubPermissions.Organizations.Delete, L("Permission:Delete")); + organizationsPermission.AddChild(EventHubPermissions.Organizations.Memberships.Default, L("Permission:MembershipManagement")); } private static LocalizableString L(string name) diff --git a/src/EventHub.Admin.Application.Contracts/Permissions/EventHubPermissions.cs b/src/EventHub.Admin.Application.Contracts/Permissions/EventHubPermissions.cs index ecae825..a1003bc 100644 --- a/src/EventHub.Admin.Application.Contracts/Permissions/EventHubPermissions.cs +++ b/src/EventHub.Admin.Application.Contracts/Permissions/EventHubPermissions.cs @@ -10,6 +10,11 @@ public const string Create = Default + ".Create"; public const string Update = Default + ".Update"; public const string Delete = Default + ".Delete"; + + public static class Memberships + { + public const string Default = Organizations.Default + ".Memberships"; + } } } } \ No newline at end of file diff --git a/src/EventHub.Admin.Application/EventHubAdminAppService.cs b/src/EventHub.Admin.Application/EventHubAdminAppService.cs index 3ef4f1b..5fd1056 100644 --- a/src/EventHub.Admin.Application/EventHubAdminAppService.cs +++ b/src/EventHub.Admin.Application/EventHubAdminAppService.cs @@ -1,11 +1,11 @@ using EventHub.Localization; using Volo.Abp.Application.Services; -namespace EventHub.Admin.Application +namespace EventHub.Admin { public class EventHubAdminAppService : ApplicationService { - public EventHubAdminAppService() + protected EventHubAdminAppService() { LocalizationResource = typeof(EventHubResource); } diff --git a/src/EventHub.Admin.Application/EventHubApplicationAutoMapperProfile.cs b/src/EventHub.Admin.Application/EventHubApplicationAutoMapperProfile.cs index 6b20518..6d40c34 100644 --- a/src/EventHub.Admin.Application/EventHubApplicationAutoMapperProfile.cs +++ b/src/EventHub.Admin.Application/EventHubApplicationAutoMapperProfile.cs @@ -1,7 +1,9 @@ using AutoMapper; using EventHub.Admin.Organizations; +using EventHub.Admin.Organizations.Memberships; using EventHub.Organizations; using Volo.Abp.AutoMapper; +using Volo.Abp.Identity; namespace EventHub.Admin { @@ -15,6 +17,8 @@ namespace EventHub.Admin .Ignore(x => x.OwnerUserName) .Ignore(x => x.OwnerEmail) .Ignore(x => x.ProfilePictureContent); + + CreateMap(); } } } diff --git a/src/EventHub.Admin.Application/Organizations/Memberships/OrganizationMembershipAppService.cs b/src/EventHub.Admin.Application/Organizations/Memberships/OrganizationMembershipAppService.cs new file mode 100644 index 0000000..6dbbb00 --- /dev/null +++ b/src/EventHub.Admin.Application/Organizations/Memberships/OrganizationMembershipAppService.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using EventHub.Admin.Permissions; +using EventHub.Organizations.Memberships; +using Microsoft.AspNetCore.Authorization; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; +using Volo.Abp.Domain.Entities; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.Identity; + + +namespace EventHub.Admin.Organizations.Memberships +{ + [Authorize(EventHubPermissions.Organizations.Memberships.Default)] + public class OrganizationMembershipAppService : ApplicationService, IOrganizationMembershipAppService + { + private readonly IOrganizationMembershipRepository _organizationMembershipRepository; + private readonly IRepository _userRepository; + + public OrganizationMembershipAppService( + IOrganizationMembershipRepository organizationMembershipRepository, + IRepository userRepository) + { + _organizationMembershipRepository = organizationMembershipRepository; + _userRepository = userRepository; + } + + public async Task> GetListAsync(OrganizationMemberListFilterDto input) + { + IdentityUser user = null; + if (!input.UserName.IsNullOrWhiteSpace()) + { + input.UserName = input.UserName.ToLower(); + user = await _userRepository.SingleOrDefaultAsync(x => x.UserName.ToLower().Contains(input.UserName)); + if (user is null) + { + throw new EntityNotFoundException(typeof(IdentityUser), input.UserName); + } + } + + var members = await _organizationMembershipRepository.GetMemberListAsync(input.OrganizationId, user?.Id, input.SkipCount, input.MaxResultCount); + var totalCount = await _organizationMembershipRepository.GetCountAsync(input.OrganizationId, user?.Id); + + return new PagedResultDto( + totalCount, + ObjectMapper.Map, List>(members) + ); + } + } +} \ No newline at end of file diff --git a/src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs b/src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs index fc164c1..79c3c5c 100644 --- a/src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs +++ b/src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs @@ -3,18 +3,13 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Dynamic.Core; using System.Threading.Tasks; -using EventHub.Admin.Application; -using EventHub.Admin.Application.Contracts.Organizations; using EventHub.Admin.Permissions; using EventHub.Organizations; -using EventHub.Organizations.Memberships; -using EventHub.Users; using Microsoft.AspNetCore.Authorization; using Volo.Abp.Application.Dtos; using Volo.Abp.BlobStoring; using Volo.Abp.Domain.Repositories; using Volo.Abp.Identity; -using Volo.Abp.Identity.Settings; namespace EventHub.Admin.Organizations { @@ -41,17 +36,14 @@ namespace EventHub.Admin.Organizations if (!input.Name.IsNullOrWhiteSpace()) { - query = query.Where(o => o.Name.Contains(input.Name)); + input.Name = input.Name.ToLower(); + query = query.Where(o => o.Name.ToLower().Contains(input.Name)); } if (!input.DisplayName.IsNullOrWhiteSpace()) { - query = query.Where(o => o.DisplayName.Contains(input.DisplayName)); - } - - if (!input.DisplayName.IsNullOrWhiteSpace()) - { - query = query.Where(o => o.DisplayName.Contains(input.DisplayName)); + input.DisplayName = input.DisplayName.ToLower(); + query = query.Where(o => o.DisplayName.ToLower().Contains(input.DisplayName)); } if (input.MinMemberCount != null) @@ -86,11 +78,12 @@ namespace EventHub.Admin.Organizations dto.OwnerUserName = user.UserName; dto.OwnerEmail = user.Email; - dto.ProfilePictureContent = await GetCoverImageAsync(id); + dto.ProfilePictureContent = await GetCoverImageAsync(organization.Id); return dto; } + [Authorize(EventHubPermissions.Organizations.Update)] public async Task UpdateAsync(Guid id, UpdateOrganizationDto input) { var organization = await _organizationRepository.GetAsync(id); diff --git a/src/EventHub.Admin.HttpApi.Host/Controllers/Organizations/Memberships/OrganizationMembershipController.cs b/src/EventHub.Admin.HttpApi.Host/Controllers/Organizations/Memberships/OrganizationMembershipController.cs new file mode 100644 index 0000000..0dbc4cb --- /dev/null +++ b/src/EventHub.Admin.HttpApi.Host/Controllers/Organizations/Memberships/OrganizationMembershipController.cs @@ -0,0 +1,28 @@ +using System.Threading.Tasks; +using EventHub.Admin.Organizations.Memberships; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.Application.Dtos; +using Volo.Abp.AspNetCore.Mvc; + +namespace EventHub.Admin.Controllers.Organizations.Memberships +{ + [Controller] + [Area("eventhub-admin")] + [ControllerName("OrganizationMembership")] + [Route("/api/eventhub/organization-memberships")] + public class OrganizationMembershipController : AbpController, IOrganizationMembershipAppService + { + private readonly IOrganizationMembershipAppService _organizationMembershipAppService; + + public OrganizationMembershipController(IOrganizationMembershipAppService organizationMembershipAppService) + { + _organizationMembershipAppService = organizationMembershipAppService; + } + + [HttpGet] + public async Task> GetListAsync(OrganizationMemberListFilterDto input) + { + return await _organizationMembershipAppService.GetListAsync(input); + } + } +} \ No newline at end of file diff --git a/src/EventHub.Admin.HttpApi.Host/Controllers/OrganizationController.cs b/src/EventHub.Admin.HttpApi.Host/Controllers/Organizations/OrganizationController.cs similarity index 93% rename from src/EventHub.Admin.HttpApi.Host/Controllers/OrganizationController.cs rename to src/EventHub.Admin.HttpApi.Host/Controllers/Organizations/OrganizationController.cs index 93984b7..9774488 100644 --- a/src/EventHub.Admin.HttpApi.Host/Controllers/OrganizationController.cs +++ b/src/EventHub.Admin.HttpApi.Host/Controllers/Organizations/OrganizationController.cs @@ -1,12 +1,11 @@ using System; using System.Threading.Tasks; -using EventHub.Admin.Application.Contracts.Organizations; using EventHub.Admin.Organizations; using Microsoft.AspNetCore.Mvc; using Volo.Abp.Application.Dtos; using Volo.Abp.AspNetCore.Mvc; -namespace EventHub.Admin.Controllers +namespace EventHub.Admin.Controllers.Organizations { [Controller] [Area("eventhub-admin")] diff --git a/src/EventHub.Admin.Web/Menus/EventHubMenuContributor.cs b/src/EventHub.Admin.Web/Menus/EventHubMenuContributor.cs index 90fd929..9e5e401 100644 --- a/src/EventHub.Admin.Web/Menus/EventHubMenuContributor.cs +++ b/src/EventHub.Admin.Web/Menus/EventHubMenuContributor.cs @@ -1,9 +1,12 @@ using System; using System.Threading.Tasks; +using EventHub.Admin.Permissions; using EventHub.Localization; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Localization; using Volo.Abp.Account.Localization; +using Volo.Abp.Authorization.Permissions; using Volo.Abp.UI.Navigation; using Volo.Abp.Users; @@ -30,7 +33,7 @@ namespace EventHub.Admin.Web.Menus } } - private Task ConfigureMainMenuAsync(MenuConfigurationContext context) + private async Task ConfigureMainMenuAsync(MenuConfigurationContext context) { var l = context.GetLocalizer(); @@ -43,8 +46,8 @@ namespace EventHub.Admin.Web.Menus icon: "fas fa-home" ) ); - - return Task.CompletedTask; + + await AddOrganizationMenu(context, l); } private Task ConfigureUserMenuAsync(MenuConfigurationContext context) @@ -67,5 +70,16 @@ namespace EventHub.Admin.Web.Menus return Task.CompletedTask; } + + private Task AddOrganizationMenu(MenuConfigurationContext context, IStringLocalizer l) + { + var organizationMenu = new ApplicationMenuItem(EventHubMenus.OrganizationManagement.GroupName, l["Menu:OrganizationManagement"], icon: "fa fa-sitemap"); + context.Menu.Items.Insert(2, organizationMenu); + + organizationMenu.AddItem(new ApplicationMenuItem(EventHubMenus.OrganizationManagement.Organizations, l["Organizations"], url: "/organizations").RequirePermissions(EventHubPermissions.Organizations.Default)); + organizationMenu.AddItem(new ApplicationMenuItem(EventHubMenus.OrganizationManagement.OrganizationMemberships, l["OrganizationMemberships"], url: "/organization-memberships").RequirePermissions(EventHubPermissions.Organizations.Memberships.Default)); + + return Task.CompletedTask; + } } } diff --git a/src/EventHub.Admin.Web/Menus/EventHubMenus.cs b/src/EventHub.Admin.Web/Menus/EventHubMenus.cs index e24ac1c..66562a1 100644 --- a/src/EventHub.Admin.Web/Menus/EventHubMenus.cs +++ b/src/EventHub.Admin.Web/Menus/EventHubMenus.cs @@ -5,7 +5,11 @@ private const string Prefix = "EventHub"; public const string Home = Prefix + ".Home"; - //Add your menu items here... - + public static class OrganizationManagement + { + public const string GroupName = Prefix + ".OrganizationManagement"; + public const string Organizations = GroupName + ".Organizations"; + public const string OrganizationMemberships = GroupName + ".OrganizationMemberships"; + } } } \ No newline at end of file diff --git a/src/EventHub.Admin.Web/Pages/OrganizationManagement.razor b/src/EventHub.Admin.Web/Pages/OrganizationManagement.razor new file mode 100644 index 0000000..5a8a0c3 --- /dev/null +++ b/src/EventHub.Admin.Web/Pages/OrganizationManagement.razor @@ -0,0 +1,255 @@ +@page "/organizations" +@using Volo.Abp.BlazoriseUI.Components +@using EventHub.Admin.Permissions +@using Microsoft.AspNetCore.Authorization +@using EventHub.Admin.Organizations +@using EventHub.Organizations +@inherits EventHubComponentBase +@inject NavigationManager NavigationManager +@attribute [Authorize(EventHubPermissions.Organizations.Default)] +@inject IOrganizationAppService OrganizationAppService + + + + @* ************************* PAGE HEADER ************************* *@ +

@L["Organizations"]

+
+ +@* ************************* SEARCH ************************* *@ + + +
+
+ + + @L["Name"] + + + + + + + @L["DisplayName"] + + + + + + + @L["MinMemberCount"] + + + + + + + @L["MaxMemberCount"] + + + +
+
+ + @* ************************* DATA GRID ************************* *@ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +@* ************************* EDIT MODAL ************************* *@ + + + +
+ + @L["UpdateOrganization"] + + + + + + Organization Info + Profile Image + + + + + + + @L["DisplayName"] * + + + + + + + + + + + @L["Description"] + + + + + + + + + + + @L["Website"] + + + + + + + + + + + @L["TwitterUsername"] + + + + + + + + + + + @L["GitHubUsername"] + + + + + + + + + + + @L["FacebookUsername"] + + + + + + + + + + + + @L["InstagramUsername"] + + + + + + + + + + + @L["MediumUsername"] + + + + + + + + + + + + @if (!ProfileImageUrl.IsNullOrEmpty()) + { + @if (!IsLoadingProfileImage) + { +
+ profile-image +
+ } + else + { +
+
+ Loading... +
+
+ } + } + +
+ + @L["ChooseProfileImage"] + + + + +
+
+
+
+
+ + + + +
+
+
\ No newline at end of file diff --git a/src/EventHub.Admin.Web/Pages/OrganizationManagement.razor.cs b/src/EventHub.Admin.Web/Pages/OrganizationManagement.razor.cs new file mode 100644 index 0000000..f4135b2 --- /dev/null +++ b/src/EventHub.Admin.Web/Pages/OrganizationManagement.razor.cs @@ -0,0 +1,162 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Blazorise; +using Blazorise.DataGrid; +using EventHub.Admin.Organizations; +using Microsoft.AspNetCore.Components.Web; +using Volo.Abp.Application.Dtos; + +namespace EventHub.Admin.Web.Pages +{ + public partial class OrganizationManagement + { + private IReadOnlyList OrganizationList { get; set; } + private OrganizationListFilterDto Filter { get; set; } + private int CurrentPage { get; set; } + private string CurrentSorting { get; set; } + private int TotalCount { get; set; } + private int PageSize { get; } + + private OrganizationProfileDto Organization { get; set; } + private string ProfileImageUrl { get; set; } + + private Guid EditingOrganizationId { get; set; } + private UpdateOrganizationDto EditingOrganization { get; set; } + private Modal EditOrganizationModal { get; set; } + private IFileEntry FileEntry { get; set; } + private bool IsLoadingProfileImage { get; set; } + private string SelectedTabInEditModal { get; set; } + + public OrganizationManagement() + { + Filter = new OrganizationListFilterDto(); + PageSize = LimitedResultRequestDto.DefaultMaxResultCount; + + OrganizationList = new List(); + EditingOrganization = new UpdateOrganizationDto(); + IsLoadingProfileImage = false; + SelectedTabInEditModal = TabContentInEditModal.OrganizationProfile.ToString(); + } + + protected override async Task OnInitializedAsync() + { + await GetOrganizationsAsync(); + } + + private async Task OnDataGridReadAsync(DataGridReadDataEventArgs e) + { + CurrentSorting = e.Columns + .Where(c => c.Direction != SortDirection.None) + .Select(c => c.Field + (c.Direction == SortDirection.Descending ? " DESC" : "")) + .JoinAsString(","); + CurrentPage = e.Page - 1; + await GetOrganizationsAsync(); + await InvokeAsync(StateHasChanged); + } + + private async Task GetOrganizationsAsync() + { + Filter.MaxResultCount = PageSize; + Filter.SkipCount = CurrentPage * PageSize; + Filter.Sorting = CurrentSorting; + + var result = await OrganizationAppService.GetListAsync(Filter); + OrganizationList = result.Items; + TotalCount = (int) result.TotalCount; + } + + private async Task OpenEditOrganizationModal(OrganizationInListDto input) + { + EditingOrganizationId = input.Id; + Organization = await OrganizationAppService.GetAsync(EditingOrganizationId); + FillProfileImageUrl(Organization.ProfilePictureContent); + + EditingOrganization = ObjectMapper.Map(Organization); + EditOrganizationModal.Show(); + } + + private async Task UpdateOrganizationAsync() + { + await OrganizationAppService.UpdateAsync(EditingOrganizationId, EditingOrganization); + await GetOrganizationsAsync(); + EditOrganizationModal.Hide(); + } + + private async Task DeleteOrganizationAsync(OrganizationInListDto organization) + { + await OrganizationAppService.DeleteAsync(organization.Id); + await GetOrganizationsAsync(); + } + + private async Task OnProfileImageFileChanged(FileChangedEventArgs e) + { + IsLoadingProfileImage = true; + + if (e.Files != null && e.Files.Any()) + { + FileEntry = e.Files[0]; + + if (FileEntry != null) + { + using (var stream = new MemoryStream()) + { + await FileEntry.WriteToStreamAsync(stream); + + stream.Seek(0, SeekOrigin.Begin); + EditingOrganization.ProfilePictureContent = stream.ToArray(); + FillProfileImageUrl(EditingOrganization.ProfilePictureContent); + await InvokeAsync(StateHasChanged); + } + } + } + } + + private void FillProfileImageUrl(byte[] content) + { + if (content != null) + { + var imageBase64Data = Convert.ToBase64String(content); + var imageDataUrl = $"data:image/png;base64,{imageBase64Data}"; + ProfileImageUrl = imageDataUrl; + } + } + + private void OnProgressedForProfileImage(FileProgressedEventArgs e) + { + if (e.Percentage == 100D) + { + IsLoadingProfileImage = false; + } + } + + private void OnSelectedTabChangedInEditModal(string name) + { + SelectedTabInEditModal = name; + } + + private void OnEditModalClosing(CancelEventArgs e) + { + IsLoadingProfileImage = false; + SelectedTabInEditModal = TabContentInEditModal.OrganizationProfile.ToString(); + + } + + private async Task OnKeyPress(KeyboardEventArgs e) + { + if (e.Code == "Enter" || e.Code == "NumpadEnter") + { + await GetOrganizationsAsync(); + } + } + } + + public enum TabContentInEditModal : byte + { + OrganizationProfile = 0, + ProfileImage + } +} \ No newline at end of file diff --git a/src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor b/src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor new file mode 100644 index 0000000..3474b5e --- /dev/null +++ b/src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor @@ -0,0 +1,63 @@ +@page "/organization-memberships/{OrganizationId:guid?}" +@using Volo.Abp.BlazoriseUI.Components +@using EventHub.Admin.Organizations.Memberships +@using EventHub.Admin.Permissions +@using Microsoft.AspNetCore.Authorization +@inherits EventHubComponentBase +@attribute [Authorize(EventHubPermissions.Organizations.Memberships.Default)] +@inject IOrganizationMembershipAppService OrganizationMembershipAppService + + + + @* ************************* HEADER ************************* *@ +

+ @L["OrganizationMemberships"] + @if (OrganizationId.HasValue && !OrganizationName.IsNullOrWhiteSpace()) + { + (@OrganizationName) + } +

+
+ + @* ************************* SEARCH ************************* *@ + +
+ + @L["UserName"] + + +
+ + @* ************************* DATA GRID ************************* *@ + + + + + + + + + + + + + + + +
+
\ No newline at end of file diff --git a/src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor.cs b/src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor.cs new file mode 100644 index 0000000..f8e6a86 --- /dev/null +++ b/src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Blazorise.DataGrid; +using EventHub.Admin.Organizations; +using EventHub.Admin.Organizations.Memberships; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Web; +using Volo.Abp.Application.Dtos; + +namespace EventHub.Admin.Web.Pages +{ + public partial class OrganizationMembershipManagement + { + [Parameter] + public Guid? OrganizationId { get; set; } + public string OrganizationName { get; set; } + [Inject] + protected IOrganizationAppService OrganizationAppService { get; set; } + + + private IReadOnlyList OrganizationMemberList { get; set; } + private OrganizationMemberListFilterDto Filter { get; set; } + private int CurrentPage { get; set; } + private int TotalCount { get; set; } + private int PageSize { get; } + + public OrganizationMembershipManagement() + { + Filter = new OrganizationMemberListFilterDto(); + PageSize = LimitedResultRequestDto.DefaultMaxResultCount; + + OrganizationMemberList = new List(); + } + + protected override async Task OnInitializedAsync() + { + await GetOrganizationMembershipsAsync(); + + if (OrganizationId.HasValue) + { + OrganizationName = (await OrganizationAppService.GetAsync(OrganizationId.Value)).Name; + } + } + + private async Task OnDataGridReadAsync(DataGridReadDataEventArgs e) + { + CurrentPage = e.Page - 1; + await GetOrganizationMembershipsAsync(); + await InvokeAsync(StateHasChanged); + } + + private async Task GetOrganizationMembershipsAsync() + { + Filter.MaxResultCount = PageSize; + Filter.SkipCount = CurrentPage * PageSize; + + if (OrganizationId.HasValue) + { + Filter.OrganizationId = OrganizationId!.Value; + } + + var result = await OrganizationMembershipAppService.GetListAsync(Filter); + OrganizationMemberList = result.Items; + TotalCount = (int) result.TotalCount; + } + + private async Task OnKeyPress(KeyboardEventArgs e) + { + if (e.Code == "Enter" || e.Code == "NumpadEnter") + { + await GetOrganizationMembershipsAsync(); + } + } + } +} \ No newline at end of file diff --git a/src/EventHub.Application/Organizations/Memberships/OrganizationMembershipAppService.cs b/src/EventHub.Application/Organizations/Memberships/OrganizationMembershipAppService.cs index 744d74d..d6a43ea 100644 --- a/src/EventHub.Application/Organizations/Memberships/OrganizationMembershipAppService.cs +++ b/src/EventHub.Application/Organizations/Memberships/OrganizationMembershipAppService.cs @@ -2,7 +2,6 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using EventHub.Users; using Microsoft.AspNetCore.Authorization; using Volo.Abp.Application.Dtos; using Volo.Abp.Domain.Repositories; diff --git a/src/EventHub.Domain/Organizations/Memberships/IOrganizationMembershipRepository.cs b/src/EventHub.Domain/Organizations/Memberships/IOrganizationMembershipRepository.cs new file mode 100644 index 0000000..c8b25b7 --- /dev/null +++ b/src/EventHub.Domain/Organizations/Memberships/IOrganizationMembershipRepository.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.Identity; + +namespace EventHub.Organizations.Memberships +{ + public interface IOrganizationMembershipRepository : IRepository + { + Task> GetMemberListAsync( + Guid? organizationId, + Guid? userId, + int skipCount, + int maxResultCount, + CancellationToken cancellationToken = default); + + Task GetCountAsync( + Guid? organizationId, + Guid? userId, + CancellationToken cancellationToken = default); + } +} \ No newline at end of file diff --git a/src/EventHub.EntityFrameworkCore/EntityFrameworkCore/Organizations/Memberships/OrganizationMembershipRepository.cs b/src/EventHub.EntityFrameworkCore/EntityFrameworkCore/Organizations/Memberships/OrganizationMembershipRepository.cs new file mode 100644 index 0000000..91fa861 --- /dev/null +++ b/src/EventHub.EntityFrameworkCore/EntityFrameworkCore/Organizations/Memberships/OrganizationMembershipRepository.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using EventHub.Organizations.Memberships; +using Microsoft.EntityFrameworkCore; +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.Identity; + +namespace EventHub.EntityFrameworkCore.Organizations.Memberships +{ + public class OrganizationMembershipRepository : EfCoreRepository, IOrganizationMembershipRepository + { + public OrganizationMembershipRepository(IDbContextProvider dbContextProvider) : base(dbContextProvider) + { + + } + + public async Task> GetMemberListAsync( + Guid? organizationId, + Guid? userId, + int skipCount, + int maxResultCount, + CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + + var organizationMembershipsDbSet = dbContext.Set(); + var identityUserDbSet = dbContext.Set(); + + var query = organizationMembershipsDbSet + .Join(identityUserDbSet, organizationMember => organizationMember.UserId, user => user.Id, + (organizationMember, user) => new {organizationMember, user}) + .WhereIf(userId.HasValue, t => t.user.Id == userId) + .WhereIf(organizationId.HasValue, t => t.organizationMember.OrganizationId == organizationId) + .OrderByDescending(x => x.organizationMember.CreationTime) + .Select(x => x.user); + + return await query + .PageBy(skipCount, maxResultCount) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + public async Task GetCountAsync( + Guid? organizationId, + Guid? userId, + CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + + var organizationMembershipsDbSet = dbContext.Set(); + var identityUserDbSet = dbContext.Set(); + + return await organizationMembershipsDbSet + .Join(identityUserDbSet, organizationMember => organizationMember.UserId, user => user.Id, + (organizationMember, user) => new {organizationMember, user}) + .WhereIf(userId.HasValue, t => t.user.Id == userId) + .WhereIf(organizationId.HasValue, t => t.organizationMember.OrganizationId == organizationId) + .CountAsync(GetCancellationToken(cancellationToken)); + } + } +} \ No newline at end of file From 01a1cb9bb47d0e7072619e7f39106b9134b446e8 Mon Sep 17 00:00:00 2001 From: Berkan Sasmaz Date: Thu, 29 Jul 2021 14:05:25 +0300 Subject: [PATCH 6/9] Add missing localizations and add delete cover image button --- .../OrganizationMembershipAppService.cs | 5 +- .../Organizations/OrganizationAppService.cs | 11 ++++ .../Menus/EventHubMenuContributor.cs | 4 +- .../Pages/OrganizationManagement.razor | 49 ++++++++++------ .../Pages/OrganizationManagement.razor.cs | 57 ++++++++++--------- .../EventHubErrorCodes.cs | 1 + .../Localization/EventHub/en.json | 33 ++++++++++- 7 files changed, 111 insertions(+), 49 deletions(-) diff --git a/src/EventHub.Admin.Application/Organizations/Memberships/OrganizationMembershipAppService.cs b/src/EventHub.Admin.Application/Organizations/Memberships/OrganizationMembershipAppService.cs index 6dbbb00..f06fe45 100644 --- a/src/EventHub.Admin.Application/Organizations/Memberships/OrganizationMembershipAppService.cs +++ b/src/EventHub.Admin.Application/Organizations/Memberships/OrganizationMembershipAppService.cs @@ -4,9 +4,9 @@ using System.Threading.Tasks; using EventHub.Admin.Permissions; using EventHub.Organizations.Memberships; using Microsoft.AspNetCore.Authorization; +using Volo.Abp; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; -using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories; using Volo.Abp.Identity; @@ -36,7 +36,8 @@ namespace EventHub.Admin.Organizations.Memberships user = await _userRepository.SingleOrDefaultAsync(x => x.UserName.ToLower().Contains(input.UserName)); if (user is null) { - throw new EntityNotFoundException(typeof(IdentityUser), input.UserName); + throw new BusinessException(EventHubErrorCodes.UserNotFound) + .WithData("UserName", input.UserName); } } diff --git a/src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs b/src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs index 79c3c5c..d21de44 100644 --- a/src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs +++ b/src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs @@ -102,6 +102,10 @@ namespace EventHub.Admin.Organizations { await SaveCoverImageAsync(organization.Id, input.ProfilePictureContent); } + else + { + await DeleteCoverImageAsync(organization.Id); + } await _organizationRepository.UpdateAsync(organization); @@ -127,5 +131,12 @@ namespace EventHub.Admin.Organizations await _organizationBlobContainer.SaveAsync(blobName, coverImageContent, overrideExisting: true); } + + private async Task DeleteCoverImageAsync(Guid id) + { + var blobName = id.ToString(); + + await _organizationBlobContainer.DeleteAsync(blobName); + } } } diff --git a/src/EventHub.Admin.Web/Menus/EventHubMenuContributor.cs b/src/EventHub.Admin.Web/Menus/EventHubMenuContributor.cs index 9e5e401..8bd135c 100644 --- a/src/EventHub.Admin.Web/Menus/EventHubMenuContributor.cs +++ b/src/EventHub.Admin.Web/Menus/EventHubMenuContributor.cs @@ -76,8 +76,8 @@ namespace EventHub.Admin.Web.Menus var organizationMenu = new ApplicationMenuItem(EventHubMenus.OrganizationManagement.GroupName, l["Menu:OrganizationManagement"], icon: "fa fa-sitemap"); context.Menu.Items.Insert(2, organizationMenu); - organizationMenu.AddItem(new ApplicationMenuItem(EventHubMenus.OrganizationManagement.Organizations, l["Organizations"], url: "/organizations").RequirePermissions(EventHubPermissions.Organizations.Default)); - organizationMenu.AddItem(new ApplicationMenuItem(EventHubMenus.OrganizationManagement.OrganizationMemberships, l["OrganizationMemberships"], url: "/organization-memberships").RequirePermissions(EventHubPermissions.Organizations.Memberships.Default)); + organizationMenu.AddItem(new ApplicationMenuItem(EventHubMenus.OrganizationManagement.Organizations, l["Menu:Organizations"], url: "/organizations").RequirePermissions(EventHubPermissions.Organizations.Default)); + organizationMenu.AddItem(new ApplicationMenuItem(EventHubMenus.OrganizationManagement.OrganizationMemberships, l["Menu:OrganizationMemberships"], url: "/organization-memberships").RequirePermissions(EventHubPermissions.Organizations.Memberships.Default)); return Task.CompletedTask; } diff --git a/src/EventHub.Admin.Web/Pages/OrganizationManagement.razor b/src/EventHub.Admin.Web/Pages/OrganizationManagement.razor index 5a8a0c3..6a81b63 100644 --- a/src/EventHub.Admin.Web/Pages/OrganizationManagement.razor +++ b/src/EventHub.Admin.Web/Pages/OrganizationManagement.razor @@ -4,10 +4,12 @@ @using Microsoft.AspNetCore.Authorization @using EventHub.Admin.Organizations @using EventHub.Organizations +@using Volo.Abp.AspNetCore.Components.Notifications @inherits EventHubComponentBase @inject NavigationManager NavigationManager @attribute [Authorize(EventHubPermissions.Organizations.Default)] @inject IOrganizationAppService OrganizationAppService +@inject IUiNotificationService UiNotificationService @@ -15,7 +17,7 @@

@L["Organizations"]

-@* ************************* SEARCH ************************* *@ + @* ************************* SEARCH ************************* *@
@@ -65,7 +67,8 @@ + Text="@L["Members"]"> + - Organization Info - Profile Image + @L["OrganizationInfo"] + @L["ProfileImage"] @@ -131,12 +134,12 @@ - @L["Description"] - + @L["Description"] * + - + @@ -210,30 +213,40 @@ - @if (!ProfileImageUrl.IsNullOrEmpty()) + @if (!IsLoadingProfileImage) { - @if (!IsLoadingProfileImage) + @if (!ProfileImageUrl.IsNullOrEmpty()) {
profile-image
} - else - { -
-
- Loading... -
+ } + else + { +
+
+ @L["Loading"]...
- } +
} -
+
@L["ChooseProfileImage"] - + + + @if (!ProfileImageUrl.IsNullOrWhiteSpace()) + { + + } + else + { + + } +
diff --git a/src/EventHub.Admin.Web/Pages/OrganizationManagement.razor.cs b/src/EventHub.Admin.Web/Pages/OrganizationManagement.razor.cs index f4135b2..d441bae 100644 --- a/src/EventHub.Admin.Web/Pages/OrganizationManagement.razor.cs +++ b/src/EventHub.Admin.Web/Pages/OrganizationManagement.razor.cs @@ -23,14 +23,14 @@ namespace EventHub.Admin.Web.Pages private OrganizationProfileDto Organization { get; set; } private string ProfileImageUrl { get; set; } - + private Guid EditingOrganizationId { get; set; } private UpdateOrganizationDto EditingOrganization { get; set; } private Modal EditOrganizationModal { get; set; } private IFileEntry FileEntry { get; set; } private bool IsLoadingProfileImage { get; set; } private string SelectedTabInEditModal { get; set; } - + public OrganizationManagement() { Filter = new OrganizationListFilterDto(); @@ -74,7 +74,7 @@ namespace EventHub.Admin.Web.Pages EditingOrganizationId = input.Id; Organization = await OrganizationAppService.GetAsync(EditingOrganizationId); FillProfileImageUrl(Organization.ProfilePictureContent); - + EditingOrganization = ObjectMapper.Map(Organization); EditOrganizationModal.Show(); } @@ -86,35 +86,41 @@ namespace EventHub.Admin.Web.Pages EditOrganizationModal.Hide(); } + private void OnDeleteCoverImageButtonClicked() + { + EditingOrganization.ProfilePictureContent = null; + FileEntry = new FileEntry(); + ProfileImageUrl = null; + IsLoadingProfileImage = false; + } + private async Task DeleteOrganizationAsync(OrganizationInListDto organization) { await OrganizationAppService.DeleteAsync(organization.Id); await GetOrganizationsAsync(); } - + private async Task OnProfileImageFileChanged(FileChangedEventArgs e) { + FileEntry = e.Files.FirstOrDefault(); + if (FileEntry is null) + { + return; + } + IsLoadingProfileImage = true; - - if (e.Files != null && e.Files.Any()) - { - FileEntry = e.Files[0]; - - if (FileEntry != null) - { - using (var stream = new MemoryStream()) - { - await FileEntry.WriteToStreamAsync(stream); - - stream.Seek(0, SeekOrigin.Begin); - EditingOrganization.ProfilePictureContent = stream.ToArray(); - FillProfileImageUrl(EditingOrganization.ProfilePictureContent); - await InvokeAsync(StateHasChanged); - } - } + + using (var stream = new MemoryStream()) + { + await FileEntry.WriteToStreamAsync(stream); + + stream.Seek(0, SeekOrigin.Begin); + EditingOrganization.ProfilePictureContent = stream.ToArray(); + FillProfileImageUrl(EditingOrganization.ProfilePictureContent); + await InvokeAsync(StateHasChanged); } } - + private void FillProfileImageUrl(byte[] content) { if (content != null) @@ -124,7 +130,7 @@ namespace EventHub.Admin.Web.Pages ProfileImageUrl = imageDataUrl; } } - + private void OnProgressedForProfileImage(FileProgressedEventArgs e) { if (e.Percentage == 100D) @@ -137,12 +143,11 @@ namespace EventHub.Admin.Web.Pages { SelectedTabInEditModal = name; } - + private void OnEditModalClosing(CancelEventArgs e) { IsLoadingProfileImage = false; SelectedTabInEditModal = TabContentInEditModal.OrganizationProfile.ToString(); - } private async Task OnKeyPress(KeyboardEventArgs e) @@ -153,7 +158,7 @@ namespace EventHub.Admin.Web.Pages } } } - + public enum TabContentInEditModal : byte { OrganizationProfile = 0, diff --git a/src/EventHub.Domain.Shared/EventHubErrorCodes.cs b/src/EventHub.Domain.Shared/EventHubErrorCodes.cs index 4b4bccd..e2bc477 100644 --- a/src/EventHub.Domain.Shared/EventHubErrorCodes.cs +++ b/src/EventHub.Domain.Shared/EventHubErrorCodes.cs @@ -11,5 +11,6 @@ public const string CapacityCantBeLowerThanRegisteredUserCount = "EventHub:CapacityCantBeLowerThanRegisteredUserCount"; public const string NotAuthorizedToUpdateEvent = "EventHub:NotAuthorizedToUpdateEvent"; public const string CantChangeEventTiming = "EventHub:CantChangeEventTiming"; + public const string UserNotFound = "EventHub:UserNotFound"; } } diff --git a/src/EventHub.Domain.Shared/Localization/EventHub/en.json b/src/EventHub.Domain.Shared/Localization/EventHub/en.json index fa2b05b..5eab35a 100644 --- a/src/EventHub.Domain.Shared/Localization/EventHub/en.json +++ b/src/EventHub.Domain.Shared/Localization/EventHub/en.json @@ -82,6 +82,37 @@ "EventTimingPreview": "Event Timing Preview", "CoverImagePreview": "Cover Image Preview", "EventTimingChangeSuccessMessage": "The time of the event has been changed successfully!", - "PastEvent": "Past Event" + "PastEvent": "Past Event", + "Menu:OrganizationManagement": "Organization Management", + "Menu:OrganizationMemberships": "Memberships", + "Permission:OrganizationManagement": "Organization Management", + "Permission:MembershipManagement": "Membership Management", + "Permission:Create": "Create", + "Permission:Edit": "Edit", + "Permission:Delete": "Delete", + "UserName": "User name", + "Email": "Email", + "Name": "Name", + "Surname": "Surname", + "DisplayName": "Display Name", + "MinMemberCount": "Min Member Count", + "MaxMemberCount": "Max Member Count", + "MemberCount": "Member Count", + "UpdateOrganization": "Update Organization", + "Description": "Description", + "Website": "Website", + "TwitterUsername": "Twitter Username", + "GitHubUsername": "GitHub Username", + "FacebookUsername": "Facebook Username", + "InstagramUsername": "Instagram Username", + "MediumUsername": "Medium Username", + "ChooseProfileImage": "Choose profile image:", + "OrganizationMemberships": "Organization Memberships", + "EventHub:UserNotFound": "There is no user named \"{UserName}\"", + "DeleteCoverImage": "Delete Cover Image", + "DeleteConfirmationMessage": "Are you sure you want to delete this item?", + "Loading": "Loading", + "OrganizationInfo": "Organization Info", + "ProfileImage": "Profile Image" } } From 96c419d6cd83741d5db5de101537512bb6953024 Mon Sep 17 00:00:00 2001 From: Berkan Sasmaz Date: Thu, 29 Jul 2021 14:13:43 +0300 Subject: [PATCH 7/9] fix(Admin): bad indentation --- .../Organizations/OrganizationInListDto.cs | 14 +- .../Organizations/OrganizationAppService.cs | 256 +++++++++--------- .../Organizations/OrganizationController.cs | 2 +- .../EventHubBlazorAutoMapperProfile.cs | 2 +- .../Menus/EventHubMenuContributor.cs | 20 +- 5 files changed, 151 insertions(+), 143 deletions(-) diff --git a/src/EventHub.Admin.Application.Contracts/Organizations/OrganizationInListDto.cs b/src/EventHub.Admin.Application.Contracts/Organizations/OrganizationInListDto.cs index 796ed3d..e5ddbff 100644 --- a/src/EventHub.Admin.Application.Contracts/Organizations/OrganizationInListDto.cs +++ b/src/EventHub.Admin.Application.Contracts/Organizations/OrganizationInListDto.cs @@ -3,12 +3,12 @@ using Volo.Abp.Application.Dtos; namespace EventHub.Admin.Organizations { - public class OrganizationInListDto : EntityDto - { - public string Name { get; set; } + public class OrganizationInListDto : EntityDto + { + public string Name { get; set; } - public string DisplayName { get; set; } + public string DisplayName { get; set; } - public int MemberCount { get; set; } - } -} + public int MemberCount { get; set; } + } +} \ No newline at end of file diff --git a/src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs b/src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs index d21de44..bbf2c37 100644 --- a/src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs +++ b/src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs @@ -13,130 +13,132 @@ using Volo.Abp.Identity; namespace EventHub.Admin.Organizations { - [Authorize(EventHubPermissions.Organizations.Default)] - public class OrganizationAppService : EventHubAdminAppService, IOrganizationAppService - { - private readonly IRepository _organizationRepository; - private readonly IRepository _identityUserRepository; - private readonly IBlobContainer _organizationBlobContainer; - - public OrganizationAppService( - IRepository organizationRepository, - IRepository identityUserRepository, - IBlobContainer organizationBlobContainer) - { - _organizationRepository = organizationRepository; - _identityUserRepository = identityUserRepository; - _organizationBlobContainer = organizationBlobContainer; - } - - public async Task> GetListAsync(OrganizationListFilterDto input) - { - var query = await _organizationRepository.GetQueryableAsync(); - - if (!input.Name.IsNullOrWhiteSpace()) - { - input.Name = input.Name.ToLower(); - query = query.Where(o => o.Name.ToLower().Contains(input.Name)); - } - - if (!input.DisplayName.IsNullOrWhiteSpace()) - { - input.DisplayName = input.DisplayName.ToLower(); - query = query.Where(o => o.DisplayName.ToLower().Contains(input.DisplayName)); - } - - if (input.MinMemberCount != null) - { - query = query.Where(o => o.MemberCount >= input.MinMemberCount); - } - - if (input.MaxMemberCount != null) - { - query = query.Where(o => o.MemberCount <= input.MaxMemberCount); - } - - var totalCount = await AsyncExecuter.CountAsync(query); - - query = query.OrderBy(string.IsNullOrWhiteSpace(input.Sorting) ? OrganizationConsts.DefaultSorting : input.Sorting); - - query = query.PageBy(input); - - var organizationListDto = ObjectMapper - .Map, List>(await AsyncExecuter.ToListAsync(query)); - - return new PagedResultDto(totalCount, organizationListDto); - } - - public async Task GetAsync(Guid id) - { - var organization = await _organizationRepository.GetAsync(id); - - var dto = ObjectMapper.Map(organization); - - var user = await _identityUserRepository.GetAsync(organization.OwnerUserId); - dto.OwnerUserName = user.UserName; - dto.OwnerEmail = user.Email; - - dto.ProfilePictureContent = await GetCoverImageAsync(organization.Id); - - return dto; - } - - [Authorize(EventHubPermissions.Organizations.Update)] - public async Task UpdateAsync(Guid id, UpdateOrganizationDto input) - { - var organization = await _organizationRepository.GetAsync(id); - - organization.SetDisplayName(input.DisplayName); - organization.SetDescription(input.Description); - - organization.Website = input.Website; - organization.TwitterUsername = input.TwitterUsername; - organization.GitHubUsername = input.GitHubUsername; - organization.FacebookUsername = input.FacebookUsername; - organization.InstagramUsername = input.InstagramUsername; - organization.MediumUsername = input.MediumUsername; - - if (input.ProfilePictureContent?.Length > 0) - { - await SaveCoverImageAsync(organization.Id, input.ProfilePictureContent); - } - else - { - await DeleteCoverImageAsync(organization.Id); - } - - await _organizationRepository.UpdateAsync(organization); - - return ObjectMapper.Map(organization); - } - - [Authorize(EventHubPermissions.Organizations.Delete)] - public async Task DeleteAsync(Guid id) - { - await _organizationRepository.DeleteAsync(id); - } - - private async Task GetCoverImageAsync(Guid id) - { - var blobName = id.ToString(); - - return await _organizationBlobContainer.GetAllBytesOrNullAsync(blobName); - } - - private async Task SaveCoverImageAsync(Guid id, byte[] coverImageContent) - { - var blobName = id.ToString(); - - await _organizationBlobContainer.SaveAsync(blobName, coverImageContent, overrideExisting: true); - } - - private async Task DeleteCoverImageAsync(Guid id) - { - var blobName = id.ToString(); - - await _organizationBlobContainer.DeleteAsync(blobName); - } - } -} + [Authorize(EventHubPermissions.Organizations.Default)] + public class OrganizationAppService : EventHubAdminAppService, IOrganizationAppService + { + private readonly IRepository _organizationRepository; + private readonly IRepository _identityUserRepository; + private readonly IBlobContainer _organizationBlobContainer; + + public OrganizationAppService( + IRepository organizationRepository, + IRepository identityUserRepository, + IBlobContainer organizationBlobContainer) + { + _organizationRepository = organizationRepository; + _identityUserRepository = identityUserRepository; + _organizationBlobContainer = organizationBlobContainer; + } + + public async Task> GetListAsync(OrganizationListFilterDto input) + { + var query = await _organizationRepository.GetQueryableAsync(); + + if (!input.Name.IsNullOrWhiteSpace()) + { + input.Name = input.Name.ToLower(); + query = query.Where(o => o.Name.ToLower().Contains(input.Name)); + } + + if (!input.DisplayName.IsNullOrWhiteSpace()) + { + input.DisplayName = input.DisplayName.ToLower(); + query = query.Where(o => o.DisplayName.ToLower().Contains(input.DisplayName)); + } + + if (input.MinMemberCount != null) + { + query = query.Where(o => o.MemberCount >= input.MinMemberCount); + } + + if (input.MaxMemberCount != null) + { + query = query.Where(o => o.MemberCount <= input.MaxMemberCount); + } + + var totalCount = await AsyncExecuter.CountAsync(query); + + query = query.OrderBy(string.IsNullOrWhiteSpace(input.Sorting) + ? OrganizationConsts.DefaultSorting + : input.Sorting); + + query = query.PageBy(input); + + var organizationListDto = ObjectMapper + .Map, List>(await AsyncExecuter.ToListAsync(query)); + + return new PagedResultDto(totalCount, organizationListDto); + } + + public async Task GetAsync(Guid id) + { + var organization = await _organizationRepository.GetAsync(id); + + var dto = ObjectMapper.Map(organization); + + var user = await _identityUserRepository.GetAsync(organization.OwnerUserId); + dto.OwnerUserName = user.UserName; + dto.OwnerEmail = user.Email; + + dto.ProfilePictureContent = await GetCoverImageAsync(organization.Id); + + return dto; + } + + [Authorize(EventHubPermissions.Organizations.Update)] + public async Task UpdateAsync(Guid id, UpdateOrganizationDto input) + { + var organization = await _organizationRepository.GetAsync(id); + + organization.SetDisplayName(input.DisplayName); + organization.SetDescription(input.Description); + + organization.Website = input.Website; + organization.TwitterUsername = input.TwitterUsername; + organization.GitHubUsername = input.GitHubUsername; + organization.FacebookUsername = input.FacebookUsername; + organization.InstagramUsername = input.InstagramUsername; + organization.MediumUsername = input.MediumUsername; + + if (input.ProfilePictureContent?.Length > 0) + { + await SaveCoverImageAsync(organization.Id, input.ProfilePictureContent); + } + else + { + await DeleteCoverImageAsync(organization.Id); + } + + await _organizationRepository.UpdateAsync(organization); + + return ObjectMapper.Map(organization); + } + + [Authorize(EventHubPermissions.Organizations.Delete)] + public async Task DeleteAsync(Guid id) + { + await _organizationRepository.DeleteAsync(id); + } + + private async Task GetCoverImageAsync(Guid id) + { + var blobName = id.ToString(); + + return await _organizationBlobContainer.GetAllBytesOrNullAsync(blobName); + } + + private async Task SaveCoverImageAsync(Guid id, byte[] coverImageContent) + { + var blobName = id.ToString(); + + await _organizationBlobContainer.SaveAsync(blobName, coverImageContent, overrideExisting: true); + } + + private async Task DeleteCoverImageAsync(Guid id) + { + var blobName = id.ToString(); + + await _organizationBlobContainer.DeleteAsync(blobName); + } + } +} \ No newline at end of file diff --git a/src/EventHub.Admin.HttpApi.Host/Controllers/Organizations/OrganizationController.cs b/src/EventHub.Admin.HttpApi.Host/Controllers/Organizations/OrganizationController.cs index 9774488..53d70fa 100644 --- a/src/EventHub.Admin.HttpApi.Host/Controllers/Organizations/OrganizationController.cs +++ b/src/EventHub.Admin.HttpApi.Host/Controllers/Organizations/OrganizationController.cs @@ -19,7 +19,7 @@ namespace EventHub.Admin.Controllers.Organizations { _organizationAppService = organizationAppService; } - + [HttpGet] public Task> GetListAsync(OrganizationListFilterDto input) { diff --git a/src/EventHub.Admin.Web/EventHubBlazorAutoMapperProfile.cs b/src/EventHub.Admin.Web/EventHubBlazorAutoMapperProfile.cs index c0b5d01..53cffe5 100644 --- a/src/EventHub.Admin.Web/EventHubBlazorAutoMapperProfile.cs +++ b/src/EventHub.Admin.Web/EventHubBlazorAutoMapperProfile.cs @@ -10,4 +10,4 @@ namespace EventHub.Admin.Web CreateMap(); } } -} +} \ No newline at end of file diff --git a/src/EventHub.Admin.Web/Menus/EventHubMenuContributor.cs b/src/EventHub.Admin.Web/Menus/EventHubMenuContributor.cs index 8bd135c..1aa0481 100644 --- a/src/EventHub.Admin.Web/Menus/EventHubMenuContributor.cs +++ b/src/EventHub.Admin.Web/Menus/EventHubMenuContributor.cs @@ -46,7 +46,7 @@ namespace EventHub.Admin.Web.Menus icon: "fas fa-home" ) ); - + await AddOrganizationMenu(context, l); } @@ -70,16 +70,22 @@ namespace EventHub.Admin.Web.Menus return Task.CompletedTask; } - + private Task AddOrganizationMenu(MenuConfigurationContext context, IStringLocalizer l) { - var organizationMenu = new ApplicationMenuItem(EventHubMenus.OrganizationManagement.GroupName, l["Menu:OrganizationManagement"], icon: "fa fa-sitemap"); + var organizationMenu = new ApplicationMenuItem(EventHubMenus.OrganizationManagement.GroupName, + l["Menu:OrganizationManagement"], icon: "fa fa-sitemap"); context.Menu.Items.Insert(2, organizationMenu); - organizationMenu.AddItem(new ApplicationMenuItem(EventHubMenus.OrganizationManagement.Organizations, l["Menu:Organizations"], url: "/organizations").RequirePermissions(EventHubPermissions.Organizations.Default)); - organizationMenu.AddItem(new ApplicationMenuItem(EventHubMenus.OrganizationManagement.OrganizationMemberships, l["Menu:OrganizationMemberships"], url: "/organization-memberships").RequirePermissions(EventHubPermissions.Organizations.Memberships.Default)); - + organizationMenu.AddItem( + new ApplicationMenuItem(EventHubMenus.OrganizationManagement.Organizations, l["Menu:Organizations"], + url: "/organizations").RequirePermissions(EventHubPermissions.Organizations.Default)); + organizationMenu.AddItem( + new ApplicationMenuItem(EventHubMenus.OrganizationManagement.OrganizationMemberships, + l["Menu:OrganizationMemberships"], url: "/organization-memberships") + .RequirePermissions(EventHubPermissions.Organizations.Memberships.Default)); + return Task.CompletedTask; } } -} +} \ No newline at end of file From 1f61892afec99ef7832dae944cf7bbe84988b321 Mon Sep 17 00:00:00 2001 From: Berkan Sasmaz Date: Thu, 29 Jul 2021 16:18:21 +0300 Subject: [PATCH 8/9] Feat: Add Organization name on Organization memberships page --- .../Organizations/IOrganizationAppService.cs | 2 ++ .../Memberships/OrganizationMemberDto.cs | 2 ++ .../EventHubApplicationAutoMapperProfile.cs | 4 +-- .../OrganizationMembershipAppService.cs | 4 +-- .../Organizations/OrganizationAppService.cs | 21 +++++++++++++++ .../Organizations/OrganizationController.cs | 7 +++++ .../OrganizationMembershipManagement.razor | 25 ++++++++++++++---- .../OrganizationMembershipManagement.razor.cs | 26 +++++++++++++++++-- .../EventHubErrorCodes.cs | 1 + .../Localization/EventHub/en.json | 4 ++- .../IOrganizationMembershipRepository.cs | 2 +- .../OrganizationMemberWithDetails.cs | 18 +++++++++++++ .../OrganizationMembershipRepository.cs | 25 +++++++++++++----- 13 files changed, 121 insertions(+), 20 deletions(-) create mode 100644 src/EventHub.Domain/Organizations/Memberships/OrganizationMemberWithDetails.cs diff --git a/src/EventHub.Admin.Application.Contracts/Organizations/IOrganizationAppService.cs b/src/EventHub.Admin.Application.Contracts/Organizations/IOrganizationAppService.cs index 0a1a715..b0850b8 100644 --- a/src/EventHub.Admin.Application.Contracts/Organizations/IOrganizationAppService.cs +++ b/src/EventHub.Admin.Application.Contracts/Organizations/IOrganizationAppService.cs @@ -11,6 +11,8 @@ namespace EventHub.Admin.Organizations Task GetAsync(Guid id); + Task GetByNameAsync(string name); + Task UpdateAsync(Guid id, UpdateOrganizationDto input); Task DeleteAsync(Guid id); diff --git a/src/EventHub.Admin.Application.Contracts/Organizations/Memberships/OrganizationMemberDto.cs b/src/EventHub.Admin.Application.Contracts/Organizations/Memberships/OrganizationMemberDto.cs index f356ca1..e4e3550 100644 --- a/src/EventHub.Admin.Application.Contracts/Organizations/Memberships/OrganizationMemberDto.cs +++ b/src/EventHub.Admin.Application.Contracts/Organizations/Memberships/OrganizationMemberDto.cs @@ -5,6 +5,8 @@ namespace EventHub.Admin.Organizations.Memberships { public class OrganizationMemberDto : EntityDto { + public string OrganizationName { get; set; } + public string UserName { get; set; } public string Email { get; set; } diff --git a/src/EventHub.Admin.Application/EventHubApplicationAutoMapperProfile.cs b/src/EventHub.Admin.Application/EventHubApplicationAutoMapperProfile.cs index 6d40c34..b11a97c 100644 --- a/src/EventHub.Admin.Application/EventHubApplicationAutoMapperProfile.cs +++ b/src/EventHub.Admin.Application/EventHubApplicationAutoMapperProfile.cs @@ -2,8 +2,8 @@ using AutoMapper; using EventHub.Admin.Organizations; using EventHub.Admin.Organizations.Memberships; using EventHub.Organizations; +using EventHub.Organizations.Memberships; using Volo.Abp.AutoMapper; -using Volo.Abp.Identity; namespace EventHub.Admin { @@ -18,7 +18,7 @@ namespace EventHub.Admin .Ignore(x => x.OwnerEmail) .Ignore(x => x.ProfilePictureContent); - CreateMap(); + CreateMap(); } } } diff --git a/src/EventHub.Admin.Application/Organizations/Memberships/OrganizationMembershipAppService.cs b/src/EventHub.Admin.Application/Organizations/Memberships/OrganizationMembershipAppService.cs index f06fe45..b97d381 100644 --- a/src/EventHub.Admin.Application/Organizations/Memberships/OrganizationMembershipAppService.cs +++ b/src/EventHub.Admin.Application/Organizations/Memberships/OrganizationMembershipAppService.cs @@ -33,7 +33,7 @@ namespace EventHub.Admin.Organizations.Memberships if (!input.UserName.IsNullOrWhiteSpace()) { input.UserName = input.UserName.ToLower(); - user = await _userRepository.SingleOrDefaultAsync(x => x.UserName.ToLower().Contains(input.UserName)); + user = await _userRepository.SingleOrDefaultAsync(x => x.UserName.ToLower() == input.UserName); if (user is null) { throw new BusinessException(EventHubErrorCodes.UserNotFound) @@ -46,7 +46,7 @@ namespace EventHub.Admin.Organizations.Memberships return new PagedResultDto( totalCount, - ObjectMapper.Map, List>(members) + ObjectMapper.Map, List>(members) ); } } diff --git a/src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs b/src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs index bbf2c37..9551782 100644 --- a/src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs +++ b/src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using EventHub.Admin.Permissions; using EventHub.Organizations; using Microsoft.AspNetCore.Authorization; +using Volo.Abp; using Volo.Abp.Application.Dtos; using Volo.Abp.BlobStoring; using Volo.Abp.Domain.Repositories; @@ -84,6 +85,26 @@ namespace EventHub.Admin.Organizations return dto; } + + public async Task GetByNameAsync(string name) + { + var organization = await _organizationRepository.FindAsync(x => x.Name.ToLower() == name.ToLower()); + if (organization is null) + { + throw new BusinessException(EventHubErrorCodes.OrganizationNotFound) + .WithData("OrganizationName", name); + } + + var dto = ObjectMapper.Map(organization); + + var user = await _identityUserRepository.GetAsync(organization.OwnerUserId); + dto.OwnerUserName = user.UserName; + dto.OwnerEmail = user.Email; + + dto.ProfilePictureContent = await GetCoverImageAsync(organization.Id); + + return dto; + } [Authorize(EventHubPermissions.Organizations.Update)] public async Task UpdateAsync(Guid id, UpdateOrganizationDto input) diff --git a/src/EventHub.Admin.HttpApi.Host/Controllers/Organizations/OrganizationController.cs b/src/EventHub.Admin.HttpApi.Host/Controllers/Organizations/OrganizationController.cs index 53d70fa..50a6c07 100644 --- a/src/EventHub.Admin.HttpApi.Host/Controllers/Organizations/OrganizationController.cs +++ b/src/EventHub.Admin.HttpApi.Host/Controllers/Organizations/OrganizationController.cs @@ -32,6 +32,13 @@ namespace EventHub.Admin.Controllers.Organizations { return _organizationAppService.GetAsync(id); } + + [HttpGet] + [Route("by-name/{name}")] + public Task GetByNameAsync(string name) + { + return _organizationAppService.GetByNameAsync(name); + } [HttpPut] public Task UpdateAsync(Guid id, UpdateOrganizationDto input) diff --git a/src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor b/src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor index 3474b5e..a304b2d 100644 --- a/src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor +++ b/src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor @@ -14,7 +14,7 @@ @L["OrganizationMemberships"] @if (OrganizationId.HasValue && !OrganizationName.IsNullOrWhiteSpace()) { - (@OrganizationName) + (@OrganizationName) } @@ -22,10 +22,21 @@ @* ************************* SEARCH ************************* *@
- - @L["UserName"] - - + + + + @L["OrganizationName"] + + + + + + + @L["UserName"] + + + +
@* ************************* DATA GRID ************************* *@ @@ -38,6 +49,10 @@ Responsive="true" Sortable="false"> + + diff --git a/src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor.cs b/src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor.cs index f8e6a86..8d9a017 100644 --- a/src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor.cs +++ b/src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor.cs @@ -14,7 +14,8 @@ namespace EventHub.Admin.Web.Pages { [Parameter] public Guid? OrganizationId { get; set; } - public string OrganizationName { get; set; } + private string OrganizationName { get; set; } + [Inject] protected IOrganizationAppService OrganizationAppService { get; set; } @@ -59,7 +60,16 @@ namespace EventHub.Admin.Web.Pages { Filter.OrganizationId = OrganizationId!.Value; } - + else + { + Filter.OrganizationId = null; + } + + if (!Filter.UserName.IsNullOrWhiteSpace()) + { + Filter.UserName = Filter.UserName.Trim(); + } + var result = await OrganizationMembershipAppService.GetListAsync(Filter); OrganizationMemberList = result.Items; TotalCount = (int) result.TotalCount; @@ -69,6 +79,18 @@ namespace EventHub.Admin.Web.Pages { if (e.Code == "Enter" || e.Code == "NumpadEnter") { + if (OrganizationName.IsNullOrWhiteSpace()) + { + OrganizationId = null; + OrganizationName = null; + } + else + { + var organization = await OrganizationAppService.GetByNameAsync(OrganizationName.Trim()); + OrganizationId = organization.Id; + OrganizationName = organization.Name; + } + await GetOrganizationMembershipsAsync(); } } diff --git a/src/EventHub.Domain.Shared/EventHubErrorCodes.cs b/src/EventHub.Domain.Shared/EventHubErrorCodes.cs index e2bc477..d35d621 100644 --- a/src/EventHub.Domain.Shared/EventHubErrorCodes.cs +++ b/src/EventHub.Domain.Shared/EventHubErrorCodes.cs @@ -12,5 +12,6 @@ public const string NotAuthorizedToUpdateEvent = "EventHub:NotAuthorizedToUpdateEvent"; public const string CantChangeEventTiming = "EventHub:CantChangeEventTiming"; public const string UserNotFound = "EventHub:UserNotFound"; + public const string OrganizationNotFound = "EventHub:OrganizationNotFound"; } } diff --git a/src/EventHub.Domain.Shared/Localization/EventHub/en.json b/src/EventHub.Domain.Shared/Localization/EventHub/en.json index 5eab35a..1bf060c 100644 --- a/src/EventHub.Domain.Shared/Localization/EventHub/en.json +++ b/src/EventHub.Domain.Shared/Localization/EventHub/en.json @@ -109,10 +109,12 @@ "ChooseProfileImage": "Choose profile image:", "OrganizationMemberships": "Organization Memberships", "EventHub:UserNotFound": "There is no user named \"{UserName}\"", + "EventHub:OrganizationNotFound": "There is no organization named \"{OrganizationName}\"", "DeleteCoverImage": "Delete Cover Image", "DeleteConfirmationMessage": "Are you sure you want to delete this item?", "Loading": "Loading", "OrganizationInfo": "Organization Info", - "ProfileImage": "Profile Image" + "ProfileImage": "Profile Image", + "OrganizationName": "Organization Name" } } diff --git a/src/EventHub.Domain/Organizations/Memberships/IOrganizationMembershipRepository.cs b/src/EventHub.Domain/Organizations/Memberships/IOrganizationMembershipRepository.cs index c8b25b7..07f542a 100644 --- a/src/EventHub.Domain/Organizations/Memberships/IOrganizationMembershipRepository.cs +++ b/src/EventHub.Domain/Organizations/Memberships/IOrganizationMembershipRepository.cs @@ -9,7 +9,7 @@ namespace EventHub.Organizations.Memberships { public interface IOrganizationMembershipRepository : IRepository { - Task> GetMemberListAsync( + Task> GetMemberListAsync( Guid? organizationId, Guid? userId, int skipCount, diff --git a/src/EventHub.Domain/Organizations/Memberships/OrganizationMemberWithDetails.cs b/src/EventHub.Domain/Organizations/Memberships/OrganizationMemberWithDetails.cs new file mode 100644 index 0000000..df907f3 --- /dev/null +++ b/src/EventHub.Domain/Organizations/Memberships/OrganizationMemberWithDetails.cs @@ -0,0 +1,18 @@ +using System; +using Volo.Abp.Domain.Entities; + +namespace EventHub.Organizations.Memberships +{ + public class OrganizationMemberWithDetails : Entity + { + public string OrganizationName { get; set; } + + public string UserName { get; set; } + + public string Email { get; set; } + + public string Name { get; set; } + + public string Surname { get; set; } + } +} \ No newline at end of file diff --git a/src/EventHub.EntityFrameworkCore/EntityFrameworkCore/Organizations/Memberships/OrganizationMembershipRepository.cs b/src/EventHub.EntityFrameworkCore/EntityFrameworkCore/Organizations/Memberships/OrganizationMembershipRepository.cs index 91fa861..f540e94 100644 --- a/src/EventHub.EntityFrameworkCore/EntityFrameworkCore/Organizations/Memberships/OrganizationMembershipRepository.cs +++ b/src/EventHub.EntityFrameworkCore/EntityFrameworkCore/Organizations/Memberships/OrganizationMembershipRepository.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using EventHub.Organizations; using EventHub.Organizations.Memberships; using Microsoft.EntityFrameworkCore; using Volo.Abp.Domain.Repositories.EntityFrameworkCore; @@ -18,7 +19,7 @@ namespace EventHub.EntityFrameworkCore.Organizations.Memberships } - public async Task> GetMemberListAsync( + public async Task> GetMemberListAsync( Guid? organizationId, Guid? userId, int skipCount, @@ -29,14 +30,24 @@ namespace EventHub.EntityFrameworkCore.Organizations.Memberships var organizationMembershipsDbSet = dbContext.Set(); var identityUserDbSet = dbContext.Set(); - + var organizationDbSet = dbContext.Set(); + var query = organizationMembershipsDbSet - .Join(identityUserDbSet, organizationMember => organizationMember.UserId, user => user.Id, - (organizationMember, user) => new {organizationMember, user}) + .Join(organizationDbSet, t => t.OrganizationId, organization => organization.Id + , (organizationMember, organization) => new {organizationMember, organization}) + .Join(identityUserDbSet, organizationWithMember => organizationWithMember.organizationMember.UserId, user => user.Id, + (organizationWithMember, user) => new {organizationWithMember, user}) .WhereIf(userId.HasValue, t => t.user.Id == userId) - .WhereIf(organizationId.HasValue, t => t.organizationMember.OrganizationId == organizationId) - .OrderByDescending(x => x.organizationMember.CreationTime) - .Select(x => x.user); + .WhereIf(organizationId.HasValue, t => t.organizationWithMember.organizationMember.OrganizationId == organizationId) + .OrderByDescending(o => o.organizationWithMember.organizationMember.CreationTime) + .Select(t => new OrganizationMemberWithDetails + { + OrganizationName = t.organizationWithMember.organization.Name, + UserName = t.user.UserName, + Email = t.user.Email, + Name = t.user.Name, + Surname = t.user.Surname + }); return await query .PageBy(skipCount, maxResultCount) From 9895a1ddfb4b08dd131dbd97c2b744721afda8b0 Mon Sep 17 00:00:00 2001 From: Berkan Sasmaz Date: Thu, 29 Jul 2021 16:35:03 +0300 Subject: [PATCH 9/9] fix(Admin): bad indentation --- .../OrganizationMembershipManagement.razor | 4 +-- .../OrganizationMembershipRepository.cs | 28 ++++++++++--------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor b/src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor index a304b2d..79f6f18 100644 --- a/src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor +++ b/src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor @@ -23,14 +23,14 @@
- + @L["OrganizationName"] - + @L["UserName"] diff --git a/src/EventHub.EntityFrameworkCore/EntityFrameworkCore/Organizations/Memberships/OrganizationMembershipRepository.cs b/src/EventHub.EntityFrameworkCore/EntityFrameworkCore/Organizations/Memberships/OrganizationMembershipRepository.cs index f540e94..fa1b3bb 100644 --- a/src/EventHub.EntityFrameworkCore/EntityFrameworkCore/Organizations/Memberships/OrganizationMembershipRepository.cs +++ b/src/EventHub.EntityFrameworkCore/EntityFrameworkCore/Organizations/Memberships/OrganizationMembershipRepository.cs @@ -12,17 +12,18 @@ using Volo.Abp.Identity; namespace EventHub.EntityFrameworkCore.Organizations.Memberships { - public class OrganizationMembershipRepository : EfCoreRepository, IOrganizationMembershipRepository + public class OrganizationMembershipRepository : EfCoreRepository, + IOrganizationMembershipRepository { - public OrganizationMembershipRepository(IDbContextProvider dbContextProvider) : base(dbContextProvider) + public OrganizationMembershipRepository(IDbContextProvider dbContextProvider) + : base(dbContextProvider) { - } public async Task> GetMemberListAsync( - Guid? organizationId, + Guid? organizationId, Guid? userId, - int skipCount, + int skipCount, int maxResultCount, CancellationToken cancellationToken = default) { @@ -31,14 +32,15 @@ namespace EventHub.EntityFrameworkCore.Organizations.Memberships var organizationMembershipsDbSet = dbContext.Set(); var identityUserDbSet = dbContext.Set(); var organizationDbSet = dbContext.Set(); - + var query = organizationMembershipsDbSet - .Join(organizationDbSet, t => t.OrganizationId, organization => organization.Id - , (organizationMember, organization) => new {organizationMember, organization}) - .Join(identityUserDbSet, organizationWithMember => organizationWithMember.organizationMember.UserId, user => user.Id, - (organizationWithMember, user) => new {organizationWithMember, user}) + .Join(organizationDbSet, t => t.OrganizationId, organization => organization.Id, + (organizationMember, organization) => new {organizationMember, organization}) + .Join(identityUserDbSet, organizationWithMember => organizationWithMember.organizationMember.UserId, + user => user.Id, (organizationWithMember, user) => new {organizationWithMember, user}) .WhereIf(userId.HasValue, t => t.user.Id == userId) - .WhereIf(organizationId.HasValue, t => t.organizationWithMember.organizationMember.OrganizationId == organizationId) + .WhereIf(organizationId.HasValue, + t => t.organizationWithMember.organizationMember.OrganizationId == organizationId) .OrderByDescending(o => o.organizationWithMember.organizationMember.CreationTime) .Select(t => new OrganizationMemberWithDetails { @@ -48,14 +50,14 @@ namespace EventHub.EntityFrameworkCore.Organizations.Memberships Name = t.user.Name, Surname = t.user.Surname }); - + return await query .PageBy(skipCount, maxResultCount) .ToListAsync(GetCancellationToken(cancellationToken)); } public async Task GetCountAsync( - Guid? organizationId, + Guid? organizationId, Guid? userId, CancellationToken cancellationToken = default) {