summary refs log tree commit diff
path: root/util/src/models/Member.ts
diff options
context:
space:
mode:
Diffstat (limited to 'util/src/models/Member.ts')
-rw-r--r--util/src/models/Member.ts109
1 files changed, 109 insertions, 0 deletions
diff --git a/util/src/models/Member.ts b/util/src/models/Member.ts
new file mode 100644
index 00000000..d1c9ad9b
--- /dev/null
+++ b/util/src/models/Member.ts
@@ -0,0 +1,109 @@
+import { PublicUser, PublicUserProjection, User, UserModel } from "./User";
+import { Schema, Types, Document } from "mongoose";
+import db from "../util/Database";
+
+export const PublicMemberProjection = {
+	id: true,
+	guild_id: true,
+	nick: true,
+	roles: true,
+	joined_at: true,
+	pending: true,
+	deaf: true,
+	mute: true,
+	premium_since: true,
+};
+
+export interface Member {
+	id: string;
+	guild_id: string;
+	nick?: string;
+	roles: string[];
+	joined_at: Date;
+	premium_since?: number;
+	deaf: boolean;
+	mute: boolean;
+	pending: boolean;
+	settings: UserGuildSettings;
+	read_state: Record<string, string | null>;
+	// virtual
+	user?: User;
+}
+
+export interface MemberDocument extends Member, Document {
+	id: string;
+}
+
+export interface UserGuildSettings {
+	channel_overrides: {
+		channel_id: string;
+		message_notifications: number;
+		mute_config: MuteConfig;
+		muted: boolean;
+	}[];
+	message_notifications: number;
+	mobile_push: boolean;
+	mute_config: MuteConfig;
+	muted: boolean;
+	suppress_everyone: boolean;
+	suppress_roles: boolean;
+	version: number;
+}
+
+export interface MuteConfig {
+	end_time: number;
+	selected_time_window: number;
+}
+
+const MuteConfig = {
+	end_time: Number,
+	selected_time_window: Number,
+};
+
+export const MemberSchema = new Schema({
+	id: { type: String, required: true },
+	guild_id: String,
+	nick: String,
+	roles: [String],
+	joined_at: Date,
+	premium_since: Number,
+	deaf: Boolean,
+	mute: Boolean,
+	pending: Boolean,
+	read_state: Object,
+	settings: {
+		channel_overrides: [
+			{
+				channel_id: String,
+				message_notifications: Number,
+				mute_config: MuteConfig,
+				muted: Boolean,
+			},
+		],
+		message_notifications: Number,
+		mobile_push: Boolean,
+		mute_config: MuteConfig,
+		muted: Boolean,
+		suppress_everyone: Boolean,
+		suppress_roles: Boolean,
+		version: Number,
+	},
+});
+
+MemberSchema.virtual("user", {
+	ref: UserModel,
+	localField: "id",
+	foreignField: "id",
+	justOne: true,
+	autopopulate: {
+		select: PublicUserProjection,
+	},
+});
+
+// @ts-ignore
+export const MemberModel = db.model<MemberDocument>("Member", MemberSchema, "members");
+
+// @ts-ignore
+export interface PublicMember extends Omit<Member, "settings" | "id" | "read_state"> {
+	user: PublicUser;
+}