Individual document sharing with permissions (#5814)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Tom Moor <tom@getoutline.com>
This commit is contained in:
Apoorv Mishra
2024-01-31 07:18:22 +05:30
committed by GitHub
parent 717c9b5d64
commit 1490c3a14b
91 changed files with 4004 additions and 1166 deletions

View File

@@ -39,6 +39,8 @@ const WEBHOOK_EVENTS = {
"documents.move",
"documents.update",
"documents.title_change",
"documents.add_user",
"documents.remove_user",
],
collections: [
"collections.create",

View File

@@ -18,7 +18,7 @@ import {
Revision,
View,
Share,
UserPermission,
UserMembership,
GroupPermission,
GroupUser,
Comment,
@@ -48,6 +48,7 @@ import {
CollectionUserEvent,
CommentEvent,
DocumentEvent,
DocumentUserEvent,
Event,
FileOperationEvent,
GroupEvent,
@@ -132,6 +133,10 @@ export default class DeliverWebhookTask extends BaseTask<Props> {
case "documents.title_change":
await this.handleDocumentEvent(subscription, event);
return;
case "documents.add_user":
case "documents.remove_user":
await this.handleDocumentUserEvent(subscription, event);
return;
case "documents.update.delayed":
case "documents.update.debounced":
// Ignored
@@ -207,6 +212,9 @@ export default class DeliverWebhookTask extends BaseTask<Props> {
case "views.create":
await this.handleViewEvent(subscription, event);
return;
case "userMemberships.update":
// Ignored
return;
default:
assertUnreachable(event);
}
@@ -427,7 +435,7 @@ export default class DeliverWebhookTask extends BaseTask<Props> {
subscription: WebhookSubscription,
event: CollectionUserEvent
): Promise<void> {
const model = await UserPermission.scope([
const model = await UserMembership.scope([
"withUser",
"withCollection",
]).findOne({
@@ -513,6 +521,33 @@ export default class DeliverWebhookTask extends BaseTask<Props> {
});
}
private async handleDocumentUserEvent(
subscription: WebhookSubscription,
event: DocumentUserEvent
): Promise<void> {
const model = await UserMembership.scope([
"withUser",
"withDocument",
]).findOne({
where: {
documentId: event.documentId,
userId: event.userId,
},
paranoid: false,
});
await this.sendWebhook({
event,
subscription,
payload: {
id: event.modelId,
model: model && presentMembership(model),
document: model && (await presentDocument(model.document!)),
user: model && presentUser(model.user),
},
});
}
private async handleRevisionEvent(
subscription: WebhookSubscription,
event: RevisionEvent