import { inject, injectable } from 'inversify' import { Repository } from 'typeorm' import TYPES from '../../Bootstrap/Types' import { OfflineUserSubscription } from '../../Domain/Subscription/OfflineUserSubscription' import { OfflineUserSubscriptionRepositoryInterface } from '../../Domain/Subscription/OfflineUserSubscriptionRepositoryInterface' @injectable() export class MySQLOfflineUserSubscriptionRepository implements OfflineUserSubscriptionRepositoryInterface { constructor( @inject(TYPES.ORMOfflineUserSubscriptionRepository) private ormRepository: Repository, ) {} async save(offlineUserSubscription: OfflineUserSubscription): Promise { return this.ormRepository.save(offlineUserSubscription) } async findOneBySubscriptionId(subscriptionId: number): Promise { return await this.ormRepository .createQueryBuilder() .where('subscription_id = :subscriptionId', { subscriptionId, }) .getOne() } async findByEmail(email: string, activeAfter: number): Promise { return await this.ormRepository .createQueryBuilder() .where('email = :email AND ends_at > :endsAt', { email, endsAt: activeAfter, }) .orderBy('ends_at', 'DESC') .getMany() } async findOneByEmail(email: string): Promise { const subscriptions = await this.ormRepository .createQueryBuilder() .where('email = :email', { email, }) .orderBy('ends_at', 'DESC') .getMany() const uncanceled = subscriptions.find((subscription) => !subscription.cancelled) if (uncanceled !== undefined) { return uncanceled } if (subscriptions.length !== 0) { return subscriptions[0] } return null } async updateCancelled(subscriptionId: number, cancelled: boolean, updatedAt: number): Promise { await this.ormRepository .createQueryBuilder() .update() .set({ cancelled, updatedAt, }) .where('subscription_id = :subscriptionId', { subscriptionId, }) .execute() } async updateEndsAt(subscriptionId: number, endsAt: number, updatedAt: number): Promise { await this.ormRepository .createQueryBuilder() .update() .set({ endsAt, updatedAt, }) .where('subscription_id = :subscriptionId', { subscriptionId, }) .execute() } }