"use strict"; (function () { 'use strict'; angular.module('knowledgeArticleModule') .factory('knowledgeArticleModel', ['knowledgeArticleService', '$q', 'searchService', 'configurationModel', 'metadataModel', function (knowledgeArticleService, $q, searchService, configurationModel, metadataModel) { var knowledgeArticleModel = { articles: {}, articleRevisions: {}, visibilities: {}, visitedArticlesCache: {} }, serializationMap = configurationModel.get('knowledgeArticle.categorySerializationMap'), restrictionMap = configurationModel.get('knowledgeArticle.restrictionMap'); knowledgeArticleModel.getKnowledgeArticleById = function (id, ignoreCache, preventIncrement) { if (knowledgeArticleModel.articles[id] && !ignoreCache) { if (!preventIncrement) { knowledgeArticleService.incrementViewCount(id, preventIncrement); } return $q.when(knowledgeArticleModel.articles[id]); } return knowledgeArticleService.getArticleById(id, !!preventIncrement).then(function (article) { knowledgeArticleModel.articles[id] = article; return article; }); }; knowledgeArticleModel.getArticleRevisionsById = function (id) { if (!knowledgeArticleModel.articleRevisions[id]) { knowledgeArticleModel.articleRevisions[id] = knowledgeArticleService.getArticleRevisions(id).then(function (revisions) { knowledgeArticleModel.articleRevisions[id] = revisions; return revisions; }); } return $q.when(knowledgeArticleModel.articleRevisions[id]); }; knowledgeArticleModel.rateArticle = function (articleId, vote) { knowledgeArticleModel.articles[articleId].voted = (vote ? 'yes' : 'nope'); vote ? knowledgeArticleModel.articles[articleId].useCount++ : knowledgeArticleModel.articles[articleId].notUsefulCount++; knowledgeArticleModel.articles[articleId].recalculateRating(); return knowledgeArticleService.rateArticle(articleId, vote); }; knowledgeArticleModel.getDraft = function (templateId, context) { if (context && context.type === EntityVO.TYPE_PROBLEM) { return knowledgeArticleService.getProblemDraft(context.id, templateId); } if (context && context.type === EntityVO.TYPE_KNOWNERROR) { return knowledgeArticleService.getKnownErrorDraft(context.id, templateId); } if (context && context.type === EntityVO.TYPE_INCIDENT) { return knowledgeArticleService.getIncidentDraft(context.id, templateId); } if (context && context.type === EntityVO.TYPE_WORKORDER) { return knowledgeArticleService.getWorkorderDraft(context.id, templateId); } return knowledgeArticleService.getDraft(templateId); }; knowledgeArticleModel.getVisibilityByCompanyName = function (companyName, chunkSize) { if (knowledgeArticleModel.visibilities[companyName]) { return $q.when(knowledgeArticleModel.visibilities[companyName]); } return knowledgeArticleService.getVisibility(companyName, chunkSize).then(function (result) { knowledgeArticleModel.visibilities[companyName] = result; return result; }); }; knowledgeArticleModel.getVisibilityGroupsByText = function (companyName, searchText, chunkSize) { return knowledgeArticleService.getVisibilityByText(companyName, searchText, chunkSize).then(function (response) { return response; }); }; knowledgeArticleModel.findArticleByText = function (params, options, sortOptions) { var jsonParams = { types: ['knowledge'] }; if (sortOptions && sortOptions.sortFieldName) { params.sortFieldName = sortOptions.sortFieldName; params.sortFieldOrder = sortOptions.sortFieldOrder; } if (!_.isEmpty(options)) { jsonParams = _.merge(jsonParams, options); } return searchService.getGlobalSearchResults(params, jsonParams).then(function (data) { return data.items[0].results; }); }; knowledgeArticleModel.createArticle = function (loginId, articleFull) { return knowledgeArticleService.createArticle(loginId, prepareArticle(articleFull)).then(function (article) { knowledgeArticleModel.articles[article.id] = article; return article; }); }; knowledgeArticleModel.update = function (oldArticle, isMinorEdit, articleRevisionList) { var propsToUpdate = ['title', 'content'], params = _.pick(oldArticle, propsToUpdate); params.isMinorEdit = isMinorEdit; return knowledgeArticleService.updateArticle(oldArticle.uuid, params).then(function (article) { if (isMinorEdit) { angular.extend(knowledgeArticleModel.articles[article.uuid], _.pick(article, propsToUpdate)); } else { if (articleRevisionList && articleRevisionList.length > 0) { _.forEach(articleRevisionList, function (revision) { knowledgeArticleModel.articleRevisions[revision.id] = null; }); } else { knowledgeArticleModel.articleRevisions[oldArticle.uuid] = null; } knowledgeArticleModel.articles[oldArticle.uuid] = null; knowledgeArticleModel.articles[article.uuid] = article; } return knowledgeArticleModel.articles[article.uuid]; }); }; knowledgeArticleModel.updateArticleMetadata = function (article) { var propsToUpdate = getPropsToUpdateMetadata(article.accessMappings); article = prepareArticle(article); var params = _.pick(article, propsToUpdate); if (_.indexOf(propsToUpdate, "assignee") !== -1 && article.assigneeGroup) { params.assigneeGroup = article.assigneeGroup.name; params.assigneeOrganization = article.assigneeGroup.organization; params.assigneeGroupId = article.assigneeGroup.id; params.assigneeCompany = article.assigneeGroup.company && article.assigneeGroup.company.name; } params.isMinorEdit = true; if (article.autoAssign) { params.isAutoAssign = article.autoAssign; delete params.assignee; delete params.assigneeGroup; delete params.assigneeGroupId; delete params.assigneeCompany; delete params.assigneeOrganization; } return knowledgeArticleService.updateArticle(article.uuid, params).then(function (article) { angular.extend(knowledgeArticleModel.articles[article.uuid], _.pick(article, propsToUpdate)); return article; }); }; function getPropsToUpdateMetadata(accessMappings) { var props = []; _.forIn(restrictionMap, function (value, property) { props = props.concat(accessMappings[property] ? value : []); }); return props; } function prepareArticle(articleFull) { var article = _.omit(articleFull, ['accessMappings', 'defaultCategorization']); article.tags = article.tags.join(','); //splitting temporary all* property into primary and additional _.forEach(serializationMap, function (field) { article[field.primary] = _.isArray(article[field.primary]) ? _.filter(article[field.all], 'primary') : (_.find(article[field.all], 'primary') || {}); article[field.additional] = _.reject(article[field.all], 'primary'); delete article[field.all]; }); return article; } knowledgeArticleModel.getAutoSavedCopy = function (articleId) { return knowledgeArticleService.getAutoSavedCopy(articleId); }; knowledgeArticleModel.autoSave = function (article) { return knowledgeArticleService.autoSave(article); }; knowledgeArticleModel.removeAutoSavedCopy = function (articleId) { return knowledgeArticleService.removeAutoSavedCopy(articleId); }; knowledgeArticleModel.checkEditStatus = function (articleId) { return knowledgeArticleService.checkEditStatus(articleId); }; knowledgeArticleModel.mergeArticleMetaData = function (article, oldArticle, content) { //TODO: refactor that article.visibility = oldArticle.visibility; article.author = oldArticle.author; article.selectedAssignee = oldArticle.selectedAssignee; article.tags = oldArticle.tags; article.allSites = oldArticle.allSites; article.allServices = oldArticle.allServices; article.allOrganizations = oldArticle.allOrganizations; article.linkedItems = oldArticle.linkedItems; article.title = oldArticle.title; article.content = content; return article; }; knowledgeArticleModel.refreshStatus = function (id, statusData) { var article = knowledgeArticleModel.articles[id]; var metadata = metadataModel.cache[EntityVO.TYPE_KNOWLEDGE]; article.status.value = _.find(metadata.statuses, { name: statusData.status }).name; if (!_.isEmpty(statusData.updatedTickets)) { var currentArticle = _.find(statusData.updatedTickets, function (updatedTicket) { return updatedTicket.id === id; }); article.accessMappings = currentArticle.accessMappings; } }; knowledgeArticleModel.getKnowledgeArticleTemplates = function () { if (!_.isUndefined(knowledgeArticleModel.knowledgeArticleTemplates)) { return $q.when(knowledgeArticleModel.knowledgeArticleTemplates); } return knowledgeArticleService.getKnowledgeArticleTemplates().then(function (templates) { knowledgeArticleModel.knowledgeArticleTemplates = templates; return templates; }); }; knowledgeArticleModel.updateTemplateStyles = function (templateID, styles) { var params = {}; params.templateID = templateID; params.styles = styles; return knowledgeArticleService.updateTemplateStyles(params).then(function (data) { updateExistingTemplates(data); return data; }); }; function updateExistingTemplates(data) { if (!knowledgeArticleModel.knowledgeArticleTemplates) { return; } _.find(knowledgeArticleModel.knowledgeArticleTemplates, { name: data.templateID }).templateObject.styles = data.styles; } knowledgeArticleModel.updateCachedArticles = function (ids, update) { _.forEach(ids, function (id) { knowledgeArticleModel.articles[id] && angular.extend(knowledgeArticleModel.articles[id], update); }); }; knowledgeArticleModel.getPotentialPrimary = function (params) { return knowledgeArticleService.getPotentialPrimary(params); }; knowledgeArticleModel.markArticleVisited = function (articleId, ticketId) { if (knowledgeArticleModel.visitedArticlesCache[ticketId]) { if (!(_.includes(knowledgeArticleModel.visitedArticlesCache[ticketId], articleId))) { knowledgeArticleModel.visitedArticlesCache[ticketId].push(articleId); } } else { knowledgeArticleModel.visitedArticlesCache[ticketId] = [articleId]; } }; knowledgeArticleModel.getVisitedArticlesForTicket = function (ticketId) { if (!knowledgeArticleModel.visitedArticlesCache[ticketId]) { knowledgeArticleModel.visitedArticlesCache = {}; return null; } return knowledgeArticleModel.visitedArticlesCache[ticketId]; }; knowledgeArticleModel.clearVisitedArticlesForTicket = function (ticketId) { if (knowledgeArticleModel.visitedArticlesCache[ticketId]) { knowledgeArticleModel.visitedArticlesCache = {}; } }; knowledgeArticleModel.getAssessmentQuestions = function (companyName, organization) { return knowledgeArticleService.getAssessmentQuestions(companyName, organization); }; knowledgeArticleModel.submitAssessment = function (articleId, answers) { return knowledgeArticleService.submitAssessment(articleId, answers); }; knowledgeArticleModel.getQuestionSetList = function () { return knowledgeArticleService.getQuestionSetList(); }; knowledgeArticleModel.getQuestionSetById = function (questionSetId) { return knowledgeArticleService.getQuestionSetById(questionSetId); }; knowledgeArticleModel.deleteQuestionSetById = function (questionSetId) { return knowledgeArticleService.deleteQuestionSetById(questionSetId); }; knowledgeArticleModel.createQuestionSet = function (postdata) { return knowledgeArticleService.createQuestionSet(postdata); }; knowledgeArticleModel.updateQuestionSet = function (questionSetId, postdata) { return knowledgeArticleService.updateQuestionSet(questionSetId, postdata); }; return knowledgeArticleModel; } ]); }());