From 4699458457bd25c851e1491a737fe33226881add Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 17 May 2022 18:46:57 +0800 Subject: [PATCH] Implement subscribe api --- .../api/src/resolvers/subscriptions/index.ts | 73 +++++++++++++++++-- 1 file changed, 66 insertions(+), 7 deletions(-) diff --git a/packages/api/src/resolvers/subscriptions/index.ts b/packages/api/src/resolvers/subscriptions/index.ts index ab2c1dff5..b59ea7123 100644 --- a/packages/api/src/resolvers/subscriptions/index.ts +++ b/packages/api/src/resolvers/subscriptions/index.ts @@ -1,9 +1,13 @@ import { authorized } from '../../utils/helpers' import { + MutationSubscribeArgs, MutationUnsubscribeArgs, QuerySubscriptionsArgs, SortBy, SortOrder, + SubscribeError, + SubscribeErrorCode, + SubscribeSuccess, SubscriptionsError, SubscriptionsErrorCode, SubscriptionsSuccess, @@ -17,7 +21,8 @@ import { env } from '../../env' import { getRepository } from '../../entity/utils' import { User } from '../../entity/user' import { Subscription } from '../../entity/subscription' -import { unsubscribe } from '../../services/subscriptions' +import { getSubscribeHandler, unsubscribe } from '../../services/subscriptions' +import { ILike } from 'typeorm' export const subscriptionsResolver = authorized< SubscriptionsSuccess, @@ -87,12 +92,6 @@ export const unsubscribeResolver = authorized< } } - if (subscription.user.id !== uid) { - return { - errorCodes: [UnsubscribeErrorCode.Unauthorized], - } - } - // if subscription is already unsubscribed, throw error if (subscription.status === SubscriptionStatus.Unsubscribed) { return { @@ -125,3 +124,63 @@ export const unsubscribeResolver = authorized< } } }) + +export const subscribeResolver = authorized< + SubscribeSuccess, + SubscribeError, + MutationSubscribeArgs +>(async (_, { name }, { claims: { uid }, log }) => { + log.info('subscribeResolver') + + try { + const user = await getRepository(User).findOneBy({ id: uid }) + if (!user) { + return { + errorCodes: [SubscribeErrorCode.Unauthorized], + } + } + + const subscription = await getRepository(Subscription).findOneBy({ + name: ILike(name), + user: { id: uid }, + status: SubscriptionStatus.Active, + }) + if (subscription) { + return { + errorCodes: [SubscribeErrorCode.AlreadySubscribed], + } + } + + const subscribeHandler = getSubscribeHandler(name) + if (!subscribeHandler) { + return { + errorCodes: [SubscribeErrorCode.NotFound], + } + } + + const newSubscriptions = await subscribeHandler.handleSubscribe(uid, name) + if (!newSubscriptions) { + return { + errorCodes: [SubscribeErrorCode.BadRequest], + } + } + + analytics.track({ + userId: uid, + event: 'subscribed', + properties: { + name, + env: env.server.apiEnv, + }, + }) + + return { + subscriptions: newSubscriptions, + } + } catch (error) { + log.error('failed to subscribe', error) + return { + errorCodes: [SubscribeErrorCode.BadRequest], + } + } +})