diff options
Diffstat (limited to 'server/sonar-web/src/main/js/overview/models')
-rw-r--r-- | server/sonar-web/src/main/js/overview/models/state.js | 357 |
1 files changed, 357 insertions, 0 deletions
diff --git a/server/sonar-web/src/main/js/overview/models/state.js b/server/sonar-web/src/main/js/overview/models/state.js new file mode 100644 index 00000000000..750670a32db --- /dev/null +++ b/server/sonar-web/src/main/js/overview/models/state.js @@ -0,0 +1,357 @@ +define(function () { + + var $ = jQuery; + + return Backbone.Model.extend({ + defaults: function () { + return { + qualityGateStatus: 'ERROR' + }; + }, + + fetch: function () { + return $.when( + this.fetchGate(), + + this.fetchSize(), + this.fetchSizeTrend(), + + this.fetchIssues(), + this.fetchIssues1(), + this.fetchIssues2(), + this.fetchIssues3(), + this.fetchIssuesTrend(), + + this.fetchDebt(), + this.fetchDebtTrend(), + + this.fetchCoverage(), + this.fetchCoverageTrend(), + + this.fetchDuplications(), + this.fetchDuplicationsTrend() + ); + }, + + fetchGate: function () { + var that = this, + url = baseUrl + '/api/resources/index', + options = { + resource: this.get('componentKey'), + metrics: 'quality_gate_details' + }; + return $.get(url, options).done(function (r) { + var gateData = JSON.parse(r[0].msr[0].data), + gateConditions = gateData.conditions, + urlMetrics = baseUrl + '/api/metrics'; + $.get(urlMetrics).done(function (r) { + var gateConditionsWithMetric = gateConditions.map(function (c) { + var metric = _.findWhere(r, { key: c.metric }), + type = metric != null ? metric.val_type : null, + periodDate = that.get('period' + c.period + 'Date'), + periodName = that.get('period' + c.period + 'Name'); + return _.extend(c, { + type: type, + periodName: periodName, + periodDate: periodDate + }); + }); + that.set({ + gateStatus: gateData.level, + gateConditions: gateConditionsWithMetric + }); + }); + }); + }, + + fetchSize: function () { + var that = this, + url = baseUrl + '/api/resources/index', + options = { + resource: this.get('componentKey'), + metrics: 'ncloc,ncloc_language_distribution,function_complexity,file_complexity', + includetrends: true + }; + return $.get(url, options).done(function (r) { + var msr = r[0].msr, + nclocMeasure = _.findWhere(msr, { key: 'ncloc' }), + nclocLangMeasure = _.findWhere(msr, { key: 'ncloc_language_distribution' }), + nclocLangParsed = nclocLangMeasure.data.split(';').map(function (token) { + var tokens = token.split('='); + return { key: tokens[0], value: +tokens[1] }; + }), + nclocLangSorted = _.sortBy(nclocLangParsed, function (item) { + return -item.value; + }), + nclocLang = _.first(nclocLangSorted, 2), + functionComplexityMeasure = _.findWhere(msr, { key: 'function_complexity' }), + fileComplexityMeasure = _.findWhere(msr, { key: 'file_complexity' }); + that.set({ + ncloc: nclocMeasure.val, + ncloc1: nclocMeasure.var1, + ncloc2: nclocMeasure.var2, + ncloc3: nclocMeasure.var3, + nclocLang: nclocLang, + + functionComplexity: functionComplexityMeasure.val, + functionComplexity1: functionComplexityMeasure.var1, + functionComplexity2: functionComplexityMeasure.var2, + functionComplexity3: functionComplexityMeasure.var3, + + fileComplexity: fileComplexityMeasure.val, + fileComplexity1: fileComplexityMeasure.var1, + fileComplexity2: fileComplexityMeasure.var2, + fileComplexity3: fileComplexityMeasure.var3 + }); + }); + }, + + fetchSizeTrend: function () { + var that = this, + url = baseUrl + '/api/timemachine/index', + options = { + resource: this.get('componentKey'), + metrics: 'ncloc' + }; + return $.get(url, options).done(function (r) { + var trend = r[0].cells.map(function (cell) { + return { val: cell.d, count: cell.v[0] }; + }); + that.set({ sizeTrend: trend }); + }); + }, + + fetchIssues: function () { + var that = this, + url = baseUrl + '/api/issues/search', + options = { + ps: 1, + resolved: 'false', + componentUuids: this.get('componentUuid'), + facets: 'severities,statuses,tags' + }; + return $.get(url, options).done(function (r) { + var severityFacet = _.findWhere(r.facets, { property: 'severities' }), + statusFacet = _.findWhere(r.facets, { property: 'statuses' }), + tagFacet = _.findWhere(r.facets, { property: 'tags' }), + tags = _.first(tagFacet.values, 10), + minTagCount = _.min(tags, function (t) { + return t.count; + }).count, + maxTagCount = _.max(tags, function (t) { + return t.count; + }).count, + tagScale = d3.scale.linear().domain([minTagCount, maxTagCount]).range([10, 24]), + sizedTags = tags.map(function (tag) { + return _.extend(tag, { size: tagScale(tag.count) }); + }); + that.set({ + issues: r.total, + blockerIssues: _.findWhere(severityFacet.values, { val: 'BLOCKER' }).count, + criticalIssues: _.findWhere(severityFacet.values, { val: 'CRITICAL' }).count, + majorIssues: _.findWhere(severityFacet.values, { val: 'MAJOR' }).count, + openIssues: _.findWhere(statusFacet.values, { val: 'OPEN' }).count + + _.findWhere(statusFacet.values, { val: 'REOPENED' }).count, + issuesTags: sizedTags + }); + }); + }, + + fetchIssues1: function () { + var that = this, + url = baseUrl + '/api/issues/search', + options = { + ps: 1, + resolved: 'false', + createdAfter: this.get('period1Date'), + componentUuids: this.get('componentUuid'), + facets: 'severities,statuses' + }; + return $.get(url, options).done(function (r) { + var severityFacet = _.findWhere(r.facets, { property: 'severities' }), + statusFacet = _.findWhere(r.facets, { property: 'statuses' }); + that.set({ + issues1: r.total, + blockerIssues1: _.findWhere(severityFacet.values, { val: 'BLOCKER' }).count, + criticalIssues1: _.findWhere(severityFacet.values, { val: 'CRITICAL' }).count, + majorIssues1: _.findWhere(severityFacet.values, { val: 'MAJOR' }).count, + openIssues1: _.findWhere(statusFacet.values, { val: 'OPEN' }).count + + _.findWhere(statusFacet.values, { val: 'REOPENED' }).count + }); + }); + }, + + fetchIssues2: function () { + var that = this, + url = baseUrl + '/api/issues/search', + options = { + ps: 1, + resolved: 'false', + createdAfter: this.get('period2Date'), + componentUuids: this.get('componentUuid'), + facets: 'severities,statuses' + }; + return $.get(url, options).done(function (r) { + var severityFacet = _.findWhere(r.facets, { property: 'severities' }), + statusFacet = _.findWhere(r.facets, { property: 'statuses' }); + that.set({ + issues2: r.total, + blockerIssues2: _.findWhere(severityFacet.values, { val: 'BLOCKER' }).count, + criticalIssues2: _.findWhere(severityFacet.values, { val: 'CRITICAL' }).count, + majorIssues2: _.findWhere(severityFacet.values, { val: 'MAJOR' }).count, + openIssues2: _.findWhere(statusFacet.values, { val: 'OPEN' }).count + + _.findWhere(statusFacet.values, { val: 'REOPENED' }).count + }); + }); + }, + + fetchIssues3: function () { + var that = this, + url = baseUrl + '/api/issues/search', + options = { + ps: 1, + resolved: 'false', + createdAfter: this.get('period3Date'), + componentUuids: this.get('componentUuid'), + facets: 'severities,statuses' + }; + return $.get(url, options).done(function (r) { + var severityFacet = _.findWhere(r.facets, { property: 'severities' }), + statusFacet = _.findWhere(r.facets, { property: 'statuses' }); + that.set({ + issues3: r.total, + blockerIssues3: _.findWhere(severityFacet.values, { val: 'BLOCKER' }).count, + criticalIssues3: _.findWhere(severityFacet.values, { val: 'CRITICAL' }).count, + majorIssues3: _.findWhere(severityFacet.values, { val: 'MAJOR' }).count, + openIssues3: _.findWhere(statusFacet.values, { val: 'OPEN' }).count + + _.findWhere(statusFacet.values, { val: 'REOPENED' }).count + }); + }); + }, + + fetchIssuesTrend: function () { + var that = this, + url = baseUrl + '/api/timemachine/index', + options = { + resource: this.get('componentKey'), + metrics: 'violations' + }; + return $.get(url, options).done(function (r) { + var trend = r[0].cells.map(function (cell) { + return { val: cell.d, count: cell.v[0] }; + }); + that.set({ issuesTrend: trend }); + }); + }, + + fetchDebt: function () { + var that = this, + url = baseUrl + '/api/resources/index', + options = { + resource: this.get('componentKey'), + metrics: 'sqale_index', + includetrends: true + }; + return $.get(url, options).done(function (r) { + var msr = r[0].msr, + debtMeasure = _.findWhere(msr, { key: 'sqale_index' }); + that.set({ + debt: debtMeasure.val, + debt1: debtMeasure.var1, + debt2: debtMeasure.var2, + debt3: debtMeasure.var3 + }); + }); + }, + + fetchDebtTrend: function () { + var that = this, + url = baseUrl + '/api/timemachine/index', + options = { + resource: this.get('componentKey'), + metrics: 'sqale_index' + }; + return $.get(url, options).done(function (r) { + var trend = r[0].cells.map(function (cell) { + return { val: cell.d, count: cell.v[0] }; + }); + that.set({ debtTrend: trend }); + }); + }, + + fetchCoverage: function () { + var that = this, + url = baseUrl + '/api/resources/index', + options = { + resource: this.get('componentKey'), + metrics: 'overall_coverage,new_overall_coverage', + includetrends: true + }; + return $.get(url, options).done(function (r) { + var msr = r[0].msr, + coverageMeasure = _.findWhere(msr, { key: 'overall_coverage' }), + newCoverageMeasure = _.findWhere(msr, { key: 'new_overall_coverage' }); + that.set({ + coverage: coverageMeasure.val, + coverage1: coverageMeasure.var1, + coverage2: coverageMeasure.var2, + coverage3: coverageMeasure.var3, + newCoverage1: newCoverageMeasure.var1, + newCoverage2: newCoverageMeasure.var2, + newCoverage3: newCoverageMeasure.var3 + }); + }); + }, + + fetchCoverageTrend: function () { + var that = this, + url = baseUrl + '/api/timemachine/index', + options = { + resource: this.get('componentKey'), + metrics: 'coverage' + }; + return $.get(url, options).done(function (r) { + var trend = r[0].cells.map(function (cell) { + return { val: cell.d, count: cell.v[0] }; + }); + that.set({ coverageTrend: trend }); + }); + }, + + fetchDuplications: function () { + var that = this, + url = baseUrl + '/api/resources/index', + options = { + resource: this.get('componentKey'), + metrics: 'duplicated_lines_density', + includetrends: true + }; + return $.get(url, options).done(function (r) { + var msr = r[0].msr, + duplicationsMeasure = _.findWhere(msr, { key: 'duplicated_lines_density' }); + that.set({ + duplications: duplicationsMeasure.val, + duplications1: duplicationsMeasure.var1, + duplications2: duplicationsMeasure.var2, + duplications3: duplicationsMeasure.var3 + }); + }); + }, + + fetchDuplicationsTrend: function () { + var that = this, + url = baseUrl + '/api/timemachine/index', + options = { + resource: this.get('componentKey'), + metrics: 'duplicated_lines_density' + }; + return $.get(url, options).done(function (r) { + var trend = r[0].cells.map(function (cell) { + return { val: cell.d, count: cell.v[0] }; + }); + that.set({ duplicationsTrend: trend }); + }); + } + }); + +}); |