import * as _ from 'lodash'; import Axios, { AxiosResponse } from 'axios'; import * as config from 'config'; import { Build } from '../models/circleci/build'; class CircleCIService { static INSTANCE: CircleCIService = new CircleCIService( config.get('circle.api.token'), config.get('circle.api.url') ); apiToken: string; apiUrl: string; constructor(apiToken: string, apiUrl: string) { this.apiToken = apiToken; this.apiUrl = apiUrl; } completedBuilds(): Promise> { return Axios.get(this.apiUrl, { params: { 'circle-token': this.apiToken, filter: 'completed', limit: 100 } }) .then((response: AxiosResponse): Array => { return _(response.data) .map((buildJSON: Build.JSON) => Build.parse(buildJSON)) .value(); }); } originalFailingBuild(build: Build): Promise { const previousSuccessfulBuild: Promise = Axios.get(this.apiUrl, { params: { 'circle-token': this.apiToken, filter: 'successful', limit: 100 } }) .then((response: AxiosResponse) => { const successfulBuilds: Array = _(response.data) .map((buildJSON: Build.JSON) => Build.parse(buildJSON)) .value(); return _(successfulBuilds).find((successfulBuild: Build) => { return successfulBuild.id < build.id; }); }); return previousSuccessfulBuild .then((previousSuccessfulBuild: Build) => { return Axios.get(this.apiUrl, { params: { 'circle-token': this.apiToken, filter: 'failed', limit: 100 } }) .then((response: AxiosResponse) => { const failingBuilds: Array = _(response.data) .map((buildJSON: Build.JSON) => Build.parse(buildJSON)) .value(); return _(failingBuilds).findLast((failingBuild: Build) => { return failingBuild.id > previousSuccessfulBuild.id; }); }); }); } } export { CircleCIService };