src/auth0/handlers/guardianFactorProviders.js
import DefaultHandler from './default';
import constants from '../../constants';
const mappings = Object.entries(constants.GUARDIAN_FACTOR_PROVIDERS).reduce((accum, [ 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 {
constructor(options) {
super({
...options,
type: 'guardianFactorProviders',
id: 'name'
});
}
async getType() {
if (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) {
// No API to delete or create guardianFactorProviders, we can only update.
const { guardianFactorProviders } = assets;
// Do nothing if not set
if (!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;
}));
}
}