import { Transaction } from "sequelize"; import { Subscription, Event, User } from "@server/models"; type Props = { /** The user creating the subscription */ user: User; /** The document to subscribe to */ documentId?: string; /** Event to subscribe to */ event: string; /** The IP address of the incoming request */ ip: string; /** Whether the subscription should be restored if it exists in a deleted state */ resubscribe?: boolean; transaction: Transaction; }; /** * This command creates a subscription of a user to a document. * * @returns The subscription that was created */ export default async function subscriptionCreator({ user, documentId, event, ip, resubscribe = true, transaction, }: Props): Promise { const [subscription, created] = await Subscription.findOrCreate({ where: { userId: user.id, documentId, event, }, transaction, // Previous subscriptions are soft-deleted, we want to know about them here paranoid: false, }); // If the subscription was deleted, then just restore the existing row. if (subscription.deletedAt && resubscribe) { subscription.restore({ transaction }); await Event.create( { name: "subscriptions.create", modelId: subscription.id, actorId: user.id, userId: user.id, documentId, ip, }, { transaction } ); } if (created) { await Event.create( { name: "subscriptions.create", modelId: subscription.id, actorId: user.id, userId: user.id, documentId, ip, }, { transaction } ); } return subscription; }