From 9705b01fdc760e7583576e6d6ec1f3772e78abe8 Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Thu, 22 Apr 2021 22:00:25 +0200 Subject: [PATCH 01/17] :zap: :sparkles: prod multi threading --- src/index.ts | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/index.ts b/src/index.ts index 6a0fabc4..471bf90c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,13 +5,29 @@ import "missing-native-js-functions"; import { config } from "dotenv"; config(); import { DiscordServer } from "./Server"; +import cluster from "cluster"; +import os from "os"; +const cores = os.cpus().length; -var port = Number(process.env.PORT); -if (isNaN(port)) port = 1000; +if (cluster.isMaster && process.env.production == "true") { + console.log(`Primary ${process.pid} is running`); -const server = new DiscordServer({ port }); -server.start().catch(console.error); + // Fork workers. + for (let i = 0; i < cores; i++) { + cluster.fork(); + } -// @ts-ignore -global.server = server; -export default server; + cluster.on("exit", (worker, code, signal) => { + console.log(`worker ${worker.process.pid} died, restart worker`); + cluster.fork(); + }); +} else { + var port = Number(process.env.PORT); + if (isNaN(port)) port = 1000; + + const server = new DiscordServer({ port }); + server.start().catch(console.error); + + // @ts-ignore + global.server = server; +} From 4528a96ded3f2023d193957a95ffbd070e4cfc30 Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Thu, 22 Apr 2021 23:29:06 +0200 Subject: [PATCH 02/17] prepare npm publish --- .npmignore | 1 + README.md | 32 +++++++---- package-lock.json | Bin 775569 -> 758715 bytes package.json | 18 ++++-- src/Server.ts | 10 ++-- src/index.ts | 52 +++++++----------- src/middlewares/index.ts | 10 ++-- src/start.ts | 33 +++++++++++ ...think_test.ts => rethink_test.ts.disabled} | 0 src/util/Captcha.ts | 1 + src/util/Config.ts | 6 +- tsconfig.json | 2 +- 12 files changed, 104 insertions(+), 61 deletions(-) create mode 100644 .npmignore create mode 100644 src/start.ts rename src/test/{rethink_test.ts => rethink_test.ts.disabled} (100%) diff --git a/.npmignore b/.npmignore new file mode 100644 index 00000000..05a9d0cf --- /dev/null +++ b/.npmignore @@ -0,0 +1 @@ +!dist/ \ No newline at end of file diff --git a/README.md b/README.md index bf8eed09..d83120e2 100644 --- a/README.md +++ b/README.md @@ -1,39 +1,51 @@ # Fosscord API Server -This repository contains the HTTP API Server + +This repository contains the Fosscord HTTP API Server ## Bug Tracker + [Project Board](https://github.com/fosscord/fosscord-api/projects/2) ## API -We use [express](https://expressjs.com/) for the HTTP Server and +We use [express](https://expressjs.com/) for the HTTP Server and [lambert-server](https://www.npmjs.com/package/lambert-server) for route handling and body validation (customized). ## Contribution -You should be familiar with: -- [Git](https://git-scm.com/) -- [NodeJS](https://nodejs.org/) -- [TypeScript](https://www.typescriptlang.org/) -- [MongoDB/mongoose](http://mongoosejs.com/) -and the other technologies we use +You should be familiar with: + +- [Git](https://git-scm.com/) +- [NodeJS](https://nodejs.org/) +- [TypeScript](https://www.typescriptlang.org/) +- [MongoDB/mongoose](http://mongoosejs.com/) + +and the other technologies we use ### Getting Started + Clone the Repository: + ```bash git clone https://github.com/fosscord/fosscord-api cd discord-server ``` + #### Install (dev)dependencies: + ```bash npm install npm install --only=dev ``` + #### Starting: + ``` npm start ``` + #### Debugging: + **Vscode:** -The Launch file configuration is in ``./vscode/launch.json``, -so you can just debug the server by pressing ``F5`` or the ``> Launch Server`` button +The Launch file configuration is in `./vscode/launch.json`, +so you can just debug the server by pressing `F5` or the `> Launch Server` button diff --git a/package-lock.json b/package-lock.json index bd7cb447397fa6459b05e1165541310f676df729..455aa3c4d930611124713abb98c3956760181ebd 100644 GIT binary patch delta 1247 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 H`22qZ;sM?W diff --git a/package.json b/package.json index 2047cb37..b8e591df 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,13 @@ { - "name": "fosscord-api", + "name": "@fosscord/api", "version": "1.0.0", "description": "This repository contains the HTTP API Server", - "main": "index.js", + "main": "dist/Server.js", + "types": "dist/Server.d.ts", "scripts": { "test": "jest", "test:watch": "jest --watch", - "start": "npm run build:util && npm run build && node dist/", + "start": "npm run build:util && npm run build && node dist/start", "build": "tsc -b .", "build:util": "tsc -b ./node_modules/fosscord-server-util/", "postinstall": "npm i github:fosscord/fosscord-server-util && patch-package" @@ -15,14 +16,21 @@ "type": "git", "url": "git+https://github.com/fosscord/fosscord-api.git" }, - "keywords": [], - "author": "", + "keywords": [ + "discord", + "fosscord", + "fosscord-api", + "discord open source", + "discord-open-source" + ], + "author": "Fosscord", "license": "ISC", "bugs": { "url": "https://github.com/fosscord/fosscord-api/issues" }, "homepage": "https://github.com/fosscord/fosscord-api#readme", "dependencies": { + "@fosscord/fosscord-server-util": "github:fosscord/fosscord-server-util", "@types/jest": "^26.0.22", "bcrypt": "^5.0.0", "body-parser": "^1.19.0", diff --git a/src/Server.ts b/src/Server.ts index 19a0fc5f..03222d4a 100644 --- a/src/Server.ts +++ b/src/Server.ts @@ -13,21 +13,21 @@ import { BodyParser } from "./middlewares/BodyParser"; import { Router } from "express"; import fetch from "node-fetch"; -export interface DiscordServerOptions extends ServerOptions {} +export interface FosscordServerOptions extends ServerOptions {} declare global { namespace Express { interface Request { // @ts-ignore - server: DiscordServer; + server: FosscordServer; } } } -export class DiscordServer extends Server { - public options: DiscordServerOptions; +export class FosscordServer extends Server { + public options: FosscordServerOptions; - constructor(opts?: Partial) { + constructor(opts?: Partial) { // @ts-ignore super({ ...opts, errorHandler: false, jsonBody: false }); } diff --git a/src/index.ts b/src/index.ts index 471bf90c..c6417126 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,33 +1,19 @@ -process.on("uncaughtException", console.error); -process.on("unhandledRejection", console.error); - -import "missing-native-js-functions"; -import { config } from "dotenv"; -config(); -import { DiscordServer } from "./Server"; -import cluster from "cluster"; -import os from "os"; -const cores = os.cpus().length; - -if (cluster.isMaster && process.env.production == "true") { - console.log(`Primary ${process.pid} is running`); - - // Fork workers. - for (let i = 0; i < cores; i++) { - cluster.fork(); - } - - cluster.on("exit", (worker, code, signal) => { - console.log(`worker ${worker.process.pid} died, restart worker`); - cluster.fork(); - }); -} else { - var port = Number(process.env.PORT); - if (isNaN(port)) port = 1000; - - const server = new DiscordServer({ port }); - server.start().catch(console.error); - - // @ts-ignore - global.server = server; -} +export * from "./Server"; +export * from "./middlewares/"; +export * from "./schema/Ban"; +export * from "./schema/Channel"; +export * from "./schema/Guild"; +export * from "./schema/Invite"; +export * from "./schema/Message"; +export * from "./util/Captcha"; +export * from "./util/Config"; +export * from "./util/Constants"; +export * from "./util/Event"; +export * from "./util/instanceOf"; +export * from "./util/Event"; +export * from "./util/instanceOf"; +export * from "./util/Member"; +export * from "./util/RandomInviteID"; +export * from "./util/String"; +export * from "./util/User"; +export { check as checkPassword } from "./util/passwordStrength"; diff --git a/src/middlewares/index.ts b/src/middlewares/index.ts index e3332f07..6a2993a7 100644 --- a/src/middlewares/index.ts +++ b/src/middlewares/index.ts @@ -1,4 +1,6 @@ -import { Authentication } from "./Authentication"; -import { GlobalRateLimit } from "./GlobalRateLimit"; - -export { Authentication, GlobalRateLimit }; +export * from "./GlobalRateLimit"; +export * from "./Authentication"; +export * from "./BodyParser"; +export * from "./CORS"; +export * from "./ErrorHandler"; +export * from "./RateLimit"; diff --git a/src/start.ts b/src/start.ts new file mode 100644 index 00000000..11e15941 --- /dev/null +++ b/src/start.ts @@ -0,0 +1,33 @@ +process.on("uncaughtException", console.error); +process.on("unhandledRejection", console.error); + +import "missing-native-js-functions"; +import { config } from "dotenv"; +config(); +import { FosscordServer } from "./Server"; +import cluster from "cluster"; +import os from "os"; +const cores = os.cpus().length; + +if (cluster.isMaster && process.env.production == "true") { + console.log(`Primary ${process.pid} is running`); + + // Fork workers. + for (let i = 0; i < cores; i++) { + cluster.fork(); + } + + cluster.on("exit", (worker, code, signal) => { + console.log(`worker ${worker.process.pid} died, restart worker`); + cluster.fork(); + }); +} else { + var port = Number(process.env.PORT); + if (isNaN(port)) port = 1000; + + const server = new FosscordServer({ port }); + server.start().catch(console.error); + + // @ts-ignore + global.server = server; +} diff --git a/src/test/rethink_test.ts b/src/test/rethink_test.ts.disabled similarity index 100% rename from src/test/rethink_test.ts rename to src/test/rethink_test.ts.disabled diff --git a/src/util/Captcha.ts b/src/util/Captcha.ts index e69de29b..cb0ff5c3 100644 --- a/src/util/Captcha.ts +++ b/src/util/Captcha.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/util/Config.ts b/src/util/Config.ts index 60d83e1a..1a038b1d 100644 --- a/src/util/Config.ts +++ b/src/util/Config.ts @@ -16,7 +16,7 @@ export default { setAll: Config.setAll, }; -export interface RateLimit { +export interface RateLimitOptions { count: number; timespan: number; } @@ -62,8 +62,8 @@ export interface DefaultOptions { }; routes: { auth?: { - login?: RateLimit; - register?: RateLimit; + login?: RateLimitOptions; + register?: RateLimitOptions; }; channel?: {}; // TODO: rate limit configuration for all routes diff --git a/tsconfig.json b/tsconfig.json index 0976d3f7..1d4f4886 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,5 @@ { - "include": ["src/**/*.ts"], + "include": ["src/**/*.ts", "src/test/rethink_test.ts.disabled"], "compilerOptions": { /* Visit https://aka.ms/tsconfig.json to read more about this file */ From 4b914bcd32109c16dc6e1b54af7aced22afe1a17 Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Thu, 22 Apr 2021 23:30:53 +0200 Subject: [PATCH 03/17] :art: rename to -> @fosscord/server-util --- package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index b8e591df..99c0d73e 100644 --- a/package.json +++ b/package.json @@ -30,14 +30,13 @@ }, "homepage": "https://github.com/fosscord/fosscord-api#readme", "dependencies": { - "@fosscord/fosscord-server-util": "github:fosscord/fosscord-server-util", + "@fosscord/server-util": "@fosscord/server-util", "@types/jest": "^26.0.22", "bcrypt": "^5.0.0", "body-parser": "^1.19.0", "dotenv": "^8.2.0", "express": "^4.17.1", "express-validator": "^6.9.2", - "fosscord-server-util": "github:fosscord/fosscord-server-util", "i18next": "^19.8.5", "i18next-http-middleware": "^3.1.0", "i18next-node-fs-backend": "^2.1.3", From b40d6b825b4a2074e5eb0f6f20f0388abb36dd89 Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Thu, 22 Apr 2021 23:37:07 +0200 Subject: [PATCH 04/17] npm i @fosscord/server-util --- package-lock.json | Bin 758715 -> 756135 bytes package.json | 6 +++--- src/Server.ts | 2 +- src/middlewares/Authentication.ts | 2 +- src/routes/auth/login.ts | 2 +- src/routes/auth/register.ts | 2 +- src/routes/channels/#channel_id/invites.ts | 2 +- .../#channel_id/messages/bulk-delete.ts | 4 ++-- .../channels/#channel_id/messages/index.ts | 2 +- src/routes/guilds/#guild_id/bans.ts | 2 +- src/routes/guilds/#guild_id/channels.ts | 2 +- src/routes/guilds/#guild_id/index.ts | 2 +- src/routes/guilds/#guild_id/members.ts | 2 +- src/routes/guilds/index.ts | 2 +- src/routes/invites/index.ts | 2 +- src/routes/users/@me/guilds.ts | 2 +- src/routes/users/@me/index.ts | 2 +- src/schema/Guild.ts | 2 +- src/schema/Message.ts | 2 +- src/test/test.ts | 2 +- src/util/Config.ts | 2 +- src/util/Event.ts | 2 +- src/util/Member.ts | 2 +- src/util/User.ts | 2 +- 24 files changed, 26 insertions(+), 26 deletions(-) diff --git a/package-lock.json b/package-lock.json index 455aa3c4d930611124713abb98c3956760181ebd..53482ae0e62a2a9bc9f0d62de8ad6a099b75ef25 100644 GIT binary patch delta 418 zcmdnJTyObgy$QcXi&KlrQj2s;OEPnmtQ3^u4D}53j3%2iZrZHN4%_%v3 z!W|}KWrwu<;^O4|q7;23o%*`Syy+JiSye+LOmehys@zTT^8AW@&5V=MvI0}{000mPg@%(Z=U0yl>-0J*G{X#fBK delta 920 zcmZ2JS#S4py$Qc<((;Rolk0q=q2ap!d(DoAUj15s8BgEE!oJz zBsJMG(ahMuGTAaI&BVgY+}P68*dis>(9F;>$;`;iz$8U!;sK-S3#Ku%ZI^9ii)EZ{ zJ(G)b@&$E1A(%@LRx~dRZ(kVBxP4(b(^W|hSXcoasyzLI1EUBfuC+`yGfFZsHZwCx zv$QaGW6H=J?;Lh2+Fua(#y|j=Ch(R<9 z5VLMCEo7U{9I5vazGAKGmNALjbQxgZ2H45YzpnbxB|u( zd(&08zk$&}k(Y>$0aP!+d<0H^I?y~ryhlKZ&X9TfW(5|(_Vr;LK+FlmT-(=&asMy^ E07?5q^8f$< diff --git a/package.json b/package.json index 99c0d73e..c2899076 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,8 @@ "test:watch": "jest --watch", "start": "npm run build:util && npm run build && node dist/start", "build": "tsc -b .", - "build:util": "tsc -b ./node_modules/fosscord-server-util/", - "postinstall": "npm i github:fosscord/fosscord-server-util && patch-package" + "build:util": "tsc -b ./node_modules/@fosscord/server-util/", + "postinstall": "npm i github:fosscord/@fosscord/server-util && patch-package" }, "repository": { "type": "git", @@ -30,7 +30,7 @@ }, "homepage": "https://github.com/fosscord/fosscord-api#readme", "dependencies": { - "@fosscord/server-util": "@fosscord/server-util", + "@fosscord/server-util": "^1.0.2", "@types/jest": "^26.0.22", "bcrypt": "^5.0.0", "body-parser": "^1.19.0", diff --git a/src/Server.ts b/src/Server.ts index 03222d4a..c7c52c1f 100644 --- a/src/Server.ts +++ b/src/Server.ts @@ -4,7 +4,7 @@ import { Connection } from "mongoose"; import { Server, ServerOptions } from "lambert-server"; import { Authentication, GlobalRateLimit } from "./middlewares/"; import Config from "./util/Config"; -import { db } from "fosscord-server-util"; +import { db } from "@fosscord/server-util"; import i18next from "i18next"; import i18nextMiddleware, { I18next } from "i18next-http-middleware"; import i18nextBackend from "i18next-node-fs-backend"; diff --git a/src/middlewares/Authentication.ts b/src/middlewares/Authentication.ts index 30445815..0ecc1bc0 100644 --- a/src/middlewares/Authentication.ts +++ b/src/middlewares/Authentication.ts @@ -1,6 +1,6 @@ import { NextFunction, Request, Response } from "express"; import { HTTPError } from "lambert-server"; -import { checkToken } from "fosscord-server-util"; +import { checkToken } from "@fosscord/server-util"; export const NO_AUTHORIZATION_ROUTES = [ "/api/v8/auth/login", diff --git a/src/routes/auth/login.ts b/src/routes/auth/login.ts index cc2b6202..9db2e06a 100644 --- a/src/routes/auth/login.ts +++ b/src/routes/auth/login.ts @@ -2,7 +2,7 @@ import { Request, Response, Router } from "express"; import { check, FieldErrors, Length } from "../../util/instanceOf"; import bcrypt from "bcrypt"; import jwt from "jsonwebtoken"; -import { User, UserModel } from "fosscord-server-util"; +import { User, UserModel } from "@fosscord/server-util"; import Config from "../../util/Config"; import { adjustEmail } from "./register"; diff --git a/src/routes/auth/register.ts b/src/routes/auth/register.ts index 5501203d..1a026670 100644 --- a/src/routes/auth/register.ts +++ b/src/routes/auth/register.ts @@ -1,6 +1,6 @@ import { Request, Response, Router } from "express"; import Config from "../../util/Config"; -import { trimSpecial, User, Snowflake, UserModel } from "fosscord-server-util"; +import { trimSpecial, User, Snowflake, UserModel } from "@fosscord/server-util"; import bcrypt from "bcrypt"; import { check, Email, EMAIL_REGEX, FieldErrors, Length } from "../../util/instanceOf"; import "missing-native-js-functions"; diff --git a/src/routes/channels/#channel_id/invites.ts b/src/routes/channels/#channel_id/invites.ts index da802800..5ec5163a 100644 --- a/src/routes/channels/#channel_id/invites.ts +++ b/src/routes/channels/#channel_id/invites.ts @@ -7,7 +7,7 @@ import { emitEvent } from "../../../util/Event"; import { InviteCreateSchema } from "../../../schema/Invite"; -import { getPermission, ChannelModel, InviteModel, InviteCreateEvent, toObject } from "fosscord-server-util"; +import { getPermission, ChannelModel, InviteModel, InviteCreateEvent, toObject } from "@fosscord/server-util"; const router: Router = Router(); diff --git a/src/routes/channels/#channel_id/messages/bulk-delete.ts b/src/routes/channels/#channel_id/messages/bulk-delete.ts index 89e9d720..13aea8a1 100644 --- a/src/routes/channels/#channel_id/messages/bulk-delete.ts +++ b/src/routes/channels/#channel_id/messages/bulk-delete.ts @@ -1,5 +1,5 @@ import { Router } from "express"; -import { ChannelModel, getPermission, MessageDeleteBulkEvent, MessageModel } from "fosscord-server-util"; +import { ChannelModel, getPermission, MessageDeleteBulkEvent, MessageModel } from "@fosscord/server-util"; import { HTTPError } from "lambert-server"; import Config from "../../../../util/Config"; import { emitEvent } from "../../../../util/Event"; @@ -13,7 +13,7 @@ export default router; // TODO: should this request fail, if you provide messages older than 14 days/invalid ids? // https://discord.com/developers/docs/resources/channel#bulk-delete-messages router.post("/", check({ messages: [String] }), async (req, res) => { - const channel_id = req.params.channel_id + const channel_id = req.params.channel_id; const channel = await ChannelModel.findOne({ id: channel_id }, { permission_overwrites: true, guild_id: true }).exec(); if (!channel?.guild_id) throw new HTTPError("Can't bulk delete dm channel messages", 400); diff --git a/src/routes/channels/#channel_id/messages/index.ts b/src/routes/channels/#channel_id/messages/index.ts index 4978b98a..91298326 100644 --- a/src/routes/channels/#channel_id/messages/index.ts +++ b/src/routes/channels/#channel_id/messages/index.ts @@ -9,7 +9,7 @@ import { MessageModel, Snowflake, toObject, -} from "fosscord-server-util"; +} from "@fosscord/server-util"; import { HTTPError } from "lambert-server"; import { MessageCreateSchema } from "../../../../schema/Message"; import { check, instanceOf, Length } from "../../../../util/instanceOf"; diff --git a/src/routes/guilds/#guild_id/bans.ts b/src/routes/guilds/#guild_id/bans.ts index 3de80a32..f0e3804a 100644 --- a/src/routes/guilds/#guild_id/bans.ts +++ b/src/routes/guilds/#guild_id/bans.ts @@ -1,5 +1,5 @@ import { Request, Response, Router } from "express"; -import { BanModel, getPermission, GuildBanAddEvent, GuildBanRemoveEvent, GuildModel, toObject } from "fosscord-server-util"; +import { BanModel, getPermission, GuildBanAddEvent, GuildBanRemoveEvent, GuildModel, toObject } from "@fosscord/server-util"; import { HTTPError } from "lambert-server"; import { getIpAdress } from "../../../middlewares/GlobalRateLimit"; import { BanCreateSchema } from "../../../schema/Ban"; diff --git a/src/routes/guilds/#guild_id/channels.ts b/src/routes/guilds/#guild_id/channels.ts index e0d8f3ac..d42ba481 100644 --- a/src/routes/guilds/#guild_id/channels.ts +++ b/src/routes/guilds/#guild_id/channels.ts @@ -1,5 +1,5 @@ import { Router } from "express"; -import { ChannelCreateEvent, ChannelModel, ChannelType, GuildModel, Snowflake, toObject } from "fosscord-server-util"; +import { ChannelCreateEvent, ChannelModel, ChannelType, GuildModel, Snowflake, toObject } from "@fosscord/server-util"; import { HTTPError } from "lambert-server"; import { ChannelModifySchema } from "../../../schema/Channel"; import { emitEvent } from "../../../util/Event"; diff --git a/src/routes/guilds/#guild_id/index.ts b/src/routes/guilds/#guild_id/index.ts index 7e5f49d3..96861e48 100644 --- a/src/routes/guilds/#guild_id/index.ts +++ b/src/routes/guilds/#guild_id/index.ts @@ -12,7 +12,7 @@ import { RoleModel, toObject, UserModel, -} from "fosscord-server-util"; +} from "@fosscord/server-util"; import { HTTPError } from "lambert-server"; import { GuildUpdateSchema } from "../../../schema/Guild"; import { emitEvent } from "../../../util/Event"; diff --git a/src/routes/guilds/#guild_id/members.ts b/src/routes/guilds/#guild_id/members.ts index f4e6d4e8..61493485 100644 --- a/src/routes/guilds/#guild_id/members.ts +++ b/src/routes/guilds/#guild_id/members.ts @@ -1,5 +1,5 @@ import { Request, Response, Router } from "express"; -import { GuildModel, MemberModel, toObject } from "fosscord-server-util"; +import { GuildModel, MemberModel, toObject } from "@fosscord/server-util"; import { HTTPError } from "lambert-server"; import { instanceOf, Length } from "../../../util/instanceOf"; import { PublicMemberProjection } from "../../../util/Member"; diff --git a/src/routes/guilds/index.ts b/src/routes/guilds/index.ts index 57d7ddc4..6d9b7c1b 100644 --- a/src/routes/guilds/index.ts +++ b/src/routes/guilds/index.ts @@ -1,5 +1,5 @@ import { Router, Request, Response } from "express"; -import { RoleModel, GuildModel, Snowflake, Guild } from "fosscord-server-util"; +import { RoleModel, GuildModel, Snowflake, Guild } from "@fosscord/server-util"; import { HTTPError } from "lambert-server"; import { check } from "./../../util/instanceOf"; import { GuildCreateSchema } from "../../schema/Guild"; diff --git a/src/routes/invites/index.ts b/src/routes/invites/index.ts index df74e216..7ffceb25 100644 --- a/src/routes/invites/index.ts +++ b/src/routes/invites/index.ts @@ -1,5 +1,5 @@ import { Router, Request, Response } from "express"; -import { getPermission, InviteModel, toObject } from "fosscord-server-util"; +import { getPermission, InviteModel, toObject } from "@fosscord/server-util"; import { HTTPError } from "lambert-server"; const router: Router = Router(); diff --git a/src/routes/users/@me/guilds.ts b/src/routes/users/@me/guilds.ts index d0fbaa3e..5042c17c 100644 --- a/src/routes/users/@me/guilds.ts +++ b/src/routes/users/@me/guilds.ts @@ -1,5 +1,5 @@ import { Router, Request, Response } from "express"; -import { GuildModel, MemberModel, UserModel, GuildDeleteEvent, GuildMemberRemoveEvent, toObject } from "fosscord-server-util"; +import { GuildModel, MemberModel, UserModel, GuildDeleteEvent, GuildMemberRemoveEvent, toObject } from "@fosscord/server-util"; import { HTTPError } from "lambert-server"; import { emitEvent } from "../../../util/Event"; import { getPublicUser } from "../../../util/User"; diff --git a/src/routes/users/@me/index.ts b/src/routes/users/@me/index.ts index 32877dcc..22d4cf3b 100644 --- a/src/routes/users/@me/index.ts +++ b/src/routes/users/@me/index.ts @@ -1,5 +1,5 @@ import { Router, Request, Response } from "express"; -import { UserModel } from "fosscord-server-util"; +import { UserModel } from "@fosscord/server-util"; import { HTTPError } from "lambert-server"; const router: Router = Router(); diff --git a/src/schema/Guild.ts b/src/schema/Guild.ts index 6527f35d..2b792db0 100644 --- a/src/schema/Guild.ts +++ b/src/schema/Guild.ts @@ -1,4 +1,4 @@ -import { ChannelSchema, GuildChannel } from "fosscord-server-util"; +import { ChannelSchema, GuildChannel } from "@fosscord/server-util"; import { Length } from "../util/instanceOf"; export const GuildCreateSchema = { diff --git a/src/schema/Message.ts b/src/schema/Message.ts index c0e2315a..9b62edcf 100644 --- a/src/schema/Message.ts +++ b/src/schema/Message.ts @@ -1,4 +1,4 @@ -import { Embed, EmbedImage } from "fosscord-server-util"; +import { Embed, EmbedImage } from "@fosscord/server-util"; import { Length } from "../util/instanceOf"; export const MessageCreateSchema = { diff --git a/src/test/test.ts b/src/test/test.ts index eb0cb8b3..b7d877b3 100644 --- a/src/test/test.ts +++ b/src/test/test.ts @@ -1,4 +1,4 @@ -import { getPermission } from "fosscord-server-util"; +import { getPermission } from "@fosscord/server-util"; async function main() { const t = await getPermission("811642917432066048", "812327318532915201"); diff --git a/src/util/Config.ts b/src/util/Config.ts index 1a038b1d..e500197f 100644 --- a/src/util/Config.ts +++ b/src/util/Config.ts @@ -1,4 +1,4 @@ -import { Config, Snowflake } from "fosscord-server-util"; +import { Config, Snowflake } from "@fosscord/server-util"; import crypto from "crypto"; import fs from "fs"; diff --git a/src/util/Event.ts b/src/util/Event.ts index 8a24e4bb..5ff027e5 100644 --- a/src/util/Event.ts +++ b/src/util/Event.ts @@ -1,4 +1,4 @@ -import { Event, EventModel } from "fosscord-server-util"; +import { Event, EventModel } from "@fosscord/server-util"; export async function emitEvent(payload: Omit) { const obj = { diff --git a/src/util/Member.ts b/src/util/Member.ts index 4d1b8ac5..2be9686e 100644 --- a/src/util/Member.ts +++ b/src/util/Member.ts @@ -7,7 +7,7 @@ import { GuildModel, MemberModel, UserModel, -} from "fosscord-server-util"; +} from "@fosscord/server-util"; import { HTTPError } from "lambert-server"; import Config from "./Config"; import { emitEvent } from "./Event"; diff --git a/src/util/User.ts b/src/util/User.ts index 05213642..0f3768cc 100644 --- a/src/util/User.ts +++ b/src/util/User.ts @@ -1,4 +1,4 @@ -import { toObject, UserModel } from "fosscord-server-util"; +import { toObject, UserModel } from "@fosscord/server-util"; import { HTTPError } from "lambert-server"; export const PublicUserProjection = { From 696ef6278ab6a4f48f5bc6ef46571691127b80be Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Fri, 23 Apr 2021 00:14:54 +0200 Subject: [PATCH 05/17] :bug: fix wrong permission in delete invite --- src/routes/invites/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/routes/invites/index.ts b/src/routes/invites/index.ts index 7ffceb25..7f4ff59b 100644 --- a/src/routes/invites/index.ts +++ b/src/routes/invites/index.ts @@ -21,7 +21,8 @@ router.delete("/:invite_code", async (req: Request, res: Response) => { const { guild_id, channel_id } = invite; const perms = await getPermission(req.user_id, guild_id, channel_id); - if (!perms.has("MANAGE_GUILD") || !perms.has("MANAGE_CHANNELS")) throw new HTTPError("You aren't allow", 401); + if (!perms.has("MANAGE_GUILD") && !perms.has("MANAGE_CHANNELS")) + throw new HTTPError("You missing the MANAGE_GUILD or MANAGE_CHANNELS permission", 401); await InviteModel.deleteOne({ code }).exec(); From 3e6d1103bcb121390116ed9d2b200806da0f85d9 Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Fri, 23 Apr 2021 00:15:38 +0200 Subject: [PATCH 06/17] :art: clean up permission checks to use .hasThrow() --- package-lock.json | Bin 756135 -> 756135 bytes package.json | 2 +- src/routes/channels/#channel_id/followers.ts | 9 +++++++++ src/routes/channels/#channel_id/invites.ts | 10 ++-------- .../messages/:message_id/crosspost.ts | 8 ++++++++ .../#channel_id/messages/:message_id/index.ts | 0 .../messages/:message_id/reactions.ts | 0 .../#channel_id/messages/bulk-delete.ts | 2 +- .../channels/#channel_id/messages/index.ts | 10 +++++----- src/routes/channels/#channel_id/webhooks.ts | 2 ++ src/routes/guilds/#guild_id/bans.ts | 6 ++---- src/routes/guilds/#guild_id/index.ts | 2 +- 12 files changed, 31 insertions(+), 20 deletions(-) create mode 100644 src/routes/channels/#channel_id/messages/:message_id/crosspost.ts create mode 100644 src/routes/channels/#channel_id/messages/:message_id/index.ts create mode 100644 src/routes/channels/#channel_id/messages/:message_id/reactions.ts diff --git a/package-lock.json b/package-lock.json index 53482ae0e62a2a9bc9f0d62de8ad6a099b75ef25..e5321797ca15604179a5fefc20350a55361bec78 100644 GIT binary patch delta 310 zcmZ2JS#SAdy$$?~jK-S<7!^aNKWJjrpPUe?F`ZqALuT>@0oGubD9=#CApcU!;PQ}+ zqVkGl&rqjw{m4kmJSY9o;?$h%^wPA%yb80D6c;ap$dL5#sXe&NfYhPHsCW&n`P%;1wHtJJ4-F45B%Jm=lP(fbQk);s5~OJZMM& delta 314 zcmZ2JS#SAdy$$?~j7FOU7!^aN2P|dPpPUe?FEp-&|)LgP>Zk>lZXPB{7n7aZ2ype zOz#L!U!%03> { } const { guild_id } = channel; const permission = await getPermission(user_id, guild_id); - - if (!permission.has("MANAGE_CHANNELS")) { - throw new HTTPError("You aren't authorised to access this endpoint", 401); - } + permission.hasThrow("MANAGE_CHANNELS"); const invites = await InviteModel.find({ guild_id }).exec(); diff --git a/src/routes/channels/#channel_id/messages/:message_id/crosspost.ts b/src/routes/channels/#channel_id/messages/:message_id/crosspost.ts new file mode 100644 index 00000000..17f36396 --- /dev/null +++ b/src/routes/channels/#channel_id/messages/:message_id/crosspost.ts @@ -0,0 +1,8 @@ +import { Router } from "express"; + +const router = Router(); + +// TODO: +// router.post("/", (req, res) => {}); + +export default router; diff --git a/src/routes/channels/#channel_id/messages/:message_id/index.ts b/src/routes/channels/#channel_id/messages/:message_id/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/routes/channels/#channel_id/messages/:message_id/reactions.ts b/src/routes/channels/#channel_id/messages/:message_id/reactions.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/routes/channels/#channel_id/messages/bulk-delete.ts b/src/routes/channels/#channel_id/messages/bulk-delete.ts index 13aea8a1..ff1324d7 100644 --- a/src/routes/channels/#channel_id/messages/bulk-delete.ts +++ b/src/routes/channels/#channel_id/messages/bulk-delete.ts @@ -18,7 +18,7 @@ router.post("/", check({ messages: [String] }), async (req, res) => { if (!channel?.guild_id) throw new HTTPError("Can't bulk delete dm channel messages", 400); const permission = await getPermission(req.user_id, channel?.guild_id, channel_id, { channel }); - if (!permission.has("MANAGE_MESSAGES")) throw new HTTPError("You are missing the MANAGE_MESSAGES permissions"); + permission.hasThrow("MANAGE_MESSAGES"); const { maxBulkDelete } = Config.get().limits.message; diff --git a/src/routes/channels/#channel_id/messages/index.ts b/src/routes/channels/#channel_id/messages/index.ts index 91298326..689f6733 100644 --- a/src/routes/channels/#channel_id/messages/index.ts +++ b/src/routes/channels/#channel_id/messages/index.ts @@ -62,7 +62,8 @@ router.get("/", async (req, res) => { if (channel.guild_id) { const permissions = await getPermission(req.user_id, channel.guild_id, channel_id, { channel }); - if (!permissions.has("VIEW_CHANNEL")) throw new HTTPError("You don't have permission to view this channel", 401); + permissions.hasThrow("VIEW_CHANNEL"); + if (!permissions.has("READ_MESSAGE_HISTORY")) return res.json([]); } else if (channel.recipients) { // group/dm channel @@ -106,11 +107,10 @@ router.post("/", check(MessageCreateSchema), async (req, res) => { if (channel.guild_id) { const permissions = await getPermission(req.user_id, channel.guild_id, channel_id, { channel }); - if (!permissions.has("SEND_MESSAGES")) throw new HTTPError("You don't have the SEND_MESSAGES permission"); - if (body.tts && !permissions.has("SEND_TTS_MESSAGES")) throw new HTTPError("You are missing the SEND_TTS_MESSAGES permission"); + permissions.hasThrow("SEND_MESSAGES"); + if (body.tts) permissions.hasThrow("SEND_TTS_MESSAGES"); if (body.message_reference) { - if (!permissions.has("READ_MESSAGE_HISTORY")) - throw new HTTPError("You are missing the READ_MESSAGE_HISTORY permission to reply"); + permissions.hasThrow("READ_MESSAGE_HISTORY"); if (body.message_reference.guild_id !== channel.guild_id) throw new HTTPError("You can only reference messages from this guild"); } diff --git a/src/routes/channels/#channel_id/webhooks.ts b/src/routes/channels/#channel_id/webhooks.ts index 9a4e81fa..a7a5df95 100644 --- a/src/routes/channels/#channel_id/webhooks.ts +++ b/src/routes/channels/#channel_id/webhooks.ts @@ -1,4 +1,6 @@ import { Router } from "express"; const router: Router = Router(); +router.post("/", (req, res) => {}); + export default router; diff --git a/src/routes/guilds/#guild_id/bans.ts b/src/routes/guilds/#guild_id/bans.ts index f0e3804a..f84950f9 100644 --- a/src/routes/guilds/#guild_id/bans.ts +++ b/src/routes/guilds/#guild_id/bans.ts @@ -35,7 +35,7 @@ router.post("/:user_id", check(BanCreateSchema), async (req: Request, res: Respo const banned_user = await getPublicUser(banned_user_id); const perms = await getPermission(req.user_id, guild_id); - if (!perms.has("BAN_MEMBERS")) throw new HTTPError("You don't have the permission to ban members", 403); + perms.hasThrow("BAN_MEMBERS"); if (req.user_id === banned_user_id) throw new HTTPError("You can't ban yourself", 400); await removeMember(banned_user_id, guild_id); @@ -69,9 +69,7 @@ router.delete("/:user_id", async (req: Request, res: Response) => { if (!guild) throw new HTTPError("Guild not found", 404); const perms = await getPermission(req.user_id, guild_id); - if (!perms.has("BAN_MEMBERS")) { - throw new HTTPError("No permissions", 403); - } + perms.hasThrow("BAN_MEMBERS"); await BanModel.deleteOne({ user_id: banned_user_id, diff --git a/src/routes/guilds/#guild_id/index.ts b/src/routes/guilds/#guild_id/index.ts index 96861e48..2a7d9b38 100644 --- a/src/routes/guilds/#guild_id/index.ts +++ b/src/routes/guilds/#guild_id/index.ts @@ -41,7 +41,7 @@ router.patch("/", check(GuildUpdateSchema), async (req: Request, res: Response) // TODO: guild update check image const perms = await getPermission(req.user_id, guild_id); - if (!perms.has("MANAGE_GUILD")) throw new HTTPError("You do not have the MANAGE_GUILD permission", 401); + perms.hasThrow("MANAGE_GUILD"); const guild = await GuildModel.findOneAndUpdate({ id: guild_id }, body) .populate({ path: "joined_at", match: { id: req.user_id } }) From 4a2c0ebe5f56348fcd5ebf0f3691decda3c30209 Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Fri, 23 Apr 2021 00:48:18 +0200 Subject: [PATCH 07/17] :construction: Webhook --- src/routes/channels/#channel_id/followers.ts | 1 + src/routes/channels/#channel_id/index.ts | 1 + .../#channel_id/messages/:message_id/index.ts | 6 +++++ .../messages/:message_id/reactions.ts | 6 +++++ .../channels/#channel_id/messages/index.ts | 2 +- .../channels/#channel_id/permissions.ts | 1 + src/routes/channels/#channel_id/pins.ts | 1 + src/routes/channels/#channel_id/recipients.ts | 1 + src/routes/channels/#channel_id/typing.ts | 1 + src/routes/channels/#channel_id/webhooks.ts | 25 +++++++++++++++++-- src/util/instanceOf.ts | 3 +++ 11 files changed, 45 insertions(+), 3 deletions(-) diff --git a/src/routes/channels/#channel_id/followers.ts b/src/routes/channels/#channel_id/followers.ts index 25165356..c06db61b 100644 --- a/src/routes/channels/#channel_id/followers.ts +++ b/src/routes/channels/#channel_id/followers.ts @@ -1,5 +1,6 @@ import { Router } from "express"; const router: Router = Router(); +// TODO: export default router; diff --git a/src/routes/channels/#channel_id/index.ts b/src/routes/channels/#channel_id/index.ts index 9a4e81fa..93c33ea5 100644 --- a/src/routes/channels/#channel_id/index.ts +++ b/src/routes/channels/#channel_id/index.ts @@ -1,4 +1,5 @@ import { Router } from "express"; const router: Router = Router(); +// TODO: export default router; diff --git a/src/routes/channels/#channel_id/messages/:message_id/index.ts b/src/routes/channels/#channel_id/messages/:message_id/index.ts index e69de29b..014daee7 100644 --- a/src/routes/channels/#channel_id/messages/:message_id/index.ts +++ b/src/routes/channels/#channel_id/messages/:message_id/index.ts @@ -0,0 +1,6 @@ +import { Router } from "express"; + +const router = Router(); +// TODO: + +export default router; diff --git a/src/routes/channels/#channel_id/messages/:message_id/reactions.ts b/src/routes/channels/#channel_id/messages/:message_id/reactions.ts index e69de29b..014daee7 100644 --- a/src/routes/channels/#channel_id/messages/:message_id/reactions.ts +++ b/src/routes/channels/#channel_id/messages/:message_id/reactions.ts @@ -0,0 +1,6 @@ +import { Router } from "express"; + +const router = Router(); +// TODO: + +export default router; diff --git a/src/routes/channels/#channel_id/messages/index.ts b/src/routes/channels/#channel_id/messages/index.ts index 689f6733..712bbc7a 100644 --- a/src/routes/channels/#channel_id/messages/index.ts +++ b/src/routes/channels/#channel_id/messages/index.ts @@ -22,7 +22,7 @@ const router: Router = Router(); export default router; -function isTextChannel(type: ChannelType): boolean { +export function isTextChannel(type: ChannelType): boolean { switch (type) { case ChannelType.GUILD_VOICE: case ChannelType.GUILD_CATEGORY: diff --git a/src/routes/channels/#channel_id/permissions.ts b/src/routes/channels/#channel_id/permissions.ts index 9a4e81fa..93c33ea5 100644 --- a/src/routes/channels/#channel_id/permissions.ts +++ b/src/routes/channels/#channel_id/permissions.ts @@ -1,4 +1,5 @@ import { Router } from "express"; const router: Router = Router(); +// TODO: export default router; diff --git a/src/routes/channels/#channel_id/pins.ts b/src/routes/channels/#channel_id/pins.ts index 9a4e81fa..93c33ea5 100644 --- a/src/routes/channels/#channel_id/pins.ts +++ b/src/routes/channels/#channel_id/pins.ts @@ -1,4 +1,5 @@ import { Router } from "express"; const router: Router = Router(); +// TODO: export default router; diff --git a/src/routes/channels/#channel_id/recipients.ts b/src/routes/channels/#channel_id/recipients.ts index 9a4e81fa..93c33ea5 100644 --- a/src/routes/channels/#channel_id/recipients.ts +++ b/src/routes/channels/#channel_id/recipients.ts @@ -1,4 +1,5 @@ import { Router } from "express"; const router: Router = Router(); +// TODO: export default router; diff --git a/src/routes/channels/#channel_id/typing.ts b/src/routes/channels/#channel_id/typing.ts index 9a4e81fa..93c33ea5 100644 --- a/src/routes/channels/#channel_id/typing.ts +++ b/src/routes/channels/#channel_id/typing.ts @@ -1,4 +1,5 @@ import { Router } from "express"; const router: Router = Router(); +// TODO: export default router; diff --git a/src/routes/channels/#channel_id/webhooks.ts b/src/routes/channels/#channel_id/webhooks.ts index a7a5df95..a56365b8 100644 --- a/src/routes/channels/#channel_id/webhooks.ts +++ b/src/routes/channels/#channel_id/webhooks.ts @@ -1,6 +1,27 @@ import { Router } from "express"; -const router: Router = Router(); +import { check, Length } from "../../../util/instanceOf"; +import { ChannelModel, getPermission, trimSpecial } from "@fosscord/server-util"; +import { HTTPError } from "lambert-server"; +import { isTextChannel } from "./messages/index"; -router.post("/", (req, res) => {}); +const router: Router = Router(); +// TODO: + +// TODO: use Image Data Type for avatar instead of String +router.post("/", check({ name: new Length(String, 1, 80), $avatar: String }), async (req, res) => { + const channel_id = req.params.channel_id; + const channel = await ChannelModel.findOne({ id: channel_id }, { guild_id: true, type: true }).exec(); + if (!channel) throw new HTTPError("Channel not found", 404); + + isTextChannel(channel.type); + if (!channel.guild_id) throw new HTTPError("Not a guild channel", 400); + + const permission = await getPermission(req.user_id, channel.guild_id); + permission.hasThrow("MANAGE_WEBHOOKS"); + + var { avatar, name } = req.body as { name: string; avatar?: string }; + name = trimSpecial(name); + if (name === "clyde") throw new HTTPError("Invalid name", 400); +}); export default router; diff --git a/src/util/instanceOf.ts b/src/util/instanceOf.ts index b4a231ba..e4e58092 100644 --- a/src/util/instanceOf.ts +++ b/src/util/instanceOf.ts @@ -34,6 +34,9 @@ export function FieldErrors(fields: Record Date: Fri, 23 Apr 2021 20:39:52 +0200 Subject: [PATCH 08/17] :bug: fix directory name --- src/routes/auth/login.ts | 2 +- .../messages/{:message_id => #message_id}/crosspost.ts | 0 .../#channel_id/messages/{:message_id => #message_id}/index.ts | 0 .../messages/{:message_id => #message_id}/reactions.ts | 0 4 files changed, 1 insertion(+), 1 deletion(-) rename src/routes/channels/#channel_id/messages/{:message_id => #message_id}/crosspost.ts (100%) rename src/routes/channels/#channel_id/messages/{:message_id => #message_id}/index.ts (100%) rename src/routes/channels/#channel_id/messages/{:message_id => #message_id}/reactions.ts (100%) diff --git a/src/routes/auth/login.ts b/src/routes/auth/login.ts index 9db2e06a..247ee018 100644 --- a/src/routes/auth/login.ts +++ b/src/routes/auth/login.ts @@ -2,7 +2,7 @@ import { Request, Response, Router } from "express"; import { check, FieldErrors, Length } from "../../util/instanceOf"; import bcrypt from "bcrypt"; import jwt from "jsonwebtoken"; -import { User, UserModel } from "@fosscord/server-util"; +import { UserModel } from "@fosscord/server-util"; import Config from "../../util/Config"; import { adjustEmail } from "./register"; diff --git a/src/routes/channels/#channel_id/messages/:message_id/crosspost.ts b/src/routes/channels/#channel_id/messages/#message_id/crosspost.ts similarity index 100% rename from src/routes/channels/#channel_id/messages/:message_id/crosspost.ts rename to src/routes/channels/#channel_id/messages/#message_id/crosspost.ts diff --git a/src/routes/channels/#channel_id/messages/:message_id/index.ts b/src/routes/channels/#channel_id/messages/#message_id/index.ts similarity index 100% rename from src/routes/channels/#channel_id/messages/:message_id/index.ts rename to src/routes/channels/#channel_id/messages/#message_id/index.ts diff --git a/src/routes/channels/#channel_id/messages/:message_id/reactions.ts b/src/routes/channels/#channel_id/messages/#message_id/reactions.ts similarity index 100% rename from src/routes/channels/#channel_id/messages/:message_id/reactions.ts rename to src/routes/channels/#channel_id/messages/#message_id/reactions.ts From c6e1511ae4cc87e82456d48a4eca8d06076d352d Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Fri, 23 Apr 2021 22:24:52 +0200 Subject: [PATCH 09/17] :bug: fix package --- package-lock.json | Bin 756135 -> 756156 bytes package.json | 5 ++--- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index e5321797ca15604179a5fefc20350a55361bec78..ea95261705533bcfd88796bdf8190dad66fdb20b 100644 GIT binary patch delta 308 zcmZ2JS#Qr|y$$?~j3%1}7!^aN&+li~pPUe?F@1YBmqKJnR6wX-rN5hgN=0s%k4tfK zXh2{@Zf3T3u)epEfu(0jnW1Tjdsw8qM}C>JTbO5>M_5u?L`9-@skv)dacZDfS%kTh zkD+&EiixRbxQnYnV5MP}qphvd!~;gt7ffSj+b-M47Rxx@dL|d=Xe&NfX0)or0PaocpmnVd4y1zxeSw*y@U#2}gjh&h3n3+P(zE)D?q C_GZNZ delta 291 zcmdlpS#SAdy$$?~jK-S<7!^aN&;QM+KRF>(V>)XOlR{{*OO$7*VUT~RWpH^&Mp1c1 zvS+AMxqf7%WuB9MXmM&zc6w=AVqS$=Ns5b?L1ajJcvV?ufVs0tj$vSVYLtGOS4yy- zlV6r$kzZzkOKPOCevx_M^u!HJ3X}P-us2(VwOfWU0x=U1GXpUT5VLN#3}fTcLUl

~u2VxE&<^*D{?fp&My6ga0SYven diff --git a/package.json b/package.json index 7e4dd3de..6003b7a8 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,7 @@ "test:watch": "jest --watch", "start": "npm run build:util && npm run build && node dist/start", "build": "tsc -b .", - "build:util": "tsc -b ./node_modules/@fosscord/server-util/", - "postinstall": "npm i github:fosscord/@fosscord/server-util && patch-package" + "build:util": "tsc -b ./node_modules/@fosscord/server-util/" }, "repository": { "type": "git", @@ -30,7 +29,7 @@ }, "homepage": "https://github.com/fosscord/fosscord-api#readme", "dependencies": { - "@fosscord/server-util": "^1.0.3", + "@fosscord/server-util": "^1.0.4", "@types/jest": "^26.0.22", "bcrypt": "^5.0.0", "body-parser": "^1.19.0", From d8f22c681903485258b691cc4d0abcab7fa81663 Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Fri, 23 Apr 2021 22:39:31 +0200 Subject: [PATCH 10/17] :bug: add patch-package postinstall --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 6003b7a8..f8509916 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,8 @@ "test:watch": "jest --watch", "start": "npm run build:util && npm run build && node dist/start", "build": "tsc -b .", - "build:util": "tsc -b ./node_modules/@fosscord/server-util/" + "build:util": "tsc -b ./node_modules/@fosscord/server-util/", + "postinstall": "patch-package" }, "repository": { "type": "git", From e1d06e35efddaccc1135003634ddbc570906e61e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Intevel=20=E3=83=84?= <59223342+Intevel@users.noreply.github.com> Date: Sat, 24 Apr 2021 00:10:18 +0200 Subject: [PATCH 11/17] Create index.ts --- src/routes/users/#id/index.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/routes/users/#id/index.ts diff --git a/src/routes/users/#id/index.ts b/src/routes/users/#id/index.ts new file mode 100644 index 00000000..ca280597 --- /dev/null +++ b/src/routes/users/#id/index.ts @@ -0,0 +1,15 @@ +import { Router, Request, Response } from "express"; +import { UserModel } from "@fosscord/server-util"; +import { HTTPError } from "lambert-server"; + +const router: Router = Router(); + +router.get("/", async (req: Request, res: Response) => { + const { id } = req.params; + const user = await UserModel.findOne({ id: id }).exec(); + if (!user) throw new HTTPError("User not found", 404); + + res.json(user); +}); + +export default router; From b213e2931a4e2ea1973e151dc985bede331363a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Intevel=20=E3=83=84?= <59223342+Intevel@users.noreply.github.com> Date: Sat, 24 Apr 2021 00:21:57 +0200 Subject: [PATCH 12/17] Update index.ts --- src/routes/users/#id/index.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/routes/users/#id/index.ts b/src/routes/users/#id/index.ts index ca280597..3cbeb463 100644 --- a/src/routes/users/#id/index.ts +++ b/src/routes/users/#id/index.ts @@ -1,15 +1,18 @@ import { Router, Request, Response } from "express"; -import { UserModel } from "@fosscord/server-util"; +import { UserModel} from "@fosscord/server-util"; +import { getPublicUser } from "../../../util/User"; import { HTTPError } from "lambert-server"; const router: Router = Router(); router.get("/", async (req: Request, res: Response) => { const { id } = req.params; - const user = await UserModel.findOne({ id: id }).exec(); + const user = await getPublicUser(id); if (!user) throw new HTTPError("User not found", 404); res.json(user); }); + + export default router; From 07fb93a4e6b14fa5f2ab890255d0eb054414832f Mon Sep 17 00:00:00 2001 From: stefan080106 Date: Sat, 24 Apr 2021 01:25:20 +0200 Subject: [PATCH 13/17] :construction: add guild channel delete route --- src/routes/channels/#channel_id/index.ts | 27 +++++++++++++++++++++++- src/routes/guilds/index.ts | 2 ++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/routes/channels/#channel_id/index.ts b/src/routes/channels/#channel_id/index.ts index 93c33ea5..f6970df3 100644 --- a/src/routes/channels/#channel_id/index.ts +++ b/src/routes/channels/#channel_id/index.ts @@ -1,5 +1,30 @@ +import { ChannelModel, getPermission, toObject } from "@fosscord/server-util"; import { Router } from "express"; +import { HTTPError } from "lambert-server"; const router: Router = Router(); -// TODO: +// TODO: delete channel +// TODO: Get channel + +router.delete("/", async(req,res)=>{ + const {channel_id} = req.params + + const channel = await ChannelModel.findOne({ id: channel_id }, { guild_id: true, type: true, permission_overwrites: true }).exec(); + if (!channel) throw new HTTPError("Channel not found", 404); + if (channel.guild_id) { + const permission = await getPermission(req.user_id, channel.guild_id) + permission.hasThrow("MANAGE_CHANNELS") + + // TODO Channel Update Gateway event will fire for each of them + await ChannelModel.updateMany({parent_id: channel_id}, {$set: {channel_id: null}}).exec() + + await ChannelModel.deleteOne({id: channel_id}) + } + + // TODO: Dm channel "close" not delete + + const data = toObject(channel); + //TODO: Reload channel list if request successful + res.send(data) +}) export default router; diff --git a/src/routes/guilds/index.ts b/src/routes/guilds/index.ts index 6d9b7c1b..bd491e86 100644 --- a/src/routes/guilds/index.ts +++ b/src/routes/guilds/index.ts @@ -9,6 +9,8 @@ import { addMember } from "../../util/Member"; const router: Router = Router(); +//TODO: create default channel + router.post("/", check(GuildCreateSchema), async (req: Request, res: Response) => { const body = req.body as GuildCreateSchema; From e3815e5c3e2acf8f31b177c889e2a77ca80bd165 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Intevel=20=E3=83=84?= <59223342+Intevel@users.noreply.github.com> Date: Sat, 24 Apr 2021 09:38:18 +0200 Subject: [PATCH 14/17] lol --- src/routes/users/#id/index.ts | 5 ++-- src/schema/User.ts | 43 +++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 src/schema/User.ts diff --git a/src/routes/users/#id/index.ts b/src/routes/users/#id/index.ts index 3cbeb463..d5f3b788 100644 --- a/src/routes/users/#id/index.ts +++ b/src/routes/users/#id/index.ts @@ -1,7 +1,9 @@ import { Router, Request, Response } from "express"; -import { UserModel} from "@fosscord/server-util"; +import { UserModel, toObject } from "@fosscord/server-util"; import { getPublicUser } from "../../../util/User"; import { HTTPError } from "lambert-server"; +import { UserUpdateSchema } from "../../../schema/User"; +import { check } from "../../../util/instanceOf"; const router: Router = Router(); @@ -14,5 +16,4 @@ router.get("/", async (req: Request, res: Response) => { }); - export default router; diff --git a/src/schema/User.ts b/src/schema/User.ts new file mode 100644 index 00000000..2b74a433 --- /dev/null +++ b/src/schema/User.ts @@ -0,0 +1,43 @@ +export const UserUpdateSchema = { + id: String, + username: String, + discriminator: String, + avatar: String || null, + $phone: String, + desktop: Boolean, + mobile: Boolean, + premium: Boolean, + premium_type: Number, + bot: Boolean, + system: Boolean, + nsfw_allowed: Boolean, + mfa_enabled: Boolean, + created_at: Date, + verified: Boolean, + $email: String, + flags: BigInt, + public_flags: BigInt, + $guilds: [String], +}; + +export interface UserUpdateSchema { + id: string; + username: string; + discriminator: string; + avatar: string | null; + phone?: string; + desktop: boolean; + mobile: boolean; + premium: boolean; + premium_type: number; + bot: boolean; + system: boolean; + nsfw_allowed: boolean; + mfa_enabled: boolean; + created_at: Date; + verified: boolean; + email?: string; + flags: bigint; + public_flags: bigint; + guilds: string[]; +} From ca02ca690b33731e2f1f3ca496bbfcf2d7378ac4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Intevel=20=E3=83=84?= <59223342+Intevel@users.noreply.github.com> Date: Sat, 24 Apr 2021 09:58:38 +0200 Subject: [PATCH 15/17] get /users/@me/channels --- src/routes/users/@me/channels.ts | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/routes/users/@me/channels.ts diff --git a/src/routes/users/@me/channels.ts b/src/routes/users/@me/channels.ts new file mode 100644 index 00000000..8f2cb74d --- /dev/null +++ b/src/routes/users/@me/channels.ts @@ -0,0 +1,20 @@ +import { Router, Request, Response } from "express"; +import { ChannelModel, MemberModel, UserModel, GuildDeleteEvent, GuildMemberRemoveEvent, toObject } from "@fosscord/server-util"; +import { HTTPError } from "lambert-server"; +import { emitEvent } from "../../../util/Event"; +import { getPublicUser } from "../../../util/User"; + +const router: Router = Router(); + +router.get("/", async (req: Request, res: Response) => { + const user = await UserModel.findOne({ id: req.user_id }, { guilds: true }).exec(); + if (!user) throw new HTTPError("User not found", 404); + + var testID = "829044530203328513"; //FOR TEST + + var channels = await ChannelModel.find({ recipients: req.user_id }).exec(); + + res.json(toObject(channels)); +}); + +export default router; \ No newline at end of file From 75461b9f6ed940d744c0036227b0f8ce943a26ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Intevel=20=E3=83=84?= <59223342+Intevel@users.noreply.github.com> Date: Sat, 24 Apr 2021 10:21:40 +0200 Subject: [PATCH 16/17] POST /users/@me/channels --- src/routes/users/@me/channels.ts | 73 +++++++++++++++++++++++++++++--- src/schema/Channel.ts | 19 +++++++++ 2 files changed, 85 insertions(+), 7 deletions(-) diff --git a/src/routes/users/@me/channels.ts b/src/routes/users/@me/channels.ts index 8f2cb74d..b5a53be7 100644 --- a/src/routes/users/@me/channels.ts +++ b/src/routes/users/@me/channels.ts @@ -1,20 +1,79 @@ -import { Router, Request, Response } from "express"; -import { ChannelModel, MemberModel, UserModel, GuildDeleteEvent, GuildMemberRemoveEvent, toObject } from "@fosscord/server-util"; -import { HTTPError } from "lambert-server"; -import { emitEvent } from "../../../util/Event"; -import { getPublicUser } from "../../../util/User"; +import { + Router, + Request, + Response +} from "express"; +import { + ChannelModel, + ChannelCreateEvent, + DMChannel, + UserModel, + toObject, + ChannelType, + Snowflake +} from "@fosscord/server-util"; +import { + HTTPError +} from "lambert-server"; +import { + emitEvent +} from "../../../util/Event"; +import { + getPublicUser +} from "../../../util/User"; +import { + DmChannelCreateSchema +} from "../../../schema/Channel"; +import { + check +} from "../../../util/instanceOf"; const router: Router = Router(); router.get("/", async (req: Request, res: Response) => { - const user = await UserModel.findOne({ id: req.user_id }, { guilds: true }).exec(); + const user = await UserModel.findOne({ + id: req.user_id + }, { + guilds: true + }).exec(); if (!user) throw new HTTPError("User not found", 404); var testID = "829044530203328513"; //FOR TEST - var channels = await ChannelModel.find({ recipients: req.user_id }).exec(); + var channels = await ChannelModel.find({ + recipients: req.user_id, + type: 1 + }).exec(); res.json(toObject(channels)); }); +router.post("/", check(DmChannelCreateSchema), async (req, res) => { + const body = req.body as DmChannelCreateSchema; + switch (body.type) { + case ChannelType.GUILD_CATEGORY: + case ChannelType.GUILD_TEXT: + case ChannelType.GUILD_VOICE: + throw new HTTPError("You can't create a dm channel in a guild"); + // TODO: + case ChannelType.GUILD_STORE: + throw new HTTPError("Not yet supported"); + case ChannelType.GUILD_NEWS: + // TODO: check if guild is community server + } + + const channel = { + ...body, + owner_id: req.user_id, + id: Snowflake.generate(), + created_at: new Date(), + }; + await new ChannelModel(channel).save(); + + /*Event({ event: "CHANNEL_CREATE", data: channel } as ChannelCreateEvent);*/ + + + res.json(channel); +}); + export default router; \ No newline at end of file diff --git a/src/schema/Channel.ts b/src/schema/Channel.ts index 0fafc54d..3a22872a 100644 --- a/src/schema/Channel.ts +++ b/src/schema/Channel.ts @@ -1,3 +1,4 @@ +import { ChannelType } from "@fosscord/server-util"; import { Length } from "../util/instanceOf"; export const ChannelModifySchema = { @@ -20,6 +21,24 @@ export const ChannelModifySchema = { $nsfw: Boolean, }; +export const DmChannelCreateSchema = { + owner_id: String, + $id: String, + $created_at: Date, + name: String, + type: Number, + recipients: [String] +} + +export interface DmChannelCreateSchema { + owner_id: String; + id?: String; + created_at?: Date; + name: String; + type: Number; + recipients: String[]; +} + export interface ChannelModifySchema { name: string; type: number; From f41f2cb251132ff5d2915cf98a4411f1fb0d2942 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Intevel=20=E3=83=84?= <59223342+Intevel@users.noreply.github.com> Date: Sat, 24 Apr 2021 10:28:25 +0200 Subject: [PATCH 17/17] Update channels.ts --- src/routes/users/@me/channels.ts | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/routes/users/@me/channels.ts b/src/routes/users/@me/channels.ts index b5a53be7..45371b34 100644 --- a/src/routes/users/@me/channels.ts +++ b/src/routes/users/@me/channels.ts @@ -50,22 +50,12 @@ router.get("/", async (req: Request, res: Response) => { router.post("/", check(DmChannelCreateSchema), async (req, res) => { const body = req.body as DmChannelCreateSchema; - switch (body.type) { - case ChannelType.GUILD_CATEGORY: - case ChannelType.GUILD_TEXT: - case ChannelType.GUILD_VOICE: - throw new HTTPError("You can't create a dm channel in a guild"); - // TODO: - case ChannelType.GUILD_STORE: - throw new HTTPError("Not yet supported"); - case ChannelType.GUILD_NEWS: - // TODO: check if guild is community server - } const channel = { ...body, owner_id: req.user_id, id: Snowflake.generate(), + type: ChannelType.DM, created_at: new Date(), }; await new ChannelModel(channel).save();