Convert GroupUser mutations (#8187)

* Convert 'GroupUser' mutations

* cleanup commands
This commit is contained in:
Hemachandar
2025-01-06 06:03:51 +05:30
committed by GitHub
parent 9bc1788bc0
commit 4a64a767e1
8 changed files with 46 additions and 117 deletions
-55
View File
@@ -1,55 +0,0 @@
import type { Transaction } from "sequelize";
import { Event, GroupUser, type Group, type User } from "@server/models";
type Props = {
group: Group;
user: User;
actor: User;
ip: string;
transaction?: Transaction;
};
export default async function groupUserCreator({
group,
user,
actor,
ip,
transaction,
}: Props): Promise<GroupUser> {
let groupUser = await GroupUser.findOne({
where: {
groupId: group.id,
userId: user.id,
},
transaction,
});
if (!groupUser) {
groupUser = await GroupUser.create(
{
groupId: group.id,
userId: user.id,
createdById: actor.id,
},
{ transaction }
);
groupUser.user = user;
await Event.create(
{
name: "groups.add_user",
userId: user.id,
modelId: group.id,
teamId: user.teamId,
actorId: actor.id,
data: {
name: user.name,
},
ip,
},
{ transaction }
);
}
return groupUser;
}
-45
View File
@@ -1,45 +0,0 @@
import type { Transaction } from "sequelize";
import { Event, GroupUser, type Group, type User } from "@server/models";
type Props = {
group: Group;
user: User;
actor: User;
ip: string;
transaction?: Transaction;
};
export default async function groupUserDestroyer({
group,
user,
actor,
ip,
transaction,
}: Props): Promise<void> {
const groupUser = await GroupUser.unscoped().findOne({
where: {
groupId: group.id,
userId: user.id,
},
transaction,
lock: transaction?.LOCK.UPDATE,
});
if (groupUser) {
await groupUser.destroy({ transaction });
await Event.create(
{
name: "groups.remove_user",
userId: user.id,
modelId: group.id,
teamId: user.teamId,
actorId: actor.id,
data: {
name: user.name,
},
ip,
},
{ transaction }
);
}
}
+1
View File
@@ -38,6 +38,7 @@ export default async function userSuspender({
userId: user.id,
},
transaction,
hooks: false,
});
await Event.create(
{
+25
View File
@@ -7,7 +7,10 @@ import {
Table,
DataType,
Scopes,
AfterCreate,
AfterDestroy,
} from "sequelize-typescript";
import { APIContext } from "@server/types";
import Group from "./Group";
import User from "./User";
import Model from "./base/Model";
@@ -62,6 +65,28 @@ class GroupUser extends Model<
@ForeignKey(() => User)
@Column(DataType.UUID)
createdById: string;
get modelId() {
return this.groupId;
}
// hooks
@AfterCreate
public static async publishAddUserEvent(
model: GroupUser,
context: APIContext["context"]
) {
await Group.insertEvent("add_user", model, context);
}
@AfterDestroy
public static async publishRemoveUserEvent(
model: GroupUser,
context: APIContext["context"]
) {
await Group.insertEvent("remove_user", model, context);
}
}
export default GroupUser;
+1 -1
View File
@@ -183,7 +183,7 @@ class Model<
return models.event.create(
{
name: `${namespace}.${model.eventOverride?.name ?? name}`,
modelId: model.id,
modelId: "modelId" in model ? model.modelId : model.id,
collectionId:
"collectionId" in model
? model.collectionId
@@ -20,6 +20,7 @@ export default class UserDeletedProcessor extends BaseProcessor {
userId: event.userId,
},
transaction,
hooks: false,
});
await UserAuthentication.destroy({
where: {
+18 -13
View File
@@ -1,8 +1,6 @@
import Router from "koa-router";
import { Op, WhereOptions } from "sequelize";
import { MAX_AVATAR_DISPLAY } from "@shared/constants";
import groupUserCreator from "@server/commands/groupUserCreator";
import groupUserDestroyer from "@server/commands/groupUserDestroyer";
import auth from "@server/middlewares/authentication";
import { rateLimiter } from "@server/middlewares/rateLimiter";
import { transaction } from "@server/middlewares/transaction";
@@ -263,14 +261,18 @@ router.post(
const group = await Group.findByPk(id, { transaction });
authorize(actor, "update", group);
const groupUser = await groupUserCreator({
group,
user,
actor,
ip: ctx.request.ip,
transaction,
const [groupUser] = await GroupUser.findOrCreateWithCtx(ctx, {
where: {
groupId: group.id,
userId: user.id,
},
defaults: {
createdById: actor.id,
},
});
groupUser.user = user;
ctx.body = {
data: {
users: [presentUser(user)],
@@ -297,14 +299,17 @@ router.post(
const user = await User.findByPk(userId, { transaction });
authorize(actor, "read", user);
await groupUserDestroyer({
group,
user,
actor,
ip: ctx.request.ip,
const groupUser = await GroupUser.unscoped().findOne({
where: {
groupId: group.id,
userId: user.id,
},
transaction,
lock: transaction.LOCK.UPDATE,
});
await groupUser?.destroyWithCtx(ctx);
ctx.body = {
data: {
groups: [await presentGroup(group)],
-3
View File
@@ -343,9 +343,6 @@ export type GroupUserEvent = BaseEvent<UserMembership> & {
name: "groups.add_user" | "groups.remove_user";
userId: string;
modelId: string;
data: {
name: string;
};
};
export type GroupEvent = BaseEvent<Group> &