@digitalpersona/enrollment
Version:
DigitalPersona Enrollment API
77 lines (67 loc) • 2.74 kB
text/typescript
import { Credential, Question, Answer, Utf8 } from '@digitalpersona/core';
import { Enroller } from '../../private';
import { EnrollmentContext } from '../..';
/**
* Maps a security question to its corresponding answer.
*/
export interface QuestionWithAnswer {
/** A security question */
question: Question;
/** An answer to the security question. */
answer: Answer;
}
/**
* Security Questions enrollment API.
*/
export class SecurityQuestionsEnroll extends Enroller
{
/** Constructs a new Security Questions enrollment API object.
* @param context - an {@link EnrollmentContext|enrollment context}.
*/
constructor(context: EnrollmentContext){
super(context);
}
/**
* Reads enrolled Security Questions.
* @returns a promise to return a collection of enrolled Security Questions.
*/
public getEnrolledQuestions(): Promise<Question[]>
{
return this.context.enrollService
.GetEnrollmentData(this.context.getUser(), Credential.SecurityQuestions)
.then(data =>
(JSON.parse(Utf8.fromBase64Url(data)) as object[])
.map(item => Question.fromJson(item)));
}
/** Reads a Security Questions enrollment availability.
* @returns a fulfilled promise when Security Questions can be enrolled, a rejected promise otherwise.
*/
public canEnroll(): Promise<void>
{
return super._canEnroll(Credential.SecurityQuestions);
}
/**
* Enrolls Security Questions.
* @param questionsWithAnswers - a colelction of user's answers to Security Questions.
* @returns a promise to perform the enrollment or reject in case of an error.
*/
public enroll(questionsWithAnswers: QuestionWithAnswer[]): Promise<void>
{
const equal = (a: QuestionWithAnswer, b: QuestionWithAnswer) =>
a.question.number === b.question.number;
const unique = (val: QuestionWithAnswer, idx: number, arr: QuestionWithAnswer[]) =>
arr.findIndex(qa => equal(qa, val)) === idx;
const data = questionsWithAnswers
.filter(qa => qa.question.number === qa.answer.number)
.filter(unique)
.sort((a, b) => b.question.number - a.question.number); // server requires reverse order
return super._enroll(new Credential(Credential.SecurityQuestions, data));
}
/** Deletes the Security Question enrollment.
* @returns a promise to delete the enrollment or reject in case of an error.
*/
public unenroll(): Promise<void>
{
return super._unenroll(new Credential(Credential.SecurityQuestions));
}
}