onebeyond/bamboohrbot

View on GitHub
src/handler.ts

Summary

Maintainability
A
1 hr
Test Coverage
import * as dotenv from 'dotenv';
dotenv.config();

import moment from 'moment';
import sdk from '@api/bamboohr';
import { App, LogLevel } from '@slack/bolt';

import {
  fetchEmployees,
  fetchEmployeesAtOffice,
  fetchBankHolidays,
} from './fetchers';
import {
  employeesAtOfficeBlockBuilder,
  employeesCelebrationsBlockBuilder,
  bankHolidaysBlockBuilder,
} from './blockBuilders';
import { getSecret, initializeSecretsManager } from './utils/secrets';
import { postSlackMessage } from './slack/postSlackMessage';

export async function main() {
  initializeSecretsManager();

  const slackBotToken = await getSecret('SLACK_BOT_TOKEN');
  const slackSigningSecret = await getSecret('SLACK_SIGNING_SECRET');

  const app = new App({
    token: slackBotToken,
    signingSecret: slackSigningSecret,
    logLevel: LogLevel.INFO,
  });

  const bamboohrKey = await getSecret('BAMBOOHR_KEY');
  sdk.auth(bamboohrKey ?? '');

  const today = moment();

  const countryList: string[] =
    process.env.EMPLOYEE_COUNTRY_FILTER?.split(',') ?? [];

  // Fetch info from BambooHR API
  const [employees, employeesAtOffice, bankHolidays] = await Promise.all([
    fetchEmployees(countryList),
    fetchEmployeesAtOffice(today),
    fetchBankHolidays(today),
  ]);

  // Build the messages
  const employeesAtOfficeMessage = employeesAtOfficeBlockBuilder(
    employees,
    employeesAtOffice,
    today
  );
  const employeesCelebrationsMessage = employeesCelebrationsBlockBuilder(
    employees,
    today
  );
  const bankHolidaysMessage = bankHolidaysBlockBuilder(bankHolidays, today);

  // Publish to slack
  await Promise.allSettled([
    postSlackMessage(
      app,
      process.env.SLACK_OFFICE_CHANNEL_IDS ?? '',
      employeesAtOfficeMessage
    ),
    postSlackMessage(
      app,
      process.env.SLACK_CELEBRATIONS_CHANNEL_IDS ?? '',
      employeesCelebrationsMessage
    ),
    postSlackMessage(
      app,
      process.env.SLACK_BANK_HOLIDAYS_CHANNEL_IDS ?? '',
      bankHolidaysMessage
    ),
  ]);

  return {
    message: 'Published to Slack!',
  };
}