[Channels] get messages
This commit is contained in:
parent
87b38d740b
commit
91e52d10b4
@ -1,48 +0,0 @@
|
|||||||
import { Router } from "express";
|
|
||||||
import { ChannelModel, ChannelType, getPermission, MessageModel } from "fosscord-server-util";
|
|
||||||
import { HTTPError } from "lambert-server";
|
|
||||||
import { instanceOf, Length } from "../../../../../util/instanceOf";
|
|
||||||
const router: Router = Router();
|
|
||||||
|
|
||||||
export default router;
|
|
||||||
|
|
||||||
router.get("/", async (req, res) => {
|
|
||||||
const channel_id = BigInt(req.params.channel_id);
|
|
||||||
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);
|
|
||||||
|
|
||||||
const type: ChannelType = channel.type;
|
|
||||||
switch (type) {
|
|
||||||
case ChannelType.GUILD_VOICE:
|
|
||||||
case ChannelType.GUILD_CATEGORY:
|
|
||||||
throw new HTTPError("not a text channel", 400);
|
|
||||||
case ChannelType.DM:
|
|
||||||
case ChannelType.GROUP_DM:
|
|
||||||
case ChannelType.GUILD_NEWS:
|
|
||||||
case ChannelType.GUILD_STORE:
|
|
||||||
case ChannelType.GUILD_TEXT:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
instanceOf({ $around: BigInt, $after: BigInt, $before: BigInt, $limit: new Length(Number, 1, 100) }, req.query, {
|
|
||||||
path: "query",
|
|
||||||
req,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (channel.guild_id) {
|
|
||||||
const permissions = await getPermission(req.userid, channel.guild_id, channel_id, { channel });
|
|
||||||
if (!permissions.has("VIEW_CHANNEL"))
|
|
||||||
throw new HTTPError("You don't have permission to view this channel", 401);
|
|
||||||
if (permissions.has("READ_MESSAGE_HISTORY")) return res.json([]);
|
|
||||||
} else if (channel.recipients) {
|
|
||||||
// group/dm channel
|
|
||||||
if (!channel.recipients.includes(req.userid))
|
|
||||||
throw new HTTPError("You don't have permission to view this channel", 401);
|
|
||||||
} else {
|
|
||||||
// idk what this channel is, can probably be removed
|
|
||||||
throw new HTTPError("Unkown channel type", 500);
|
|
||||||
}
|
|
||||||
});
|
|
85
src/routes/api/v8/channels/#channel_id/messages/index.ts
Normal file
85
src/routes/api/v8/channels/#channel_id/messages/index.ts
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
import { Router } from "express";
|
||||||
|
import { ChannelModel, ChannelType, getPermission, MessageModel } from "fosscord-server-util";
|
||||||
|
import { HTTPError } from "lambert-server";
|
||||||
|
import { check, instanceOf, Length } from "../../../../../../util/instanceOf";
|
||||||
|
import { PublicUserProjection } from "../../../../../../util/User";
|
||||||
|
const router: Router = Router();
|
||||||
|
|
||||||
|
export default router;
|
||||||
|
|
||||||
|
function isTextChannel(type: ChannelType): boolean {
|
||||||
|
switch (type) {
|
||||||
|
case ChannelType.GUILD_VOICE:
|
||||||
|
case ChannelType.GUILD_CATEGORY:
|
||||||
|
throw new HTTPError("not a text channel", 400);
|
||||||
|
case ChannelType.DM:
|
||||||
|
case ChannelType.GROUP_DM:
|
||||||
|
case ChannelType.GUILD_NEWS:
|
||||||
|
case ChannelType.GUILD_STORE:
|
||||||
|
case ChannelType.GUILD_TEXT:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
router.get("/", async (req, res) => {
|
||||||
|
const channel_id = BigInt(req.params.channel_id);
|
||||||
|
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);
|
||||||
|
|
||||||
|
isTextChannel(channel.type);
|
||||||
|
|
||||||
|
try {
|
||||||
|
instanceOf({ $around: BigInt, $after: BigInt, $before: BigInt, $limit: new Length(Number, 1, 100) }, req.query, {
|
||||||
|
path: "query",
|
||||||
|
req,
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
return res.status(400).json({ code: 50035, message: "Invalid Query", success: false, errors: error });
|
||||||
|
}
|
||||||
|
var { around, after, before, limit }: { around?: bigint; after?: bigint; before?: bigint; limit?: number } = req.query;
|
||||||
|
if (!limit) limit = 50;
|
||||||
|
var halfLimit = BigInt(Math.floor(limit / 2));
|
||||||
|
|
||||||
|
if ([ChannelType.GUILD_VOICE, ChannelType.GUILD_CATEGORY, ChannelType.GUILD_STORE].includes(channel.type))
|
||||||
|
throw new HTTPError("Not a text channel");
|
||||||
|
|
||||||
|
if (channel.guild_id) {
|
||||||
|
const permissions = await getPermission(req.userid, channel.guild_id, channel_id, { channel });
|
||||||
|
if (!permissions.has("VIEW_CHANNEL")) throw new HTTPError("You don't have permission to view this channel", 401);
|
||||||
|
if (!permissions.has("READ_MESSAGE_HISTORY")) return res.json([]);
|
||||||
|
} else if (channel.recipients) {
|
||||||
|
// group/dm channel
|
||||||
|
if (!channel.recipients.includes(req.userid)) throw new HTTPError("You don't have permission to view this channel", 401);
|
||||||
|
}
|
||||||
|
|
||||||
|
var query: any;
|
||||||
|
if (after) query = MessageModel.find({ channel_id, id: { $gt: after } });
|
||||||
|
else if (before) query = MessageModel.find({ channel_id, id: { $lt: before } });
|
||||||
|
else if (around) query = MessageModel.find({ channel_id, id: { $gt: around - halfLimit, $lt: around + halfLimit } });
|
||||||
|
else {
|
||||||
|
query = MessageModel.find({ channel_id }).sort({ id: -1 });
|
||||||
|
}
|
||||||
|
|
||||||
|
const messages = await query
|
||||||
|
.limit(limit)
|
||||||
|
.populate({ path: "author", select: PublicUserProjection })
|
||||||
|
.populate({ path: "mentions", select: PublicUserProjection })
|
||||||
|
.populate({ path: "mention_channels", select: { id: true, guild_id: true, type: true, name: true } })
|
||||||
|
.populate("mention_roles")
|
||||||
|
// .populate({ path: "member", select: PublicMemberProjection })
|
||||||
|
.exec();
|
||||||
|
|
||||||
|
return res.json(messages);
|
||||||
|
});
|
||||||
|
|
||||||
|
router.post("/", check(), async (req, res) => {
|
||||||
|
const channel_id = BigInt(req.params.channel_id);
|
||||||
|
|
||||||
|
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 permissions = await getPermission(req.userid, channel.guild_id, channel_id, { channel });
|
||||||
|
if (!permissions.has("SEND_MESSAGES")) throw new HTTPError("You don't have the SEND_MESSAGES permission");
|
||||||
|
}
|
||||||
|
});
|
Loading…
x
Reference in New Issue
Block a user