#208 simplifying db structures

This commit is contained in:
Hamid Reza Mohammadi 2021-09-27 10:27:07 +03:30
parent 08ab7b6711
commit b0cfd18469
9 changed files with 151 additions and 65 deletions

View File

@ -120,6 +120,13 @@ namespace RMuseum.DbContext
.HasIndex(m => m.Name)
.IsUnique();
builder.Entity<GanjoorUserBookmark>().HasOne(b => b.Verse)
.WithMany().Metadata.DeleteBehavior = DeleteBehavior.Restrict;
builder.Entity<GanjoorUserBookmark>()
.HasIndex(b => new { b.UserId, b.PoemId, b.VerseId })
.IsUnique();
//Index set suggested by SQL Server Tuning Wizard -- end

View File

@ -10,7 +10,7 @@ using RMuseum.DbContext;
namespace RMuseum.Migrations
{
[DbContext(typeof(RMuseumDbContext))]
[Migration("20210925151537_GanjoorUserBookmarks")]
[Migration("20210927065456_GanjoorUserBookmarks")]
partial class GanjoorUserBookmarks
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
@ -995,26 +995,26 @@ namespace RMuseum.Migrations
b.Property<int>("PoemId")
.HasColumnType("int");
b.Property<int>("RBookmarkType")
.HasColumnType("int");
b.Property<int>("Rating")
.HasColumnType("int");
b.Property<Guid>("UserId")
.HasColumnType("uniqueidentifier");
b.Property<int?>("VerseId")
b.Property<int?>("Verse2Id")
.HasColumnType("int");
b.Property<int>("VerseId")
.HasColumnType("int");
b.HasKey("Id");
b.HasIndex("PoemId");
b.HasIndex("UserId");
b.HasIndex("Verse2Id");
b.HasIndex("VerseId");
b.HasIndex("UserId", "PoemId", "VerseId")
.IsUnique();
b.ToTable("GanjoorUserBookmarks");
});
@ -2677,15 +2677,23 @@ namespace RMuseum.Migrations
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("RMuseum.Models.Ganjoor.GanjoorVerse", "Verse2")
.WithMany()
.HasForeignKey("Verse2Id");
b.HasOne("RMuseum.Models.Ganjoor.GanjoorVerse", "Verse")
.WithMany()
.HasForeignKey("VerseId");
.HasForeignKey("VerseId")
.OnDelete(DeleteBehavior.Restrict)
.IsRequired();
b.Navigation("Poem");
b.Navigation("User");
b.Navigation("Verse");
b.Navigation("Verse2");
});
modelBuilder.Entity("RMuseum.Models.Ganjoor.GanjoorVerse", b =>

View File

@ -14,11 +14,10 @@ namespace RMuseum.Migrations
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
UserId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
PoemId = table.Column<int>(type: "int", nullable: false),
VerseId = table.Column<int>(type: "int", nullable: true),
DateTime = table.Column<DateTime>(type: "datetime2", nullable: false),
RBookmarkType = table.Column<int>(type: "int", nullable: false),
Rating = table.Column<int>(type: "int", nullable: false),
Note = table.Column<string>(type: "nvarchar(max)", nullable: true)
VerseId = table.Column<int>(type: "int", nullable: false),
Verse2Id = table.Column<int>(type: "int", nullable: true),
Note = table.Column<string>(type: "nvarchar(max)", nullable: true),
DateTime = table.Column<DateTime>(type: "datetime2", nullable: false)
},
constraints: table =>
{
@ -35,6 +34,12 @@ namespace RMuseum.Migrations
principalTable: "GanjoorPoems",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_GanjoorUserBookmarks_GanjoorVerses_Verse2Id",
column: x => x.Verse2Id,
principalTable: "GanjoorVerses",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
table.ForeignKey(
name: "FK_GanjoorUserBookmarks_GanjoorVerses_VerseId",
column: x => x.VerseId,
@ -49,9 +54,15 @@ namespace RMuseum.Migrations
column: "PoemId");
migrationBuilder.CreateIndex(
name: "IX_GanjoorUserBookmarks_UserId",
name: "IX_GanjoorUserBookmarks_UserId_PoemId_VerseId",
table: "GanjoorUserBookmarks",
column: "UserId");
columns: new[] { "UserId", "PoemId", "VerseId" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_GanjoorUserBookmarks_Verse2Id",
table: "GanjoorUserBookmarks",
column: "Verse2Id");
migrationBuilder.CreateIndex(
name: "IX_GanjoorUserBookmarks_VerseId",

View File

@ -993,26 +993,26 @@ namespace RMuseum.Migrations
b.Property<int>("PoemId")
.HasColumnType("int");
b.Property<int>("RBookmarkType")
.HasColumnType("int");
b.Property<int>("Rating")
.HasColumnType("int");
b.Property<Guid>("UserId")
.HasColumnType("uniqueidentifier");
b.Property<int?>("VerseId")
b.Property<int?>("Verse2Id")
.HasColumnType("int");
b.Property<int>("VerseId")
.HasColumnType("int");
b.HasKey("Id");
b.HasIndex("PoemId");
b.HasIndex("UserId");
b.HasIndex("Verse2Id");
b.HasIndex("VerseId");
b.HasIndex("UserId", "PoemId", "VerseId")
.IsUnique();
b.ToTable("GanjoorUserBookmarks");
});
@ -2675,15 +2675,23 @@ namespace RMuseum.Migrations
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("RMuseum.Models.Ganjoor.GanjoorVerse", "Verse2")
.WithMany()
.HasForeignKey("Verse2Id");
b.HasOne("RMuseum.Models.Ganjoor.GanjoorVerse", "Verse")
.WithMany()
.HasForeignKey("VerseId");
.HasForeignKey("VerseId")
.OnDelete(DeleteBehavior.Restrict)
.IsRequired();
b.Navigation("Poem");
b.Navigation("User");
b.Navigation("Verse");
b.Navigation("Verse2");
});
modelBuilder.Entity("RMuseum.Models.Ganjoor.GanjoorVerse", b =>

View File

@ -1,5 +1,4 @@
using RMuseum.Models.Bookmark;
using RSecurityBackend.Models.Auth.Db;
using RSecurityBackend.Models.Auth.Db;
using System;
namespace RMuseum.Models.Ganjoor
@ -37,31 +36,31 @@ namespace RMuseum.Models.Ganjoor
/// <summary>
/// Verse Id
/// </summary>
public int? VerseId { get; set; }
public int VerseId { get; set; }
/// <summary>
/// Verse
/// </summary>
public virtual GanjoorVerse Verse { get; set; }
public GanjoorVerse Verse { get; set; }
/// <summary>
/// Verse 2 Id
/// </summary>
public int? Verse2Id { get; set; }
/// <summary>
/// Verse 2
/// </summary>
public virtual GanjoorVerse Verse2 { get; set; }
/// <summary>
/// note
/// </summary>
public string Note { get; set; }
/// <summary>
/// DateTime
/// </summary>
public DateTime DateTime { get; set; }
/// <summary>
/// Type
/// </summary>
public RBookmarkType RBookmarkType { get; set; }
/// <summary>
/// rating
/// </summary>
public int Rating { get; set; }
/// <summary>
/// User Note
/// </summary>
public string Note { get; set; }
}
}

View File

@ -5312,24 +5312,24 @@
Verse
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.GanjoorUserBookmark.DateTime">
<member name="P:RMuseum.Models.Ganjoor.GanjoorUserBookmark.Verse2Id">
<summary>
DateTime
Verse 2 Id
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.GanjoorUserBookmark.RBookmarkType">
<member name="P:RMuseum.Models.Ganjoor.GanjoorUserBookmark.Verse2">
<summary>
Type
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.GanjoorUserBookmark.Rating">
<summary>
rating
Verse 2
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.GanjoorUserBookmark.Note">
<summary>
User Note
note
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.GanjoorUserBookmark.DateTime">
<summary>
DateTime
</summary>
</member>
<member name="T:RMuseum.Models.Ganjoor.GanjoorVerse">
@ -9706,12 +9706,13 @@
<param name="coupletIndex"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorService.BookmarkVerse(System.Int32,System.Int32,System.Guid)">
<member name="M:RMuseum.Services.Implementation.GanjoorService.BookmarkVerse(System.Int32,System.Int32,System.Nullable{System.Int32},System.Guid)">
<summary>
Bookmark Verse
</summary>
<param name="poemId"></param>
<param name="verseId"></param>
<param name="verse2Id"></param>
<param name="userId"></param>
<returns></returns>
</member>
@ -9904,6 +9905,14 @@
<param name="coupletIndex"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorService._GetVerse12IdFromCoupletIndex(System.Int32,System.Int32)">
<summary>
verse 1/ 2 id from couplet index
</summary>
<param name="poemId"></param>
<param name="coupletIndex"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorService.GetPoemComments(System.Int32,System.Guid,System.Nullable{System.Int32})">
<summary>
get poem comments

View File

@ -1,5 +1,4 @@
using Microsoft.AspNetCore.Http;
using RMuseum.Models.Bookmark;
using RMuseum.Models.Ganjoor;
using RMuseum.Models.Ganjoor.ViewModels;
using RMuseum.Models.GanjoorAudio.ViewModels;

View File

@ -5,9 +5,7 @@ using System;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using RMuseum.Models.Artifact;
using RSecurityBackend.Services.Implementation;
using RMuseum.Models.Bookmark;
namespace RMuseum.Services.Implementation
{
@ -25,10 +23,10 @@ namespace RMuseum.Services.Implementation
/// <returns></returns>
public async Task<RServiceResult<GanjoorUserBookmark>> SwitchCoupletBookmark(Guid userId, int poemId, int coupletIndex)
{
int? verseId = await _GetVerseIdFromCoupletIndex(poemId, coupletIndex);
if (verseId == null)
(int Verse1, int? Verse2)? verse12 = await _GetVerse12IdFromCoupletIndex(poemId, coupletIndex);
if (verse12 == null)
return new RServiceResult<GanjoorUserBookmark>(null, "verse not found");
var bookmark = await _context.GanjoorUserBookmarks.Where(b => b.UserId == userId && b.PoemId == poemId && b.VerseId == verseId).SingleOrDefaultAsync();
var bookmark = await _context.GanjoorUserBookmarks.Where(b => b.UserId == userId && b.PoemId == poemId && b.VerseId == verse12.Value.Verse1).SingleOrDefaultAsync();
if (bookmark != null)
{
var res = await DeleteGanjoorBookmark(bookmark.Id, userId);
@ -39,7 +37,7 @@ namespace RMuseum.Services.Implementation
}
else
{
var res = await BookmarkVerse(poemId, (int)verseId, userId);
var res = await BookmarkVerse(poemId, verse12.Value.Verse1, verse12.Value.Verse2, userId);
if(!string.IsNullOrEmpty(res.ExceptionString))
return res;
bookmark = res.Result;
@ -53,9 +51,10 @@ namespace RMuseum.Services.Implementation
/// </summary>
/// <param name="poemId"></param>
/// <param name="verseId"></param>
/// <param name="verse2Id"></param>
/// <param name="userId"></param>
/// <returns></returns>
public async Task<RServiceResult<GanjoorUserBookmark>> BookmarkVerse(int poemId, int verseId, Guid userId)
public async Task<RServiceResult<GanjoorUserBookmark>> BookmarkVerse(int poemId, int verseId, int? verse2Id, Guid userId)
{
if ((await _context.GanjoorUserBookmarks.Where(b => b.UserId == userId && b.PoemId == poemId && b.VerseId == verseId).SingleOrDefaultAsync()) != null)
{
@ -68,8 +67,8 @@ namespace RMuseum.Services.Implementation
UserId = userId,
PoemId = poemId,
VerseId = verseId,
Verse2Id = verse2Id,
DateTime = DateTime.Now,
Note = ""
};
_context.GanjoorUserBookmarks.Add(bookmark);

View File

@ -545,6 +545,52 @@ namespace RMuseum.Services.Implementation
return res;
}
/// <summary>
/// verse 1/ 2 id from couplet index
/// </summary>
/// <param name="poemId"></param>
/// <param name="coupletIndex"></param>
/// <returns></returns>
private async Task<(int Verse1, int? Verse2)?> _GetVerse12IdFromCoupletIndex(int poemId, int coupletIndex)
{
int? Verse1Id = null;
int? Verse2Id = null;
var verses = await _context.GanjoorVerses.Where(v => v.PoemId == poemId).OrderBy(v => v.VOrder).ToListAsync();
int cIndex = -1;
for (int i = 0; i < verses.Count; i++)
{
if (verses[i].VersePosition != VersePosition.Left && verses[i].VersePosition != VersePosition.CenteredVerse2)
cIndex++;
if (cIndex == coupletIndex)
{
Verse1Id = verses[i].Id;
if (verses[i].VersePosition == VersePosition.Right)
{
if (i < verses.Count - 1)
{
Verse2Id = verses[i + 1].Id;
}
}
if (verses[i].VersePosition == VersePosition.CenteredVerse1)
{
if (i < verses.Count - 1)
{
if (verses[i + 1].VersePosition == VersePosition.CenteredVerse2)
{
Verse2Id = verses[i + 1].Id;
}
}
}
break;
}
}
if (Verse1Id == null)
return null;
return ((int)Verse1Id, Verse2Id);
}
/// <summary>