Convert GroupMembership mutations (#8242)

* Convert 'GroupMembership' mutations

* cleanup collectionGroupMemberships

* remove duplicate data
This commit is contained in:
Hemachandar
2025-01-17 04:53:09 +05:30
committed by GitHub
parent bcba35550a
commit 3c86b48533
6 changed files with 103 additions and 84 deletions

View File

@@ -166,6 +166,8 @@ class Collection extends ParanoidModel<
InferAttributes<Collection>,
Partial<InferCreationAttributes<Collection>>
> {
static eventNamespace = "collections";
@SimpleLength({
min: 10,
max: 10,

View File

@@ -254,6 +254,8 @@ class Document extends ArchivableModel<
InferAttributes<Document>,
Partial<InferCreationAttributes<Document>>
> {
static eventNamespace = "documents";
@SimpleLength({
min: 10,
max: 10,

View File

@@ -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.
*/

View File

@@ -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))

View File

@@ -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,

View File

@@ -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;
};
};