aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-web/src/main/js/helpers
diff options
context:
space:
mode:
authorStas Vilchik <stas-vilchik@users.noreply.github.com>2017-03-02 13:18:27 +0100
committerGitHub <noreply@github.com>2017-03-02 13:18:27 +0100
commitce9f0892fc3d15638c4eaa4054ed06f3d7e5fc19 (patch)
tree0dd0d0633c514ef51071b03516d5eca5b23d64f2 /server/sonar-web/src/main/js/helpers
parent0a547ba79c4affb9b6ff0b669ee4a5e87ef16479 (diff)
downloadsonarqube-ce9f0892fc3d15638c4eaa4054ed06f3d7e5fc19.tar.gz
sonarqube-ce9f0892fc3d15638c4eaa4054ed06f3d7e5fc19.zip
refactor source viewer (#1705)
Diffstat (limited to 'server/sonar-web/src/main/js/helpers')
-rw-r--r--server/sonar-web/src/main/js/helpers/issues.js121
-rw-r--r--server/sonar-web/src/main/js/helpers/request.js25
2 files changed, 133 insertions, 13 deletions
diff --git a/server/sonar-web/src/main/js/helpers/issues.js b/server/sonar-web/src/main/js/helpers/issues.js
new file mode 100644
index 00000000000..3a1e509f790
--- /dev/null
+++ b/server/sonar-web/src/main/js/helpers/issues.js
@@ -0,0 +1,121 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2017 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+// @flow
+import sortBy from 'lodash/sortBy';
+import { SEVERITIES } from './constants';
+
+type TextRange = {
+ startLine: number,
+ endLine: number,
+ startOffset: number,
+ endOffset: number
+};
+
+type Comment = {
+ login: string
+};
+
+type User = {
+ login: string
+};
+
+type RawIssue = {
+ assignee?: string,
+ author: string,
+ comments?: Array<Comment>,
+ component: string,
+ line?: number,
+ project: string,
+ rule: string,
+ status: string,
+ subProject?: string,
+ textRange?: TextRange
+};
+
+export const sortBySeverity = (issues: Array<*>) => (
+ sortBy(issues, issue => SEVERITIES.indexOf(issue.severity))
+);
+
+const injectRelational = (
+ issue: RawIssue | Comment,
+ source?: Array<*>,
+ baseField: string,
+ lookupField: string
+) => {
+ const newFields = {};
+ const baseValue = issue[baseField];
+ if (baseValue != null && source != null) {
+ const lookupValue = source.find(candidate => candidate[lookupField] === baseValue);
+ if (lookupValue != null) {
+ Object.keys(lookupValue).forEach(key => {
+ const newKey = baseField + key.charAt(0).toUpperCase() + key.slice(1);
+ newFields[newKey] = lookupValue[key];
+ });
+ }
+ }
+ return newFields;
+};
+
+const injectCommentsRelational = (issue: RawIssue, users?: Array<User>) => {
+ if (!issue.comments) {
+ return {};
+ }
+ const comments = issue.comments.map(comment => ({
+ ...comment,
+ author: comment.login,
+ login: undefined,
+ ...injectRelational(comment, users, 'author', 'login')
+ }));
+ return { comments };
+};
+
+const prepareClosed = (issue: RawIssue) => {
+ return issue.status === 'CLOSED' ? { flows: undefined } : {};
+};
+
+const ensureTextRange = (issue: RawIssue) => {
+ return issue.line && !issue.textRange ? {
+ textRange: {
+ startLine: issue.line,
+ endLine: issue.line,
+ startOffset: 0,
+ endOffset: 999999
+ }
+ } : {};
+};
+
+export const parseIssueFromResponse = (
+ issue: RawIssue,
+ components?: Array<*>,
+ users?: Array<*>,
+ rules?: Array<*>
+) => {
+ return {
+ ...issue,
+ ...injectRelational(issue, components, 'component', 'key'),
+ ...injectRelational(issue, components, 'project', 'key'),
+ ...injectRelational(issue, components, 'subProject', 'key'),
+ ...injectRelational(issue, rules, 'rule', 'key'),
+ ...injectRelational(issue, users, 'assignee', 'login'),
+ ...injectCommentsRelational(issue, users),
+ ...prepareClosed(issue),
+ ...ensureTextRange(issue)
+ };
+};
diff --git a/server/sonar-web/src/main/js/helpers/request.js b/server/sonar-web/src/main/js/helpers/request.js
index 80bb9e787cc..cbd5a4e7c01 100644
--- a/server/sonar-web/src/main/js/helpers/request.js
+++ b/server/sonar-web/src/main/js/helpers/request.js
@@ -146,19 +146,18 @@ export function request (url: string): Request {
* @returns {*}
*/
export function checkStatus (response: Response): Promise<Object> {
- if (response.status === 401) {
- // workaround cyclic dependencies
- const handleRequiredAuthentication = require('../app/utils/handleRequiredAuthentication').default;
- handleRequiredAuthentication();
- return Promise.reject();
- } else if (response.status >= 200 && response.status < 300) {
- return Promise.resolve(response);
- } else {
- const error = new Error(response.status);
- // $FlowFixMe complains that `response` is not found
- error.response = response;
- throw error;
- }
+ return new Promise((resolve, reject) => {
+ if (response.status === 401) {
+ // workaround cyclic dependencies
+ const handleRequiredAuthentication = require('../app/utils/handleRequiredAuthentication').default;
+ handleRequiredAuthentication();
+ reject();
+ } else if (response.status >= 200 && response.status < 300) {
+ resolve(response);
+ } else {
+ reject({ response });
+ }
+ });
}
/**