All files / libs/tools/plugin/src/executors/sonar-tracker/use-cases/sonar get-sonar-issues-count-per-assignee.use-case.ts

0% Statements 0/47
0% Branches 0/1
0% Functions 0/1
0% Lines 0/47

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48                                                                                               
import { z } from 'zod';

import { assert } from '@amalia/ext/typescript';

import { sonarConfiguration, users, type UsersEmails } from '../../configurations';

const Validator = z.object({
  facets: z.array(
    z.object({
      property: z.literal('assignees'),
      values: z.array(
        z.object({
          val: z.string(),
          count: z.number(),
        }),
      ),
    }),
  ),
});

export class GetSonarIssuesCountPerAssigneeUseCase {
  public async execute(): Promise<Record<UsersEmails, number>> {
    const response = await fetch(`${sonarConfiguration.url}/api/issues/search?statuses=OPEN&facets=assignees`, {
      headers: {
        Authorization: `Bearer ${sonarConfiguration.token}`,
      },
    });

    const data = await response.json();
    const dataParsed = await Validator.parseAsync(data);

    const assigneesFacet = dataParsed.facets.at(0);
    assert(assigneesFacet, 'No assignees facet found');

    return users.reduce(
      (acc, user) => {
        const issuesAssigned = assigneesFacet.values.find(({ val: sonarId }) => sonarId === user.sonarId)?.count;

        return {
          ...acc,
          [user.email]: issuesAssigned ?? 0,
        };
      },
      {} as Record<UsersEmails, number>,
    );
  }
}