All files / src/tools/auth0/handlers guardianFactorProviders.ts

93.33% Statements 28/30
66.66% Branches 4/6
100% Functions 11/11
100% Lines 27/27

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 731x 1x     1x   2x 2x   2x         1x           2x           1x       134x               5x   5x 10x 10x 10x         10x         1x     1x     1x 1x 1x 1x 1x 1x 1x 1x 1x          
import DefaultHandler from './default';
import constants from '../../constants';
import { Asset, Assets } from '../../../types';
 
const mappings = Object.entries(constants.GUARDIAN_FACTOR_PROVIDERS).reduce(
  (accum: { name: string; provider: string }[], [name, providers]) => {
    providers.forEach((p) => {
      accum.push({ name, provider: p });
    });
    return accum;
  },
  []
);
 
export const schema = {
  type: 'array',
  items: {
    type: 'object',
    properties: {
      name: { type: 'string', enum: constants.GUARDIAN_FACTORS },
      provider: { type: 'string', enum: mappings.map((p) => p.provider) },
    },
    required: ['name', 'provider'],
  },
};
 
export default class GuardianFactorProvidersHandler extends DefaultHandler {
  existing: Asset[];
 
  constructor(options: DefaultHandler) {
    super({
      ...options,
      type: 'guardianFactorProviders',
      id: 'name',
    });
  }
 
  async getType(): Promise<Asset[]> {
    Iif (this.existing) return this.existing;
 
    const data = await Promise.all(
      mappings.map(async (m) => {
        const provider = await this.client.guardian.getFactorProvider(m);
        return { ...m, ...provider };
      })
    );
 
    // Filter out empty, should have more then 2 keys (name, provider)
    return data.filter((d) => Object.keys(d).length > 2);
  }
 
  async processChanges(assets: Assets): Promise<void> {
    // No API to delete or create guardianFactorProviders, we can only update.
    const { guardianFactorProviders } = assets;
 
    // Do nothing if not set
    Iif (!guardianFactorProviders || !guardianFactorProviders.length) return;
 
    // Process each factor
    await Promise.all(
      guardianFactorProviders.map(async (factorProvider) => {
        const data = { ...factorProvider };
        const params = { name: factorProvider.name, provider: factorProvider.provider };
        delete data.name;
        delete data.provider;
        await this.client.guardian.updateFactorProvider(params, data);
        this.didUpdate(params);
        this.updated += 1;
      })
    );
  }
}