mirror of
https://github.com/spacebarchat/server.git
synced 2026-05-24 19:05:29 +00:00
✨ add user_id field to Member
This commit is contained in:
+32
-31
@@ -1,6 +1,6 @@
|
||||
import { PublicUser, User } from "./User";
|
||||
import { BaseClass } from "./BaseClass";
|
||||
import { Column, Entity, JoinColumn, JoinTable, ManyToMany, ManyToOne, OneToMany, RelationId } from "typeorm";
|
||||
import { Column, Entity, Index, JoinColumn, JoinTable, ManyToMany, ManyToOne, OneToMany, RelationId } from "typeorm";
|
||||
import { Guild } from "./Guild";
|
||||
import { Config, emitEvent } from "../util";
|
||||
import {
|
||||
@@ -12,15 +12,19 @@ import {
|
||||
} from "../interfaces";
|
||||
import { HTTPError } from "lambert-server";
|
||||
import { Role } from "./Role";
|
||||
import { ReadState } from "./ReadState";
|
||||
|
||||
@Entity("members")
|
||||
@Index(["user_id", "guild_id"], { unique: true })
|
||||
export class Member extends BaseClass {
|
||||
@JoinColumn({ name: "id" })
|
||||
@Column()
|
||||
@RelationId((member: Member) => member.user)
|
||||
user_id: string;
|
||||
|
||||
@JoinColumn({ name: "user_id" })
|
||||
@ManyToOne(() => User)
|
||||
user: User;
|
||||
|
||||
@Column({ nullable: true })
|
||||
@Column()
|
||||
@RelationId((member: Member) => member.guild)
|
||||
guild_id: string;
|
||||
|
||||
@@ -58,20 +62,20 @@ export class Member extends BaseClass {
|
||||
// read_state: ReadState;
|
||||
|
||||
static async IsInGuildOrFail(user_id: string, guild_id: string) {
|
||||
if (await Member.count({ id: user_id, guild: { id: guild_id } })) return true;
|
||||
if (await Member.count({ user_id: user_id, guild: { id: guild_id } })) return true;
|
||||
throw new HTTPError("You are not member of this guild", 403);
|
||||
}
|
||||
|
||||
static async removeFromGuild(user_id: string, guild_id: string) {
|
||||
const guild = await Guild.findOneOrFail({ select: ["owner_id"], where: { id: guild_id } });
|
||||
if (guild.owner_id === user_id) throw new Error("The owner cannot be removed of the guild");
|
||||
const member = await Member.findOneOrFail({ where: { id: user_id, guild_id }, relations: ["user"] });
|
||||
const member = await Member.findOneOrFail({ where: { user_id, guild_id }, relations: ["user"] });
|
||||
|
||||
// use promise all to execute all promises at the same time -> save time
|
||||
return Promise.all([
|
||||
Member.delete({
|
||||
id: user_id,
|
||||
guild_id: guild_id,
|
||||
user_id,
|
||||
guild_id,
|
||||
}),
|
||||
Guild.decrement({ id: guild_id }, "member_count", -1),
|
||||
|
||||
@@ -84,11 +88,8 @@ export class Member extends BaseClass {
|
||||
} as GuildDeleteEvent),
|
||||
emitEvent({
|
||||
event: "GUILD_MEMBER_REMOVE",
|
||||
data: {
|
||||
guild_id: guild_id,
|
||||
user: member.user,
|
||||
},
|
||||
guild_id: guild_id,
|
||||
data: { guild_id, user: member.user },
|
||||
guild_id,
|
||||
} as GuildMemberRemoveEvent),
|
||||
]);
|
||||
}
|
||||
@@ -97,11 +98,11 @@ export class Member extends BaseClass {
|
||||
const [member] = await Promise.all([
|
||||
// @ts-ignore
|
||||
Member.findOneOrFail({
|
||||
where: { id: user_id, guild_id: guild_id },
|
||||
where: { user_id: user_id, guild_id },
|
||||
relations: ["user", "roles"], // we don't want to load the role objects just the ids
|
||||
select: ["roles.id"],
|
||||
}),
|
||||
await Role.findOneOrFail({ id: role_id, guild_id: guild_id }),
|
||||
await Role.findOneOrFail({ id: role_id, guild_id }),
|
||||
]);
|
||||
member.roles.push(new Role({ id: role_id }));
|
||||
|
||||
@@ -110,11 +111,11 @@ export class Member extends BaseClass {
|
||||
emitEvent({
|
||||
event: "GUILD_MEMBER_UPDATE",
|
||||
data: {
|
||||
guild_id: guild_id,
|
||||
guild_id,
|
||||
user: member.user,
|
||||
roles: member.roles.map((x) => x.id),
|
||||
},
|
||||
guild_id: guild_id,
|
||||
guild_id,
|
||||
} as GuildMemberUpdateEvent),
|
||||
]);
|
||||
}
|
||||
@@ -123,11 +124,11 @@ export class Member extends BaseClass {
|
||||
const [member] = await Promise.all([
|
||||
// @ts-ignore
|
||||
Member.findOneOrFail({
|
||||
where: { id: user_id, guild_id: guild_id },
|
||||
where: { user_id, guild_id },
|
||||
relations: ["user", "roles"], // we don't want to load the role objects just the ids
|
||||
select: ["roles.id"],
|
||||
}),
|
||||
await Role.findOneOrFail({ id: role_id, guild_id: guild_id }),
|
||||
await Role.findOneOrFail({ id: role_id, guild_id }),
|
||||
]);
|
||||
member.roles = member.roles.filter((x) => x.id == role_id);
|
||||
|
||||
@@ -136,11 +137,11 @@ export class Member extends BaseClass {
|
||||
emitEvent({
|
||||
event: "GUILD_MEMBER_UPDATE",
|
||||
data: {
|
||||
guild_id: guild_id,
|
||||
guild_id,
|
||||
user: member.user,
|
||||
roles: member.roles.map((x) => x.id),
|
||||
},
|
||||
guild_id: guild_id,
|
||||
guild_id,
|
||||
} as GuildMemberUpdateEvent),
|
||||
]);
|
||||
}
|
||||
@@ -148,8 +149,8 @@ export class Member extends BaseClass {
|
||||
static async changeNickname(user_id: string, guild_id: string, nickname: string) {
|
||||
const member = await Member.findOneOrFail({
|
||||
where: {
|
||||
id: user_id,
|
||||
guild_id: guild_id,
|
||||
user_id: user_id,
|
||||
guild_id,
|
||||
},
|
||||
relations: ["user"],
|
||||
});
|
||||
@@ -161,11 +162,11 @@ export class Member extends BaseClass {
|
||||
emitEvent({
|
||||
event: "GUILD_MEMBER_UPDATE",
|
||||
data: {
|
||||
guild_id: guild_id,
|
||||
guild_id,
|
||||
user: member.user,
|
||||
nick: nickname,
|
||||
},
|
||||
guild_id: guild_id,
|
||||
guild_id,
|
||||
} as GuildMemberUpdateEvent),
|
||||
]);
|
||||
}
|
||||
@@ -174,7 +175,7 @@ export class Member extends BaseClass {
|
||||
const user = await User.getPublicUser(user_id);
|
||||
|
||||
const { maxGuilds } = Config.get().limits.user;
|
||||
const guild_count = await Member.count({ id: user_id });
|
||||
const guild_count = await Member.count({ user_id: user_id });
|
||||
if (guild_count >= maxGuilds) {
|
||||
throw new HTTPError(`You are at the ${maxGuilds} server limit.`, 403);
|
||||
}
|
||||
@@ -186,12 +187,12 @@ export class Member extends BaseClass {
|
||||
relations: ["channels", "emojis", "members", "roles", "stickers"],
|
||||
});
|
||||
|
||||
if (await Member.count({ id: user.id, guild: { id: guild_id } }))
|
||||
if (await Member.count({ user_id: user.id, guild: { id: guild_id } }))
|
||||
throw new HTTPError("You are already a member of this guild", 400);
|
||||
|
||||
const member = {
|
||||
id: user_id,
|
||||
guild_id: guild_id,
|
||||
user_id,
|
||||
guild_id,
|
||||
nick: undefined,
|
||||
roles: [guild_id], // @everyone role
|
||||
joined_at: new Date(),
|
||||
@@ -224,9 +225,9 @@ export class Member extends BaseClass {
|
||||
data: {
|
||||
...member,
|
||||
user,
|
||||
guild_id: guild_id,
|
||||
guild_id,
|
||||
},
|
||||
guild_id: guild_id,
|
||||
guild_id,
|
||||
} as GuildMemberAddEvent),
|
||||
emitEvent({
|
||||
event: "GUILD_CREATE",
|
||||
|
||||
@@ -220,7 +220,7 @@ export async function getPermission(user_id?: string, guild_id?: string, channel
|
||||
guild = await Guild.findOneOrFail({ id: guild_id });
|
||||
if (guild.owner_id === user_id) return new Permissions(Permissions.FLAGS.ADMINISTRATOR);
|
||||
|
||||
member = await Member.findOneOrFail({ where: { guild: guild_id, id: user_id }, relations: ["roles"] });
|
||||
member = await Member.findOneOrFail({ where: { guild_id, user_id }, relations: ["roles"] });
|
||||
}
|
||||
|
||||
// TODO: remove guild.roles and convert recipient_ids to recipients
|
||||
|
||||
Reference in New Issue
Block a user