File

src/contributor/contributor.service.ts

Index

Methods

Constructor

constructor(pullRequestGithubEventsService: PullRequestGithubEventsService, userService: UserService, contribDevstatsService: ContributorDevstatsService)
Parameters :
Name Type Optional
pullRequestGithubEventsService PullRequestGithubEventsService No
userService UserService No
contribDevstatsService ContributorDevstatsService No

Methods

Async searchAuthors
searchAuthors(options: PullRequestContributorOptionsDto)
Parameters :
Name Type Optional
options PullRequestContributorOptionsDto No
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);
  }
}

results matching ""

    No results matching ""