🎨 restructure + add/remove Member() function

This commit is contained in:
Flam3rboy 2021-02-22 15:51:53 +01:00
parent c16a221402
commit a0cb65ccad
11 changed files with 147 additions and 22 deletions

4
package-lock.json generated
View File

@ -1363,7 +1363,7 @@
}, },
"node_modules/fosscord-server-util": { "node_modules/fosscord-server-util": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "git+ssh://git@github.com/fosscord/fosscord-server-util.git#0ab57bb6cd92dbd8c90f716645139d691de7493d", "resolved": "git+ssh://git@github.com/fosscord/fosscord-server-util.git#c058020a7ca033077755594e0cb0a0658d10596f",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"jsonwebtoken": "^8.5.1", "jsonwebtoken": "^8.5.1",
@ -5077,7 +5077,7 @@
"integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
}, },
"fosscord-server-util": { "fosscord-server-util": {
"version": "git+ssh://git@github.com/fosscord/fosscord-server-util.git#0ab57bb6cd92dbd8c90f716645139d691de7493d", "version": "git+ssh://git@github.com/fosscord/fosscord-server-util.git#c058020a7ca033077755594e0cb0a0658d10596f",
"from": "fosscord-server-util@github:fosscord/fosscord-server-util", "from": "fosscord-server-util@github:fosscord/fosscord-server-util",
"requires": { "requires": {
"jsonwebtoken": "^8.5.1", "jsonwebtoken": "^8.5.1",

View File

@ -4,7 +4,7 @@ import { Connection } from "mongoose";
import { Server, ServerOptions } from "lambert-server"; import { Server, ServerOptions } from "lambert-server";
import { Authentication, GlobalRateLimit } from "./middlewares/"; import { Authentication, GlobalRateLimit } from "./middlewares/";
import Config from "./util/Config"; import Config from "./util/Config";
import { db } from "./routes/api/v8/channels/#channelid/node_modules/fosscord-server-util"; import { db } from "fosscord-server-util";
import i18next from "i18next"; import i18next from "i18next";
import i18nextMiddleware, { I18next } from "i18next-http-middleware"; import i18nextMiddleware, { I18next } from "i18next-http-middleware";
import i18nextBackend from "i18next-node-fs-backend"; import i18nextBackend from "i18next-node-fs-backend";

View File

@ -1,6 +1,6 @@
import { NextFunction, Request, Response } from "express"; import { NextFunction, Request, Response } from "express";
import { HTTPError } from "lambert-server"; import { HTTPError } from "lambert-server";
import { checkToken } from "../routes/api/v8/channels/#channelid/node_modules/fosscord-server-util"; import { checkToken } from "fosscord-server-util";
export const NO_AUTHORIZATION_ROUTES = ["/api/v8/auth/login", "/api/v8/auth/register"]; export const NO_AUTHORIZATION_ROUTES = ["/api/v8/auth/login", "/api/v8/auth/register"];

View File

@ -2,7 +2,7 @@ import { Request, Response, Router } from "express";
import { check, FieldErrors, Length } from "../../../../util/instanceOf"; import { check, FieldErrors, Length } from "../../../../util/instanceOf";
import bcrypt from "bcrypt"; import bcrypt from "bcrypt";
import jwt from "jsonwebtoken"; import jwt from "jsonwebtoken";
import { User, UserModel } from "../channels/#channelid/node_modules/fosscord-server-util"; import { User, UserModel } from "fosscord-server-util";
import Config from "../../../../util/Config"; import Config from "../../../../util/Config";
import { adjustEmail } from "./register"; import { adjustEmail } from "./register";

View File

@ -1,6 +1,6 @@
import { Request, Response, Router } from "express"; import { Request, Response, Router } from "express";
import Config from "../../../../util/Config"; import Config from "../../../../util/Config";
import { trimSpecial, User, Snowflake, UserModel } from "../channels/#channelid/node_modules/fosscord-server-util"; import { trimSpecial, User, Snowflake, UserModel } from "fosscord-server-util";
import bcrypt from "bcrypt"; import bcrypt from "bcrypt";
import { check, Email, EMAIL_REGEX, FieldErrors, Length } from "../../../../util/instanceOf"; import { check, Email, EMAIL_REGEX, FieldErrors, Length } from "../../../../util/instanceOf";
import "missing-native-js-functions"; import "missing-native-js-functions";

View File

@ -1,13 +1,8 @@
import { Router, Request, Response } from "express"; import { Router, Request, Response } from "express";
import { import { GuildModel, MemberModel, UserModel, GuildDeleteEvent, GuildMemberRemoveEvent } from "fosscord-server-util";
GuildModel,
MemberModel,
UserModel,
GuildDeleteEvent,
GuildMemberRemoveEvent,
} from "../../channels/#channelid/node_modules/fosscord-server-util";
import { HTTPError } from "lambert-server"; import { HTTPError } from "lambert-server";
import { emitEvent } from "../../../../../util/Event"; import { emitEvent } from "../../../../../util/Event";
import { getPublicUser } from "../../../../../util/User";
const router: Router = Router(); const router: Router = Router();
@ -20,16 +15,22 @@ router.get("/", async (req: Request, res: Response) => {
if (!user) throw new HTTPError("User not found", 404); if (!user) throw new HTTPError("User not found", 404);
var guildIDs = user.guilds || []; var guildIDs = user.guilds || [];
var guildsss = await GuildModel.find({ id: { $in: guildIDs } }).exec(); var guild = await GuildModel.find({ id: { $in: guildIDs } }).exec();
res.json(guildsss); res.json(guild);
}); });
// user send to leave a certain guild
router.delete("/:id", async (req: Request, res: Response) => { router.delete("/:id", async (req: Request, res: Response) => {
const guildID = BigInt(req.params.id); const guildID = BigInt(req.params.id);
if (await GuildModel.findOne({ id: guildID, owner_id: req.userid }).exec()) const guild = await GuildModel.findOne({ id: guildID }).exec();
throw new HTTPError("You can't leave your own guild", 400);
var user = await UserModel.findOneAndUpdate({ id: req.userid }, { $pull: { guilds: guildID } }).exec(); if (!guild) throw new HTTPError("Guild doesn't exist", 404);
if (guild.owner_id === req.userid) throw new HTTPError("You can't leave your own guild", 400);
await MemberModel.deleteOne({ id: req.userid, guild_id: guildID }).exec(); await MemberModel.deleteOne({ id: req.userid, guild_id: guildID }).exec();
await UserModel.updateOne({ id: req.userid }, { $pull: { guilds: guildID } }).exec();
const user = await getPublicUser(req.userid);
await emitEvent({ await emitEvent({
event: "GUILD_DELETE", event: "GUILD_DELETE",
data: { data: {

8
src/test/test.ts Normal file
View File

@ -0,0 +1,8 @@
import { getPermission } from "fosscord-server-util";
async function main() {
const t = await getPermission(811642917432066048n, 812327318532915201n);
console.log(t);
}
main();

View File

@ -1,4 +1,4 @@
import { Config } from "../routes/api/v8/channels/#channelid/node_modules/fosscord-server-util"; import { Config } from "fosscord-server-util";
import crypto from "crypto"; import crypto from "crypto";
import fs from "fs"; import fs from "fs";

View File

@ -1,10 +1,10 @@
import { Event, EventModel } from "../routes/api/v8/channels/#channelid/node_modules/fosscord-server-util"; import { Event, EventModel } from "fosscord-server-util";
export async function emitEvent(payload: Omit<Event, "created_at">) { export async function emitEvent(payload: Omit<Event, "created_at">) {
const emitEvent = { const obj = {
created_at: new Date(), // in seconds created_at: new Date(), // in seconds
...payload, ...payload,
}; };
return await new EventModel(emitEvent).save(); return await new EventModel(obj).save();
} }

98
src/util/Member.ts Normal file
View File

@ -0,0 +1,98 @@
import {
Guild,
GuildCreateEvent,
GuildDeleteEvent,
GuildMemberAddEvent,
GuildMemberRemoveEvent,
GuildModel,
MemberModel,
UserModel,
} from "fosscord-server-util";
import { HTTPError } from "lambert-server";
import { emitEvent } from "./Event";
import { getPublicUser } from "./User";
export async function addMember(user_id: bigint, guild_id: bigint, cache?: { guild?: Guild }) {
const user = await getPublicUser(user_id);
const guild = cache?.guild || (await GuildModel.findOne({ id: guild_id }).exec());
const member = {
id: user_id,
guild_id: guild_id,
nick: undefined,
roles: [guild_id], // @everyone role
joined_at: Date.now(),
premium_since: undefined,
deaf: false,
mute: false,
pending: false,
};
return Promise.all([
new MemberModel({
...member,
settings: {
channel_overrides: [],
message_notifications: 0,
mobile_push: true,
mute_config: null,
muted: false,
suppress_everyone: false,
suppress_roles: false,
version: 0,
},
}).save(),
UserModel.updateOne({ id: user_id }, { $push: { guilds: guild_id } }).exec(),
GuildModel.updateOne({ id: guild_id }, { $inc: { member_count: 1 } }).exec(),
emitEvent({
event: "GUILD_MEMBER_ADD",
data: {
...member,
user,
guild_id: guild_id,
},
guild_id: guild_id,
} as GuildMemberAddEvent),
emitEvent({
event: "GUILD_CREATE",
data: guild,
guild_id: guild_id,
} as GuildCreateEvent),
]);
}
export async function removeMember(user_id: bigint, guild_id: bigint) {
const user = await getPublicUser(user_id);
const guild = await GuildModel.findOne({ id: guild_id }, { owner_id: true }).exec();
if (!guild) throw new HTTPError("Guild not found", 404);
if (guild.owner_id === user_id) throw new Error("The owner cannot be removed of the guild");
// use promise all to execute all promises at the same time -> save time
return Promise.all([
MemberModel.deleteOne({
id: user_id,
guild_id: guild_id,
}).exec(),
UserModel.updateOne({ id: user.id }, { $pull: { guilds: guild_id } }).exec(),
GuildModel.updateOne({ id: guild_id }, { $inc: { member_count: -1 } }).exec(),
emitEvent({
event: "GUILD_DELETE",
data: {
id: guild_id,
},
user_id: user_id,
} as GuildDeleteEvent),
emitEvent({
event: "GUILD_MEMBER_REMOVE",
data: {
guild_id: guild_id,
user: user,
},
guild_id: guild_id,
} as GuildMemberRemoveEvent),
]);
}

18
src/util/User.ts Normal file
View File

@ -0,0 +1,18 @@
import { UserModel } from "fosscord-server-util";
import { HTTPError } from "lambert-server";
export async function getPublicUser(user_id: bigint, additional_fields?: any) {
const user = await UserModel.findOne(
{ id: user_id },
{
username: true,
discriminator: true,
id: true,
public_flags: true,
avatar: true,
...additional_fields,
}
).exec();
if (!user) throw new HTTPError("User not found", 404);
return user;
}