mirror of
https://github.com/outline/outline.git
synced 2026-06-13 11:25:03 +03:00
6a1f2399db
* feat: Collection subscription * refactor to use latest impl * load subscriptions only once * tests, type rename, migration index * all users in publish flow * tsc * remove SubscriptionType.Collection enum * review
67 lines
1.8 KiB
TypeScript
67 lines
1.8 KiB
TypeScript
import { Transaction } from "sequelize";
|
|
import { SubscriptionType } from "@shared/types";
|
|
import subscriptionCreator from "@server/commands/subscriptionCreator";
|
|
import { createContext } from "@server/context";
|
|
import { Subscription, User } from "@server/models";
|
|
import { sequelize } from "@server/storage/database";
|
|
import { DocumentUserEvent } from "@server/types";
|
|
import BaseTask from "./BaseTask";
|
|
|
|
export default class DocumentSubscriptionTask extends BaseTask<DocumentUserEvent> {
|
|
public async perform(event: DocumentUserEvent) {
|
|
const user = await User.findByPk(event.userId);
|
|
if (!user) {
|
|
return;
|
|
}
|
|
|
|
switch (event.name) {
|
|
case "documents.add_user":
|
|
return this.addUser(event, user);
|
|
|
|
case "documents.remove_user":
|
|
return this.removeUser(event, user);
|
|
|
|
default:
|
|
}
|
|
}
|
|
|
|
private async addUser(event: DocumentUserEvent, user: User) {
|
|
await sequelize.transaction(async (transaction) => {
|
|
await subscriptionCreator({
|
|
ctx: createContext({
|
|
user,
|
|
authType: event.authType,
|
|
ip: event.ip,
|
|
transaction,
|
|
}),
|
|
documentId: event.documentId,
|
|
event: SubscriptionType.Document,
|
|
resubscribe: false,
|
|
});
|
|
});
|
|
}
|
|
|
|
private async removeUser(event: DocumentUserEvent, user: User) {
|
|
await sequelize.transaction(async (transaction) => {
|
|
const subscription = await Subscription.findOne({
|
|
where: {
|
|
userId: user.id,
|
|
documentId: event.documentId,
|
|
event: "documents.update",
|
|
},
|
|
transaction,
|
|
lock: Transaction.LOCK.UPDATE,
|
|
});
|
|
|
|
await subscription?.destroyWithCtx(
|
|
createContext({
|
|
user,
|
|
authType: event.authType,
|
|
ip: event.ip,
|
|
transaction,
|
|
})
|
|
);
|
|
});
|
|
}
|
|
}
|