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;
|