コード例 #1
0
        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));
        }