import Joi from 'joi' import { optionalUrl } from '../validators.js' import { formatDate } from '../text-formatters.js' import { age as ageColor } from '../color-formatters.js' import { documentation, errorMessagesFor } from './gitlab-helper.js' import GitLabBase from './gitlab-base.js' const schema = Joi.array() .items( Joi.object({ committed_date: Joi.string().required(), }).required() ) .required() .min(1) const queryParamSchema = Joi.object({ ref: Joi.string(), gitlab_url: optionalUrl, }).required() const refText = `
ref can be filled with the name of a branch, tag or revision range of the repository.
` const defaultDocumentation = documentation + refText export default class GitlabLastCommit extends GitLabBase { static category = 'activity' static route = { base: 'gitlab/last-commit', pattern: ':project+', queryParamSchema, } static examples = [ { title: 'GitLab last commit', namedParams: { project: 'gitlab-org/gitlab', }, queryParams: { gitlab_url: 'https://gitlab.com' }, staticPreview: this.render({ commitDate: '2013-07-31T20:01:41Z' }), documentation: defaultDocumentation, }, ] static defaultBadgeData = { label: 'last commit' } static render({ commitDate }) { return { message: formatDate(commitDate), color: ageColor(Date.parse(commitDate)), } } async fetch({ project, baseUrl, ref }) { // https://docs.gitlab.com/ee/api/commits.html#list-repository-commits return super.fetch({ url: `${baseUrl}/api/v4/projects/${encodeURIComponent( project )}/repository/commits`, options: { searchParams: { ref_name: ref } }, schema, errorMessages: errorMessagesFor('project not found'), }) } async handle( { project }, { gitlab_url: baseUrl = 'https://gitlab.com', ref } ) { const data = await this.fetch({ project, baseUrl, ref }) return this.constructor.render({ commitDate: data[0].committed_date }) } }