]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-10040 Update usage of api/metrics/search
authorGrégoire Aubert <gregoire.aubert@sonarsource.com>
Mon, 6 Nov 2017 16:19:12 +0000 (17:19 +0100)
committerGuillaume Jambet <guillaume.jambet@gmail.com>
Wed, 8 Nov 2017 12:51:31 +0000 (13:51 +0100)
server/sonar-web/src/main/js/api/metrics.ts
server/sonar-web/src/main/js/apps/overview/events/AnalysesList.js
server/sonar-web/src/main/js/apps/portfolio/components/Activity.tsx
server/sonar-web/src/main/js/apps/portfolio/components/__tests__/Activity-test.tsx
server/sonar-web/src/main/js/apps/projectActivity/components/ProjectActivityAppContainer.js
server/sonar-web/src/main/js/components/SourceViewer/views/measures-overlay.js
server/sonar-web/src/main/js/store/rootActions.js

index 0cdc333aef0dfdc99076adae0b9cda0dccbd71da..1e9fdfdc1f97b8de128207a226c49f2cd81e7e8e 100644 (file)
@@ -21,8 +21,31 @@ import { getJSON } from '../helpers/request';
 import { Metric } from '../app/types';
 import throwGlobalError from '../app/utils/throwGlobalError';
 
-export function getMetrics(): Promise<Metric[]> {
-  return getJSON('/api/metrics/search', { ps: 9999 }).then(r => r.metrics);
+interface MetricsResponse {
+  metrics: Metric[];
+  p: number;
+  ps: number;
+  total: number;
+}
+
+export function getMetrics(data: { p?: number; ps?: number }): Promise<MetricsResponse> {
+  return getJSON('/api/metrics/search', data).catch(throwGlobalError);
+}
+
+export function getAllMetrics(data?: { p?: number; ps?: number }): Promise<Metric[]> {
+  return inner(data);
+  function inner(
+    data: { p?: number; ps?: number } = { ps: 500 },
+    prev?: MetricsResponse
+  ): Promise<Metric[]> {
+    return getMetrics(data).then(r => {
+      const result = prev ? prev.metrics.concat(r.metrics) : r.metrics;
+      if (r.p * r.ps >= r.total) {
+        return result;
+      }
+      return inner({ ...data, p: r.p + 1 }, { ...r, metrics: result });
+    });
+  }
 }
 
 export function getMetricDomains(): Promise<string[]> {
index e70fa1cb1fbd3fad7b759dd7c7b867cf5559b79b..81fd6181acb9a23976673a67cdbb580127292674 100644 (file)
@@ -21,7 +21,7 @@
 import React from 'react';
 import { Link } from 'react-router';
 import Analysis from './Analysis';
-import { getMetrics } from '../../../api/metrics';
+import { getAllMetrics } from '../../../api/metrics';
 import { getProjectActivity } from '../../../api/projectActivity';
 import PreviewGraph from '../../../components/preview-graph/PreviewGraph';
 import { translate } from '../../../helpers/l10n';
@@ -88,12 +88,23 @@ export default class AnalysesList extends React.PureComponent {
         project: this.getTopLevelComponent(),
         ps: PAGE_SIZE
       }),
-      getMetrics()
-    ]).then(response => {
-      if (this.mounted) {
-        this.setState({ analyses: response[0].analyses, metrics: response[1], loading: false });
+      getAllMetrics()
+    ]).then(
+      response => {
+        if (this.mounted) {
+          this.setState({
+            analyses: response[0].analyses,
+            metrics: response[1],
+            loading: false
+          });
+        }
+      },
+      () => {
+        if (this.mounted) {
+          this.setState({ loading: false });
+        }
       }
-    });
+    );
   }
 
   renderList(analyses /*: Array<AnalysisType> */) {
index 7816da08c76717d4fd3cb6247e1712c3ef2a34df..dc9f9db6669e6f443edc60b80b104dfc41e97b51 100644 (file)
@@ -20,7 +20,7 @@
 import * as React from 'react';
 import { getDisplayedHistoryMetrics, DEFAULT_GRAPH } from '../../projectActivity/utils';
 import PreviewGraph from '../../../components/preview-graph/PreviewGraph';
-import { getMetrics } from '../../../api/metrics';
+import { getAllMetrics } from '../../../api/metrics';
 import { getAllTimeMachineData } from '../../../api/time-machine';
 import { Metric } from '../../../app/types';
 import { parseDate } from '../../../helpers/dates';
@@ -71,7 +71,7 @@ export default class Activity extends React.PureComponent<Props> {
     }
 
     this.setState({ loading: true });
-    return Promise.all([getAllTimeMachineData(component, graphMetrics), getMetrics()]).then(
+    return Promise.all([getAllTimeMachineData(component, graphMetrics), getAllMetrics()]).then(
       ([timeMachine, metrics]) => {
         if (this.mounted) {
           const history: History = {};
index e0fc5b8ff9d45efd7b9c5ed3b16f69b7987755fc..c343e8c0193bf645e137984c0c30ef235f3cd226 100644 (file)
@@ -24,7 +24,7 @@ jest.mock('../../../../helpers/storage', () => ({
 }));
 
 jest.mock('../../../../api/metrics', () => ({
-  getMetrics: jest.fn(() => Promise.resolve([]))
+  getAllMetrics: jest.fn(() => Promise.resolve([]))
 }));
 
 jest.mock('../../../../api/time-machine', () => ({
@@ -47,12 +47,12 @@ import * as React from 'react';
 import { mount, shallow } from 'enzyme';
 import Activity from '../Activity';
 
-const getMetrics = require('../../../../api/metrics').getMetrics as jest.Mock<any>;
+const getAllMetrics = require('../../../../api/metrics').getAllMetrics as jest.Mock<any>;
 const getAllTimeMachineData = require('../../../../api/time-machine')
   .getAllTimeMachineData as jest.Mock<any>;
 
 beforeEach(() => {
-  getMetrics.mockClear();
+  getAllMetrics.mockClear();
   getAllTimeMachineData.mockClear();
 });
 
@@ -73,6 +73,6 @@ it('renders', () => {
 
 it('fetches history', () => {
   mount(<Activity component="foo" />);
-  expect(getMetrics).toBeCalled();
+  expect(getAllMetrics).toBeCalled();
   expect(getAllTimeMachineData).toBeCalledWith('foo', ['coverage']);
 });
index d201c600c01fe80c99a53a72a8002b87628a258f..080842999d868acfa4cf48943be795b3f13212c0 100644 (file)
@@ -23,7 +23,7 @@ import PropTypes from 'prop-types';
 import ProjectActivityApp from './ProjectActivityApp';
 import throwGlobalError from '../../../app/utils/throwGlobalError';
 import { getAllTimeMachineData } from '../../../api/time-machine';
-import { getMetrics } from '../../../api/metrics';
+import { getAllMetrics } from '../../../api/metrics';
 import * as api from '../../../api/projectActivity';
 import * as actions from '../actions';
 import { getBranchName } from '../../../helpers/branches';
@@ -206,8 +206,6 @@ export default class ProjectActivityAppContainer extends React.PureComponent {
     );
   };
 
-  fetchMetrics = () => getMetrics().catch(throwGlobalError);
-
   loadAllActivities = (
     project /*: string */,
     prevResult /*: ?{ analyses: Array<Analysis>, paging: Paging } */
@@ -246,7 +244,7 @@ export default class ProjectActivityAppContainer extends React.PureComponent {
     const topLevelComponent = this.getTopLevelComponent(component);
     Promise.all([
       this.fetchActivity(topLevelComponent, 1, 100, serializeQuery(query)),
-      this.fetchMetrics(),
+      getAllMetrics(),
       this.fetchMeasuresHistory(graphMetrics)
     ]).then(
       response => {
index ad4ca78efaa2479779274b1250c0e71983e6d63f..0faa854f57c0cfbe5cec010c86ae588d882fd6a2 100644 (file)
@@ -25,7 +25,7 @@ import ModalView from '../../common/modals';
 import Template from './templates/source-viewer-measures.hbs';
 import { searchIssues } from '../../../api/issues';
 import { getMeasures } from '../../../api/measures';
-import { getMetrics } from '../../../api/metrics';
+import { getAllMetrics } from '../../../api/metrics';
 import { getTests, getCoveredFiles } from '../../../api/tests';
 import * as theme from '../../../app/theme';
 import { getLocalizedMetricName, getLocalizedMetricDomain } from '../../../helpers/l10n';
@@ -108,20 +108,6 @@ export default ModalView.extend({
     this.$('.js-test-list').scrollTop(this.testsScroll);
   },
 
-  getMetrics() {
-    let metrics = '';
-    const url = window.baseUrl + '/api/metrics/search';
-    $.ajax({
-      url,
-      async: false,
-      data: { ps: 9999 }
-    }).done(data => {
-      metrics = data.metrics.filter(metric => metric.type !== 'DATA' && !metric.hidden);
-      metrics = sortBy(metrics, 'name');
-    });
-    return metrics;
-  },
-
   calcAdditionalMeasures(measures) {
     measures.issuesRemediationEffort =
       (Number(measures.sqale_index_raw) || 0) +
@@ -153,7 +139,7 @@ export default ModalView.extend({
   },
 
   requestMeasures() {
-    return getMetrics().then(metrics => {
+    return getAllMetrics().then(metrics => {
       const metricsToRequest = metrics
         .filter(metric => metric.type !== 'DATA' && !metric.hidden)
         .map(metric => metric.key);
index 84ecaba4dd1313a6c317c2e0e4734e907720b784..3f41686b56762c62cc5184ab30e408ff6cd8220f 100644 (file)
@@ -21,7 +21,7 @@ import { getLanguages } from '../api/languages';
 import { getGlobalNavigation } from '../api/nav';
 import * as auth from '../api/auth';
 import { getOrganizations } from '../api/organizations';
-import { getMetrics } from '../api/metrics';
+import { getAllMetrics } from '../api/metrics';
 import { receiveLanguages } from './languages/actions';
 import { receiveMetrics } from './metrics/actions';
 import { addGlobalErrorMessage } from './globalMessages/duck';
@@ -42,7 +42,7 @@ export const fetchLanguages = () => dispatch =>
   getLanguages().then(languages => dispatch(receiveLanguages(languages)), onFail(dispatch));
 
 export const fetchMetrics = () => dispatch =>
-  getMetrics().then(metrics => dispatch(receiveMetrics(metrics)), onFail(dispatch));
+  getAllMetrics().then(metrics => dispatch(receiveMetrics(metrics)), onFail(dispatch));
 
 export const fetchOrganizations = (organizations /*: Array<string> | void */) => dispatch =>
   getOrganizations(organizations).then(