import { Base } from './base'; import { RedeemableToken } from './models/redeemable-token'; import { PersonalisedToken } from './models/personalised-token'; import { PersonalisedTokenMembershipResponse } from './types/personalised-token'; import { mapRedeemTokenResponse } from './mappers/redeem-token-post'; import { TokenInterface } from './types/token'; import { mapRedeemableTokenResponse } from './mappers/redeemable-token'; import { MembershipRedeemableTokenData } from './types/redeemable-token'; /** Class representing RedeemableToken Service request. */ export class RedeemableTokenService extends Base { private membershipApi = this.config.get('membershipApi'); private redeemableTokenApiKey = this.config.get('redeemableTokenApiKey'); private redeemableEmailTokenApiKey = this.config.get('redeemableEmailTokenApiKey'); // This is for getting personalised tokens until one key can use all endpoints /** * This function is the public method for redeeming a token. It can be used for redeeming a personal token or redeemable token. * @param token The token to redeem * @param [userId] User's ID * @returns Token */ public async redeem(token: TokenInterface, userId?: string): Promise { if (token instanceof RedeemableToken) { if (!userId) { throw new Error('No userId provided'); } return this.redeemRedeemableToken(token, userId); } if (token instanceof PersonalisedToken) { return this.redeemPersonalisedToken(token); } throw new Error('Unknown token type'); } /** * getPersonalisedToken * This function creates a new PersonalisedToken instance for a given token ID. * @param tokenId The ID of the token * @throws {NotFoundError} * @returns Personalised Token */ public async getPersonalisedToken(tokenId: string): Promise { const url = `${this.membershipApi}/redeemable-email-tokens/v1/${tokenId}`; const response: PersonalisedTokenMembershipResponse = await this.requestGet({ key: this.redeemableEmailTokenApiKey, url, }); const { tokenValue: id, createdTime: creationDateTime, accessLicenceId, emailAddress, externalUserId, } = response; return new PersonalisedToken({ id, accessLicenceId, emailAddress, creationDateTime, externalUserId }); } /** * Maps an AIM GraphQL response to redeemableToken model. * @param tokenData Response to redeemableToken request. * @throws {InvalidResponseError} If the membership request does not return the expected response. * @returns RedeemableToken instance. */ public mapRedeemableTokenResponse (tokenData: any): RedeemableToken { return mapRedeemableTokenResponse(tokenData); } /** * redeemRedeemableToken * This function redeems the given RedeemableToken for the given user. * @param token - The token to redeem * @param [userId] User's ID * @returns Token */ private async redeemRedeemableToken(token: RedeemableToken, userId: string) { const url = `${this.membershipApi}/redeemable-tokens/${token.id}/redeem`; const body = { userId }; const response = await this.requestPost({ key: this.redeemableTokenApiKey, url, body }); return mapRedeemTokenResponse(response); } /** * redeemPersonalisedToken * This function redeems the given PersonalisedToken. * @param token - The token to redeem * @returns Personalised Token */ private async redeemPersonalisedToken(token: PersonalisedToken) { const url = `${this.membershipApi}/redeemable-email-tokens/v1/${token.id}/redeem`; await this.requestPost({ key: this.redeemableEmailTokenApiKey, url }); return token; } }