'use strict' const Joi = require('@hapi/joi') const { BaseSvgScrapingService } = require('..') const { codacyGrade } = require('./codacy-helpers') const schema = Joi.object({ message: codacyGrade }).required() module.exports = class CodacyGrade extends BaseSvgScrapingService { static get category() { return 'analysis' } static get route() { return { base: 'codacy/grade', pattern: ':projectId/:branch*', } } static get examples() { return [ { title: 'Codacy grade', pattern: ':projectId', namedParams: { projectId: 'e27821fb6289410b8f58338c7e0bc686' }, staticPreview: this.render({ grade: 'A' }), }, { title: 'Codacy branch grade', pattern: ':projectId/:branch', namedParams: { projectId: 'e27821fb6289410b8f58338c7e0bc686', branch: 'master', }, staticPreview: this.render({ grade: 'A' }), }, ] } static get defaultBadgeData() { return { label: 'code quality', } } static render({ grade }) { const color = { A: 'brightgreen', B: 'green', C: 'yellowgreen', D: 'yellow', E: 'orange', F: 'red', }[grade] return { message: grade, color, } } async handle({ projectId, branch }) { const { message: grade } = await this._requestSvg({ schema, url: `https://api.codacy.com/project/badge/grade/${encodeURIComponent( projectId )}`, options: { qs: { branch } }, errorMessages: { 404: 'project or branch not found' }, valueMatcher: /visibility="hidden">([^<>]+)<\/text>/, }) return this.constructor.render({ grade }) } }