src/contributor/contributor.service.ts
Methods |
|
constructor(pullRequestGithubEventsService: PullRequestGithubEventsService, userService: UserService, contribDevstatsService: ContributorDevstatsService)
|
||||||||||||
|
Defined in src/contributor/contributor.service.ts:13
|
||||||||||||
|
Parameters :
|
| Async searchAuthors | ||||||
searchAuthors(options: PullRequestContributorOptionsDto)
|
||||||
|
Defined in src/contributor/contributor.service.ts:20
|
||||||
|
Parameters :
Returns :
Promise<PageDto<DbUserDevstats>>
|
import { cpus } from "os";
import { BadRequestException, Injectable } from "@nestjs/common";
import PromisePool from "@supercharge/promise-pool/dist";
import { UserService } from "../user/services/user.service";
import { PullRequestGithubEventsService } from "../timescale/pull_request_github_events.service";
import { PullRequestContributorOptionsDto } from "../pull-requests/dtos/pull-request-contributor-options.dto";
import { PageMetaDto } from "../common/dtos/page-meta.dto";
import { PageDto } from "../common/dtos/page.dto";
import { ContributorDevstatsService } from "../timescale/contrib-stats.service";
import { DbUserDevstats } from "../user/entities/user-devstats.entity";
@Injectable()
export class ContributorService {
constructor(
private pullRequestGithubEventsService: PullRequestGithubEventsService,
private userService: UserService,
private contribDevstatsService: ContributorDevstatsService
) {}
async searchAuthors(options: PullRequestContributorOptionsDto): Promise<PageDto<DbUserDevstats>> {
const allContribs = await this.pullRequestGithubEventsService.searchAuthors(options);
// get paged contributors to actually process - sort based on provided filter
const filteredUsers = await this.userService.filterGivenContributors(
allContribs.data.map((contrib) => contrib.author_login.toLowerCase()),
{
limit: options.limit!,
skip: 0,
}
);
const { results } = await PromisePool.withConcurrency(Math.max(2, cpus().length))
.for(filteredUsers)
.useCorrespondingResults()
.handleError((error) => {
throw error;
})
.process(async (contributor) => {
const devstats = await this.contribDevstatsService.findAllContributorStats(
{
range: options.range,
skip: 0,
},
[contributor.login]
);
if (devstats.length !== 1) {
throw new BadRequestException("Error fetching user:", contributor.login);
}
return {
...contributor,
commits: devstats[0].commits,
prs_created: devstats[0].prs_created,
prs_reviewed: devstats[0].prs_reviewed,
issues_created: devstats[0].issues_created,
commit_comments: devstats[0].commit_comments,
issue_comments: devstats[0].issue_comments,
pr_review_comments: devstats[0].pr_review_comments,
comments: devstats[0].comments,
total_contributions: devstats[0].total_contributions,
} as DbUserDevstats;
});
const pageMetaDto = new PageMetaDto({ itemCount: allContribs.meta.itemCount, pageOptionsDto: options });
return new PageDto(results, pageMetaDto);
}
}