mirror of
https://github.com/spacebarchat/server.git
synced 2024-11-11 05:02:37 +01:00
🎨 [Route] templates refactor
This commit is contained in:
parent
4e765c424e
commit
78fa2835ab
5
.vscode/launch.json
vendored
5
.vscode/launch.json
vendored
@ -9,9 +9,10 @@
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
"name": "Launch Server",
|
||||
"program": "${workspaceFolder}/dist/index.js",
|
||||
"program": "${workspaceFolder}/dist/start.js",
|
||||
"preLaunchTask": "tsc: build - tsconfig.json",
|
||||
"outFiles": ["${workspaceFolder}/dist/**/*.js"]
|
||||
"outFiles": ["${workspaceFolder}/dist/**/*.js"],
|
||||
"envFile": "${workspaceFolder}/.env"
|
||||
},
|
||||
{
|
||||
"name": "Debug current file",
|
||||
|
12368
package-lock.json
generated
12368
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -2,135 +2,96 @@ import { Request, Response, Router } from "express";
|
||||
import { TemplateModel, GuildModel, getPermission, toObject, UserModel, Snowflake } from "@fosscord/server-util";
|
||||
import { HTTPError } from "lambert-server";
|
||||
import { TemplateCreateSchema, TemplateModifySchema } from "../../../schema/Template";
|
||||
import { emitEvent } from "../../../util/Event";
|
||||
import { check } from "../../../util/instanceOf";
|
||||
import { getPublicUser } from "../../../util/User";
|
||||
import { generateCode } from "../../../util/String";
|
||||
|
||||
const router: Router = Router();
|
||||
|
||||
router.get("/", async (req: Request, res: Response) => {
|
||||
const guild_id = req.params.id;
|
||||
const TemplateGuildProjection = {
|
||||
name: true,
|
||||
description: true,
|
||||
region: true,
|
||||
verification_level: true,
|
||||
default_message_notifications: true,
|
||||
explicit_content_filter: true,
|
||||
preferred_locale: true,
|
||||
afk_timeout: true,
|
||||
roles: true,
|
||||
channels: true,
|
||||
afk_channel_id: true,
|
||||
system_channel_id: true,
|
||||
system_channel_flags: true,
|
||||
icon_hash: true,
|
||||
};
|
||||
|
||||
const guild = await GuildModel.exists({ id: guild_id });
|
||||
if (!guild) throw new HTTPError("Guild not found", 404);
|
||||
router.get("/", async (req: Request, res: Response) => {
|
||||
const { guild_id } = req.params;
|
||||
|
||||
var templates = await TemplateModel.find({ source_guild_id: guild_id }).exec();
|
||||
return res.json(toObject(templates));
|
||||
});
|
||||
|
||||
router.post("/", check(TemplateCreateSchema), async (req: Request, res: Response) => {
|
||||
const guild_id = req.params.guild_id;
|
||||
|
||||
const guild_id = req.params.guild_id;
|
||||
const { name } = req.body;
|
||||
|
||||
const guild = await GuildModel.findOne({ id: guild_id }, { id: true }).exec();
|
||||
const guild = await GuildModel.findOne({ id: guild_id }, TemplateGuildProjection).exec();
|
||||
if (!guild) throw new HTTPError("Guild not found", 404);
|
||||
if (!name) throw new HTTPError("Unknown name", 404);
|
||||
|
||||
const user = await UserModel.findOne({ id: req.user_id }).exec();
|
||||
if (!user) throw new HTTPError("User not found", 404);
|
||||
|
||||
const perms = await getPermission(req.user_id, guild_id);
|
||||
perms.hasThrow("MANAGE_GUILD");
|
||||
|
||||
if (!perms.has("MANAGE_GUILD"))
|
||||
throw new HTTPError("You missing the MANAGE_GUILD permission", 401);
|
||||
|
||||
const template_id = Snowflake.generate();
|
||||
|
||||
var template = {
|
||||
const template = await new TemplateModel({
|
||||
...req.body,
|
||||
id: template_id,
|
||||
code: generateCode(),
|
||||
creator_id: req.user_id,
|
||||
creator: user,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date(),
|
||||
source_guild_id: guild_id,
|
||||
serialized_source_guild: guild
|
||||
}
|
||||
serialized_source_guild: guild,
|
||||
}).save();
|
||||
|
||||
const templatenew = await new TemplateModel(template).save();
|
||||
|
||||
res.json(toObject(templatenew)).send();
|
||||
res.json(toObject(template)).send();
|
||||
});
|
||||
|
||||
router.delete("/:template_id", async (req: Request, res: Response) => {
|
||||
|
||||
const guild_id = req.params.guild_id;
|
||||
const { template_id } = req.params;
|
||||
|
||||
const guild = await GuildModel.findOne({ id: guild_id }, { id: true }).exec();
|
||||
if (!guild) throw new HTTPError("Guild not found", 404);
|
||||
if (!template_id) throw new HTTPError("Unknown template_id", 404);
|
||||
|
||||
const user = await UserModel.findOne({ id: req.user_id }).exec();
|
||||
if (!user) throw new HTTPError("User not found", 404);
|
||||
router.delete("/:code", async (req: Request, res: Response) => {
|
||||
const guild_id = req.params.guild_id;
|
||||
const { code } = req.params;
|
||||
|
||||
const perms = await getPermission(req.user_id, guild_id);
|
||||
perms.hasThrow("MANAGE_GUILD");
|
||||
|
||||
if (!perms.has("MANAGE_GUILD"))
|
||||
throw new HTTPError("You missing the MANAGE_GUILD permission", 401);
|
||||
|
||||
await TemplateModel.findOneAndDelete({
|
||||
id: template_id,
|
||||
source_guild_id: guild_id
|
||||
const template = await TemplateModel.findOneAndDelete({
|
||||
code,
|
||||
}).exec();
|
||||
|
||||
res.send("Deleted");
|
||||
res.send(toObject(template));
|
||||
});
|
||||
|
||||
router.put("/:template_id", async (req: Request, res: Response) => {
|
||||
router.put("/:code", async (req: Request, res: Response) => {
|
||||
const guild_id = req.params.guild_id;
|
||||
const { code } = req.params;
|
||||
|
||||
const guild_id = req.params.guild_id;
|
||||
const { template_id } = req.params;
|
||||
|
||||
const guild = await GuildModel.findOne({ id: guild_id }, { id: true }).exec();
|
||||
const guild = await GuildModel.findOne({ id: guild_id }, TemplateGuildProjection).exec();
|
||||
if (!guild) throw new HTTPError("Guild not found", 404);
|
||||
if (!template_id) throw new HTTPError("Unknown template_id", 404);
|
||||
|
||||
const user = await UserModel.findOne({ id: req.user_id }).exec();
|
||||
if (!user) throw new HTTPError("User not found", 404);
|
||||
|
||||
const template = await TemplateModel.findOneAndDelete({ id: template_id }).exec();
|
||||
if (!template) throw new HTTPError("template not found", 404);
|
||||
|
||||
const perms = await getPermission(req.user_id, guild_id);
|
||||
perms.hasThrow("MANAGE_GUILD");
|
||||
|
||||
if (!perms.has("MANAGE_GUILD"))
|
||||
throw new HTTPError("You missing the MANAGE_GUILD permission", 401);
|
||||
const template = await TemplateModel.findOneAndUpdate({ code }, { serialized_source_guild: guild }).exec();
|
||||
|
||||
var templateobj = await TemplateModel.findOneAndUpdate({
|
||||
id: template_id,
|
||||
serialized_source_guild: guild
|
||||
}).exec();
|
||||
|
||||
res.json(toObject(templateobj)).send();
|
||||
res.json(toObject(template)).send();
|
||||
});
|
||||
|
||||
router.patch("/:template_id", check(TemplateModifySchema), async (req: Request, res: Response) => {
|
||||
const guild_id = req.params.guild_id;
|
||||
const { template_id } = req.params;
|
||||
|
||||
const guild = await GuildModel.findOne({ id: guild_id }, { id: true }).exec();
|
||||
if (!guild) throw new HTTPError("Guild not found", 404);
|
||||
if (!template_id) throw new HTTPError("Unknown template_id", 404);
|
||||
|
||||
const user = await UserModel.findOne({ id: req.user_id }).exec();
|
||||
if (!user) throw new HTTPError("User not found", 404);
|
||||
|
||||
const template = await TemplateModel.findOne({ id: template_id }).exec();
|
||||
if (!template) throw new HTTPError("template not found", 404);
|
||||
router.patch("/:code", check(TemplateModifySchema), async (req: Request, res: Response) => {
|
||||
const { guild_id } = req.params;
|
||||
const { code } = req.params;
|
||||
|
||||
const perms = await getPermission(req.user_id, guild_id);
|
||||
perms.hasThrow("MANAGE_GUILD");
|
||||
|
||||
if (!perms.has("MANAGE_GUILD"))
|
||||
throw new HTTPError("You missing the MANAGE_GUILD permission", 401);
|
||||
const template = await TemplateModel.findOneAndUpdate({ code }, { name: req.body.name, description: req.body.description }).exec();
|
||||
|
||||
var templateobj = await TemplateModel.findOneAndUpdate({
|
||||
id: template_id
|
||||
}, {name: req.body.name,
|
||||
description: req.body.description || "No description"}).exec();
|
||||
|
||||
res.json(toObject(templateobj)).send();
|
||||
res.json(toObject(template)).send();
|
||||
});
|
||||
|
||||
export default router;
|
||||
|
@ -8,23 +8,17 @@ import { check } from "../../../util/instanceOf";
|
||||
import Config from "../../../util/Config";
|
||||
import { addMember } from "../../../util/Member";
|
||||
|
||||
router.get("/:template_id", async (req: Request, res: Response) => {
|
||||
router.get("/:code", async (req: Request, res: Response) => {
|
||||
const { code } = req.params;
|
||||
|
||||
const guild_id = req.params.guild_id;
|
||||
const { template_id } = req.params;
|
||||
|
||||
const guild = await GuildModel.findOne({ id: guild_id }, { id: true }).exec();
|
||||
if (!guild) throw new HTTPError("Guild not found", 404);
|
||||
if (!template_id) throw new HTTPError("Unknown template_id", 404);
|
||||
|
||||
const template = await TemplateModel.findOne({ id: template_id }).exec();
|
||||
const template = await TemplateModel.findOne({ id: code }).exec();
|
||||
if (!template) throw new HTTPError("template not found", 404);
|
||||
|
||||
res.json(toObject(template)).send();
|
||||
});
|
||||
|
||||
router.post("/:template_id", check(GuildTemplateCreateSchema), async (req: Request, res: Response) => {
|
||||
const { template_id } = req.params;
|
||||
router.post("/:code", check(GuildTemplateCreateSchema), async (req: Request, res: Response) => {
|
||||
const { code } = req.params;
|
||||
const body = req.body as GuildTemplateCreateSchema;
|
||||
|
||||
const { maxGuilds } = Config.get().limits.user;
|
||||
@ -34,9 +28,7 @@ router.post("/:template_id", check(GuildTemplateCreateSchema), async (req: Reque
|
||||
throw new HTTPError(`Maximum number of guilds reached ${maxGuilds}`, 403);
|
||||
}
|
||||
|
||||
if (!template_id) throw new HTTPError("Unknown template_id", 404);
|
||||
|
||||
const template = await TemplateModel.findOne({ id: template_id }).exec();
|
||||
const template = await TemplateModel.findOne({ code: code }).exec();
|
||||
if (!template) throw new HTTPError("template not found", 404);
|
||||
|
||||
const guild_id = Snowflake.generate();
|
||||
@ -45,7 +37,7 @@ router.post("/:template_id", check(GuildTemplateCreateSchema), async (req: Reque
|
||||
...body,
|
||||
...template.serialized_source_guild,
|
||||
id: guild_id,
|
||||
owner_id: req.user_id
|
||||
owner_id: req.user_id,
|
||||
};
|
||||
|
||||
await Promise.all([
|
||||
@ -68,5 +60,4 @@ router.post("/:template_id", check(GuildTemplateCreateSchema), async (req: Reque
|
||||
res.status(201).json({ id: guild.id });
|
||||
});
|
||||
|
||||
|
||||
export default router;
|
||||
|
@ -1,21 +1,19 @@
|
||||
export const TemplateCreateSchema = {
|
||||
name: String,
|
||||
$description: String,
|
||||
|
||||
};
|
||||
|
||||
export interface TemplateCreateSchema {
|
||||
name: string,
|
||||
description?: string,
|
||||
name: string;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export const TemplateModifySchema = {
|
||||
name: String,
|
||||
$description: String,
|
||||
|
||||
};
|
||||
|
||||
export interface TemplateModifySchema {
|
||||
name: string,
|
||||
description?: string,
|
||||
name: string;
|
||||
description?: string;
|
||||
}
|
||||
|
47
src/util/Base64.ts
Normal file
47
src/util/Base64.ts
Normal file
@ -0,0 +1,47 @@
|
||||
const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+";
|
||||
|
||||
// binary to string lookup table
|
||||
const b2s = alphabet.split("");
|
||||
|
||||
// string to binary lookup table
|
||||
// 123 == 'z'.charCodeAt(0) + 1
|
||||
const s2b = new Array(123);
|
||||
for (let i = 0; i < alphabet.length; i++) {
|
||||
s2b[alphabet.charCodeAt(i)] = i;
|
||||
}
|
||||
|
||||
// number to base64
|
||||
export const ntob = (n: number): string => {
|
||||
if (n < 0) return `-${ntob(-n)}`;
|
||||
|
||||
let lo = n >>> 0;
|
||||
let hi = (n / 4294967296) >>> 0;
|
||||
|
||||
let right = "";
|
||||
while (hi > 0) {
|
||||
right = b2s[0x3f & lo] + right;
|
||||
lo >>>= 6;
|
||||
lo |= (0x3f & hi) << 26;
|
||||
hi >>>= 6;
|
||||
}
|
||||
|
||||
let left = "";
|
||||
do {
|
||||
left = b2s[0x3f & lo] + left;
|
||||
lo >>>= 6;
|
||||
} while (lo > 0);
|
||||
|
||||
return left + right;
|
||||
};
|
||||
|
||||
// base64 to number
|
||||
export const bton = (base64: string) => {
|
||||
let number = 0;
|
||||
const sign = base64.charAt(0) === "-" ? 1 : 0;
|
||||
|
||||
for (let i = sign; i < base64.length; i++) {
|
||||
number = number * 64 + s2b[base64.charCodeAt(i)];
|
||||
}
|
||||
|
||||
return sign ? -number : number;
|
||||
};
|
@ -1,4 +1,5 @@
|
||||
import { Request } from "express";
|
||||
import { ntob } from "./Base64";
|
||||
import { FieldErrors } from "./instanceOf";
|
||||
|
||||
export function checkLength(str: string, min: number, max: number, key: string, req: Request) {
|
||||
@ -11,3 +12,7 @@ export function checkLength(str: string, min: number, max: number, key: string,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export function generateCode() {
|
||||
return ntob(Date.now() + Math.randomIntBetween(0, 10000));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user