diff --git a/RMuseum/Controllers/GanjoorController.cs b/RMuseum/Controllers/GanjoorController.cs
new file mode 100644
index 00000000..a581770a
--- /dev/null
+++ b/RMuseum/Controllers/GanjoorController.cs
@@ -0,0 +1,48 @@
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using RMuseum.Models.Auth.Memory;
+using RMuseum.Services;
+using RSecurityBackend.Models.Generic;
+using System.Net;
+using System.Threading.Tasks;
+
+namespace RMuseum.Controllers
+{
+ [Produces("application/json")]
+ [Route("api/ganjoor")]
+ public class GanjoorController : Controller
+ {
+ ///
+ /// imports data from ganjoor SQLite database
+ ///
+ ///
+ [HttpPost]
+ [Route("sqliteimport")]
+ [Authorize(Policy = RMuseumSecurableItem.GanjoorEntityShortName + ":" + RMuseumSecurableItem.ImportOperationShortName)]
+ [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(bool))]
+ [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
+ public async Task ImportLocalSQLiteDb()
+ {
+ RServiceResult res =
+ await _ganjoorService.ImportLocalSQLiteDb();
+ if (res.Result)
+ return Ok();
+ return BadRequest(res.ExceptionString);
+ }
+
+ ///
+ /// Ganjoor Service
+ ///
+
+ protected readonly IGanjoorService _ganjoorService;
+
+ ///
+ /// constructor
+ ///
+ ///
+ public GanjoorController(IGanjoorService ganjoorService)
+ {
+ _ganjoorService = ganjoorService;
+ }
+ }
+}
diff --git a/RMuseum/Migrations/20201022150541_GanjoorStructures.Designer.cs b/RMuseum/Migrations/20201022150541_GanjoorStructures.Designer.cs
new file mode 100644
index 00000000..ef1dc0eb
--- /dev/null
+++ b/RMuseum/Migrations/20201022150541_GanjoorStructures.Designer.cs
@@ -0,0 +1,1541 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using RMuseum.DbContext;
+
+namespace RMuseum.Migrations
+{
+ [DbContext(typeof(RMuseumDbContext))]
+ [Migration("20201022150541_GanjoorStructures")]
+ partial class GanjoorStructures
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "3.1.3")
+ .HasAnnotation("Relational:MaxIdentifierLength", 128)
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ b.Property("ClaimType")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ClaimValue")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("RoleId")
+ .HasColumnType("uniqueidentifier");
+
+ b.HasKey("Id");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("AspNetRoleClaims");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ b.Property("ClaimType")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ClaimValue")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("UserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AspNetUserClaims");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b =>
+ {
+ b.Property("LoginProvider")
+ .HasColumnType("nvarchar(450)");
+
+ b.Property("ProviderKey")
+ .HasColumnType("nvarchar(450)");
+
+ b.Property("ProviderDisplayName")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("UserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.HasKey("LoginProvider", "ProviderKey");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AspNetUserLogins");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b =>
+ {
+ b.Property("UserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("RoleId")
+ .HasColumnType("uniqueidentifier");
+
+ b.HasKey("UserId", "RoleId");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("AspNetUserRoles");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b =>
+ {
+ b.Property("UserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("LoginProvider")
+ .HasColumnType("nvarchar(450)");
+
+ b.Property("Name")
+ .HasColumnType("nvarchar(450)");
+
+ b.Property("Value")
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("UserId", "LoginProvider", "Name");
+
+ b.ToTable("AspNetUserTokens");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Artifact.RArtifactItemRecord", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CoverImageIndex")
+ .HasColumnType("int");
+
+ b.Property("Description")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("DescriptionInEnglish")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("FriendlyUrl")
+ .HasColumnType("nvarchar(450)");
+
+ b.Property("LastModified")
+ .HasColumnType("datetime2");
+
+ b.Property("Name")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("NameInEnglish")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Order")
+ .HasColumnType("int");
+
+ b.Property("RArtifactMasterRecordId")
+ .HasColumnType("uniqueidentifier");
+
+ b.HasKey("Id");
+
+ b.HasIndex("RArtifactMasterRecordId", "FriendlyUrl")
+ .IsUnique()
+ .HasFilter("[FriendlyUrl] IS NOT NULL");
+
+ b.HasIndex("RArtifactMasterRecordId", "Order")
+ .IsUnique();
+
+ b.ToTable("Items");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Artifact.RArtifactMasterRecord", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CoverImageId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CoverItemIndex")
+ .HasColumnType("int");
+
+ b.Property("DateTime")
+ .HasColumnType("datetime2");
+
+ b.Property("Description")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("DescriptionInEnglish")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("FriendlyUrl")
+ .HasColumnType("nvarchar(450)");
+
+ b.Property("ItemCount")
+ .HasColumnType("int");
+
+ b.Property("LastModified")
+ .HasColumnType("datetime2");
+
+ b.Property("Name")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("NameInEnglish")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Status")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CoverImageId");
+
+ b.HasIndex("FriendlyUrl")
+ .IsUnique()
+ .HasFilter("[FriendlyUrl] IS NOT NULL");
+
+ b.ToTable("Artifacts");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Artifact.RTag", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("FriendlyUrl")
+ .HasColumnType("nvarchar(450)");
+
+ b.Property("GlobalValue")
+ .HasColumnType("bit");
+
+ b.Property("Name")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("NameInEnglish")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Order")
+ .HasColumnType("int");
+
+ b.Property("PluralName")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("PluralNameInEnglish")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Status")
+ .HasColumnType("int");
+
+ b.Property("TagType")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("FriendlyUrl");
+
+ b.ToTable("Tags");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Artifact.RTagValue", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("FriendlyUrl")
+ .HasColumnType("nvarchar(450)");
+
+ b.Property("Order")
+ .HasColumnType("int");
+
+ b.Property("RArtifactItemRecordId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("RArtifactMasterRecordId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("RTagId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("Status")
+ .HasColumnType("int");
+
+ b.Property("Value")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ValueInEnglish")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ValueSupplement")
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("FriendlyUrl");
+
+ b.HasIndex("RArtifactItemRecordId");
+
+ b.HasIndex("RArtifactMasterRecordId");
+
+ b.HasIndex("RTagId");
+
+ b.ToTable("TagValues");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Bookmark.RUserBookmark", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("DateTime")
+ .HasColumnType("datetime2");
+
+ b.Property("Note")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("RAppUserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("RArtifactItemRecordId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("RArtifactMasterRecordId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("RBookmarkType")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("RAppUserId");
+
+ b.HasIndex("RArtifactItemRecordId");
+
+ b.HasIndex("RArtifactMasterRecordId");
+
+ b.ToTable("UserBookmarks");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Ganjoor.GanjoorCat", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("int");
+
+ b.Property("ParentId")
+ .HasColumnType("int");
+
+ b.Property("PoetId")
+ .HasColumnType("int");
+
+ b.Property("Title")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("UrlSlug")
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ParentId");
+
+ b.HasIndex("PoetId");
+
+ b.ToTable("GanjoorCategories");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Ganjoor.GanjoorPoem", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("int");
+
+ b.Property("CatId")
+ .HasColumnType("int");
+
+ b.Property("FullTitle")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Title")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("UrlSlug")
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CatId");
+
+ b.ToTable("GanjoorPoems");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Ganjoor.GanjoorPoet", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("int");
+
+ b.Property("Description")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Name")
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.ToTable("GanjoorPoets");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Ganjoor.GanjoorVerse", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ b.Property("PoemId")
+ .HasColumnType("int");
+
+ b.Property("Text")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("VOrder")
+ .HasColumnType("int");
+
+ b.Property("VersePosition")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("PoemId");
+
+ b.ToTable("GanjoorVerses");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.GanjoorAudio.PoemNarration", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("AudioArtist")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("AudioArtistUrl")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("AudioOrder")
+ .HasColumnType("int");
+
+ b.Property("AudioSrc")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("AudioSrcUrl")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("AudioSyncStatus")
+ .HasColumnType("int");
+
+ b.Property("AudioTitle")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("FileNameWithoutExtension")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("GanjoorAudioId")
+ .HasColumnType("int");
+
+ b.Property("GanjoorPostId")
+ .HasColumnType("int");
+
+ b.Property("LegacyAudioGuid")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("LocalMp3FilePath")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("LocalXmlFilePath")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Mp3FileCheckSum")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Mp3SizeInBytes")
+ .HasColumnType("int");
+
+ b.Property("OggSizeInBytes")
+ .HasColumnType("int");
+
+ b.Property("OwnerId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("ReviewDate")
+ .HasColumnType("datetime2");
+
+ b.Property("ReviewMsg")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ReviewStatus")
+ .HasColumnType("int");
+
+ b.Property("ReviewerId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("SoundFilesFolder")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("UploadDate")
+ .HasColumnType("datetime2");
+
+ b.HasKey("Id");
+
+ b.HasIndex("OwnerId");
+
+ b.HasIndex("ReviewerId");
+
+ b.ToTable("AudioFiles");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.GanjoorAudio.UserNarrationProfile", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("ArtistName")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ArtistUrl")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("AudioSrc")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("AudioSrcUrl")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("FileSuffixWithoutDash")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("IsDefault")
+ .HasColumnType("bit");
+
+ b.Property("UserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("UserNarrationProfiles");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.GanjoorIntegration.GanjoorLink", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("ArtifactId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("GanjoorPostId")
+ .HasColumnType("int");
+
+ b.Property("GanjoorTitle")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("GanjoorUrl")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ItemId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("ReviewDate")
+ .HasColumnType("datetime2");
+
+ b.Property("ReviewResult")
+ .HasColumnType("int");
+
+ b.Property("ReviewerId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("SuggestedById")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("SuggestionDate")
+ .HasColumnType("datetime2");
+
+ b.Property("Synchronized")
+ .HasColumnType("bit");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ArtifactId");
+
+ b.HasIndex("ItemId");
+
+ b.HasIndex("ReviewerId");
+
+ b.HasIndex("SuggestedById");
+
+ b.ToTable("GanjoorLinks");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.GanjoorIntegration.PinterestLink", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("AltText")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ArtifactId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("GanjoorPostId")
+ .HasColumnType("int");
+
+ b.Property("GanjoorTitle")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("GanjoorUrl")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ItemId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("LinkType")
+ .HasColumnType("int");
+
+ b.Property("PinterestImageUrl")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("PinterestUrl")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ReviewDate")
+ .HasColumnType("datetime2");
+
+ b.Property("ReviewDesc")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ReviewResult")
+ .HasColumnType("int");
+
+ b.Property("ReviewerId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("SuggestedById")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("SuggestionDate")
+ .HasColumnType("datetime2");
+
+ b.Property("Synchronized")
+ .HasColumnType("bit");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ArtifactId");
+
+ b.HasIndex("ItemId");
+
+ b.HasIndex("ReviewerId");
+
+ b.HasIndex("SuggestedById");
+
+ b.ToTable("PinterestLinks");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.ImportJob.ImportJob", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("ArtifactId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("EndTime")
+ .HasColumnType("datetime2");
+
+ b.Property("Exception")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("FriendlyUrl")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("JobType")
+ .HasColumnType("int");
+
+ b.Property("ProgressPercent")
+ .HasColumnType("decimal(18,2)");
+
+ b.Property("QueueTime")
+ .HasColumnType("datetime2");
+
+ b.Property("ResourceNumber")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("SrcContent")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("SrcUrl")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("StartTime")
+ .HasColumnType("datetime2");
+
+ b.Property("Status")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ArtifactId");
+
+ b.ToTable("ImportJobs");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Note.RUserNote", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("DateTime")
+ .HasColumnType("datetime2");
+
+ b.Property("HtmlContent")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("LastModified")
+ .HasColumnType("datetime2");
+
+ b.Property("Modified")
+ .HasColumnType("bit");
+
+ b.Property("NoteType")
+ .HasColumnType("int");
+
+ b.Property("RAppUserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("RArtifactItemRecordId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("RArtifactMasterRecordId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("ReferenceNoteId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("Status")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("RAppUserId");
+
+ b.HasIndex("RArtifactItemRecordId");
+
+ b.HasIndex("RArtifactMasterRecordId");
+
+ b.HasIndex("ReferenceNoteId");
+
+ b.ToTable("UserNotes");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.Notification.RUserNotification", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("DateTime")
+ .HasColumnType("datetime2");
+
+ b.Property("HtmlText")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Status")
+ .HasColumnType("int");
+
+ b.Property("Subject")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("UserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("Notifications");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.UploadSession.UploadSession", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("ProcessEndTime")
+ .HasColumnType("datetime2");
+
+ b.Property("ProcessProgress")
+ .HasColumnType("int");
+
+ b.Property("ProcessStartTime")
+ .HasColumnType("datetime2");
+
+ b.Property("SessionType")
+ .HasColumnType("int");
+
+ b.Property("Status")
+ .HasColumnType("int");
+
+ b.Property("UploadEndTime")
+ .HasColumnType("datetime2");
+
+ b.Property("UploadStartTime")
+ .HasColumnType("datetime2");
+
+ b.Property("UseId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("UserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("UploadSessions");
+ });
+
+ modelBuilder.Entity("RMuseum.Models.UploadSession.UploadSessionFile", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("ContentDisposition")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ContentType")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("FileName")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("FilePath")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Length")
+ .HasColumnType("bigint");
+
+ b.Property("MP3FileCheckSum")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Name")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ProcessResult")
+ .HasColumnType("bit");
+
+ b.Property("ProcessResultMsg")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("UploadSessionId")
+ .HasColumnType("uniqueidentifier");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UploadSessionId");
+
+ b.ToTable("UploadedFiles");
+ });
+
+ modelBuilder.Entity("RSecurityBackend.Models.Audit.Db.REvent", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("Duration")
+ .HasColumnType("int");
+
+ b.Property("EndDate")
+ .HasColumnType("datetime2");
+
+ b.Property("EventType")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("IpAddress")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("JsonData")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("RequestUrl")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ResponseStatusCode")
+ .HasColumnType("int");
+
+ b.Property("StartDate")
+ .HasColumnType("datetime2");
+
+ b.Property("UserName")
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.ToTable("AuditLogs");
+ });
+
+ modelBuilder.Entity("RSecurityBackend.Models.Auth.Db.RAppRole", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Description")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Name")
+ .HasColumnType("nvarchar(256)")
+ .HasMaxLength(256);
+
+ b.Property("NormalizedName")
+ .HasColumnType("nvarchar(256)")
+ .HasMaxLength(256);
+
+ b.HasKey("Id");
+
+ b.HasIndex("NormalizedName")
+ .IsUnique()
+ .HasName("RoleNameIndex")
+ .HasFilter("[NormalizedName] IS NOT NULL");
+
+ b.ToTable("AspNetRoles");
+ });
+
+ modelBuilder.Entity("RSecurityBackend.Models.Auth.Db.RAppUser", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("AccessFailedCount")
+ .HasColumnType("int");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("CreateDate")
+ .HasColumnType("datetime2");
+
+ b.Property("Email")
+ .HasColumnType("nvarchar(256)")
+ .HasMaxLength(256);
+
+ b.Property("EmailConfirmed")
+ .HasColumnType("bit");
+
+ b.Property("FirstName")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("LockoutEnabled")
+ .HasColumnType("bit");
+
+ b.Property("LockoutEnd")
+ .HasColumnType("datetimeoffset");
+
+ b.Property("NormalizedEmail")
+ .HasColumnType("nvarchar(256)")
+ .HasMaxLength(256);
+
+ b.Property("NormalizedUserName")
+ .HasColumnType("nvarchar(256)")
+ .HasMaxLength(256);
+
+ b.Property("PasswordHash")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("PhoneNumber")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("PhoneNumberConfirmed")
+ .HasColumnType("bit");
+
+ b.Property("RImageId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("SecurityStamp")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Status")
+ .HasColumnType("int");
+
+ b.Property("SureName")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("TwoFactorEnabled")
+ .HasColumnType("bit");
+
+ b.Property("UserName")
+ .HasColumnType("nvarchar(256)")
+ .HasMaxLength(256);
+
+ b.HasKey("Id");
+
+ b.HasIndex("NormalizedEmail")
+ .HasName("EmailIndex");
+
+ b.HasIndex("NormalizedUserName")
+ .IsUnique()
+ .HasName("UserNameIndex")
+ .HasFilter("[NormalizedUserName] IS NOT NULL");
+
+ b.HasIndex("RImageId");
+
+ b.ToTable("AspNetUsers");
+ });
+
+ modelBuilder.Entity("RSecurityBackend.Models.Auth.Db.RCaptchaImage", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("DateTime")
+ .HasColumnType("datetime2");
+
+ b.Property("RImageId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("Value")
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("RImageId");
+
+ b.ToTable("CaptchaImages");
+ });
+
+ modelBuilder.Entity("RSecurityBackend.Models.Auth.Db.RPermission", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("OperationShortName")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("RAppRoleId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("SecurableItemShortName")
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("RAppRoleId");
+
+ b.ToTable("Permissions");
+ });
+
+ modelBuilder.Entity("RSecurityBackend.Models.Auth.Db.RTemporaryUserSession", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("ClientAppName")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ClientIPAddress")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Language")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("LastRenewal")
+ .HasColumnType("datetime2");
+
+ b.Property("LoginTime")
+ .HasColumnType("datetime2");
+
+ b.Property("RAppUserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property