diff --git a/src/routes/api/v8/channels/#CHANNELID/webhooks.ts b/src/routes/api/v8/channels/#CHANNELID/webhooks.ts
new file mode 100644
index 00000000..9a4e81fa
--- /dev/null
+++ b/src/routes/api/v8/channels/#CHANNELID/webhooks.ts
@@ -0,0 +1,4 @@
+import { Router } from "express";
+const router: Router = Router();
+
+export default router;
diff --git a/src/routes/api/v8/guilds/#id/members.ts b/src/routes/api/v8/guilds/#id/members.ts
deleted file mode 100644
index 68434830..00000000
--- a/src/routes/api/v8/guilds/#id/members.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { Request, Response, Router } from "express";
-import { GuildModel, MemberModel } from "fosscord-server-util";
-import { HTTPError } from "lambert-server";
-
-const router = Router();
-
-// TODO: needs pagination/only send over websocket
-router.get("/:id/members", async (req: Request, res: Response) => {
- const guild = await GuildModel.findOne({ id: BigInt(req.params.id) }).exec();
- if (!guild) throw new HTTPError("Guild not found", 404);
-
- var members = await MemberModel.find({ guild_id: BigInt(req.params.id) }).exec();
- return res.json(members);
-});
-
-export default router;
diff --git a/src/routes/api/v8/guilds/#id/members/index.ts b/src/routes/api/v8/guilds/#id/members/index.ts
new file mode 100644
index 00000000..4b34dc8d
--- /dev/null
+++ b/src/routes/api/v8/guilds/#id/members/index.ts
@@ -0,0 +1,36 @@
+import { Request, Response, Router } from "express";
+import { GuildModel, MemberModel } from "fosscord-server-util";
+import { HTTPError } from "lambert-server";
+import { instanceOf, Length } from "../../../../../../util/instanceOf";
+
+const router = Router();
+
+// TODO: privileged intents
+// TODO: needs pagination/only send over websocket
+router.get("/", async (req: Request, res: Response) => {
+ const guild_id = BigInt(req.params.id);
+ const guild = await GuildModel.findOne({ id: guild_id }).exec();
+ if (!guild) throw new HTTPError("Guild not found", 404);
+
+ try {
+ instanceOf({ $limit: new Length(Number, 1, 1000), $after: BigInt }, req.query, {
+ path: "query",
+ req,
+ ref: { obj: null, key: "" },
+ });
+ } catch (error) {
+ return res.status(400).json({ code: 50035, message: "Invalid Form Body", success: false, errors: error });
+ }
+
+ // @ts-ignore
+ if (!req.query.limit) req.query.limit = 1;
+ const { limit, after } = (<unknown>req.query) as { limit: number; after: bigint };
+ const query = after ? { id: { $gt: after } } : {};
+
+ var members = await MemberModel.find({ guild_id, ...query })
+ .limit(limit)
+ .exec();
+ return res.json(members);
+});
+
+export default router;
diff --git a/src/util/instanceOf.ts b/src/util/instanceOf.ts
index cc373ec1..be7124d4 100644
--- a/src/util/instanceOf.ts
+++ b/src/util/instanceOf.ts
@@ -51,7 +51,9 @@ export class Length {
constructor(public type: any, public min: number, public max: number) {}
check(value: string) {
- return value.length >= this.min && value.length <= this.max;
+ if (typeof value === "string") return value.length >= this.min && value.length <= this.max;
+ if (typeof value === "number" || typeof value === "bigint") return value >= this.min && value <= this.max;
+ return false;
}
}
|