From 4041a6fd2a9d859b552d999ebdab8585e9dc5227 Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Sun, 9 May 2021 16:54:59 +0800 Subject: [PATCH] feat(pipelines): add commits query api. --- src/pipelines/commit-logs.resolver.ts | 17 +++++++++++++++-- src/pipelines/pipelines.module.ts | 2 ++ src/pipelines/pipelines.service.ts | 7 +++++++ src/repos/dtos/log-list.model.ts | 11 +++++++++++ src/repos/repos.module.ts | 3 +-- src/repos/repos.service.ts | 22 +++++++++++++++++++--- 6 files changed, 55 insertions(+), 7 deletions(-) diff --git a/src/pipelines/commit-logs.resolver.ts b/src/pipelines/commit-logs.resolver.ts index 0a55f76..41c715a 100644 --- a/src/pipelines/commit-logs.resolver.ts +++ b/src/pipelines/commit-logs.resolver.ts @@ -1,3 +1,4 @@ +import { Query } from '@nestjs/graphql'; import { Args, Parent, @@ -6,14 +7,16 @@ import { Subscription, } from '@nestjs/graphql'; import { PipelineTasksService } from '../pipeline-tasks/pipeline-tasks.service'; -import { LogFields, LogList } from '../repos/dtos/log-list.model'; +import { Commit, LogFields, LogList } from '../repos/dtos/log-list.model'; +import { ReposService } from '../repos/repos.service'; import { PipelinesService } from './pipelines.service'; -@Resolver(() => LogFields) +@Resolver(() => Commit) export class CommitLogsResolver { constructor( private readonly service: PipelinesService, private readonly taskServices: PipelineTasksService, + private readonly reposService: ReposService, ) {} @Subscription(() => LogList, { resolve: (value) => { @@ -30,4 +33,14 @@ export class CommitLogsResolver { async tasks(@Parent() commit: LogFields) { return await this.taskServices.listTasksByCommitHash(commit.hash); } + + @Query(() => [Commit]) + async commits(@Args('pipelineId', { type: () => String }) id: string) { + const pipeline = await this.service.findOneWithProject(id); + const data = await this.reposService.listCommits( + pipeline.project, + pipeline.branch, + ); + return data; + } } diff --git a/src/pipelines/pipelines.module.ts b/src/pipelines/pipelines.module.ts index 77c76f7..02fd479 100644 --- a/src/pipelines/pipelines.module.ts +++ b/src/pipelines/pipelines.module.ts @@ -7,6 +7,7 @@ import { BullModule } from '@nestjs/bull'; import { LIST_LOGS_TASK } from '../repos/repos.constants'; import { CommitLogsResolver } from './commit-logs.resolver'; import { PipelineTasksModule } from '../pipeline-tasks/pipeline-tasks.module'; +import { ReposModule } from '../repos/repos.module'; @Module({ imports: [ @@ -15,6 +16,7 @@ import { PipelineTasksModule } from '../pipeline-tasks/pipeline-tasks.module'; name: LIST_LOGS_TASK, }), PipelineTasksModule, + ReposModule, ], providers: [PipelinesResolver, PipelinesService, CommitLogsResolver], }) diff --git a/src/pipelines/pipelines.service.ts b/src/pipelines/pipelines.service.ts index 4eabeae..8d00786 100644 --- a/src/pipelines/pipelines.service.ts +++ b/src/pipelines/pipelines.service.ts @@ -26,6 +26,13 @@ export class PipelinesService extends BaseDbService { return this.repository.find(dto); } + async findOneWithProject(id: string) { + return await this.repository.findOne({ + where: { id }, + relations: ['project'], + }); + } + async create(dto: CreatePipelineInput) { await this.isDuplicateEntity(dto); return await this.repository.save(this.repository.create(dto)); diff --git a/src/repos/dtos/log-list.model.ts b/src/repos/dtos/log-list.model.ts index a144e5e..58bca5a 100644 --- a/src/repos/dtos/log-list.model.ts +++ b/src/repos/dtos/log-list.model.ts @@ -2,6 +2,17 @@ import { ObjectType, Field } from '@nestjs/graphql'; import { LogResult, DefaultLogFields } from 'simple-git'; import { PipelineTask } from '../../pipeline-tasks/pipeline-task.entity'; +@ObjectType() +export class Commit { + hash: string; + date: Date; + message: string; + refs: string; + body: string; + author_name: string; + author_email: string; + tasks: PipelineTask[]; +} @ObjectType() export class LogFields { hash: string; diff --git a/src/repos/repos.module.ts b/src/repos/repos.module.ts index 99cc87b..ab8235c 100644 --- a/src/repos/repos.module.ts +++ b/src/repos/repos.module.ts @@ -6,8 +6,7 @@ import { ReposService } from './repos.service'; import { ConfigModule } from '@nestjs/config'; import { ProjectsModule } from '../projects/projects.module'; import { BullModule } from '@nestjs/bull'; -import { LIST_LOGS_TASK, LIST_LOGS_PUB_SUB } from './repos.constants'; -import { PubSub } from 'graphql-subscriptions'; +import { LIST_LOGS_TASK } from './repos.constants'; import { ListLogsConsumer } from './list-logs.consumer'; @Module({ diff --git a/src/repos/repos.service.ts b/src/repos/repos.service.ts index 8e6256b..7567664 100644 --- a/src/repos/repos.service.ts +++ b/src/repos/repos.service.ts @@ -10,13 +10,23 @@ import { gitP } from 'simple-git'; import { Repository } from 'typeorm'; import { Project } from '../projects/project.entity'; import { ListBranchesArgs } from './dtos/list-branches.args'; -import { ListLogsArgs } from './dtos/list-logs.args'; import { ConfigService } from '@nestjs/config'; +import { Commit } from './dtos/log-list.model'; const DEFAULT_REMOTE_NAME = 'origin'; const INFO_PATH = '@info'; @Injectable() export class ReposService { + async listCommits(project: Project, branch?: string) { + const git = await this.getGit(project, undefined, { fetch: false }); + const data = await git.log( + branch ? ['--branches', `remotes/origin/${branch}`, '--'] : ['--all'], + ); + return data.all.map((it) => ({ + ...it, + date: new Date(it.date), + })); + } constructor( @InjectRepository(Project) private readonly projectRepository: Repository, @@ -31,7 +41,11 @@ export class ReposService { ); } - async getGit(project: Project, workspaceRoot?: string) { + async getGit( + project: Project, + workspaceRoot?: string, + { fetch = true } = {}, + ) { if (!workspaceRoot) { workspaceRoot = this.getWorkspaceRoot(project); } @@ -44,7 +58,9 @@ export class ReposService { await git.init(); await git.addRemote(DEFAULT_REMOTE_NAME, project.sshUrl); } - await git.fetch(); + if (fetch) { + await git.fetch(); + } return git; }