All files / libs/tools/plugin/src/executors/sonar-tracker executor.ts

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

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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130                                                                                                                                                                                                                                                                   
import { type ExecutorContext } from '@nx/devkit';

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

import { slackConfiguration, sonarConfiguration, users } from './configurations';
import { debug } from './debug';
import {
  GetSonarIssuesCountPerAssigneeUseCase,
  GetSonarIssuesOverviewUseCase,
  SendSlackMessageUseCase,
} from './use-cases';

const executor = async ({ dryRun = false }, { isVerbose = false }: ExecutorContext) => {
  debug.enabled ||= isVerbose || dryRun;

  // Asserts are used to validate the configuration
  assert(slackConfiguration.url, 'Missing env var SLACK_WEBHOOK_URL');
  assert(sonarConfiguration.url, 'Missing env var SONAR_HOST_URL');
  assert(sonarConfiguration.token, 'Missing env var SONAR_TOKEN');

  const sendSlackMessageUseCase = new SendSlackMessageUseCase();
  const getSonarIssuesOverviewUseCase = new GetSonarIssuesOverviewUseCase();
  const getSonarIssuesCountPerAssignee = new GetSonarIssuesCountPerAssigneeUseCase();

  const issuesOverview = await getSonarIssuesOverviewUseCase.execute();
  const issuesPerAssignee = await getSonarIssuesCountPerAssignee.execute();

  /**
   * Construct the message that will be sent to Slack
   *
   * https://app.slack.com/block-kit-builder
   */
  const message = {
    blocks: [
      {
        type: 'section',
        text: {
          type: 'mrkdwn',
          text: 'Hello, Assistant to the Regional Manager *SonarTracker* ! *Vins*, this genyius devewopew me :uwu:',
        },
      },
      {
        type: 'header',
        text: {
          type: 'plain_text',
          text: 'Overview :jpp:',
          emoji: true,
        },
      },
      {
        type: 'section',
        fields: [
          {
            type: 'mrkdwn',
            text: `*Total issues* :mag_right: \n${issuesOverview.total}`,
          },
          {
            type: 'mrkdwn',
            text: `*High severity* :red_circle: \n${issuesOverview.HIGH}`,
          },
        ],
      },
      {
        type: 'section',
        fields: [
          {
            type: 'mrkdwn',
            text: `*Medium severity* :large_yellow_circle: \n${issuesOverview.MEDIUM}`,
          },
          {
            type: 'mrkdwn',
            text: `*Low severity* :large_green_circle: \n${issuesOverview.LOW}`,
          },
        ],
      },
      {
        type: 'divider',
      },
      {
        type: 'header',
        text: {
          type: 'plain_text',
          text: 'Devs assignments :harold-pain:',
          emoji: true,
        },
      },
      ...users.flatMap((user, index) => {
        const isLastUser = index === users.length - 1;
        const issuesCount = issuesPerAssignee[user.email];

        return [
          {
            type: 'section',
            text: {
              type: 'mrkdwn',
              text: `<@${user.slackId}> *Assignments:* ${issuesCount}\n`,
            },
            accessory: {
              type: 'button',
              text: {
                type: 'plain_text',
                text: issuesCount ? 'Check' : 'You need more work :kappa:',
                emoji: true,
              },
              value: 'check_my_debt',
              url: `${sonarConfiguration.url}/issues?issueStatuses=OPEN&assignees=${user.sonarId}`,
              action_id: 'button-action',
            },
          },
          !isLastUser && {
            type: 'divider',
          },
        ].filter(Boolean);
      }),
    ],
  };

  debug(JSON.stringify(message, null, 2));

  if (!dryRun) {
    await sendSlackMessageUseCase.execute(message);
  }

  return {
    success: true,
  };
};

export default executor;