@dxdeveloperexperience/hygie
Version:
Hygie is an easy-to-use Open-Source REST API allowing you to interact with GIT events. This NestJS API expose a set of customizable rules to automate your project's life cycle.
123 lines (115 loc) • 4.06 kB
text/typescript
import {
Controller,
Body,
Post,
UseInterceptors,
Res,
HttpStatus,
UseFilters,
HttpService,
} from '@nestjs/common';
import { Webhook } from '../webhook/webhook';
import { WebhookInterceptor } from '../interceptors/webhook.interceptor';
import { logger } from '../logger/logger.service';
import { RulesService } from '../rules/rules.service';
import { GitTypeEnum, GitEventEnum } from '../webhook/utils.enum';
import { AllExceptionsFilter } from '../exceptions/allExceptionFilter';
import { PreconditionException } from '../exceptions/precondition.exception';
import { GitlabService } from '../gitlab/gitlab.service';
import { GithubService } from '../github/github.service';
import { RemoteConfigUtils } from '../remote-config/utils';
import { DataAccessService } from '../data_access/dataAccess.service';
import { Constants } from '../utils/constants';
import { WhiteListInterceptor } from '../interceptors/whiteList.interceptor';
import { ScheduleService } from '../scheduler/scheduler.service';
import { EnvVarService } from '../env-var/env-var.service';
import { EnvVarAccessor } from '../env-var/env-var.accessor';
('webhook')
export class WebhookController {
constructor(
private readonly httpService: HttpService,
private readonly rulesService: RulesService,
private readonly githubService: GithubService,
private readonly gitlabService: GitlabService,
private readonly dataAccessService: DataAccessService,
private readonly scheduleService: ScheduleService,
private readonly envVarService: EnvVarService,
) {}
('/')
(WebhookInterceptor)
(WhiteListInterceptor)
(AllExceptionsFilter)
async processWebhook(
() webhook: Webhook,
() response,
): Promise<void> {
if (
webhook.getGitType() === GitTypeEnum.Undefined ||
webhook.getGitEvent() === GitEventEnum.Undefined
) {
throw new PreconditionException();
} else {
logger.info(
`=== ${webhook.getGitType()} - ${webhook.getGitEvent()} ===`,
{ project: webhook.getCloneURL(), location: 'processWebhook' },
);
const defaultBranch: string = webhook.getDefaultBranchName();
let rulesBranch: string = defaultBranch;
if (GitEventEnum.Push === webhook.getGitEvent()) {
rulesBranch = webhook.getBranchName();
} else if (
[
GitEventEnum.ClosedPR,
GitEventEnum.MergedPR,
GitEventEnum.NewPR,
GitEventEnum.ReopenedPR,
].find(e => e === webhook.getGitEvent())
) {
rulesBranch = webhook.pullRequest.sourceBranch;
}
let remoteRepository: string;
let remoteEnvs: string;
try {
remoteRepository = await RemoteConfigUtils.downloadRulesFile(
this.dataAccessService,
this.httpService,
this.githubService,
this.gitlabService,
webhook.getCloneURL(),
Constants.rulesExtension,
rulesBranch,
defaultBranch,
);
} catch (e) {
logger.error(e, {
project: webhook.getCloneURL(),
location: 'processWebhook',
});
throw new PreconditionException();
}
try {
remoteEnvs = webhook.getRemoteDirectory();
await webhook.gitService.setEnvironmentVariables(
this.dataAccessService,
remoteEnvs,
);
} catch (e) {
logger.error(
'There is no config.env file for the current git project',
{ project: webhook.getCloneURL(), location: 'processWebhook' },
);
throw new PreconditionException();
}
// Set Envs Var
await this.envVarService.setEnvs(remoteEnvs);
// Process incoming cron files
this.scheduleService.processCronFiles(webhook);
const result = await this.rulesService.testRules(
webhook,
remoteRepository,
Constants.rulesExtension,
);
return response.status(HttpStatus.OK).send(result);
}
}
}