import { Base } from './base'; import { EmptyResultError } from './errors'; import { DeliveryAddressResponse, DeliveryAddressIdResponse, DeliveryAddressNotes } from './types/delivery-address'; import { UserSubscription } from './models/user-subscription'; import { DeliveryAddress } from './models/delivery-address'; export class DeliveryAddressService extends Base { private membershipApi = this.config.get('membershipApi'); private deliveryAddressApiKey = this.config.get('deliveryAddressApiKey'); /** * This function is the public method for retrieving all user's delivery address details. * @param subscription User subscription. * @returns all of the user's delivery addresses. */ public async getDeliveryAddresses(subscription: UserSubscription): Promise> { const url = `${this.membershipApi}/newspaper/delivery-addresses?subscriptionNumber=${subscription.number}`; const { items } = await this.requestGet({ url, key: this.deliveryAddressApiKey, targetApiSystemCode: 'newspaper-delivery-address-svc' }); if (!items || !Array.isArray(items) || !items.length) { throw new EmptyResultError('No delivery addresses returned', { deliveryAddresses: items }); } let currentDefaultAddress: DeliveryAddress | null; let currentWeekendAddress: DeliveryAddress | null; return items.map(item => { const deliveryAddress = new DeliveryAddress(item, subscription.startDate); if (deliveryAddress.isPastDefaultAddress) { const mostCurrentAddress = deliveryAddress.getMostCurrentAddress(currentDefaultAddress); if (currentDefaultAddress) { currentDefaultAddress.isCurrentDefaultAddress = false; } currentDefaultAddress = mostCurrentAddress; currentDefaultAddress.isCurrentDefaultAddress = true; } else if (deliveryAddress.isPastWeekendAddress) { const mostCurrentAddress = deliveryAddress.getMostCurrentAddress(currentWeekendAddress); if (currentWeekendAddress) { currentWeekendAddress.isCurrentWeekendAddress = false; } currentWeekendAddress = mostCurrentAddress; currentWeekendAddress.isCurrentWeekendAddress = true; } return deliveryAddress; }); } /** * This function is the public method for retrieving a single user's delivery address. * @param deliveryAddressId The ID of a user's address. * @returns The address details of the given addressId */ public async getDeliveryAddressById(deliveryAddressId: string): Promise { const url = `${this.membershipApi}/newspaper/delivery-addresses/${deliveryAddressId}`; const { deliveryAddress } = await this.requestGet({ url, key: this.deliveryAddressApiKey, targetApiSystemCode: 'newspaper-delivery-address-svc' }); return deliveryAddress; } /** * This function is the public method for creating a new user's delivery address. * @param deliveryAddress The user's address. * @returns The ID of the address just created. */ public async createDeliveryAddress(deliveryAddress: DeliveryAddressResponse): Promise { const url = `${this.membershipApi}/newspaper/delivery-addresses`; const body = deliveryAddress; return this.requestPost({ url, key: this.deliveryAddressApiKey, body }); } /** * This function is the public method for updating a new user's delivery address notes. * @param deliveryAddressId The ID of the delivery address. * @param deliveryAddressNotes The notes information to update. * @returns The address details of the given addressId */ public async updateDeliveryAddress(deliveryAddressId: string, deliveryAddressNotes: DeliveryAddressNotes): Promise { const url = `${this.membershipApi}/newspaper/delivery-addresses/${deliveryAddressId}`; const body = deliveryAddressNotes; const { deliveryAddress } = await this.requestPost({ url, key: this.deliveryAddressApiKey, body, targetApiSystemCode: 'newspaper-delivery-address-svc' }); return deliveryAddress; } /** * This function is the public method for updating a user's future delivery address. * @param deliveryAddressId The ID of the delivery address. * @param deliveryAddress The user's future address to update. * @returns The ID of the address just updated. */ public async updateFutureDeliveryAddress(deliveryAddressId: string, deliveryAddress: DeliveryAddressResponse): Promise { const url = `${this.membershipApi}/newspaper/delivery-addresses/${deliveryAddressId}/actions/update-future-address`; const body = deliveryAddress; return this.requestPost({ url, key: this.deliveryAddressApiKey, body, targetApiSystemCode: 'newspaper-delivery-address-svc' }); } /** This function is the public method do delete a delivery address. * @param deliveryAddressId The ID of the delivery address. * @returns Empty response from membership api endpoint */ public async deleteDeliveryAddress(deliveryAddressId: string): Promise { const url = `${this.membershipApi}/newspaper/delivery-addresses/${deliveryAddressId}`; return this.requestDelete({ url, key: this.deliveryAddressApiKey, targetApiSystemCode: 'newspaper-delivery-address-svc' }); } }