mirror of
https://github.com/outline/outline.git
synced 2026-02-20 11:29:14 -06:00
Convert GroupMembership mutations (#8242)
* Convert 'GroupMembership' mutations * cleanup collectionGroupMemberships * remove duplicate data
This commit is contained in:
@@ -166,6 +166,8 @@ class Collection extends ParanoidModel<
|
||||
InferAttributes<Collection>,
|
||||
Partial<InferCreationAttributes<Collection>>
|
||||
> {
|
||||
static eventNamespace = "collections";
|
||||
|
||||
@SimpleLength({
|
||||
min: 10,
|
||||
max: 10,
|
||||
|
||||
@@ -254,6 +254,8 @@ class Document extends ArchivableModel<
|
||||
InferAttributes<Document>,
|
||||
Partial<InferCreationAttributes<Document>>
|
||||
> {
|
||||
static eventNamespace = "documents";
|
||||
|
||||
@SimpleLength({
|
||||
min: 10,
|
||||
max: 10,
|
||||
|
||||
@@ -25,6 +25,7 @@ import Collection from "./Collection";
|
||||
import Document from "./Document";
|
||||
import Group from "./Group";
|
||||
import User from "./User";
|
||||
import { type HookContext } from "./base/Model";
|
||||
import ParanoidModel from "./base/ParanoidModel";
|
||||
import Fix from "./decorators/Fix";
|
||||
|
||||
@@ -123,6 +124,10 @@ class GroupMembership extends ParanoidModel<
|
||||
@Column(DataType.UUID)
|
||||
createdById: string;
|
||||
|
||||
get modelId() {
|
||||
return this.groupId;
|
||||
}
|
||||
|
||||
// static methods
|
||||
|
||||
/**
|
||||
@@ -203,6 +208,25 @@ class GroupMembership extends ParanoidModel<
|
||||
return this.recreateSourcedMemberships(model, options);
|
||||
}
|
||||
|
||||
@AfterCreate
|
||||
static async publishAddGroupEventAfterCreate(
|
||||
model: GroupMembership,
|
||||
context: HookContext
|
||||
) {
|
||||
const data = { membershipId: model.id, isNew: true };
|
||||
|
||||
const ctxWithData = {
|
||||
...context,
|
||||
event: { ...context.event, data },
|
||||
} as HookContext;
|
||||
|
||||
if (model.collectionId) {
|
||||
await Collection.insertEvent("add_group", model, ctxWithData);
|
||||
} else {
|
||||
await Document.insertEvent("add_group", model, ctxWithData);
|
||||
}
|
||||
}
|
||||
|
||||
@AfterUpdate
|
||||
static async updateSourcedMemberships(
|
||||
model: GroupMembership,
|
||||
@@ -230,6 +254,25 @@ class GroupMembership extends ParanoidModel<
|
||||
}
|
||||
}
|
||||
|
||||
@AfterUpdate
|
||||
static async publishAddGroupEventAfterUpdate(
|
||||
model: GroupMembership,
|
||||
context: HookContext
|
||||
) {
|
||||
const data = { membershipId: model.id, isNew: false };
|
||||
|
||||
const ctxWithData = {
|
||||
...context,
|
||||
event: { ...context.event, data },
|
||||
} as HookContext;
|
||||
|
||||
if (model.collectionId) {
|
||||
await Collection.insertEvent("add_group", model, ctxWithData);
|
||||
} else {
|
||||
await Document.insertEvent("add_group", model, ctxWithData);
|
||||
}
|
||||
}
|
||||
|
||||
@AfterDestroy
|
||||
static async destroySourcedMemberships(
|
||||
model: GroupMembership,
|
||||
@@ -249,6 +292,25 @@ class GroupMembership extends ParanoidModel<
|
||||
});
|
||||
}
|
||||
|
||||
@AfterDestroy
|
||||
static async publishRemoveGroupEvent(
|
||||
model: GroupMembership,
|
||||
context: HookContext
|
||||
) {
|
||||
const data = { membershipId: model.id };
|
||||
|
||||
const ctxWithData = {
|
||||
...context,
|
||||
event: { ...context.event, data },
|
||||
} as HookContext;
|
||||
|
||||
if (model.collectionId) {
|
||||
await Collection.insertEvent("remove_group", model, ctxWithData);
|
||||
} else {
|
||||
await Document.insertEvent("remove_group", model, ctxWithData);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Recreate all sourced permissions for a given permission.
|
||||
*/
|
||||
|
||||
@@ -211,38 +211,30 @@ router.post(
|
||||
authorize(user, "update", collection);
|
||||
authorize(user, "read", group);
|
||||
|
||||
const [membership] = await GroupMembership.findOrCreate({
|
||||
where: {
|
||||
collectionId: id,
|
||||
groupId,
|
||||
},
|
||||
defaults: {
|
||||
permission,
|
||||
createdById: user.id,
|
||||
},
|
||||
transaction,
|
||||
lock: transaction.LOCK.UPDATE,
|
||||
});
|
||||
const [membership, created] = await GroupMembership.findOrCreateWithCtx(
|
||||
ctx,
|
||||
{
|
||||
where: {
|
||||
collectionId: id,
|
||||
groupId,
|
||||
},
|
||||
defaults: {
|
||||
permission,
|
||||
createdById: user.id,
|
||||
},
|
||||
lock: transaction.LOCK.UPDATE,
|
||||
}
|
||||
);
|
||||
|
||||
membership.permission = permission;
|
||||
await membership.save({ transaction });
|
||||
|
||||
await Event.createFromContext(ctx, {
|
||||
name: "collections.add_group",
|
||||
collectionId: collection.id,
|
||||
modelId: groupId,
|
||||
data: {
|
||||
name: group.name,
|
||||
membershipId: membership.id,
|
||||
},
|
||||
});
|
||||
if (!created) {
|
||||
membership.permission = permission;
|
||||
await membership.saveWithCtx(ctx);
|
||||
}
|
||||
|
||||
const groupMemberships = [presentGroupMembership(membership)];
|
||||
|
||||
ctx.body = {
|
||||
data: {
|
||||
// `collectionGroupMemberships` retained for backwards compatibility – remove after version v0.79.0
|
||||
collectionGroupMemberships: groupMemberships,
|
||||
groupMemberships,
|
||||
},
|
||||
};
|
||||
@@ -281,22 +273,7 @@ router.post(
|
||||
ctx.throw(400, "This Group is not a part of the collection");
|
||||
}
|
||||
|
||||
await GroupMembership.destroy({
|
||||
where: {
|
||||
collectionId: id,
|
||||
groupId,
|
||||
},
|
||||
transaction,
|
||||
});
|
||||
await Event.createFromContext(ctx, {
|
||||
name: "collections.remove_group",
|
||||
collectionId: collection.id,
|
||||
modelId: groupId,
|
||||
data: {
|
||||
name: group.name,
|
||||
membershipId: membership.id,
|
||||
},
|
||||
});
|
||||
await membership.destroyWithCtx(ctx);
|
||||
|
||||
ctx.body = {
|
||||
success: true,
|
||||
@@ -362,8 +339,6 @@ router.post(
|
||||
ctx.body = {
|
||||
pagination: { ...ctx.state.pagination, total },
|
||||
data: {
|
||||
// `collectionGroupMemberships` retained for backwards compatibility – remove after version v0.79.0
|
||||
collectionGroupMemberships: groupMemberships,
|
||||
groupMemberships,
|
||||
groups: await Promise.all(
|
||||
memberships.map((membership) => presentGroup(membership.group))
|
||||
|
||||
@@ -1839,40 +1839,30 @@ router.post(
|
||||
authorize(user, "update", document);
|
||||
authorize(user, "read", group);
|
||||
|
||||
const [membership, isNew] = await GroupMembership.findOrCreate({
|
||||
where: {
|
||||
documentId: id,
|
||||
groupId,
|
||||
},
|
||||
defaults: {
|
||||
permission: permission || user.defaultDocumentPermission,
|
||||
createdById: user.id,
|
||||
},
|
||||
lock: transaction.LOCK.UPDATE,
|
||||
transaction,
|
||||
});
|
||||
const [membership, created] = await GroupMembership.findOrCreateWithCtx(
|
||||
ctx,
|
||||
{
|
||||
where: {
|
||||
documentId: id,
|
||||
groupId,
|
||||
},
|
||||
defaults: {
|
||||
permission: permission || user.defaultDocumentPermission,
|
||||
createdById: user.id,
|
||||
},
|
||||
lock: transaction.LOCK.UPDATE,
|
||||
}
|
||||
);
|
||||
|
||||
if (permission) {
|
||||
if (!created && permission) {
|
||||
membership.permission = permission;
|
||||
|
||||
// disconnect from the source if the permission is manually updated
|
||||
membership.sourceId = null;
|
||||
|
||||
await membership.save({ transaction });
|
||||
await membership.saveWithCtx(ctx);
|
||||
}
|
||||
|
||||
await Event.createFromContext(ctx, {
|
||||
name: "documents.add_group",
|
||||
documentId: document.id,
|
||||
modelId: groupId,
|
||||
data: {
|
||||
name: group.name,
|
||||
isNew,
|
||||
permission: membership.permission,
|
||||
membershipId: membership.id,
|
||||
},
|
||||
});
|
||||
|
||||
ctx.body = {
|
||||
data: {
|
||||
groupMemberships: [presentGroupMembership(membership)],
|
||||
@@ -1915,17 +1905,7 @@ router.post(
|
||||
rejectOnEmpty: true,
|
||||
});
|
||||
|
||||
await membership.destroy({ transaction });
|
||||
|
||||
await Event.createFromContext(ctx, {
|
||||
name: "documents.remove_group",
|
||||
documentId: document.id,
|
||||
modelId: groupId,
|
||||
data: {
|
||||
name: group.name,
|
||||
membershipId: membership.id,
|
||||
},
|
||||
});
|
||||
await membership.destroyWithCtx(ctx);
|
||||
|
||||
ctx.body = {
|
||||
success: true,
|
||||
|
||||
@@ -273,7 +273,7 @@ export type CollectionGroupEvent = BaseEvent<GroupMembership> & {
|
||||
name: "collections.add_group" | "collections.remove_group";
|
||||
collectionId: string;
|
||||
modelId: string;
|
||||
data: { name: string; membershipId: string };
|
||||
data: { membershipId: string };
|
||||
};
|
||||
|
||||
export type DocumentUserEvent = BaseEvent<UserMembership> & {
|
||||
@@ -293,9 +293,7 @@ export type DocumentGroupEvent = BaseEvent<GroupMembership> & {
|
||||
documentId: string;
|
||||
modelId: string;
|
||||
data: {
|
||||
name: string;
|
||||
isNew?: boolean;
|
||||
permission?: DocumentPermission;
|
||||
membershipId: string;
|
||||
};
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user