/** * trial.controller.ts * Copyright (C) 2021 Sanar * * @author Edgard Leal * @module trial.controller.ts */ import { Request, Response } from 'express'; import httpStatus from 'http-status'; import { validationResult } from 'express-validator'; import { BaseController } from './base.controller'; import { SanarLinkService } from '../services/sanarlink/sanarlink.service'; import { SubscriptionsService } from '../services/subscriptions.service'; export class TrialController extends BaseController { static instance: TrialController; private linkService: SanarLinkService; private subscriptionService: SubscriptionsService; constructor() { super(); this.linkService = SanarLinkService.getInstance(); this.subscriptionService = SubscriptionsService.getInstance(); } handleTGTCoupomUsageError(error: Error): number { console.log('Error quering TGT Coupom usage: %s', error.message); // eslint-disable-line return 0; } protected getTGTCoupomUsage(userId: string): Promise { const filter = { where: { platform: 'resmed', gateway_id: 'RESMED', metadata: { origin: `tgt-${userId}`, }, }, }; return this.subscriptionService.findSubscriptions(filter) .then((list: any[] = []): number => list.length) .catch(this.handleTGTCoupomUsageError); } async createSharableLink(req: Request, res: Response) { const errors = validationResult(req); if (!errors.isEmpty()) { res.status(httpStatus.BAD_REQUEST).json({ errors: errors.array() }); } else { const [link, usage] = await Promise.all([ this.linkService.upsertLink(req.body), this.getTGTCoupomUsage(req.body.user_id), ]); res.json({ link, usage, }); } } public static getInstance() { if (!TrialController.instance) { TrialController.instance = new TrialController(); } return TrialController.instance; } }