import * as emailAddresses from 'email-addresses'; import { ValidationError } from '../errors'; const MARKETING_CAMPAIGNS_ACCOUNT = 'marketing campaigns account'; /** Class representing an Acquisition Context. */ export class AcquisitionContext { public displayName?: string; public name?: string; public hasRestrictIpRanges?: boolean; public hasRestrictEmailDomains?: boolean; public allowedEmailDomains?: Array; public hasRestrictBlockedEmailDomains?: boolean; public blockedEmailDomains?: Array; public accessLicenceId?: string; public signupWelcomeText?: string; /** * Create an Acquisition Context * @param acquisitionContextData Membership graphql acquisitionContext data response. */ constructor(acquisitionContextData?: Partial) { if (acquisitionContextData) { Object.assign(this, acquisitionContextData); } } /** * Is the email domain allowed for this licence. * @param email * @returns true|false */ public isAllowedEmailDomain (email: string): boolean { if (!this.hasRestrictEmailDomains) { return true; } if (!this.allowedEmailDomains) { throw new ValidationError('allowedEmailDomains is undefined'); } const domain = this.getDomain(email); return this.allowedEmailDomains.some(host => { const hostPart = host .replace(/\./g, '\\.') // escapes "." dots .replace(/^\*\\./, '.*\\\.'); // allows for *. domain prefix const regex = new RegExp(`^${hostPart}$`, 'i'); return regex.test(domain); }); } /** * Is the email domain blocked for this licence. * @returns true|false */ public isBlockedEmailDomain (email: string): boolean { if (!this.hasRestrictBlockedEmailDomains) { return false; } if (!this.blockedEmailDomains) { throw new ValidationError('blockedEmailDomains is undefined'); } const domain = this.getDomain(email); return !!this.blockedEmailDomains.find(blockedDomain => blockedDomain.toLowerCase() === domain ); } /** * Is the acquisitionContext name equal to `Marketing Campaigns Account` * @returns true|false */ public isMarketingCampaign (): boolean { return (this.name && this.name.toLowerCase() === MARKETING_CAMPAIGNS_ACCOUNT) || false; } /** * Gets the domain from the email. * @returns domain of the email. */ private getDomain (email: string): string { const parsedEmail = emailAddresses.parseOneAddress(email) as emailAddresses.ParsedMailbox; const domain = parsedEmail && parsedEmail.domain || ''; return domain.toLowerCase(); } }