Projects (GanjooRazor -> DivanRazor, GanjoorService.sln -> DivanService.sln), files, folders, classes, namespaces, settings, API routes (/api/divan) and DB tables (Divan*). External addresses (ganjoor.net, github.com/ganjoor) unchanged. Migrations renamed consistently (no pending model changes); requires a fresh database. Upstream RUNNING_LOCALLY/SEMANTIC_SEARCH docs archived unmodified under docs/. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1136 lines
64 KiB
C#
1136 lines
64 KiB
C#
using Microsoft.EntityFrameworkCore;
|
|
using RMuseum.DbContext;
|
|
using RMuseum.Models.Divan;
|
|
using RMuseum.Models.Divan.ViewModels;
|
|
using RSecurityBackend.Models.Generic;
|
|
using RSecurityBackend.Services.Implementation;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Data;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace RMuseum.Services.Implementation
|
|
{
|
|
/// <summary>
|
|
/// IDivanService implementation
|
|
/// </summary>
|
|
public partial class DivanService : IDivanService
|
|
{
|
|
/// <summary>
|
|
/// moderate poem section correction
|
|
/// </summary>
|
|
/// <param name="userId"></param>
|
|
/// <param name="moderation"></param>
|
|
/// <returns></returns>
|
|
public async Task<RServiceResult<DivanPoemSectionCorrectionViewModel>> ModeratePoemSectionCorrection(Guid userId,
|
|
DivanPoemSectionCorrectionViewModel moderation)
|
|
{
|
|
|
|
try
|
|
{
|
|
var dbCorrection = await _context.DivanPoemSectionCorrections.Include(c => c.User)
|
|
.Where(c => c.Id == moderation.Id)
|
|
.FirstOrDefaultAsync();
|
|
|
|
if (dbCorrection == null)
|
|
return new RServiceResult<DivanPoemSectionCorrectionViewModel>(null);
|
|
|
|
dbCorrection.ReviewerUserId = userId;
|
|
dbCorrection.ReviewDate = DateTime.Now;
|
|
dbCorrection.ApplicationOrder = await _context.DivanPoemSectionCorrections.Where(c => c.Reviewed).AnyAsync() ? 1 + await _context.DivanPoemSectionCorrections.Where(c => c.Reviewed).MaxAsync(c => c.ApplicationOrder) : 1;
|
|
|
|
dbCorrection.AffectedThePoem = false;
|
|
dbCorrection.ReviewNote = moderation.ReviewNote;
|
|
|
|
var editingSectionNotTracked = await _context.DivanPoemSections.AsNoTracking().Include(p => p.DivanMetre).Where(p => p.Id == moderation.SectionId).SingleOrDefaultAsync();
|
|
|
|
editingSectionNotTracked.OldDivanMetreId = editingSectionNotTracked.DivanMetreId;
|
|
editingSectionNotTracked.OldRhymeLetters = editingSectionNotTracked.RhymeLetters;
|
|
|
|
var sections = await _context.DivanPoemSections.Where(p => p.PoemId == editingSectionNotTracked.PoemId).ToListAsync();
|
|
|
|
if (dbCorrection.Rhythm != null)
|
|
{
|
|
if (moderation.RhythmResult == CorrectionReviewResult.NotReviewed)
|
|
return new RServiceResult<DivanPoemSectionCorrectionViewModel>(null, "تغییرات وزن بررسی نشده است.");
|
|
dbCorrection.RhythmResult = moderation.RhythmResult;
|
|
if (dbCorrection.RhythmResult == CorrectionReviewResult.Approved)
|
|
{
|
|
dbCorrection.OriginalRhythm = editingSectionNotTracked.DivanMetre == null ? null : editingSectionNotTracked.DivanMetre.Rhythm;
|
|
dbCorrection.AffectedThePoem = true;
|
|
if (moderation.Rhythm == "")
|
|
{
|
|
editingSectionNotTracked.DivanMetreId = null;
|
|
}
|
|
else
|
|
{
|
|
var metre = await _context.DivanMetres.AsNoTracking().Where(m => m.Rhythm == moderation.Rhythm).SingleOrDefaultAsync();
|
|
if (metre == null)
|
|
{
|
|
metre = new DivanMetre()
|
|
{
|
|
Rhythm = moderation.Rhythm,
|
|
VerseCount = 0
|
|
};
|
|
_context.DivanMetres.Add(metre);
|
|
await _context.SaveChangesAsync();
|
|
}
|
|
editingSectionNotTracked.DivanMetreId = metre.Id;
|
|
}
|
|
|
|
editingSectionNotTracked.Modified = editingSectionNotTracked.OldDivanMetreId != editingSectionNotTracked.DivanMetreId;
|
|
|
|
foreach (var section in sections.Where(s => s.DivanMetreRefSectionIndex == editingSectionNotTracked.Index || s.Id == editingSectionNotTracked.Id))
|
|
{
|
|
section.DivanMetreId = editingSectionNotTracked.DivanMetreId;
|
|
section.Modified = editingSectionNotTracked.Modified;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (dbCorrection.RhymeLetters != null)
|
|
{
|
|
if (moderation.RhymeLettersReviewResult == CorrectionReviewResult.NotReviewed)
|
|
return new RServiceResult<DivanPoemSectionCorrectionViewModel>(null, "تغییرات قافیه بررسی نشده است.");
|
|
dbCorrection.RhymeLettersReviewResult = moderation.RhymeLettersReviewResult;
|
|
if (dbCorrection.RhymeLettersReviewResult == CorrectionReviewResult.Approved)
|
|
{
|
|
dbCorrection.AffectedThePoem = true;
|
|
dbCorrection.OriginalRhymeLetters = editingSectionNotTracked.RhymeLetters;
|
|
if (moderation.RhymeLetters == "")
|
|
{
|
|
editingSectionNotTracked.RhymeLetters = null;
|
|
}
|
|
else
|
|
{
|
|
editingSectionNotTracked.RhymeLetters = dbCorrection.RhymeLetters;
|
|
}
|
|
editingSectionNotTracked.Modified = true;
|
|
var section = sections.Single(s => s.Id == editingSectionNotTracked.Id);
|
|
section.OldRhymeLetters = section.RhymeLetters;
|
|
section.RhymeLetters = editingSectionNotTracked.RhymeLetters;
|
|
section.Modified = editingSectionNotTracked.Modified;
|
|
}
|
|
|
|
}
|
|
|
|
if (dbCorrection.Language != null)
|
|
{
|
|
if (moderation.LanguageReviewResult == CorrectionReviewResult.NotReviewed)
|
|
return new RServiceResult<DivanPoemSectionCorrectionViewModel>(null, "تغییرات زبان بررسی نشده است.");
|
|
dbCorrection.LanguageReviewResult = moderation.LanguageReviewResult;
|
|
if (dbCorrection.LanguageReviewResult == CorrectionReviewResult.Approved)
|
|
{
|
|
dbCorrection.OriginalLanguage = editingSectionNotTracked.Language;
|
|
dbCorrection.Language = moderation.Language;
|
|
dbCorrection.AffectedThePoem = true;
|
|
|
|
var section = sections.Single(s => s.Id == editingSectionNotTracked.Id);
|
|
section.Language = moderation.Language;
|
|
section.Modified = true;
|
|
|
|
if (editingSectionNotTracked.SectionType == PoemSectionType.WholePoem)
|
|
{
|
|
if(sections.Count(s => s.SectionType == PoemSectionType.WholePoem) == 1)
|
|
{
|
|
if(false == await _context.DivanVerses.AsNoTracking().Where(v => v.PoemId == editingSectionNotTracked.PoemId
|
|
&&
|
|
(v.VersePosition == VersePosition.Paragraph || v.VersePosition == VersePosition.Single ) ).AnyAsync())
|
|
{
|
|
var trackedPoem = await _context.DivanPoems.Where(p => p.Id == editingSectionNotTracked.PoemId).SingleAsync();
|
|
trackedPoem.Language = dbCorrection.Language;
|
|
_context.Update(trackedPoem);
|
|
}
|
|
}
|
|
|
|
var divanLanguage = await _context.DivanLanguages.AsNoTracking().Where(l => l.Code == moderation.Language).SingleOrDefaultAsync();
|
|
if(divanLanguage != null )
|
|
{
|
|
var dbVerses = await _context.DivanVerses.Where(v => v.PoemId == editingSectionNotTracked.PoemId && v.SectionIndex1 == editingSectionNotTracked.Index).ToListAsync();
|
|
foreach (var dbVerse in dbVerses)
|
|
{
|
|
dbVerse.LanguageId = divanLanguage.Id;
|
|
}
|
|
_context.UpdateRange(dbVerses);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if(dbCorrection.PoemFormat != null)
|
|
{
|
|
if(moderation.PoemFormatReviewResult == CorrectionReviewResult.NotReviewed)
|
|
return new RServiceResult<DivanPoemSectionCorrectionViewModel>(null, "تغییرات قالب شعری بررسی نشده است.");
|
|
|
|
dbCorrection.PoemFormatReviewResult = moderation.PoemFormatReviewResult;
|
|
if(dbCorrection.PoemFormatReviewResult == CorrectionReviewResult.Approved)
|
|
{
|
|
dbCorrection.OriginalPoemFormat = editingSectionNotTracked.PoemFormat;
|
|
dbCorrection.PoemFormat = moderation.PoemFormat;
|
|
dbCorrection.AffectedThePoem = true;
|
|
|
|
var section = sections.Single(s => s.Id == editingSectionNotTracked.Id);
|
|
section.PoemFormat = moderation.PoemFormat;
|
|
section.Modified = true;
|
|
|
|
}
|
|
}
|
|
|
|
foreach (var section in sections)
|
|
{
|
|
if (section.Modified)
|
|
{
|
|
_context.Update(section);
|
|
}
|
|
}
|
|
|
|
|
|
if (dbCorrection.BreakFromVerse10VOrder != null)
|
|
{
|
|
if (moderation.BreakFromVerse10VOrder != dbCorrection.BreakFromVerse10VOrder)
|
|
{
|
|
dbCorrection.BreakFromVerse10VOrderResult = CorrectionReviewResult.RejectedBecauseWrong;
|
|
dbCorrection.BreakFromVerse10VOrder = null;
|
|
}
|
|
else
|
|
{
|
|
await _BreakSection(sections, editingSectionNotTracked, (int)dbCorrection.BreakFromVerse10VOrder);
|
|
dbCorrection.BreakFromVerse10VOrderResult = CorrectionReviewResult.Approved;
|
|
dbCorrection.AffectedThePoem = true;
|
|
_context.DivanPoemSectionCorrections.Update(dbCorrection);
|
|
await _context.SaveChangesAsync();
|
|
}
|
|
}
|
|
|
|
if (dbCorrection.BreakFromVerse9VOrder != null)
|
|
{
|
|
if (moderation.BreakFromVerse9VOrder != dbCorrection.BreakFromVerse9VOrder)
|
|
{
|
|
dbCorrection.BreakFromVerse9VOrderResult = CorrectionReviewResult.RejectedBecauseWrong;
|
|
dbCorrection.BreakFromVerse9VOrder = null;
|
|
}
|
|
else
|
|
{
|
|
await _BreakSection(sections, editingSectionNotTracked, (int)dbCorrection.BreakFromVerse9VOrder);
|
|
dbCorrection.BreakFromVerse9VOrderResult = CorrectionReviewResult.Approved;
|
|
dbCorrection.AffectedThePoem = true;
|
|
_context.DivanPoemSectionCorrections.Update(dbCorrection);
|
|
await _context.SaveChangesAsync();
|
|
}
|
|
}
|
|
|
|
if (dbCorrection.BreakFromVerse8VOrder != null)
|
|
{
|
|
if (moderation.BreakFromVerse8VOrder != dbCorrection.BreakFromVerse8VOrder)
|
|
{
|
|
dbCorrection.BreakFromVerse8VOrderResult = CorrectionReviewResult.RejectedBecauseWrong;
|
|
dbCorrection.BreakFromVerse8VOrder = null;
|
|
}
|
|
else
|
|
{
|
|
await _BreakSection(sections, editingSectionNotTracked, (int)dbCorrection.BreakFromVerse8VOrder);
|
|
dbCorrection.BreakFromVerse8VOrderResult = CorrectionReviewResult.Approved;
|
|
dbCorrection.AffectedThePoem = true;
|
|
_context.DivanPoemSectionCorrections.Update(dbCorrection);
|
|
await _context.SaveChangesAsync();
|
|
}
|
|
}
|
|
|
|
if (dbCorrection.BreakFromVerse7VOrder != null)
|
|
{
|
|
if (moderation.BreakFromVerse7VOrder != dbCorrection.BreakFromVerse7VOrder)
|
|
{
|
|
dbCorrection.BreakFromVerse7VOrderResult = CorrectionReviewResult.RejectedBecauseWrong;
|
|
dbCorrection.BreakFromVerse7VOrder = null;
|
|
}
|
|
else
|
|
{
|
|
await _BreakSection(sections, editingSectionNotTracked, (int)dbCorrection.BreakFromVerse7VOrder);
|
|
dbCorrection.BreakFromVerse7VOrderResult = CorrectionReviewResult.Approved;
|
|
dbCorrection.AffectedThePoem = true;
|
|
_context.DivanPoemSectionCorrections.Update(dbCorrection);
|
|
await _context.SaveChangesAsync();
|
|
}
|
|
}
|
|
|
|
if (dbCorrection.BreakFromVerse6VOrder != null)
|
|
{
|
|
if (moderation.BreakFromVerse6VOrder != dbCorrection.BreakFromVerse6VOrder)
|
|
{
|
|
dbCorrection.BreakFromVerse6VOrderResult = CorrectionReviewResult.RejectedBecauseWrong;
|
|
dbCorrection.BreakFromVerse6VOrder = null;
|
|
}
|
|
else
|
|
{
|
|
await _BreakSection(sections, editingSectionNotTracked, (int)dbCorrection.BreakFromVerse6VOrder);
|
|
dbCorrection.BreakFromVerse6VOrderResult = CorrectionReviewResult.Approved;
|
|
dbCorrection.AffectedThePoem = true;
|
|
_context.DivanPoemSectionCorrections.Update(dbCorrection);
|
|
await _context.SaveChangesAsync();
|
|
}
|
|
}
|
|
|
|
if (dbCorrection.BreakFromVerse5VOrder != null)
|
|
{
|
|
if (moderation.BreakFromVerse5VOrder != dbCorrection.BreakFromVerse5VOrder)
|
|
{
|
|
dbCorrection.BreakFromVerse5VOrderResult = CorrectionReviewResult.RejectedBecauseWrong;
|
|
dbCorrection.BreakFromVerse5VOrder = null;
|
|
}
|
|
else
|
|
{
|
|
await _BreakSection(sections, editingSectionNotTracked, (int)dbCorrection.BreakFromVerse5VOrder);
|
|
dbCorrection.BreakFromVerse5VOrderResult = CorrectionReviewResult.Approved;
|
|
dbCorrection.AffectedThePoem = true;
|
|
_context.DivanPoemSectionCorrections.Update(dbCorrection);
|
|
await _context.SaveChangesAsync();
|
|
}
|
|
}
|
|
|
|
if (dbCorrection.BreakFromVerse4VOrder != null)
|
|
{
|
|
if (moderation.BreakFromVerse4VOrder != dbCorrection.BreakFromVerse4VOrder)
|
|
{
|
|
dbCorrection.BreakFromVerse4VOrderResult = CorrectionReviewResult.RejectedBecauseWrong;
|
|
dbCorrection.BreakFromVerse4VOrder = null;
|
|
}
|
|
else
|
|
{
|
|
await _BreakSection(sections, editingSectionNotTracked, (int)dbCorrection.BreakFromVerse4VOrder);
|
|
dbCorrection.BreakFromVerse4VOrderResult = CorrectionReviewResult.Approved;
|
|
dbCorrection.AffectedThePoem = true;
|
|
_context.DivanPoemSectionCorrections.Update(dbCorrection);
|
|
await _context.SaveChangesAsync();
|
|
}
|
|
}
|
|
|
|
if (dbCorrection.BreakFromVerse3VOrder != null)
|
|
{
|
|
if (moderation.BreakFromVerse3VOrder != dbCorrection.BreakFromVerse3VOrder)
|
|
{
|
|
dbCorrection.BreakFromVerse3VOrderResult = CorrectionReviewResult.RejectedBecauseWrong;
|
|
dbCorrection.BreakFromVerse3VOrder = null;
|
|
}
|
|
else
|
|
{
|
|
await _BreakSection(sections, editingSectionNotTracked, (int)dbCorrection.BreakFromVerse3VOrder);
|
|
dbCorrection.BreakFromVerse3VOrderResult = CorrectionReviewResult.Approved;
|
|
dbCorrection.AffectedThePoem = true;
|
|
_context.DivanPoemSectionCorrections.Update(dbCorrection);
|
|
await _context.SaveChangesAsync();
|
|
}
|
|
}
|
|
|
|
if (dbCorrection.BreakFromVerse2VOrder != null)
|
|
{
|
|
if (moderation.BreakFromVerse2VOrder != dbCorrection.BreakFromVerse2VOrder)
|
|
{
|
|
dbCorrection.BreakFromVerse2VOrderResult = CorrectionReviewResult.RejectedBecauseWrong;
|
|
dbCorrection.BreakFromVerse2VOrder = null;
|
|
}
|
|
else
|
|
{
|
|
await _BreakSection(sections, editingSectionNotTracked, (int)dbCorrection.BreakFromVerse2VOrder);
|
|
dbCorrection.BreakFromVerse2VOrderResult = CorrectionReviewResult.Approved;
|
|
dbCorrection.AffectedThePoem = true;
|
|
_context.DivanPoemSectionCorrections.Update(dbCorrection);
|
|
await _context.SaveChangesAsync();
|
|
}
|
|
}
|
|
|
|
if (dbCorrection.BreakFromVerse1VOrder != null)
|
|
{
|
|
if (moderation.BreakFromVerse1VOrder != dbCorrection.BreakFromVerse1VOrder)
|
|
{
|
|
dbCorrection.BreakFromVerse1VOrderResult = CorrectionReviewResult.RejectedBecauseWrong;
|
|
dbCorrection.BreakFromVerse1VOrder = null;
|
|
}
|
|
else
|
|
{
|
|
await _BreakSection(sections, editingSectionNotTracked, (int)dbCorrection.BreakFromVerse1VOrder);
|
|
dbCorrection.BreakFromVerse1VOrderResult = CorrectionReviewResult.Approved;
|
|
dbCorrection.AffectedThePoem = true;
|
|
_context.DivanPoemSectionCorrections.Update(dbCorrection);
|
|
await _context.SaveChangesAsync();
|
|
}
|
|
}
|
|
|
|
|
|
dbCorrection.Reviewed = true;
|
|
_context.DivanPoemSectionCorrections.Update(dbCorrection);
|
|
await _context.SaveChangesAsync();
|
|
|
|
var dbPoem = await _context.DivanPoems.AsNoTracking().Where(p => p.Id == editingSectionNotTracked.PoemId).SingleAsync();
|
|
|
|
await _notificationService.PushNotification(dbCorrection.UserId,
|
|
"بررسی ویرایش پیشنهادی شما",
|
|
$"با سپاس از زحمت و همت شما ویرایش پیشنهادیتان برای <a href=\"https://ganjoor.net{dbPoem.FullUrl}\" target=\"_blank\">{dbPoem.FullTitle}</a> بررسی شد.{Environment.NewLine}" +
|
|
$"جهت مشاهدهٔ نتیجهٔ بررسی در میز کاربری خود بخش «<a href=\"https://ganjoor.net/User/SectionEdits\">ویرایشهای قطعات من</a>» را مشاهده بفرمایید.{Environment.NewLine}"
|
|
);
|
|
|
|
foreach (var section in sections)
|
|
{
|
|
if (section.Modified)
|
|
{
|
|
if (section.OldDivanMetreId != section.DivanMetreId || section.OldRhymeLetters != section.RhymeLetters)
|
|
{
|
|
_backgroundTaskQueue.QueueBackgroundWorkItem
|
|
(
|
|
async token =>
|
|
{
|
|
using (RMuseumDbContext inlineContext = new RMuseumDbContext(new DbContextOptions<RMuseumDbContext>())) //this is long running job, so context might be already been freed/collected by GC
|
|
{
|
|
if (section.OldDivanMetreId != null && !string.IsNullOrEmpty(section.OldRhymeLetters))
|
|
{
|
|
LongRunningJobProgressServiceEF jobProgressServiceEF = new LongRunningJobProgressServiceEF(inlineContext);
|
|
var job = (await jobProgressServiceEF.NewJob($"بازسازی فهرست بخشهای مرتبط", $"M: {section.OldDivanMetreId}, G: {section.OldRhymeLetters}")).Result;
|
|
|
|
try
|
|
{
|
|
await _UpdateRelatedSections(inlineContext, (int)section.OldDivanMetreId, section.OldRhymeLetters);
|
|
await inlineContext.SaveChangesAsync();
|
|
|
|
await jobProgressServiceEF.UpdateJob(job.Id, 100, "", true);
|
|
}
|
|
catch (Exception exp)
|
|
{
|
|
await jobProgressServiceEF.UpdateJob(job.Id, 100, "", false, exp.ToString());
|
|
}
|
|
}
|
|
|
|
if (section.DivanMetreId != null && !string.IsNullOrEmpty(section.RhymeLetters))
|
|
{
|
|
LongRunningJobProgressServiceEF jobProgressServiceEF = new LongRunningJobProgressServiceEF(inlineContext);
|
|
var job = (await jobProgressServiceEF.NewJob($"بازسازی فهرست بخشهای مرتبط", $"M: {section.DivanMetreId}, G: {section.RhymeLetters}")).Result;
|
|
|
|
try
|
|
{
|
|
await _UpdateRelatedSections(inlineContext, (int)section.DivanMetreId, section.RhymeLetters);
|
|
await inlineContext.SaveChangesAsync();
|
|
await jobProgressServiceEF.UpdateJob(job.Id, 100, "", true);
|
|
}
|
|
catch (Exception exp)
|
|
{
|
|
await jobProgressServiceEF.UpdateJob(job.Id, 100, "", false, exp.ToString());
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
return new RServiceResult<DivanPoemSectionCorrectionViewModel>(moderation);
|
|
}
|
|
catch (Exception exp)
|
|
{
|
|
return new RServiceResult<DivanPoemSectionCorrectionViewModel>(null, exp.ToString());
|
|
}
|
|
}
|
|
|
|
|
|
private async Task _BreakSection(List<DivanPoemSection> sections, DivanPoemSection editingSectionNotTracked, int vOrder)
|
|
{
|
|
|
|
var newSectionIndex = sections.Max(s => s.Index) + 1;
|
|
var newSectionNumber = sections.Max(s => s.Number) + 1;
|
|
int breakingMainSectionIndex = newSectionIndex;
|
|
var sectionCopy = new DivanPoemSection()
|
|
{
|
|
PoemId = editingSectionNotTracked.PoemId,
|
|
PoetId = editingSectionNotTracked.PoetId,
|
|
SectionType = editingSectionNotTracked.SectionType,
|
|
VerseType = editingSectionNotTracked.VerseType,
|
|
Index = newSectionIndex,
|
|
Number = newSectionNumber,
|
|
PoemFormat = editingSectionNotTracked.PoemFormat,
|
|
};
|
|
var verses = await _context.DivanVerses.Where(v => v.PoemId == editingSectionNotTracked.PoemId).OrderBy(v => v.VOrder).ToListAsync();
|
|
var editingSectionVerses = FilterSectionVerses(editingSectionNotTracked, verses);
|
|
|
|
foreach (var verse in editingSectionVerses)
|
|
{
|
|
if (verse.VOrder >= vOrder)
|
|
{
|
|
verse.SectionIndex1 = newSectionIndex;
|
|
_context.Update(verse);
|
|
}
|
|
}
|
|
|
|
bool sectionCopyBecameMasnavi = false;
|
|
|
|
var sectionCopyVerses = FilterSectionVerses(sectionCopy, verses);
|
|
sectionCopy.CoupletsCount = sectionCopyVerses.Where(v => v.VersePosition == VersePosition.Left || v.VersePosition == VersePosition.CenteredVerse1).Count();
|
|
sectionCopy.HtmlText = PrepareHtmlText(sectionCopyVerses);
|
|
sectionCopy.PlainText = PreparePlainText(sectionCopyVerses);
|
|
sectionCopy.RhymeLetters = LanguageUtils.FindRhyme(sectionCopyVerses).Rhyme;
|
|
sectionCopy.CachedFirstCoupletIndex = (int)sectionCopyVerses.Min(v => v.CoupletIndex);
|
|
_context.Add(sectionCopy);
|
|
sectionCopy.Modified = true;
|
|
|
|
if (sectionCopy.PoemFormat != DivanPoemFormat.Masnavi)
|
|
{
|
|
if (_IsMasnavi(sectionCopyVerses))
|
|
{
|
|
sectionCopy.PoemFormat = DivanPoemFormat.Masnavi;
|
|
sectionCopyBecameMasnavi = true;
|
|
}
|
|
}
|
|
sections.Add(sectionCopy);
|
|
|
|
bool updatingBecameMasnavi = false;
|
|
|
|
var updatingSection = sections.Where(s => s.Id == editingSectionNotTracked.Id).Single();
|
|
var updatingSectionVerses = FilterSectionVerses(updatingSection, verses);
|
|
updatingSection.HtmlText = PrepareHtmlText(updatingSectionVerses);
|
|
updatingSection.PlainText = PreparePlainText(updatingSectionVerses);
|
|
updatingSection.RhymeLetters = LanguageUtils.FindRhyme(updatingSectionVerses).Rhyme;
|
|
updatingSection.Modified = true;
|
|
if (updatingSection.PoemFormat != DivanPoemFormat.Masnavi)
|
|
{
|
|
if (_IsMasnavi(updatingSectionVerses))
|
|
{
|
|
updatingSection.PoemFormat = DivanPoemFormat.Masnavi;
|
|
updatingBecameMasnavi = true;
|
|
}
|
|
}
|
|
_context.Update(updatingSection);
|
|
|
|
List<DivanPoemSection> addedSections = new List<DivanPoemSection>();
|
|
foreach (var relatedSection in sections.Where(s => s.DivanMetreRefSectionIndex == editingSectionNotTracked.Index))
|
|
{
|
|
var relatedSectionVerses = FilterSectionVerses(relatedSection, verses);
|
|
if (relatedSectionVerses.Any(v => v.VOrder >= vOrder))
|
|
{
|
|
if (relatedSectionVerses.Any(v => v.VOrder < vOrder))
|
|
{
|
|
newSectionIndex++;
|
|
newSectionNumber++;
|
|
var relatedSectionCopy = new DivanPoemSection()
|
|
{
|
|
PoemId = relatedSection.PoemId,
|
|
PoetId = relatedSection.PoetId,
|
|
SectionType = relatedSection.SectionType,
|
|
VerseType = relatedSection.VerseType,
|
|
Index = newSectionIndex,
|
|
Number = newSectionNumber,
|
|
PoemFormat = relatedSection.PoemFormat,
|
|
DivanMetreRefSectionIndex = breakingMainSectionIndex,
|
|
};
|
|
|
|
foreach (var verse in relatedSectionVerses)
|
|
{
|
|
if (verse.VOrder >= vOrder)
|
|
{
|
|
switch (relatedSection.VerseType)
|
|
{
|
|
case VersePoemSectionType.Third:
|
|
verse.SectionIndex3 = newSectionIndex;
|
|
break;
|
|
case VersePoemSectionType.Forth:
|
|
verse.SectionIndex4 = newSectionIndex;
|
|
break;
|
|
default:
|
|
verse.SectionIndex2 = newSectionIndex;
|
|
break;
|
|
}
|
|
_context.Update(verse);
|
|
}
|
|
}
|
|
|
|
var relatedSectionCopyVerses = FilterSectionVerses(relatedSectionCopy, verses);
|
|
relatedSectionCopy.CoupletsCount = relatedSectionCopyVerses.Where(v => v.VersePosition == VersePosition.Left || v.VersePosition == VersePosition.CenteredVerse1).Count();
|
|
relatedSectionCopy.HtmlText = PrepareHtmlText(relatedSectionCopyVerses);
|
|
relatedSectionCopy.PlainText = PreparePlainText(relatedSectionCopyVerses);
|
|
relatedSectionCopy.RhymeLetters = LanguageUtils.FindRhyme(relatedSectionCopyVerses).Rhyme;
|
|
relatedSectionCopy.Modified = true;
|
|
relatedSectionCopy.CachedFirstCoupletIndex = (int)relatedSectionCopyVerses.Min(v => v.CoupletIndex);
|
|
_context.Add(relatedSectionCopy);
|
|
addedSections.Add(relatedSectionCopy);
|
|
|
|
relatedSectionVerses = FilterSectionVerses(relatedSection, verses);
|
|
relatedSection.HtmlText = PrepareHtmlText(relatedSectionVerses);
|
|
relatedSection.PlainText = PreparePlainText(relatedSectionVerses);
|
|
relatedSection.RhymeLetters = LanguageUtils.FindRhyme(relatedSectionVerses).Rhyme;
|
|
relatedSection.Modified = true;
|
|
_context.Update(relatedSection);
|
|
}
|
|
else
|
|
{
|
|
relatedSection.DivanMetreRefSectionIndex = breakingMainSectionIndex;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (sectionCopyBecameMasnavi)
|
|
{
|
|
for (int v = 0; v < sectionCopyVerses.Count; v += 2)
|
|
{
|
|
newSectionIndex++;
|
|
newSectionNumber++;
|
|
var rightVerse = sectionCopyVerses[v];
|
|
var leftVerse = sectionCopyVerses[v + 1];
|
|
List<DivanVerse> coupletVerses = new List<DivanVerse>();
|
|
coupletVerses.Add(rightVerse);
|
|
coupletVerses.Add(leftVerse);
|
|
var res = LanguageUtils.FindRhyme(coupletVerses);
|
|
|
|
DivanPoemSection verseSection = new DivanPoemSection()
|
|
{
|
|
PoemId = sectionCopy.PoemId,
|
|
PoetId = sectionCopy.PoetId,
|
|
SectionType = PoemSectionType.Couplet,
|
|
VerseType = VersePoemSectionType.Second,
|
|
Index = newSectionIndex,
|
|
Number = newSectionNumber,//couplet number
|
|
DivanMetreId = sectionCopy.DivanMetreId,
|
|
RhymeLetters = res.Rhyme,
|
|
DivanMetreRefSectionIndex = sectionCopy.Index,
|
|
};
|
|
|
|
rightVerse.SectionIndex2 = verseSection.Index;
|
|
leftVerse.SectionIndex2 = verseSection.Index;
|
|
|
|
var rl = new List<DivanVerse>(); rl.Add(rightVerse); rl.Add(leftVerse);
|
|
verseSection.CoupletsCount = rl.Where(v => v.VersePosition == VersePosition.Left || v.VersePosition == VersePosition.CenteredVerse1).Count();
|
|
verseSection.HtmlText = PrepareHtmlText(rl);
|
|
verseSection.PlainText = PreparePlainText(rl);
|
|
verseSection.Modified = true;
|
|
addedSections.Add(verseSection);
|
|
verseSection.CachedFirstCoupletIndex = (int)rl.Min(v => v.CoupletIndex);
|
|
_context.DivanPoemSections.Add(verseSection);
|
|
}
|
|
}
|
|
if (updatingBecameMasnavi)
|
|
{
|
|
for (int v = 0; v < updatingSectionVerses.Count; v += 2)
|
|
{
|
|
newSectionIndex++;
|
|
newSectionNumber++;
|
|
var rightVerse = updatingSectionVerses[v];
|
|
var leftVerse = updatingSectionVerses[v + 1];
|
|
List<DivanVerse> coupletVerses = new List<DivanVerse>();
|
|
coupletVerses.Add(rightVerse);
|
|
coupletVerses.Add(leftVerse);
|
|
var res = LanguageUtils.FindRhyme(coupletVerses);
|
|
|
|
DivanPoemSection verseSection = new DivanPoemSection()
|
|
{
|
|
PoemId = updatingSection.PoemId,
|
|
PoetId = updatingSection.PoetId,
|
|
SectionType = PoemSectionType.Couplet,
|
|
VerseType = VersePoemSectionType.Second,
|
|
Index = newSectionIndex,
|
|
Number = newSectionNumber,//couplet number
|
|
DivanMetreId = updatingSection.DivanMetreId,
|
|
RhymeLetters = res.Rhyme,
|
|
DivanMetreRefSectionIndex = updatingSection.Index,
|
|
};
|
|
|
|
rightVerse.SectionIndex2 = verseSection.Index;
|
|
leftVerse.SectionIndex2 = verseSection.Index;
|
|
|
|
var rl = new List<DivanVerse>(); rl.Add(rightVerse); rl.Add(leftVerse);
|
|
verseSection.CoupletsCount = rl.Where(v => v.VersePosition == VersePosition.Left || v.VersePosition == VersePosition.CenteredVerse1).Count();
|
|
verseSection.HtmlText = PrepareHtmlText(rl);
|
|
verseSection.PlainText = PreparePlainText(rl);
|
|
verseSection.Modified = true;
|
|
verseSection.CachedFirstCoupletIndex = (int)rl.Min(v => v.CoupletIndex);
|
|
addedSections.Add(verseSection);
|
|
_context.DivanPoemSections.Add(verseSection);
|
|
}
|
|
}
|
|
if (addedSections.Count > 0)
|
|
sections.AddRange(addedSections);
|
|
}
|
|
|
|
/// <summary>
|
|
/// get user section corrections
|
|
/// </summary>
|
|
/// <param name="userId">if sent empty returns all corrections</param>
|
|
/// <param name="paging"></param>
|
|
/// <returns></returns>
|
|
public async Task<RServiceResult<(PaginationMetadata PagingMeta, DivanPoemSectionCorrectionViewModel[] Items)>> GetUserSectionCorrections(Guid userId, PagingParameterModel paging)
|
|
{
|
|
var source = from dbCorrection in
|
|
_context.DivanPoemSectionCorrections.AsNoTracking().Include(c => c.User)
|
|
where userId == Guid.Empty || dbCorrection.UserId == userId
|
|
orderby dbCorrection.Id descending
|
|
select
|
|
dbCorrection;
|
|
|
|
(PaginationMetadata PagingMeta, DivanPoemSectionCorrection[] Items) dbPaginatedResult =
|
|
await QueryablePaginator<DivanPoemSectionCorrection>.Paginate(source, paging);
|
|
|
|
List<DivanPoemSectionCorrectionViewModel> list = new List<DivanPoemSectionCorrectionViewModel>();
|
|
foreach (var dbCorrection in dbPaginatedResult.Items)
|
|
{
|
|
var section = await _context.DivanPoemSections.AsNoTracking().Where(s => s.Id == dbCorrection.SectionId).SingleOrDefaultAsync();
|
|
list.Add
|
|
(
|
|
new DivanPoemSectionCorrectionViewModel()
|
|
{
|
|
Id = dbCorrection.Id,
|
|
SectionId = dbCorrection.SectionId,
|
|
UserId = dbCorrection.UserId,
|
|
Rhythm = dbCorrection.Rhythm,
|
|
OriginalRhythm = dbCorrection.OriginalRhythm,
|
|
RhythmResult = dbCorrection.RhythmResult,
|
|
Rhythm2 = dbCorrection.Rhythm2,
|
|
OriginalRhythm2 = dbCorrection.OriginalRhythm2,
|
|
RhythmResult2 = dbCorrection.RhythmResult2,
|
|
RhymeLetters = dbCorrection.RhymeLetters,
|
|
OriginalRhymeLetters = dbCorrection.OriginalRhymeLetters,
|
|
RhymeLettersReviewResult = dbCorrection.RhymeLettersReviewResult,
|
|
BreakFromVerse1VOrder = dbCorrection.BreakFromVerse1VOrder,
|
|
BreakFromVerse1VOrderResult = dbCorrection.BreakFromVerse1VOrderResult,
|
|
BreakFromVerse2VOrder = dbCorrection.BreakFromVerse2VOrder,
|
|
BreakFromVerse2VOrderResult = dbCorrection.BreakFromVerse2VOrderResult,
|
|
BreakFromVerse3VOrder = dbCorrection.BreakFromVerse3VOrder,
|
|
BreakFromVerse3VOrderResult = dbCorrection.BreakFromVerse3VOrderResult,
|
|
BreakFromVerse4VOrder = dbCorrection.BreakFromVerse4VOrder,
|
|
BreakFromVerse4VOrderResult = dbCorrection.BreakFromVerse4VOrderResult,
|
|
BreakFromVerse5VOrder = dbCorrection.BreakFromVerse5VOrder,
|
|
BreakFromVerse5VOrderResult = dbCorrection.BreakFromVerse5VOrderResult,
|
|
BreakFromVerse6VOrder = dbCorrection.BreakFromVerse6VOrder,
|
|
BreakFromVerse6VOrderResult = dbCorrection.BreakFromVerse6VOrderResult,
|
|
BreakFromVerse7VOrder = dbCorrection.BreakFromVerse7VOrder,
|
|
BreakFromVerse7VOrderResult = dbCorrection.BreakFromVerse7VOrderResult,
|
|
BreakFromVerse8VOrder = dbCorrection.BreakFromVerse8VOrder,
|
|
BreakFromVerse8VOrderResult = dbCorrection.BreakFromVerse8VOrderResult,
|
|
BreakFromVerse9VOrder = dbCorrection.BreakFromVerse9VOrder,
|
|
BreakFromVerse9VOrderResult = dbCorrection.BreakFromVerse9VOrderResult,
|
|
BreakFromVerse10VOrder = dbCorrection.BreakFromVerse10VOrder,
|
|
BreakFromVerse10VOrderResult = dbCorrection.BreakFromVerse10VOrderResult,
|
|
Note = dbCorrection.Note,
|
|
Date = dbCorrection.Date,
|
|
Reviewed = dbCorrection.Reviewed,
|
|
ReviewNote = dbCorrection.ReviewNote,
|
|
ReviewDate = dbCorrection.ReviewDate,
|
|
UserNickname = dbCorrection.HideMyName && dbCorrection.Reviewed ? "" : string.IsNullOrEmpty(dbCorrection.User.NickName) ? dbCorrection.User.Id.ToString() : dbCorrection.User.NickName,
|
|
PoemId = section == null ? 0 : section.PoemId,
|
|
SectionIndex = section == null ? 0 : section.Index,
|
|
Language = dbCorrection.Language,
|
|
OriginalLanguage= dbCorrection.OriginalLanguage,
|
|
LanguageReviewResult = dbCorrection.LanguageReviewResult,
|
|
PoemFormat = dbCorrection.PoemFormat,
|
|
OriginalPoemFormat = dbCorrection.OriginalPoemFormat,
|
|
PoemFormatReviewResult = dbCorrection.PoemFormatReviewResult,
|
|
HideMyName = dbCorrection.HideMyName,
|
|
}
|
|
);
|
|
}
|
|
|
|
return new RServiceResult<(PaginationMetadata, DivanPoemSectionCorrectionViewModel[])>
|
|
((dbPaginatedResult.PagingMeta, list.ToArray()));
|
|
}
|
|
|
|
/// <summary>
|
|
/// effective corrections for section
|
|
/// </summary>
|
|
/// <param name="sectionId"></param>
|
|
/// <param name="paging"></param>
|
|
/// <returns></returns>
|
|
public async Task<RServiceResult<(PaginationMetadata PagingMeta, DivanPoemSectionCorrectionViewModel[] Items)>> GetSectionEffectiveCorrections(int sectionId, PagingParameterModel paging)
|
|
{
|
|
var source = from dbCorrection in
|
|
_context.DivanPoemSectionCorrections.AsNoTracking()
|
|
where
|
|
dbCorrection.SectionId == sectionId
|
|
&&
|
|
dbCorrection.Reviewed == true
|
|
&&
|
|
(
|
|
dbCorrection.BreakFromVerse1VOrderResult == CorrectionReviewResult.Approved
|
|
||
|
|
dbCorrection.BreakFromVerse2VOrderResult == CorrectionReviewResult.Approved
|
|
||
|
|
dbCorrection.BreakFromVerse3VOrderResult == CorrectionReviewResult.Approved
|
|
||
|
|
dbCorrection.BreakFromVerse4VOrderResult == CorrectionReviewResult.Approved
|
|
||
|
|
dbCorrection.RhythmResult == CorrectionReviewResult.Approved
|
|
||
|
|
dbCorrection.RhymeLettersReviewResult == CorrectionReviewResult.Approved
|
|
)
|
|
orderby dbCorrection.Id descending
|
|
select
|
|
dbCorrection;
|
|
|
|
(PaginationMetadata PagingMeta, DivanPoemSectionCorrection[] Items) dbPaginatedResult =
|
|
await QueryablePaginator<DivanPoemSectionCorrection>.Paginate(source, paging);
|
|
|
|
List<DivanPoemSectionCorrectionViewModel> list = new List<DivanPoemSectionCorrectionViewModel>();
|
|
foreach (var dbCorrection in dbPaginatedResult.Items)
|
|
{
|
|
list.Add
|
|
(
|
|
new DivanPoemSectionCorrectionViewModel()
|
|
{
|
|
Id = dbCorrection.Id,
|
|
SectionId = dbCorrection.SectionId,
|
|
UserId = dbCorrection.UserId,
|
|
Rhythm = dbCorrection.Rhythm,
|
|
OriginalRhythm = dbCorrection.OriginalRhythm,
|
|
RhythmResult = dbCorrection.RhythmResult,
|
|
Rhythm2 = dbCorrection.Rhythm2,
|
|
OriginalRhythm2 = dbCorrection.OriginalRhythm2,
|
|
RhythmResult2 = dbCorrection.RhythmResult2,
|
|
RhymeLetters = dbCorrection.RhymeLetters,
|
|
OriginalRhymeLetters = dbCorrection.OriginalRhymeLetters,
|
|
RhymeLettersReviewResult = dbCorrection.RhymeLettersReviewResult,
|
|
BreakFromVerse1VOrder = dbCorrection.BreakFromVerse1VOrder,
|
|
BreakFromVerse1VOrderResult = dbCorrection.BreakFromVerse1VOrderResult,
|
|
BreakFromVerse2VOrder = dbCorrection.BreakFromVerse2VOrder,
|
|
BreakFromVerse2VOrderResult = dbCorrection.BreakFromVerse2VOrderResult,
|
|
BreakFromVerse3VOrder = dbCorrection.BreakFromVerse3VOrder,
|
|
BreakFromVerse3VOrderResult = dbCorrection.BreakFromVerse3VOrderResult,
|
|
BreakFromVerse4VOrder = dbCorrection.BreakFromVerse4VOrder,
|
|
BreakFromVerse4VOrderResult = dbCorrection.BreakFromVerse4VOrderResult,
|
|
BreakFromVerse5VOrder = dbCorrection.BreakFromVerse5VOrder,
|
|
BreakFromVerse5VOrderResult = dbCorrection.BreakFromVerse5VOrderResult,
|
|
BreakFromVerse6VOrder = dbCorrection.BreakFromVerse6VOrder,
|
|
BreakFromVerse6VOrderResult = dbCorrection.BreakFromVerse6VOrderResult,
|
|
BreakFromVerse7VOrder = dbCorrection.BreakFromVerse7VOrder,
|
|
BreakFromVerse7VOrderResult = dbCorrection.BreakFromVerse7VOrderResult,
|
|
BreakFromVerse8VOrder = dbCorrection.BreakFromVerse8VOrder,
|
|
BreakFromVerse8VOrderResult = dbCorrection.BreakFromVerse8VOrderResult,
|
|
BreakFromVerse9VOrder = dbCorrection.BreakFromVerse9VOrder,
|
|
BreakFromVerse9VOrderResult = dbCorrection.BreakFromVerse9VOrderResult,
|
|
BreakFromVerse10VOrder = dbCorrection.BreakFromVerse10VOrder,
|
|
BreakFromVerse10VOrderResult = dbCorrection.BreakFromVerse10VOrderResult,
|
|
Note = dbCorrection.Note,
|
|
Date = dbCorrection.Date,
|
|
Reviewed = dbCorrection.Reviewed,
|
|
ReviewNote = dbCorrection.ReviewNote,
|
|
ReviewDate = dbCorrection.ReviewDate,
|
|
UserNickname = dbCorrection.HideMyName && dbCorrection.Reviewed ? "" : string.IsNullOrEmpty(dbCorrection.User.NickName) ? dbCorrection.User.Id.ToString() : dbCorrection.User.NickName,
|
|
Language = dbCorrection.Language,
|
|
OriginalLanguage = dbCorrection.OriginalLanguage,
|
|
LanguageReviewResult = dbCorrection.LanguageReviewResult,
|
|
PoemFormat = dbCorrection.PoemFormat,
|
|
OriginalPoemFormat = dbCorrection.OriginalPoemFormat,
|
|
PoemFormatReviewResult = dbCorrection.PoemFormatReviewResult,
|
|
HideMyName = dbCorrection.HideMyName,
|
|
}
|
|
);
|
|
}
|
|
|
|
return new RServiceResult<(PaginationMetadata, DivanPoemSectionCorrectionViewModel[])>
|
|
((dbPaginatedResult.PagingMeta, list.ToArray()));
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// last unreviewed user correction for a section
|
|
/// </summary>
|
|
/// <param name="userId"></param>
|
|
/// <param name="sectionId"></param>
|
|
/// <returns></returns>
|
|
public async Task<RServiceResult<DivanPoemSectionCorrectionViewModel>> GetLastUnreviewedUserCorrectionForSection(Guid userId, int sectionId)
|
|
{
|
|
var dbCorrection = await _context.DivanPoemSectionCorrections.AsNoTracking().Include(c => c.User)
|
|
.Where(c => c.UserId == userId && c.SectionId == sectionId && c.Reviewed == false)
|
|
.OrderByDescending(c => c.Id)
|
|
.FirstOrDefaultAsync();
|
|
|
|
if (dbCorrection == null)
|
|
return new RServiceResult<DivanPoemSectionCorrectionViewModel>(null);
|
|
|
|
return new RServiceResult<DivanPoemSectionCorrectionViewModel>
|
|
(
|
|
new DivanPoemSectionCorrectionViewModel()
|
|
{
|
|
Id = dbCorrection.Id,
|
|
SectionId = dbCorrection.SectionId,
|
|
UserId = dbCorrection.UserId,
|
|
Rhythm = dbCorrection.Rhythm,
|
|
OriginalRhythm = dbCorrection.OriginalRhythm,
|
|
RhythmResult = dbCorrection.RhythmResult,
|
|
Rhythm2 = dbCorrection.Rhythm2,
|
|
OriginalRhythm2 = dbCorrection.OriginalRhythm2,
|
|
RhythmResult2 = dbCorrection.RhythmResult2,
|
|
RhymeLetters = dbCorrection.RhymeLetters,
|
|
OriginalRhymeLetters = dbCorrection.OriginalRhymeLetters,
|
|
RhymeLettersReviewResult = dbCorrection.RhymeLettersReviewResult,
|
|
BreakFromVerse1VOrder = dbCorrection.BreakFromVerse1VOrder,
|
|
BreakFromVerse1VOrderResult = dbCorrection.BreakFromVerse1VOrderResult,
|
|
BreakFromVerse2VOrder = dbCorrection.BreakFromVerse2VOrder,
|
|
BreakFromVerse2VOrderResult = dbCorrection.BreakFromVerse2VOrderResult,
|
|
BreakFromVerse3VOrder = dbCorrection.BreakFromVerse3VOrder,
|
|
BreakFromVerse3VOrderResult = dbCorrection.BreakFromVerse3VOrderResult,
|
|
BreakFromVerse4VOrder = dbCorrection.BreakFromVerse4VOrder,
|
|
BreakFromVerse4VOrderResult = dbCorrection.BreakFromVerse4VOrderResult,
|
|
BreakFromVerse5VOrder = dbCorrection.BreakFromVerse5VOrder,
|
|
BreakFromVerse5VOrderResult = dbCorrection.BreakFromVerse5VOrderResult,
|
|
BreakFromVerse6VOrder = dbCorrection.BreakFromVerse6VOrder,
|
|
BreakFromVerse6VOrderResult = dbCorrection.BreakFromVerse6VOrderResult,
|
|
BreakFromVerse7VOrder = dbCorrection.BreakFromVerse7VOrder,
|
|
BreakFromVerse7VOrderResult = dbCorrection.BreakFromVerse7VOrderResult,
|
|
BreakFromVerse8VOrder = dbCorrection.BreakFromVerse8VOrder,
|
|
BreakFromVerse8VOrderResult = dbCorrection.BreakFromVerse8VOrderResult,
|
|
BreakFromVerse9VOrder = dbCorrection.BreakFromVerse9VOrder,
|
|
BreakFromVerse9VOrderResult = dbCorrection.BreakFromVerse9VOrderResult,
|
|
BreakFromVerse10VOrder = dbCorrection.BreakFromVerse10VOrder,
|
|
BreakFromVerse10VOrderResult = dbCorrection.BreakFromVerse10VOrderResult,
|
|
Note = dbCorrection.Note,
|
|
Date = dbCorrection.Date,
|
|
Reviewed = dbCorrection.Reviewed,
|
|
ReviewNote = dbCorrection.ReviewNote,
|
|
ReviewDate = dbCorrection.ReviewDate,
|
|
UserNickname = dbCorrection.HideMyName && dbCorrection.Reviewed ? "" : string.IsNullOrEmpty(dbCorrection.User.NickName) ? dbCorrection.User.Id.ToString() : dbCorrection.User.NickName,
|
|
Language = dbCorrection.Language,
|
|
OriginalLanguage = dbCorrection.OriginalLanguage,
|
|
LanguageReviewResult = dbCorrection.LanguageReviewResult,
|
|
PoemFormat = dbCorrection.PoemFormat,
|
|
OriginalPoemFormat = dbCorrection.OriginalPoemFormat,
|
|
PoemFormatReviewResult = dbCorrection.PoemFormatReviewResult,
|
|
HideMyName = dbCorrection.HideMyName,
|
|
}
|
|
);
|
|
}
|
|
|
|
/// <summary>
|
|
/// send a correction for a section
|
|
/// </summary>
|
|
/// <param name="correction"></param>
|
|
/// <returns></returns>
|
|
public async Task<RServiceResult<DivanPoemSectionCorrectionViewModel>> SuggestPoemSectionCorrection(DivanPoemSectionCorrectionViewModel correction)
|
|
{
|
|
try
|
|
{
|
|
var preCorrections = await _context.DivanPoemSectionCorrections
|
|
.Where(c => c.UserId == correction.UserId && c.SectionId == correction.SectionId && c.Reviewed == false)
|
|
.ToListAsync();
|
|
|
|
|
|
DivanPoemSectionCorrection dbCorrection = new DivanPoemSectionCorrection()
|
|
{
|
|
SectionId = correction.SectionId,
|
|
UserId = correction.UserId,
|
|
Rhythm = correction.Rhythm,
|
|
RhythmResult = CorrectionReviewResult.NotReviewed,
|
|
RhymeLetters = correction.RhymeLetters,
|
|
RhymeLettersReviewResult = CorrectionReviewResult.NotReviewed,
|
|
BreakFromVerse1VOrder = correction.BreakFromVerse1VOrder,
|
|
BreakFromVerse1VOrderResult = CorrectionReviewResult.NotReviewed,
|
|
BreakFromVerse2VOrder = correction.BreakFromVerse2VOrder,
|
|
BreakFromVerse2VOrderResult = CorrectionReviewResult.NotReviewed,
|
|
BreakFromVerse3VOrder = correction.BreakFromVerse3VOrder,
|
|
BreakFromVerse3VOrderResult = CorrectionReviewResult.NotReviewed,
|
|
BreakFromVerse4VOrder = correction.BreakFromVerse4VOrder,
|
|
BreakFromVerse4VOrderResult = CorrectionReviewResult.NotReviewed,
|
|
BreakFromVerse5VOrder = correction.BreakFromVerse5VOrder,
|
|
BreakFromVerse5VOrderResult = CorrectionReviewResult.NotReviewed,
|
|
BreakFromVerse6VOrder = correction.BreakFromVerse6VOrder,
|
|
BreakFromVerse6VOrderResult = CorrectionReviewResult.NotReviewed,
|
|
BreakFromVerse7VOrder = correction.BreakFromVerse7VOrder,
|
|
BreakFromVerse7VOrderResult = CorrectionReviewResult.NotReviewed,
|
|
BreakFromVerse8VOrder = correction.BreakFromVerse8VOrder,
|
|
BreakFromVerse8VOrderResult = CorrectionReviewResult.NotReviewed,
|
|
BreakFromVerse9VOrder = correction.BreakFromVerse9VOrder,
|
|
BreakFromVerse9VOrderResult = CorrectionReviewResult.NotReviewed,
|
|
BreakFromVerse10VOrder = correction.BreakFromVerse10VOrder,
|
|
BreakFromVerse10VOrderResult = CorrectionReviewResult.NotReviewed,
|
|
Note = correction.Note,
|
|
Date = DateTime.Now,
|
|
Reviewed = false,
|
|
AffectedThePoem = false,
|
|
Language = correction.Language,
|
|
LanguageReviewResult = CorrectionReviewResult.NotReviewed,
|
|
PoemFormat = correction.PoemFormat,
|
|
PoemFormatReviewResult = CorrectionReviewResult.NotReviewed,
|
|
HideMyName = correction.HideMyName,
|
|
};
|
|
_context.DivanPoemSectionCorrections.Add(dbCorrection);
|
|
await _context.SaveChangesAsync();
|
|
correction.Id = dbCorrection.Id;
|
|
|
|
if (preCorrections.Count > 0)
|
|
{
|
|
_context.DivanPoemSectionCorrections.RemoveRange(preCorrections);
|
|
await _context.SaveChangesAsync();
|
|
}
|
|
|
|
return new RServiceResult<DivanPoemSectionCorrectionViewModel>(correction);
|
|
}
|
|
catch (Exception exp)
|
|
{
|
|
return new RServiceResult<DivanPoemSectionCorrectionViewModel>(null, exp.ToString());
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// delete unreviewed user corrections for a poem section
|
|
/// </summary>
|
|
/// <param name="userId"></param>
|
|
/// <param name="sectionId"></param>
|
|
/// <returns></returns>
|
|
public async Task<RServiceResult<bool>> DeletePoemSectionCorrections(Guid userId, int sectionId)
|
|
{
|
|
var preCorrections = await _context.DivanPoemSectionCorrections
|
|
.Where(c => c.UserId == userId && c.SectionId == sectionId && c.Reviewed == false)
|
|
.ToListAsync();
|
|
if (preCorrections.Count > 0)
|
|
{
|
|
_context.DivanPoemSectionCorrections.RemoveRange(preCorrections);
|
|
await _context.SaveChangesAsync();
|
|
}
|
|
return new RServiceResult<bool>(true);
|
|
}
|
|
|
|
/// <summary>
|
|
/// get next unreviewed correction for a poem section
|
|
/// </summary>
|
|
/// <param name="skip"></param>
|
|
/// <param name="deletedUserSections"></param>
|
|
/// <returns></returns>
|
|
public async Task<RServiceResult<DivanPoemSectionCorrectionViewModel>> GetNextUnreviewedPoemSectionCorrection(int skip, bool deletedUserSections)
|
|
{
|
|
string deletedUserEmail = $"{Configuration.GetSection("Divan")["DeleteUserEmail"]}";
|
|
var deletedUserId = (Guid)(await _appUserService.FindUserByEmail(deletedUserEmail)).Result.Id;
|
|
|
|
var dbCorrection = await _context.DivanPoemSectionCorrections.AsNoTracking().Include(c => c.User)
|
|
.Where(c => c.Reviewed == false && ((deletedUserSections == false && c.UserId != deletedUserId ) || (deletedUserSections == true && c.UserId == deletedUserId)))
|
|
.OrderBy(c => c.Id)
|
|
.Skip(skip)
|
|
.FirstOrDefaultAsync();
|
|
|
|
if (dbCorrection == null)
|
|
return new RServiceResult<DivanPoemSectionCorrectionViewModel>(null);
|
|
|
|
return new RServiceResult<DivanPoemSectionCorrectionViewModel>
|
|
(
|
|
new DivanPoemSectionCorrectionViewModel()
|
|
{
|
|
Id = dbCorrection.Id,
|
|
SectionId = dbCorrection.SectionId,
|
|
UserId = dbCorrection.UserId,
|
|
Rhythm = dbCorrection.Rhythm,
|
|
OriginalRhythm = dbCorrection.OriginalRhythm,
|
|
RhythmResult = dbCorrection.RhythmResult,
|
|
Rhythm2 = dbCorrection.Rhythm2,
|
|
OriginalRhythm2 = dbCorrection.OriginalRhythm2,
|
|
RhythmResult2 = dbCorrection.RhythmResult2,
|
|
RhymeLetters = dbCorrection.RhymeLetters,
|
|
OriginalRhymeLetters = dbCorrection.OriginalRhymeLetters,
|
|
RhymeLettersReviewResult = dbCorrection.RhymeLettersReviewResult,
|
|
BreakFromVerse1VOrder = dbCorrection.BreakFromVerse1VOrder,
|
|
BreakFromVerse1VOrderResult = dbCorrection.BreakFromVerse1VOrderResult,
|
|
BreakFromVerse2VOrder = dbCorrection.BreakFromVerse2VOrder,
|
|
BreakFromVerse2VOrderResult = dbCorrection.BreakFromVerse2VOrderResult,
|
|
BreakFromVerse3VOrder = dbCorrection.BreakFromVerse3VOrder,
|
|
BreakFromVerse3VOrderResult = dbCorrection.BreakFromVerse3VOrderResult,
|
|
BreakFromVerse4VOrder = dbCorrection.BreakFromVerse4VOrder,
|
|
BreakFromVerse4VOrderResult = dbCorrection.BreakFromVerse4VOrderResult,
|
|
BreakFromVerse5VOrder = dbCorrection.BreakFromVerse5VOrder,
|
|
BreakFromVerse5VOrderResult = dbCorrection.BreakFromVerse5VOrderResult,
|
|
BreakFromVerse6VOrder = dbCorrection.BreakFromVerse6VOrder,
|
|
BreakFromVerse6VOrderResult = dbCorrection.BreakFromVerse6VOrderResult,
|
|
BreakFromVerse7VOrder = dbCorrection.BreakFromVerse7VOrder,
|
|
BreakFromVerse7VOrderResult = dbCorrection.BreakFromVerse7VOrderResult,
|
|
BreakFromVerse8VOrder = dbCorrection.BreakFromVerse8VOrder,
|
|
BreakFromVerse8VOrderResult = dbCorrection.BreakFromVerse8VOrderResult,
|
|
BreakFromVerse9VOrder = dbCorrection.BreakFromVerse9VOrder,
|
|
BreakFromVerse9VOrderResult = dbCorrection.BreakFromVerse9VOrderResult,
|
|
BreakFromVerse10VOrder = dbCorrection.BreakFromVerse10VOrder,
|
|
BreakFromVerse10VOrderResult = dbCorrection.BreakFromVerse10VOrderResult,
|
|
Note = dbCorrection.Note,
|
|
Date = dbCorrection.Date,
|
|
Reviewed = dbCorrection.Reviewed,
|
|
ReviewNote = dbCorrection.ReviewNote,
|
|
ReviewDate = dbCorrection.ReviewDate,
|
|
UserNickname = dbCorrection.HideMyName && dbCorrection.Reviewed ? "" : string.IsNullOrEmpty(dbCorrection.User.NickName) ? dbCorrection.User.Id.ToString() : dbCorrection.User.NickName,
|
|
Language = dbCorrection.Language,
|
|
OriginalLanguage = dbCorrection.OriginalLanguage,
|
|
LanguageReviewResult = dbCorrection.LanguageReviewResult,
|
|
PoemFormat = dbCorrection.PoemFormat,
|
|
OriginalPoemFormat = dbCorrection.OriginalPoemFormat,
|
|
PoemFormatReviewResult = dbCorrection.PoemFormatReviewResult,
|
|
HideMyName = dbCorrection.HideMyName,
|
|
}
|
|
);
|
|
}
|
|
|
|
/// <summary>
|
|
/// get section correction by id
|
|
/// </summary>
|
|
/// <param name="id"></param>
|
|
/// <returns></returns>
|
|
public async Task<RServiceResult<DivanPoemSectionCorrectionViewModel>> GetSectionCorrectionById(int id)
|
|
{
|
|
var dbCorrection = await _context.DivanPoemSectionCorrections.AsNoTracking().Include(c => c.User)
|
|
.Where(c => c.Id == id)
|
|
.FirstOrDefaultAsync();
|
|
|
|
if (dbCorrection == null)
|
|
return new RServiceResult<DivanPoemSectionCorrectionViewModel>(null);
|
|
|
|
return new RServiceResult<DivanPoemSectionCorrectionViewModel>
|
|
(
|
|
new DivanPoemSectionCorrectionViewModel()
|
|
{
|
|
Id = dbCorrection.Id,
|
|
SectionId = dbCorrection.SectionId,
|
|
UserId = dbCorrection.UserId,
|
|
Rhythm = dbCorrection.Rhythm,
|
|
OriginalRhythm = dbCorrection.OriginalRhythm,
|
|
RhythmResult = dbCorrection.RhythmResult,
|
|
Rhythm2 = dbCorrection.Rhythm2,
|
|
OriginalRhythm2 = dbCorrection.OriginalRhythm2,
|
|
RhythmResult2 = dbCorrection.RhythmResult2,
|
|
RhymeLetters = dbCorrection.RhymeLetters,
|
|
OriginalRhymeLetters = dbCorrection.OriginalRhymeLetters,
|
|
RhymeLettersReviewResult = dbCorrection.RhymeLettersReviewResult,
|
|
BreakFromVerse1VOrder = dbCorrection.BreakFromVerse1VOrder,
|
|
BreakFromVerse1VOrderResult = dbCorrection.BreakFromVerse1VOrderResult,
|
|
BreakFromVerse2VOrder = dbCorrection.BreakFromVerse2VOrder,
|
|
BreakFromVerse2VOrderResult = dbCorrection.BreakFromVerse2VOrderResult,
|
|
BreakFromVerse3VOrder = dbCorrection.BreakFromVerse3VOrder,
|
|
BreakFromVerse3VOrderResult = dbCorrection.BreakFromVerse3VOrderResult,
|
|
BreakFromVerse4VOrder = dbCorrection.BreakFromVerse4VOrder,
|
|
BreakFromVerse4VOrderResult = dbCorrection.BreakFromVerse4VOrderResult,
|
|
BreakFromVerse5VOrder = dbCorrection.BreakFromVerse5VOrder,
|
|
BreakFromVerse5VOrderResult = dbCorrection.BreakFromVerse5VOrderResult,
|
|
BreakFromVerse6VOrder = dbCorrection.BreakFromVerse6VOrder,
|
|
BreakFromVerse6VOrderResult = dbCorrection.BreakFromVerse6VOrderResult,
|
|
BreakFromVerse7VOrder = dbCorrection.BreakFromVerse7VOrder,
|
|
BreakFromVerse7VOrderResult = dbCorrection.BreakFromVerse7VOrderResult,
|
|
BreakFromVerse8VOrder = dbCorrection.BreakFromVerse8VOrder,
|
|
BreakFromVerse8VOrderResult = dbCorrection.BreakFromVerse8VOrderResult,
|
|
BreakFromVerse9VOrder = dbCorrection.BreakFromVerse9VOrder,
|
|
BreakFromVerse9VOrderResult = dbCorrection.BreakFromVerse9VOrderResult,
|
|
BreakFromVerse10VOrder = dbCorrection.BreakFromVerse10VOrder,
|
|
BreakFromVerse10VOrderResult = dbCorrection.BreakFromVerse10VOrderResult,
|
|
Note = dbCorrection.Note,
|
|
Date = dbCorrection.Date,
|
|
Reviewed = dbCorrection.Reviewed,
|
|
ReviewNote = dbCorrection.ReviewNote,
|
|
ReviewDate = dbCorrection.ReviewDate,
|
|
UserNickname = dbCorrection.HideMyName && dbCorrection.Reviewed ? "" : string.IsNullOrEmpty(dbCorrection.User.NickName) ? dbCorrection.User.Id.ToString() : dbCorrection.User.NickName,
|
|
Language = dbCorrection.Language,
|
|
OriginalLanguage = dbCorrection.OriginalLanguage,
|
|
LanguageReviewResult = dbCorrection.LanguageReviewResult,
|
|
PoemFormat = dbCorrection.PoemFormat,
|
|
OriginalPoemFormat = dbCorrection.OriginalPoemFormat,
|
|
PoemFormatReviewResult = dbCorrection.PoemFormatReviewResult,
|
|
HideMyName = dbCorrection.HideMyName,
|
|
}
|
|
);
|
|
}
|
|
|
|
/// <summary>
|
|
/// unreview poem section correction count
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public async Task<RServiceResult<int>> GetUnreviewedPoemSectionCorrectionCount(bool deletedUserSections)
|
|
{
|
|
string deletedUserEmail = $"{Configuration.GetSection("Divan")["DeleteUserEmail"]}";
|
|
var deletedUserId = (Guid)(await _appUserService.FindUserByEmail(deletedUserEmail)).Result.Id;
|
|
return new RServiceResult<int>(await _context.DivanPoemSectionCorrections.AsNoTracking()
|
|
.Where(c => c.Reviewed == false && ((deletedUserSections == false && c.UserId != deletedUserId) || (deletedUserSections == true && c.UserId == deletedUserId)))
|
|
.CountAsync());
|
|
}
|
|
}
|
|
} |