public async Task <IActionResult> GetChapterOverview() { GoNorthProject defaultProject = await _projectDbAccess.GetDefaultProject(); AikaChapterOverview chapterOverview = await _chapterOverviewDbAccess.GetChapterOverviewByProjectId(defaultProject.Id); return(Ok(chapterOverview)); }
public async Task <IActionResult> GetChapters() { GoNorthProject defaultProject = await _projectDbAccess.GetDefaultProject(); AikaChapterOverview chapterOverview = await _chapterOverviewDbAccess.GetChapterOverviewByProjectId(defaultProject.Id); if (chapterOverview == null || chapterOverview.Chapter == null) { return(Ok(new List <ChapterResponse>())); } List <ChapterResponse> chapter = chapterOverview.Chapter.Select(c => new ChapterResponse { Id = c.Id, Name = c.Name, Number = c.ChapterNumber }).OrderBy(c => c.Number).ToList(); return(Ok(chapter)); }
public async Task <IActionResult> SaveChapterOverview([FromBody] AikaChapterOverview overview) { // Check Data if (overview.Chapter == null) { overview.Chapter = new List <AikaChapter>(); } if (overview.Link == null) { overview.Link = new List <NodeLink>(); } // Get Current Overview GoNorthProject defaultProject = await _projectDbAccess.GetDefaultProject(); AikaChapterOverview chapterOverview = await _chapterOverviewDbAccess.GetChapterOverviewByProjectId(defaultProject.Id); bool overviewExisted = true; List <AikaChapterDetail> chapterDetailsToDelete = new List <AikaChapterDetail>(); List <AikaChapterDetail> chapterDetailsToRename = new List <AikaChapterDetail>(); List <int> deletedChapterNumbers = new List <int>(); if (chapterOverview == null) { chapterOverview = new AikaChapterOverview(); chapterOverview.ProjectId = defaultProject.Id; overviewExisted = false; } else { // Check deleted chapter numbers deletedChapterNumbers = chapterOverview.Chapter.Where(c => !overview.Chapter.Any(uc => uc.ChapterNumber == c.ChapterNumber)).Select(c => c.ChapterNumber).ToList(); // Check deleted chapters List <AikaChapter> deletedChapters = chapterOverview.Chapter.Where(c => !overview.Chapter.Any(uc => uc.Id == c.Id)).ToList(); foreach (AikaChapter curDeletedChapter in deletedChapters) { if (string.IsNullOrEmpty(curDeletedChapter.DetailViewId)) { continue; } AikaChapterDetail deletedChapterDetail = await _chapterDetailDbAccess.GetChapterDetailById(curDeletedChapter.DetailViewId); if ((deletedChapterDetail.Detail != null && deletedChapterDetail.Detail.Count > 0) || (deletedChapterDetail.Quest != null && deletedChapterDetail.Quest.Count > 0) || (deletedChapterDetail.AllDone != null && deletedChapterDetail.AllDone.Count > 0) || (deletedChapterDetail.Finish != null && deletedChapterDetail.Finish.Count > 0)) { _logger.LogInformation("Tried to delete non empty chapter"); return(StatusCode((int)HttpStatusCode.BadRequest, _localizer["CanNotDeleteNonEmptyChapter"].Value)); } chapterDetailsToDelete.Add(deletedChapterDetail); } // Check renamed chapters List <AikaChapter> renamedChapters = overview.Chapter.Where(c => chapterOverview.Chapter.Any(uc => uc.Id == c.Id && uc.Name != c.Name)).ToList(); foreach (AikaChapter curRenamedChapter in renamedChapters) { if (string.IsNullOrEmpty(curRenamedChapter.DetailViewId)) { continue; } AikaChapterDetail renamedChapterDetail = await _chapterDetailDbAccess.GetChapterDetailById(curRenamedChapter.DetailViewId); renamedChapterDetail.Name = curRenamedChapter.Name; chapterDetailsToRename.Add(renamedChapterDetail); } } // Update Data chapterOverview.Link = overview.Link != null ? overview.Link : new List <NodeLink>(); chapterOverview.Chapter = overview.Chapter != null ? overview.Chapter : new List <AikaChapter>(); // Create Detail Views _logger.LogInformation("Creating chapter detail views"); bool errorOccured = false; List <AikaChapterDetail> createdChapterDetails = new List <AikaChapterDetail>(); foreach (AikaChapter curChapter in chapterOverview.Chapter) { if (string.IsNullOrEmpty(curChapter.DetailViewId)) { try { AikaChapterDetail newChapterDetail = await CreateNewChapterDetail(defaultProject.Id, curChapter.Id, curChapter.Name); curChapter.DetailViewId = newChapterDetail.Id; createdChapterDetails.Add(newChapterDetail); } catch (Exception ex) { _logger.LogError(ex, "Could not create chapter detail view."); errorOccured = true; break; } } } // Rollback on error if (errorOccured) { foreach (AikaChapterDetail curDetail in createdChapterDetails) { await _chapterDetailDbAccess.DeleteChapterDetail(curDetail); } return(StatusCode((int)HttpStatusCode.InternalServerError)); } // Save Chapter overview await this.SetModifiedData(_userManager, chapterOverview); if (overviewExisted) { await _chapterOverviewDbAccess.UpdateChapterOverview(chapterOverview); } else { chapterOverview = await _chapterOverviewDbAccess.CreateChapterOverview(chapterOverview); } // Rename Chapter details foreach (AikaChapterDetail curRenamedChapter in chapterDetailsToRename) { await _chapterDetailDbAccess.UpdateChapterDetail(curRenamedChapter); } // Remove Chapter Details for deleted chapters foreach (AikaChapterDetail curDeletedChapterDetail in chapterDetailsToDelete) { await _chapterDetailDbAccess.DeleteChapterDetail(curDeletedChapterDetail); } // Adjust Aika markers for deleted chapters int minChapterNumber = chapterOverview.Chapter.Min(c => c.ChapterNumber); int maxChapterNumber = chapterOverview.Chapter.Max(c => c.ChapterNumber); foreach (int curChapterNumber in deletedChapterNumbers) { await AdjustKartaMapMarkersForDeletedChapter(defaultProject.Id, curChapterNumber, minChapterNumber, maxChapterNumber, chapterOverview.Chapter); } // Timeline Entry await _timelineService.AddTimelineEntry(TimelineEvent.AikaChapterOverviewUpdated); return(Ok(chapterOverview)); }