import { Base } from './base'; import { MembershipSuspensionResponse, MembershipSuspensionResponseSummary } from './types/suspensions'; import { Suspension } from './models/suspension'; import { EmptyResultError } from './errors'; export class SuspensionService extends Base { private membershipApi = this.config.get('membershipApi'); private suspensionApiKey = this.config.get('suspensionApiKey'); /** * This function is the public method for retrieving all user's suspension details. * @param subscriptionNumber The number of a user's subscription. * @returns all of the user's suspensions or an empty array if the user never set up any suspensions. */ public async getSuspensions(subscriptionNumber: string): Promise | []> { const url = `${this.membershipApi}/newspaper/suspensions?subscriptionNumber=${subscriptionNumber}`; const { items } = await this.requestGet({ url, key: this.suspensionApiKey }); if (!items || !Array.isArray(items)) { throw new EmptyResultError('No suspensions returned', { suspensions: items }); } return items.map((suspension: MembershipSuspensionResponse) => new Suspension(suspension)); } /** * This function is the public method for retrieving a user's suspension by ID. * @param suspensionId The Id for a suspension * @returns details of the suspension. */ public async getSuspensionById(suspensionId: string): Promise { const url = `${this.membershipApi}/newspaper/suspensions/${suspensionId}`; const { suspension } = await this.requestGet({ url, key: this.suspensionApiKey }); return new Suspension(suspension); } /** * This function is the public method for creating a user's suspension. * @param subscriptionNumber The number of a user's subscription. * @param startDate The date the suspension should start. Format yyyy-MM-dd. * @param endDate The date the suspension should end. Format yyyy-MM-dd. * @returns all of the user's suspensions. */ public async createSuspension(subscriptionNumber: string, startDate: string, endDate: string): Promise> { const url = `${this.membershipApi}/newspaper/suspensions`; const body = { subscriptionNumber, startDate, endDate }; const { items } = await this.requestPost({ url, key: this.suspensionApiKey, body }); if (!items || !Array.isArray(items) || !items.length) { throw new EmptyResultError('No suspensions returned', { suspensions: items }); } return items.map((suspension: MembershipSuspensionResponse) => new Suspension(suspension)); } /** * This function is the public method for ending a user's suspension. * @param suspensionId The Id for the suspension that should be ended. * @param endDateFrom Optional. Defaults to empty sting.. * @returns details of the suspension. */ public async endSuspension(suspensionId: string, endDateFrom?: string): Promise> { const url = `${this.membershipApi}/newspaper/suspensions/${suspensionId}/actions/end`; const body = endDateFrom ? { endDateFrom } : {}; const { items } = await this.requestPost({ url, key: this.suspensionApiKey, body }); if (!items || !Array.isArray(items) || !items.length) { throw new EmptyResultError('No suspensions returned', { suspensions: items }); } return items.map((suspension: MembershipSuspensionResponse) => new Suspension(suspension)); } /** * This function is the public method for deleting a user's suspension. * @param suspensionId The ID of the suspension to delete. * @returns the deleted suspension. */ public async deleteSuspension(suspensionId: string): Promise { const url = `${this.membershipApi}/newspaper/suspensions/${suspensionId}`; return await this.requestDelete({ url, key: this.suspensionApiKey }); } /** * This function is the public method for retrieving a user's suspension summary details. * @param subscriptionNumber The number of a user's subscription. * @returns a summary of a user's suspension. */ public async getSummary(subscriptionNumber: string): Promise { const url = `${this.membershipApi}/newspaper/suspensions/summary?subscriptionNumber=${subscriptionNumber}`; return await this.requestGet({ url, key: this.suspensionApiKey }); } }