public async Task <IActionResult> ValidateVersionReferences(string versionId) { KirjaPageVersion version = await _pageVersionDbAccess.GetPageVersionById(versionId); if (version == null) { return(NotFound()); } PageVersionReferenceValidationResult validationResult = new PageVersionReferenceValidationResult(); validationResult.MissingNpcs = new List <string>(); if (version.MentionedNpcs != null) { List <KortistoNpc> npcs = await _npcDbAccess.ResolveFlexFieldObjectNames(version.MentionedNpcs); validationResult.MissingNpcs = version.MentionedNpcs.Where(n => !npcs.Any(npc => npc.Id.ToLowerInvariant() == n.ToLowerInvariant())).ToList(); } validationResult.MissingItems = new List <string>(); if (version.MentionedItems != null) { List <StyrItem> items = await _itemDbAccess.ResolveFlexFieldObjectNames(version.MentionedItems); validationResult.MissingItems = version.MentionedItems.Where(n => !items.Any(item => item.Id.ToLowerInvariant() == n.ToLowerInvariant())).ToList(); } validationResult.MissingSkills = new List <string>(); if (version.MentionedSkills != null) { List <EvneSkill> skills = await _skillDbAccess.ResolveFlexFieldObjectNames(version.MentionedSkills); validationResult.MissingSkills = version.MentionedSkills.Where(n => !skills.Any(skill => skill.Id.ToLowerInvariant() == n.ToLowerInvariant())).ToList(); } validationResult.MissingQuests = new List <string>(); if (version.MentionedQuests != null) { List <AikaQuest> quests = await _questDbAccess.ResolveQuestNames(version.MentionedQuests); validationResult.MissingQuests = version.MentionedQuests.Where(n => !quests.Any(quest => quest.Id.ToLowerInvariant() == n.ToLowerInvariant())).ToList(); } validationResult.MissingPages = new List <string>(); if (version.MentionedKirjaPages != null) { List <KirjaPage> pages = await _pageDbAccess.ResolveNames(version.MentionedKirjaPages); validationResult.MissingPages = version.MentionedKirjaPages.Where(n => !pages.Any(page => page.Id.ToLowerInvariant() == n.ToLowerInvariant())).ToList(); } return(Ok(validationResult)); }
/// <summary> /// Saves a new version of a page /// </summary> /// <param name="page">Page</param> /// <returns>Version Id</returns> private async Task <string> SaveVersionOfPage(KirjaPage page) { if (_maxVersionCount == 0) { return(string.Empty); } // Check if the last modification to the page was made by the same user and is in the merge time span bool isUpdate = false; KirjaPageVersion version = new KirjaPageVersion(); if (_versionMergeTimeSpan > 0) { GoNorthUser currentUser = await _userManager.GetUserAsync(User); KirjaPageVersion existingVersion = await _pageVersionDbAccess.GetLatestVersionOfPage(page.Id); if (existingVersion != null && existingVersion.ModifiedBy == currentUser.Id && (float)(DateTimeOffset.UtcNow - existingVersion.ModifiedOn).TotalMinutes < _versionMergeTimeSpan) { version = existingVersion; isUpdate = true; } } if (!isUpdate) { int versionNumber = await _pageVersionDbAccess.GetMaxPageVersionNumber(page.Id); ++versionNumber; version.VersionNumber = versionNumber; } version.OriginalPageId = page.Id; version.ProjectId = page.ProjectId; version.IsDefault = page.IsDefault; version.Name = page.Name; version.Content = page.Content; version.MentionedKirjaPages = page.MentionedKirjaPages; version.MentionedQuests = page.MentionedQuests; version.MentionedNpcs = page.MentionedNpcs; version.MentionedItems = page.MentionedItems; version.MentionedSkills = page.MentionedSkills; version.UplodadedImages = page.UplodadedImages; version.Attachments = null; version.ModifiedOn = page.ModifiedOn; version.ModifiedBy = page.ModifiedBy; if (isUpdate) { await _pageVersionDbAccess.UpdatePageVersion(version); } else { version = await _pageVersionDbAccess.CreatePageVersion(version); } // Delete old versions if (_maxVersionCount > 0) { List <KirjaPageVersion> oldVersions = await _pageVersionDbAccess.GetVersionsOfPage(page.Id, 0, int.MaxValue); List <string> imagesToDelete = new List <string>(); HashSet <string> stillUsedImages = page.UplodadedImages != null?page.UplodadedImages.ToHashSet() : new HashSet <string>(); for (int curVersion = 0; curVersion < oldVersions.Count; ++curVersion) { if (curVersion < _maxVersionCount) { if (oldVersions[curVersion].UplodadedImages != null) { foreach (string curImage in oldVersions[curVersion].UplodadedImages) { if (!stillUsedImages.Contains(curImage)) { stillUsedImages.Add(curImage); } } } } else { if (oldVersions[curVersion].Id != version.Id) { await _pageVersionDbAccess.DeletePageVersion(oldVersions[curVersion]); if (oldVersions[curVersion].UplodadedImages != null) { imagesToDelete.AddRange(oldVersions[curVersion].UplodadedImages); } } } } imagesToDelete = imagesToDelete.Distinct().ToList(); foreach (string curImage in imagesToDelete) { if (!stillUsedImages.Contains(curImage)) { _fileAccess.DeleteFile(curImage); } } } return(version.Id); }