#203 changing db structure

This commit is contained in:
Hamid Reza Mohammadi 2021-09-12 18:27:35 +04:30
parent c757270c1d
commit 175092aff9
12 changed files with 2046 additions and 5256 deletions

View File

@ -4,6 +4,8 @@ using RMuseum.Models.Auth.Memory;
using RMuseum.Models.Ganjoor;
using RMuseum.Models.Ganjoor.ViewModels;
using RMuseum.Services;
using System;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
@ -59,7 +61,7 @@ namespace RMuseum.Controllers
[ProducesResponseType((int)HttpStatusCode.Unauthorized)]
public async Task<IActionResult> AddLanguageAsync([FromBody] GanjoorLanguage lang)
{
var res = await _translationService.AddLanguageAsync(lang.Name, lang.RightToLeft);
var res = await _translationService.AddLanguageAsync(lang);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok(res.Result);
@ -148,7 +150,8 @@ namespace RMuseum.Controllers
[ProducesResponseType((int)HttpStatusCode.Unauthorized)]
public async Task<IActionResult> AddOrUpdatePoemTranslation([FromBody] GanjoorPoemTranslationViewModel translation)
{
var res = await _translationService.AddOrUpdatePoemTranslation(translation);
Guid userId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
var res = await _translationService.AddPoemTranslation(userId, translation);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok(res.Result);

View File

@ -120,19 +120,11 @@ namespace RMuseum.DbContext
.HasIndex(m => m.Name)
.IsUnique();
builder.Entity<GanjoorPoemTranslation>()
.HasIndex(t => new { t.LanguageId, t.PoemId })
.IsUnique();
builder.Entity<GanjoorPoemTranslation>()
.HasOne(e => e.Language)
.WithMany()
.OnDelete(DeleteBehavior.NoAction);
builder.Entity<GanjoorVerseTranslation>()
.HasIndex(t => new { t.LanguageId, t.VerseId })
.IsUnique();
//Index set suggested by SQL Server Tuning Wizard -- end
@ -347,10 +339,6 @@ namespace RMuseum.DbContext
/// poem translations
/// </summary>
public DbSet<GanjoorPoemTranslation> PoemTranslations { get; set; }
/// <summary>
/// verse translations
/// </summary>
public DbSet<GanjoorVerseTranslation> VerseTranslations { get; set; }
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,119 +0,0 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace RMuseum.Migrations
{
public partial class Translations : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "GanjoorLanguages",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
Name = table.Column<string>(type: "nvarchar(450)", nullable: true),
RightToLeft = table.Column<bool>(type: "bit", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_GanjoorLanguages", x => x.Id);
});
migrationBuilder.CreateTable(
name: "PoemTranslations",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
LanguageId = table.Column<int>(type: "int", nullable: false),
PoemId = table.Column<int>(type: "int", nullable: false),
Title = table.Column<string>(type: "nvarchar(max)", nullable: true),
Published = table.Column<bool>(type: "bit", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_PoemTranslations", x => x.Id);
table.ForeignKey(
name: "FK_PoemTranslations_GanjoorPoems_PoemId",
column: x => x.PoemId,
principalTable: "GanjoorPoems",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_PoemTranslations_PoemTranslations_LanguageId",
column: x => x.LanguageId,
principalTable: "PoemTranslations",
principalColumn: "Id");
});
migrationBuilder.CreateTable(
name: "VerseTranslations",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
VerseId = table.Column<int>(type: "int", nullable: false),
LanguageId = table.Column<int>(type: "int", nullable: false),
TText = table.Column<string>(type: "nvarchar(max)", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_VerseTranslations", x => x.Id);
table.ForeignKey(
name: "FK_VerseTranslations_GanjoorLanguages_LanguageId",
column: x => x.LanguageId,
principalTable: "GanjoorLanguages",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_VerseTranslations_GanjoorVerses_VerseId",
column: x => x.VerseId,
principalTable: "GanjoorVerses",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_GanjoorLanguages_Name",
table: "GanjoorLanguages",
column: "Name",
unique: true,
filter: "[Name] IS NOT NULL");
migrationBuilder.CreateIndex(
name: "IX_PoemTranslations_LanguageId_PoemId",
table: "PoemTranslations",
columns: new[] { "LanguageId", "PoemId" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_PoemTranslations_PoemId",
table: "PoemTranslations",
column: "PoemId");
migrationBuilder.CreateIndex(
name: "IX_VerseTranslations_LanguageId_VerseId",
table: "VerseTranslations",
columns: new[] { "LanguageId", "VerseId" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_VerseTranslations_VerseId",
table: "VerseTranslations",
column: "VerseId");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "PoemTranslations");
migrationBuilder.DropTable(
name: "VerseTranslations");
migrationBuilder.DropTable(
name: "GanjoorLanguages");
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -15,9 +15,24 @@
/// </summary>
public string Name { get; set; }
/// <summary>
/// code
/// </summary>
public string Code { get; set; }
/// <summary>
/// native name
/// </summary>
public string NativeName { get; set; }
/// <summary>
/// is right to left
/// </summary>
public bool RightToLeft { get; set; }
/// <summary>
/// description
/// </summary>
public string Description { get; set; }
}
}

View File

@ -1,4 +1,8 @@
namespace RMuseum.Models.Ganjoor
using RSecurityBackend.Models.Auth.Db;
using System;
using System.Collections.Generic;
namespace RMuseum.Models.Ganjoor
{
/// <summary>
/// poem translation
@ -35,9 +39,29 @@
/// </summary>
public string Title { get; set; }
/// <summary>
/// verses
/// </summary>
public List<GanjoorVerseTranslation> Verses { get; set; }
/// <summary>
/// published
/// </summary>
public bool Published { get; set; }
/// <summary>
/// user id
/// </summary>
public Guid UserId { get; set; }
/// <summary>
/// user
/// </summary>
public RAppUser User { get; set; }
/// <summary>
/// date/time
/// </summary>
public DateTime DateTime { get; set; }
}
}

View File

@ -20,16 +20,6 @@
/// </summary>
public GanjoorVerse Verse { get; set; }
/// <summary>
/// language
/// </summary>
public int LanguageId { get; set; }
/// <summary>
/// language
/// </summary>
public GanjoorLanguage Language { get; set; }
/// <summary>
/// translated text
/// </summary>

View File

@ -19,6 +19,11 @@
/// </summary>
public string Title { get; set; }
/// <summary>
/// published
/// </summary>
public bool Published { get; set; }
/// <summary>
/// translated verses
/// </summary>

View File

@ -1895,11 +1895,6 @@
poem translations
</summary>
</member>
<member name="P:RMuseum.DbContext.RMuseumDbContext.VerseTranslations">
<summary>
verse translations
</summary>
</member>
<member name="T:RMuseum.Models.Accounting.DonationExpenditure">
<summary>
donation expenditures
@ -4573,11 +4568,26 @@
name
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.GanjoorLanguage.Code">
<summary>
code
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.GanjoorLanguage.NativeName">
<summary>
native name
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.GanjoorLanguage.RightToLeft">
<summary>
is right to left
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.GanjoorLanguage.Description">
<summary>
description
</summary>
</member>
<member name="T:RMuseum.Models.Ganjoor.GanjoorMetre">
<summary>
Poem prosodic Metre
@ -5087,11 +5097,31 @@
title translation
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.GanjoorPoemTranslation.Verses">
<summary>
verses
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.GanjoorPoemTranslation.Published">
<summary>
published
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.GanjoorPoemTranslation.UserId">
<summary>
user id
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.GanjoorPoemTranslation.User">
<summary>
user
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.GanjoorPoemTranslation.DateTime">
<summary>
date/time
</summary>
</member>
<member name="T:RMuseum.Models.Ganjoor.GanjoorPoet">
<summary>
Ganjoor Poet
@ -5232,16 +5262,6 @@
verse
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.GanjoorVerseTranslation.LanguageId">
<summary>
language
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.GanjoorVerseTranslation.Language">
<summary>
language
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.GanjoorVerseTranslation.TText">
<summary>
translated text
@ -6183,6 +6203,11 @@
translated title
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.ViewModels.GanjoorPoemTranslationViewModel.Published">
<summary>
published
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.ViewModels.GanjoorPoemTranslationViewModel.TranslatedVerses">
<summary>
translated verses
@ -8421,12 +8446,11 @@
translation service implementation
</summary>
</member>
<member name="M:RMuseum.Services.IGanjoorTranslationService.AddLanguageAsync(System.String,System.Boolean)">
<member name="M:RMuseum.Services.IGanjoorTranslationService.AddLanguageAsync(RMuseum.Models.Ganjoor.GanjoorLanguage)">
<summary>
add language
</summary>
<param name="name"></param>
<param name="rtl"></param>
<param name="lang"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IGanjoorTranslationService.UpdateLangaugeAsync(RMuseum.Models.Ganjoor.GanjoorLanguage)">
@ -8456,11 +8480,12 @@
</summary>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IGanjoorTranslationService.AddOrUpdatePoemTranslation(RMuseum.Models.Ganjoor.ViewModels.GanjoorPoemTranslationViewModel)">
<member name="M:RMuseum.Services.IGanjoorTranslationService.AddPoemTranslation(System.Guid,RMuseum.Models.Ganjoor.ViewModels.GanjoorPoemTranslationViewModel)">
<summary>
add or update poem translation
</summary>
<param name="translation"></param>
<param name="userId"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IGanjoorTranslationService.GetTranslationsAsync(System.Int32)">
@ -10078,12 +10103,11 @@
translation service implementation
</summary>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorTranslationService.AddLanguageAsync(System.String,System.Boolean)">
<member name="M:RMuseum.Services.Implementation.GanjoorTranslationService.AddLanguageAsync(RMuseum.Models.Ganjoor.GanjoorLanguage)">
<summary>
add language
</summary>
<param name="name"></param>
<param name="rtl"></param>
<param name="lang"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorTranslationService.UpdateLangaugeAsync(RMuseum.Models.Ganjoor.GanjoorLanguage)">
@ -10113,10 +10137,11 @@
</summary>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorTranslationService.AddOrUpdatePoemTranslation(RMuseum.Models.Ganjoor.ViewModels.GanjoorPoemTranslationViewModel)">
<member name="M:RMuseum.Services.Implementation.GanjoorTranslationService.AddPoemTranslation(System.Guid,RMuseum.Models.Ganjoor.ViewModels.GanjoorPoemTranslationViewModel)">
<summary>
add or update poem translation
</summary>
<param name="userId"></param>
<param name="translation"></param>
<returns></returns>
</member>

View File

@ -1,6 +1,7 @@
using RMuseum.Models.Ganjoor;
using RMuseum.Models.Ganjoor.ViewModels;
using RSecurityBackend.Models.Generic;
using System;
using System.Threading.Tasks;
namespace RMuseum.Services
@ -13,10 +14,9 @@ namespace RMuseum.Services
/// <summary>
/// add language
/// </summary>
/// <param name="name"></param>
/// <param name="rtl"></param>
/// <param name="lang"></param>
/// <returns></returns>
Task<RServiceResult<GanjoorLanguage>> AddLanguageAsync(string name, bool rtl);
Task<RServiceResult<GanjoorLanguage>> AddLanguageAsync(GanjoorLanguage lang);
/// <summary>
@ -52,8 +52,9 @@ namespace RMuseum.Services
/// add or update poem translation
/// </summary>
/// <param name="translation"></param>
/// <param name="userId"></param>
/// <returns></returns>
Task<RServiceResult<bool>> AddOrUpdatePoemTranslation(GanjoorPoemTranslationViewModel translation);
Task<RServiceResult<bool>> AddPoemTranslation(Guid userId, GanjoorPoemTranslationViewModel translation);
/// <summary>
/// get translations for a poem

View File

@ -18,26 +18,20 @@ namespace RMuseum.Services.Implementation
/// <summary>
/// add language
/// </summary>
/// <param name="name"></param>
/// <param name="rtl"></param>
/// <param name="lang"></param>
/// <returns></returns>
public async Task<RServiceResult<GanjoorLanguage>> AddLanguageAsync(string name, bool rtl)
public async Task<RServiceResult<GanjoorLanguage>> AddLanguageAsync(GanjoorLanguage lang)
{
var existing = await _context.GanjoorLanguages.Where(l => l.Name == name).FirstOrDefaultAsync();
var existing = await _context.GanjoorLanguages.Where(l => l.Name == lang.Name || l.Code == lang.Code).FirstOrDefaultAsync();
if (existing != null)
return new RServiceResult<GanjoorLanguage>(null, "نام تکراری است.");
return new RServiceResult<GanjoorLanguage>(null, "اطلاعات تکراری است.");
try
{
var lang = new GanjoorLanguage()
{
Name = name,
RightToLeft = rtl
};
_context.GanjoorLanguages.Add(lang);
await _context.SaveChangesAsync();
return new RServiceResult<GanjoorLanguage>(lang);
}
catch(Exception exp)
catch (Exception exp)
{
return new RServiceResult<GanjoorLanguage>(null, exp.ToString());
}
@ -58,6 +52,9 @@ namespace RMuseum.Services.Implementation
lang.Name = updated.Name;
lang.RightToLeft = updated.RightToLeft;
lang.Code = updated.Code;
lang.NativeName = updated.NativeName;
lang.Description = updated.Description;
_context.Update(lang);
await _context.SaveChangesAsync();
@ -129,57 +126,53 @@ namespace RMuseum.Services.Implementation
/// <summary>
/// add or update poem translation
/// </summary>
/// <param name="userId"></param>
/// <param name="translation"></param>
/// <returns></returns>
public async Task<RServiceResult<bool>> AddOrUpdatePoemTranslation(GanjoorPoemTranslationViewModel translation)
public async Task<RServiceResult<bool>> AddPoemTranslation(Guid userId, GanjoorPoemTranslationViewModel translation)
{
try
{
var dbTranslation = await _context.PoemTranslations.Where(t => t.LanguageId == translation.LanguageId && t.PoemId == translation.PoemId).SingleOrDefaultAsync();
if(dbTranslation == null)
if (translation.Published)
{
dbTranslation = new GanjoorPoemTranslation()
var oldPublished = await _context.PoemTranslations.Where(t => t.LanguageId == translation.LanguageId && t.PoemId == translation.PoemId && t.Published == true).ToListAsync();
foreach (var item in oldPublished)
{
LanguageId = translation.LanguageId,
PoemId = translation.PoemId,
Title = translation.Title,
Published = true
};
_context.PoemTranslations.Add(dbTranslation);
item.Published = false;
_context.PoemTranslations.Update(item);
}
}
else
var dbTranslation = new GanjoorPoemTranslation()
{
dbTranslation.Title = translation.Title;
_context.PoemTranslations.Update(dbTranslation);
}
LanguageId = translation.LanguageId,
PoemId = translation.PoemId,
Title = translation.Title,
Published = true,
Verses = new List<GanjoorVerseTranslation>(),
UserId = userId,
DateTime = DateTime.Now
};
var verses = await _context.GanjoorVerses.Where(v => v.PoemId == translation.PoemId).ToListAsync();
foreach (var translatedVerse in translation.TranslatedVerses)
{
var verse = verses.Where(v => v.VOrder == translatedVerse.VOrder).Single();
var dbTranslatedVerse = await _context.VerseTranslations.Where(t => t.LanguageId == translation.LanguageId && t.VerseId == verse.Id).SingleOrDefaultAsync();
if (dbTranslatedVerse == null)
{
dbTranslatedVerse = new GanjoorVerseTranslation()
dbTranslation.Verses
.Add(
new GanjoorVerseTranslation()
{
LanguageId = translation.LanguageId,
VerseId = verse.Id,
TText = translatedVerse.TText
};
_context.VerseTranslations.Add(dbTranslatedVerse);
}
else
{
dbTranslatedVerse.TText = translatedVerse.TText;
_context.VerseTranslations.Update(dbTranslatedVerse);
}
});
}
_context.PoemTranslations.Add(dbTranslation);
await _context.SaveChangesAsync();
return new RServiceResult<bool>(true);
}
catch(Exception exp)
catch (Exception exp)
{
return new RServiceResult<bool>(false, exp.ToString());
}
@ -195,12 +188,11 @@ namespace RMuseum.Services.Implementation
{
try
{
var dbTranslation = await _context.PoemTranslations.Where(t => t.LanguageId == langId && t.PoemId == poemId).SingleOrDefaultAsync();
var dbTranslation = await _context.PoemTranslations.Include(t => t.Verses).Where(t => t.LanguageId == langId && t.PoemId == poemId && t.Published == true).SingleOrDefaultAsync();
if (dbTranslation == null)
return new RServiceResult<GanjoorPoemTranslationViewModel>(null); //not found
var verses = await _context.GanjoorVerses.Where(v => v.PoemId == poemId).ToListAsync();
var verseIds = verses.Select(v => v.Id).ToList();
var dbVerseTranslations = await _context.VerseTranslations.Where(t => t.LanguageId == langId && verseIds.Contains(t.VerseId)).OrderBy(t => t.VerseId).ToArrayAsync();
return new RServiceResult<GanjoorPoemTranslationViewModel>
(
@ -209,7 +201,7 @@ namespace RMuseum.Services.Implementation
LanguageId = langId,
PoemId = poemId,
Title = dbTranslation == null ? null : dbTranslation.Title,
TranslatedVerses = dbVerseTranslations.Select(v =>
TranslatedVerses = dbTranslation.Verses.Select(v =>
new GanjoorVerseTranslationViewModel()
{
VOrder = verses.Where(pv => pv.Id == v.VerseId).Single().VOrder,
@ -220,7 +212,7 @@ namespace RMuseum.Services.Implementation
);
}
catch(Exception exp)
catch (Exception exp)
{
return new RServiceResult<GanjoorPoemTranslationViewModel>(null, exp.ToString());
}
@ -235,17 +227,16 @@ namespace RMuseum.Services.Implementation
{
try
{
var dbTranslations = await _context.PoemTranslations.Where(t => t.PoemId == poemId).OrderBy(t => t.LanguageId).ToArrayAsync();
var dbTranslations = await _context.PoemTranslations.Include(t => t.Verses).Where(t => t.PoemId == poemId && t.Published == true).OrderBy(t => t.LanguageId).ToArrayAsync();
List<GanjoorPoemTranslationViewModel> res = new List<GanjoorPoemTranslationViewModel>();
if(dbTranslations.Length > 0)
if (dbTranslations.Length > 0)
{
}
var verses = await _context.GanjoorVerses.Where(v => v.PoemId == poemId).ToListAsync();
var verseIds = verses.Select(v => v.Id).ToList();
foreach(var dbTranslation in dbTranslations)
foreach (var dbTranslation in dbTranslations)
{
var dbVerseTranslations = await _context.VerseTranslations.Where(t => t.LanguageId == dbTranslation.LanguageId && verseIds.Contains(t.VerseId)).OrderBy(t => t.VerseId).ToArrayAsync();
res.Add(
new GanjoorPoemTranslationViewModel()
@ -253,7 +244,7 @@ namespace RMuseum.Services.Implementation
LanguageId = dbTranslation.LanguageId,
PoemId = poemId,
Title = dbTranslation == null ? null : dbTranslation.Title,
TranslatedVerses = dbVerseTranslations.Select(v =>
TranslatedVerses = dbTranslation.Verses.Select(v =>
new GanjoorVerseTranslationViewModel()
{
VOrder = verses.Where(pv => pv.Id == v.VerseId).Single().VOrder,