예제 #1
0
 /// <summary>
 /// Parses a kirja page
 /// </summary>
 /// <param name="page">Page to parse</param>
 public void ParsePage(KirjaPage page)
 {
     foreach (IKirjaParser curParser in _Parser)
     {
         curParser.ParsePage(page);
     }
 }
예제 #2
0
        public async Task <IActionResult> DeletePage(string id)
        {
            List <KirjaPage> kirjaPages = await _pageDbAccess.GetPagesByPage(id);

            if (kirjaPages.Count > 0)
            {
                string mentionedInPages = string.Join(", ", kirjaPages.Select(p => p.Name));
                return(StatusCode((int)HttpStatusCode.BadRequest, _localizer["CanNotDeletePageMentionedInOtherPages", mentionedInPages].Value));
            }

            List <KartaMapMarkerQueryResult> kartaMaps = await _kartaMapDbAccess.GetAllMapsKirjaPageIsMarkedIn(id);

            if (kartaMaps.Count > 0)
            {
                string markedInMaps = string.Join(", ", kartaMaps.Select(p => p.Name));
                return(StatusCode((int)HttpStatusCode.BadRequest, _localizer["CanNotDeletePageMarkedInKartaMap", markedInMaps].Value));
            }

            KirjaPage page = await _pageDbAccess.GetPageById(id);

            await _pageDbAccess.DeletePage(page);

            _logger.LogInformation("Page was deleted.");

            if (page.UplodadedImages != null)
            {
                DeleteUnusedImages(page.UplodadedImages);
            }

            await _timelineService.AddTimelineEntry(TimelineEvent.KirjaPageDeleted, page.Name);

            return(Ok(id));
        }
예제 #3
0
        public async Task <IActionResult> CreatePage([FromBody] PageRequest page)
        {
            if (string.IsNullOrEmpty(page.Name))
            {
                return(StatusCode((int)HttpStatusCode.BadRequest));
            }

            try
            {
                GoNorthProject project = await _projectDbAccess.GetDefaultProject();

                KirjaPage newPage = new KirjaPage();
                newPage.ProjectId = project.Id;
                newPage.Name      = page.Name;
                newPage.Content   = page.Content;

                newPage.Attachments = new List <KirjaPageAttachment>();

                _pageParserService.ParsePage(newPage);
                await this.SetModifiedData(_userManager, newPage);

                newPage = await _pageDbAccess.CreatePage(newPage);

                await _timelineService.AddTimelineEntry(TimelineEvent.KirjaPageCreated, newPage.Name, newPage.Id);

                return(Ok(newPage));
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Could not create page {0}", page.Name);
                return(StatusCode((int)HttpStatusCode.InternalServerError));
            }
        }
예제 #4
0
        public async Task <IActionResult> Page(string id)
        {
            KirjaPage page = null;

            if (!string.IsNullOrEmpty(id))
            {
                page = await _pageDbAccess.GetPageById(id);
            }
            else
            {
                GoNorthProject project = await _projectDbAccess.GetDefaultProject();

                page = await _pageDbAccess.GetDefaultPageForProject(project.Id);

                if (page == null)
                {
                    page           = new KirjaPage();
                    page.IsDefault = true;
                    page.ProjectId = project.Id;
                    page.Name      = _localizer["DefaultPageName"];
                    page.Content   = _localizer["DefaultPageContent"];

                    _pageParserService.ParsePage(page);

                    page = await _pageDbAccess.CreatePage(page);
                }
            }
            return(Ok(page));
        }
예제 #5
0
        public async Task <IActionResult> UpdatePage(string id, [FromBody] PageRequest page)
        {
            KirjaPage loadedPage = await _pageDbAccess.GetPageById(id);

            List <string> oldImages = null;

            if (loadedPage.UplodadedImages != null)
            {
                oldImages = new List <string>(loadedPage.UplodadedImages);
            }
            else
            {
                oldImages = new List <string>();
            }

            loadedPage.Name    = page.Name;
            loadedPage.Content = page.Content;
            _pageParserService.ParsePage(loadedPage);
            await this.SetModifiedData(_userManager, loadedPage);

            await _pageDbAccess.UpdatePage(loadedPage);

            _logger.LogInformation("Page was updated.");

            DeleteUnusedImages(oldImages.Except(loadedPage.UplodadedImages, StringComparer.OrdinalIgnoreCase).ToList());
            _logger.LogInformation("Unused Images were deleted.");

            await _timelineService.AddTimelineEntry(TimelineEvent.KirjaPageUpdated, loadedPage.Name, loadedPage.Id);

            return(Ok(loadedPage));
        }
예제 #6
0
        public async Task <IActionResult> KirjaAttachment(string pageId, string attachmentFile)
        {
            // Check Data
            if (string.IsNullOrEmpty(pageId) || string.IsNullOrEmpty(attachmentFile))
            {
                return(StatusCode((int)HttpStatusCode.BadRequest));
            }

            KirjaPage page = await _pageDbAccess.GetPageById(pageId);

            if (page == null || page.Attachments == null)
            {
                return(StatusCode((int)HttpStatusCode.NotFound));
            }

            // Get Attachment
            KirjaPageAttachment attachment = FindAttachment(page, attachmentFile);

            if (attachment == null)
            {
                return(StatusCode((int)HttpStatusCode.NotFound));
            }

            // Return File
            Stream imageStream = _fileAccess.OpenFile(attachment.Filename);

            return(File(imageStream, attachment.MimeType, attachment.OriginalFilename));
        }
예제 #7
0
        /// <summary>
        /// Searches an attachment in the list of attachments of a page
        /// </summary>
        /// <param name="page">Page with attachments</param>
        /// <param name="attachmentFile">Attachment file to search</param>
        /// <returns>Attachment file, null if file was not found</returns>
        private KirjaPageAttachment FindAttachment(KirjaPage page, string attachmentFile)
        {
            foreach (KirjaPageAttachment curAttachment in page.Attachments)
            {
                if (curAttachment.Filename == attachmentFile)
                {
                    return(curAttachment);
                }
            }

            return(null);
        }
예제 #8
0
        /// <summary>
        /// Returns a wiki page by its id
        /// </summary>
        /// <param name="pageId">Page Id</param>
        /// <returns>Wiki page</returns>
        public async Task <KirjaPage> GetWikiPageById(string pageId)
        {
            if (string.IsNullOrEmpty(pageId))
            {
                return(null);
            }

            if (_cachedPages.ContainsKey(pageId))
            {
                return(_cachedPages[pageId]);
            }

            KirjaPage page = await _pageDbAccess.GetPageById(pageId);

            _cachedPages.Add(pageId, page);
            return(page);
        }
예제 #9
0
        public async Task <IActionResult> DeleteAttachment(string pageId, string attachmentFile)
        {
            // Check Data
            if (string.IsNullOrEmpty(pageId) || string.IsNullOrEmpty(attachmentFile))
            {
                return(StatusCode((int)HttpStatusCode.BadRequest));
            }

            KirjaPage page = await _pageDbAccess.GetPageById(pageId);

            if (page == null || page.Attachments == null)
            {
                return(StatusCode((int)HttpStatusCode.NotFound));
            }

            // Get Attachment
            KirjaPageAttachment attachment = FindAttachment(page, attachmentFile);

            if (attachment == null)
            {
                return(Ok(pageId));
            }

            // Delete Attachment
            try
            {
                await this.SetModifiedData(_userManager, page);

                page.Attachments.Remove(attachment);
                await _pageDbAccess.UpdatePage(page);

                _logger.LogInformation("Attachment deleted from page");

                _fileAccess.DeleteFile(attachment.Filename);
                _logger.LogInformation("Attachment file deleted");
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Could not delete attachment");
                return(StatusCode((int)HttpStatusCode.InternalServerError));
            }

            await _timelineService.AddTimelineEntry(TimelineEvent.KirjaAttachmentDeleted, page.Name, page.Id, attachment.OriginalFilename);

            return(Ok(pageId));
        }
예제 #10
0
        /// <summary>
        /// Parses a kirja page
        /// </summary>
        /// <param name="page">Page to parse</param>
        public void ParsePage(KirjaPage page)
        {
            Regex         imageRegex = new Regex("KirjaImage\\?imageFile=([0-9A-F]{8}-([0-9A-F]{4}-){3}[0-9A-F]{12}\\..*?)\"", RegexOptions.IgnoreCase | RegexOptions.Multiline);
            List <string> images     = new List <string>();

            MatchCollection imageMatches = imageRegex.Matches(page.Content);

            foreach (Match curMatch in imageMatches)
            {
                if (!curMatch.Success)
                {
                    continue;
                }

                images.Add(curMatch.Groups[1].Value);
            }
            page.UplodadedImages = images;
        }
예제 #11
0
        /// <summary>
        /// Parses a kirja page
        /// </summary>
        /// <param name="page">Page to parse</param>
        /// <param name="pageName">Name of the page in the link to search for</param>
        /// <returns>Found ids</returns>
        public List <string> ParseIds(KirjaPage page, string pageName)
        {
            Regex         guidLinkRegex = new Regex("/" + pageName + "#id=([0-9A-F]{8}-([0-9A-F]{4}-){3}[0-9A-F]{12})", RegexOptions.IgnoreCase | RegexOptions.Multiline);
            List <string> ids           = new List <string>();

            MatchCollection itemLinkMatches = guidLinkRegex.Matches(page.Content);

            foreach (Match curMatch in itemLinkMatches)
            {
                if (!curMatch.Success)
                {
                    continue;
                }

                ids.Add(curMatch.Groups[1].Value);
            }
            return(ids);
        }
예제 #12
0
        /// <summary>
        /// Syncs kirja marker label
        /// </summary>
        /// <param name="map">Map To sync</param>
        /// <returns>Task</returns>
        private async Task SyncKirjaMarkerLabels(KartaMap map)
        {
            if (map.KirjaPageMarker == null)
            {
                return;
            }

            foreach (KirjaPageMapMarker curMarker in map.KirjaPageMarker)
            {
                KirjaPage curPage = await _kirjaPageDbAccess.GetPageById(curMarker.PageId);

                if (curPage == null)
                {
                    continue;
                }

                curMarker.PageName = curPage.Name;
            }
        }
예제 #13
0
        /// <summary>
        /// Parses a kirja page
        /// </summary>
        /// <param name="page">Page to parse</param>
        /// <param name="pageName">Name of the page in the link to search for</param>
        /// <returns>Found ids</returns>
        public List <string> ParseIds(KirjaPage page, string pageName)
        {
            // Support both query and hash notation for backwards comaptibility of links
            Regex         guidLinkRegex = new Regex("/" + pageName + "[#|?]id=([0-9A-F]{8}-([0-9A-F]{4}-){3}[0-9A-F]{12})", RegexOptions.IgnoreCase | RegexOptions.Multiline);
            List <string> ids           = new List <string>();

            MatchCollection itemLinkMatches = guidLinkRegex.Matches(page.Content);

            foreach (Match curMatch in itemLinkMatches)
            {
                if (!curMatch.Success)
                {
                    continue;
                }

                ids.Add(curMatch.Groups[1].Value);
            }
            return(ids);
        }
예제 #14
0
        public async Task <IActionResult> DeletePage(string id)
        {
            List <KirjaPage> kirjaPages = await _pageDbAccess.GetPagesByPage(id);

            if (kirjaPages.Count > 0)
            {
                string mentionedInPages = string.Join(", ", kirjaPages.Select(p => p.Name));
                return(BadRequest(_localizer["CanNotDeletePageMentionedInOtherPages", mentionedInPages].Value));
            }

            List <KartaMapMarkerQueryResult> kartaMaps = await _kartaMapDbAccess.GetAllMapsKirjaPageIsMarkedIn(id);

            if (kartaMaps.Count > 0)
            {
                string markedInMaps = string.Join(", ", kartaMaps.Select(p => p.Name));
                return(BadRequest(_localizer["CanNotDeletePageMarkedInKartaMap", markedInMaps].Value));
            }

            List <TaleDialog> taleDialogs = await _dialogDbAccess.GetDialogsObjectIsReferenced(id);

            if (taleDialogs.Count > 0)
            {
                List <KortistoNpc> npcs = await _npcDbAccess.ResolveFlexFieldObjectNames(taleDialogs.Select(t => t.RelatedObjectId).ToList());

                string referencedInDialogs = string.Join(", ", npcs.Select(n => n.Name));
                return(BadRequest(_localizer["CanNotDeletePageReferencedInDialog", referencedInDialogs].Value));
            }

            List <KortistoNpc> usedNpcs = await _npcDbAccess.GetNpcsObjectIsReferencedInDailyRoutine(id);

            if (usedNpcs.Count > 0)
            {
                string referencedInNpcs = string.Join(", ", usedNpcs.Select(p => p.Name));
                return(BadRequest(_localizer["CanNotDeletePageReferencedInNpc", referencedInNpcs].Value));
            }

            List <AikaQuest> aikaQuests = await _questDbAccess.GetQuestsObjectIsReferenced(id);

            if (aikaQuests.Count > 0)
            {
                string referencedInQuests = string.Join(", ", aikaQuests.Select(p => p.Name));
                return(BadRequest(_localizer["CanNotDeletePageReferencedInQuest", referencedInQuests].Value));
            }

            List <EvneSkill> referencedInSkills = await _skillDbAccess.GetSkillsObjectIsReferencedIn(id);

            if (referencedInSkills.Count > 0)
            {
                string usedInSkills = string.Join(", ", referencedInSkills.Select(m => m.Name));
                return(BadRequest(_localizer["CanNotDeletePageReferencedInSkill", usedInSkills].Value));
            }

            List <ObjectExportSnippet> referencedInSnippets = await _objectExportSnippetDbAccess.GetExportSnippetsObjectIsReferenced(id);

            if (referencedInSnippets.Count > 0)
            {
                List <ObjectExportSnippetReference> references = await _exportSnippetRelatedObjectNameResolver.ResolveExportSnippetReferences(referencedInSnippets, true, true, true);

                string usedInDailyRoutines = string.Join(", ", references.Select(m => string.Format("{0} ({1})", m.ObjectName, m.ExportSnippet)));
                return(BadRequest(_localizer["CanNotDeletePageReferencedInExportSnippet", usedInDailyRoutines].Value));
            }

            List <StateMachine> referencedInStateMachines = await _stateMachineDbAccess.GetStateMachinesObjectIsReferenced(id);

            if (referencedInStateMachines.Count > 0)
            {
                List <KortistoNpc> npcs = await _npcDbAccess.ResolveFlexFieldObjectNames(referencedInStateMachines.Select(t => t.RelatedObjectId).ToList());

                List <KortistoNpc> npcTemplates = await _npcTemplateDbAccess.ResolveFlexFieldObjectNames(referencedInStateMachines.Select(t => t.RelatedObjectId).ToList());

                string usedInStateMachines = string.Join(", ", npcs.Union(npcTemplates).Select(n => n.Name));
                return(BadRequest(_localizer["CanNotDeletePageUsedInStateMachines", usedInStateMachines].Value));
            }

            KirjaPage page = await _pageDbAccess.GetPageById(id);

            if (page.IsDefault)
            {
                return(BadRequest(_localizer["CanNotDeleteRootPage"].Value));
            }

            await _pageDbAccess.DeletePage(page);

            _logger.LogInformation("Page was deleted.");

            // Delete Images
            List <string> allImages = new List <string>();

            if (page.UplodadedImages != null)
            {
                allImages.AddRange(page.UplodadedImages);
            }

            List <KirjaPageVersion> oldVersions = await _pageVersionDbAccess.GetVersionsOfPage(page.Id, 0, int.MaxValue);

            foreach (KirjaPageVersion curVersion in oldVersions)
            {
                if (curVersion.UplodadedImages != null)
                {
                    allImages.AddRange(curVersion.UplodadedImages);
                }
            }

            allImages = allImages.Distinct().ToList();
            foreach (string curImage in allImages)
            {
                _fileAccess.DeleteFile(curImage);
            }

            // Delete Attachments
            if (page.Attachments != null)
            {
                foreach (KirjaPageAttachment curAttachment in page.Attachments)
                {
                    _fileAccess.DeleteFile(curAttachment.Filename);
                }
            }

            await _pageVersionDbAccess.DeletePageVersionsByPage(page.Id);

            await _timelineService.AddTimelineEntry(page.ProjectId, TimelineEvent.KirjaPageDeleted, page.Name);

            return(Ok(id));
        }
예제 #15
0
        public async Task <IActionResult> UploadPageAttachment(string id)
        {
            // Validate Date
            if (Request.Form.Files.Count != 1)
            {
                return(StatusCode((int)HttpStatusCode.BadRequest, _localizer["OnlyOneFileAllowed"]));
            }

            IFormFile uploadFile      = Request.Form.Files[0];
            string    fileContentType = uploadFile.ContentType;
            bool      mimeTypeAllowed = false;

            foreach (string curAllowedMimeType in _allowedAttachmentMimeTypes)
            {
                if (Regex.IsMatch(fileContentType, curAllowedMimeType))
                {
                    mimeTypeAllowed = true;
                    break;
                }
            }

            if (!mimeTypeAllowed)
            {
                return(StatusCode((int)HttpStatusCode.BadRequest, _localizer["FileTypeNotAllowed"]));
            }

            // Get Page
            KirjaPage page = await _pageDbAccess.GetPageById(id);

            if (page == null)
            {
                return(StatusCode((int)HttpStatusCode.NotFound));
            }

            // Save File
            string fileName = string.Empty;

            try
            {
                using (Stream fileStream = _fileAccess.CreateFile(uploadFile.FileName, out fileName))
                {
                    uploadFile.CopyTo(fileStream);
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Could not upload file");
                return(StatusCode((int)HttpStatusCode.InternalServerError, _localizer["CouldNotUploadFile"]));
            }

            // Save File to page
            if (page.Attachments == null)
            {
                page.Attachments = new List <KirjaPageAttachment>();
            }

            KirjaPageAttachment pageAttachment = new KirjaPageAttachment();

            pageAttachment.OriginalFilename = uploadFile.FileName;
            pageAttachment.Filename         = fileName;
            pageAttachment.MimeType         = fileContentType;

            page.Attachments.Add(pageAttachment);
            page.Attachments = page.Attachments.OrderBy(pa => pa.OriginalFilename).ToList();

            try
            {
                await this.SetModifiedData(_userManager, page);

                await _pageDbAccess.UpdatePage(page);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Could not save page after file upload");
                _fileAccess.DeleteFile(fileName);
                return(StatusCode((int)HttpStatusCode.InternalServerError, _localizer["CouldNotUploadFile"]));
            }

            await _timelineService.AddTimelineEntry(TimelineEvent.KirjaAttachmentAdded, page.Name, page.Id, pageAttachment.OriginalFilename);

            return(Ok(pageAttachment));
        }
예제 #16
0
 /// <summary>
 /// Parses a kirja page
 /// </summary>
 /// <param name="page">Page to parse</param>
 public void ParsePage(KirjaPage page)
 {
     page.MentionedItems = ParseIds(page, "Item");
 }
예제 #17
0
 /// <summary>
 /// Parses a kirja page
 /// </summary>
 /// <param name="page">Page to parse</param>
 public void ParsePage(KirjaPage page)
 {
     page.MentionedSkills = ParseIds(page, "Skill");
 }
예제 #18
0
        public async Task <IActionResult> DeletePage(string id)
        {
            List <KirjaPage> kirjaPages = await _pageDbAccess.GetPagesByPage(id);

            if (kirjaPages.Count > 0)
            {
                string mentionedInPages = string.Join(", ", kirjaPages.Select(p => p.Name));
                return(StatusCode((int)HttpStatusCode.BadRequest, _localizer["CanNotDeletePageMentionedInOtherPages", mentionedInPages].Value));
            }

            List <KartaMapMarkerQueryResult> kartaMaps = await _kartaMapDbAccess.GetAllMapsKirjaPageIsMarkedIn(id);

            if (kartaMaps.Count > 0)
            {
                string markedInMaps = string.Join(", ", kartaMaps.Select(p => p.Name));
                return(StatusCode((int)HttpStatusCode.BadRequest, _localizer["CanNotDeletePageMarkedInKartaMap", markedInMaps].Value));
            }

            KirjaPage page = await _pageDbAccess.GetPageById(id);

            if (page.IsDefault)
            {
                return(StatusCode((int)HttpStatusCode.BadRequest, _localizer["CanNotDeleteRootPage"].Value));
            }

            await _pageDbAccess.DeletePage(page);

            _logger.LogInformation("Page was deleted.");

            // Delete Images
            List <string> allImages = new List <string>();

            if (page.UplodadedImages != null)
            {
                allImages.AddRange(page.UplodadedImages);
            }

            List <KirjaPageVersion> oldVersions = await _pageVersionDbAccess.GetVersionsOfPage(page.Id, 0, int.MaxValue);

            foreach (KirjaPageVersion curVersion in oldVersions)
            {
                if (curVersion.UplodadedImages != null)
                {
                    allImages.AddRange(curVersion.UplodadedImages);
                }
            }

            allImages = allImages.Distinct().ToList();
            foreach (string curImage in allImages)
            {
                _fileAccess.DeleteFile(curImage);
            }

            // Delete Attachments
            if (page.Attachments != null)
            {
                foreach (KirjaPageAttachment curAttachment in page.Attachments)
                {
                    _fileAccess.DeleteFile(curAttachment.Filename);
                }
            }

            await _pageVersionDbAccess.DeletePageVersionsByPage(page.Id);

            await _timelineService.AddTimelineEntry(TimelineEvent.KirjaPageDeleted, page.Name);

            return(Ok(id));
        }
예제 #19
0
        /// <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);
        }
예제 #20
0
 /// <summary>
 /// Parses a kirja page
 /// </summary>
 /// <param name="page">Page to parse</param>
 public void ParsePage(KirjaPage page)
 {
     page.MentionedQuests = ParseIds(page, "Quest");
 }
예제 #21
0
 /// <summary>
 /// Builds an export wiki page based on a kirja page
 /// </summary>
 /// <param name="page">Wiki page</param>
 public ScribanExportWikiPage(KirjaPage page)
 {
     Name    = page.Name;
     Content = page.Content;
 }
예제 #22
0
 /// <summary>
 /// Parses a kirja page
 /// </summary>
 /// <param name="page">Page to parse</param>
 public void ParsePage(KirjaPage page)
 {
     page.MentionedNpcs = ParseIds(page, "Npc");
 }
예제 #23
0
 /// <summary>
 /// Parses a kirja page
 /// </summary>
 /// <param name="page">Page to parse</param>
 public void ParsePage(KirjaPage page)
 {
     page.MentionedKirjaPages = ParseIds(page, "Kirja");
 }
예제 #24
0
        /// <summary>
        /// Checks if a project is empty
        /// </summary>
        /// <param name="project">Project to check</param>
        /// <returns>True if the project is empty, else false</returns>
        private async Task <bool> IsProjectEmpty(GoNorthProject project)
        {
            int rootKortistoFolderCount = await _kortistoFolderDbAccess.GetRootFolderCount(project.Id, CultureInfo.CurrentUICulture.TwoLetterISOLanguageName);

            if (rootKortistoFolderCount > 0)
            {
                return(false);
            }

            int rootNpcCount = await _npcDbAccess.GetFlexFieldObjectsInRootFolderCount(project.Id, CultureInfo.CurrentUICulture.TwoLetterISOLanguageName);

            if (rootNpcCount > 0)
            {
                return(false);
            }

            int rootStyrFolderCount = await _styrFolderDbAccess.GetRootFolderCount(project.Id, CultureInfo.CurrentUICulture.TwoLetterISOLanguageName);

            if (rootStyrFolderCount > 0)
            {
                return(false);
            }

            int rootItemCount = await _itemDbAccess.GetFlexFieldObjectsInRootFolderCount(project.Id, CultureInfo.CurrentUICulture.TwoLetterISOLanguageName);

            if (rootItemCount > 0)
            {
                return(false);
            }

            int rootEvneFolderCount = await _evneFolderDbAccess.GetRootFolderCount(project.Id, CultureInfo.CurrentUICulture.TwoLetterISOLanguageName);

            if (rootEvneFolderCount > 0)
            {
                return(false);
            }

            int rootSkillCount = await _evneSkillDbAccess.GetFlexFieldObjectsInRootFolderCount(project.Id, CultureInfo.CurrentUICulture.TwoLetterISOLanguageName);

            if (rootSkillCount > 0)
            {
                return(false);
            }

            int kirjaPageCount = await _kirjaPageDbAccess.SearchPagesCount(project.Id, string.Empty, string.Empty, CultureInfo.CurrentUICulture.TwoLetterISOLanguageName);

            if (kirjaPageCount > 1)
            {
                return(false);
            }
            else if (kirjaPageCount == 1)
            {
                KirjaPage defaultPage = await _kirjaPageDbAccess.GetDefaultPageForProject(project.Id);

                if (defaultPage == null)
                {
                    return(false);
                }
            }

            int chapterDetailCount = await _chapterDetailDbAccess.GetChapterDetailsByProjectIdCount(project.Id);

            if (chapterDetailCount > 0)
            {
                return(false);
            }

            int questCount = await _questDbAccess.GetQuestsByProjectIdCount(project.Id, CultureInfo.CurrentUICulture.TwoLetterISOLanguageName);

            if (questCount > 0)
            {
                return(false);
            }

            List <KartaMap> maps = await _mapDbAccess.GetAllProjectMaps(project.Id);

            if (maps != null && maps.Count > 0)
            {
                return(false);
            }

            int taskBoardCount = await _taskBoardDbAccess.GetOpenTaskBoardCount(project.Id, CultureInfo.CurrentUICulture.TwoLetterISOLanguageName);

            taskBoardCount += await _taskBoardDbAccess.GetClosedTaskBoardCount(project.Id, CultureInfo.CurrentUICulture.TwoLetterISOLanguageName);

            if (taskBoardCount > 0)
            {
                return(false);
            }

            return(true);
        }
예제 #25
0
        public async Task <IActionResult> UpdatePage(string id, [FromBody] PageRequest page)
        {
            _xssChecker.CheckXss(page.Name);
            _xssChecker.CheckXss(page.Content);

            KirjaPage loadedPage = await _pageDbAccess.GetPageById(id);

            if (loadedPage == null)
            {
                return(NotFound());
            }

            List <string> oldImages = null;

            if (loadedPage.UplodadedImages != null)
            {
                oldImages = new List <string>(loadedPage.UplodadedImages);
            }
            else
            {
                oldImages = new List <string>();
            }

            bool nameChanged = loadedPage.Name != page.Name;

            loadedPage.Name    = page.Name;
            loadedPage.Content = page.Content;
            _pageParserService.ParsePage(loadedPage);
            await this.SetModifiedData(_userManager, loadedPage);

            await _pageDbAccess.UpdatePage(loadedPage);

            _logger.LogInformation("Page was updated.");

            if (nameChanged)
            {
                await SyncPageNameToMarkers(id, page.Name);
            }

            string versionId = await SaveVersionOfPage(loadedPage);

            string oldVersionId = string.Empty;

            if (!string.IsNullOrEmpty(versionId))
            {
                List <KirjaPageVersion> allVersions = await _pageVersionDbAccess.GetVersionsOfPage(loadedPage.Id, 0, 2);

                if (allVersions.Count > 1)
                {
                    oldVersionId = allVersions[1].Id;
                }
            }
            _logger.LogInformation("Versions were updated.");

            await DeleteUnusedImages(loadedPage.Id, oldImages.Except(loadedPage.UplodadedImages, StringComparer.OrdinalIgnoreCase).ToList());

            _logger.LogInformation("Unused Images were deleted.");

            await _timelineService.AddTimelineEntry(TimelineEvent.KirjaPageUpdated, loadedPage.Name, loadedPage.Id, versionId, oldVersionId);

            return(Ok(loadedPage));
        }