Implement subscribe api

This commit is contained in:
Hongbo Wu 2022-05-17 18:46:57 +08:00
parent 1da8b75c81
commit 4699458457

View file

@ -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],
}
}
})