diff --git a/assets/openapi.json b/assets/openapi.json
index 5cf31327..be317720 100644
Binary files a/assets/openapi.json and b/assets/openapi.json differ
diff --git a/assets/schemas.json b/assets/schemas.json
index cd3a018f..aecc76a2 100644
Binary files a/assets/schemas.json and b/assets/schemas.json differ
diff --git a/src/api/routes/channels/#channel_id/webhooks.ts b/src/api/routes/channels/#channel_id/webhooks.ts
index 4c1ccbdf..7533fceb 100644
--- a/src/api/routes/channels/#channel_id/webhooks.ts
+++ b/src/api/routes/channels/#channel_id/webhooks.ts
@@ -1,17 +1,17 @@
/*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors
-
+
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
-
+
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
-
+
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
@@ -53,13 +53,20 @@ router.get(
where: { channel_id },
relations: [
"user",
+ "channel",
+ "source_channel",
"guild",
"source_guild",
- "application" /*"source_channel"*/,
+ "application",
],
});
- return res.json(webhooks);
+ const instanceUrl =
+ Config.get().api.endpointPublic || "http://localhost:3001";
+ return res.json(webhooks.map(webhook => ({
+ ...webhook,
+ url: instanceUrl + "/webhooks/" + webhook.id + "/" + webhook.token,
+ })));
},
);
diff --git a/src/api/routes/guilds/#guild_id/webhooks.ts b/src/api/routes/guilds/#guild_id/webhooks.ts
index a2ef7d69..60c9818a 100644
--- a/src/api/routes/guilds/#guild_id/webhooks.ts
+++ b/src/api/routes/guilds/#guild_id/webhooks.ts
@@ -1,23 +1,23 @@
/*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors
-
+
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
-
+
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
-
+
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
import { route } from "@spacebar/api";
-import { Webhook } from "@spacebar/util";
+import { Config, Webhook } from "@spacebar/util";
import { Request, Response, Router } from "express";
const router = Router();
@@ -39,13 +39,20 @@ router.get(
where: { guild_id },
relations: [
"user",
+ "channel",
+ "source_channel",
"guild",
"source_guild",
- "application" /*"source_channel"*/,
+ "application",
],
});
- return res.json(webhooks);
+ const instanceUrl =
+ Config.get().api.endpointPublic || "http://localhost:3001";
+ return res.json(webhooks.map(webhook => ({
+ ...webhook,
+ url: instanceUrl + "/webhooks/" + webhook.id + "/" + webhook.token,
+ })));
},
);
diff --git a/src/api/routes/webhooks/#webhook_id/#token/index.ts b/src/api/routes/webhooks/#webhook_id/#token/index.ts
index 6d1449eb..8e0ad0dd 100644
--- a/src/api/routes/webhooks/#webhook_id/#token/index.ts
+++ b/src/api/routes/webhooks/#webhook_id/#token/index.ts
@@ -34,7 +34,14 @@ router.get(
where: {
id: webhook_id,
},
- relations: ["channel", "guild", "application"],
+ relations: [
+ "user",
+ "channel",
+ "source_channel",
+ "guild",
+ "source_guild",
+ "application",
+ ],
});
if (!webhook) {
@@ -65,6 +72,7 @@ const messageUpload = multer({
}); // max upload 50 mb
// https://discord.com/developers/docs/resources/webhook#execute-webhook
+// TODO: GitHub/Slack compatible hooks
router.post(
"/",
messageUpload.any(),
diff --git a/src/api/routes/webhooks/#webhook_id/index.ts b/src/api/routes/webhooks/#webhook_id/index.ts
index 98faaac1..c10bf224 100644
--- a/src/api/routes/webhooks/#webhook_id/index.ts
+++ b/src/api/routes/webhooks/#webhook_id/index.ts
@@ -11,7 +11,7 @@ const router = Router();
router.get(
"/",
route({
- description: "Returns a webhook object for the given id.",
+ description: "Returns a webhook object for the given id. Requires the MANAGE_WEBHOOKS permission or to be the owner of the webhook.",
responses: {
200: {
body: "APIWebhook",
@@ -23,7 +23,14 @@ router.get(
const { webhook_id } = req.params;
const webhook = await Webhook.findOneOrFail({
where: { id: webhook_id },
- relations: ["channel", "guild", "application", "user"],
+ relations: [
+ "user",
+ "channel",
+ "source_channel",
+ "guild",
+ "source_guild",
+ "application",
+ ],
});
if (webhook.guild_id) {
diff --git a/src/util/entities/Webhook.ts b/src/util/entities/Webhook.ts
index 8b1585ad..9539d6e8 100644
--- a/src/util/entities/Webhook.ts
+++ b/src/util/entities/Webhook.ts
@@ -85,13 +85,23 @@ export class Webhook extends BaseClass {
@Column({ nullable: true })
@RelationId((webhook: Webhook) => webhook.guild)
- source_guild_id: string;
+ source_guild_id?: string;
@JoinColumn({ name: "source_guild_id" })
@ManyToOne(() => Guild, {
onDelete: "CASCADE",
})
- source_guild: Guild;
+ source_guild?: Guild;
- url?: string;
+ @Column({ nullable: true })
+ @RelationId((webhook: Webhook) => webhook.channel)
+ source_channel_id: string;
+
+ @JoinColumn({ name: "source_channel_id" })
+ @ManyToOne(() => Channel, {
+ onDelete: "CASCADE",
+ })
+ source_channel: Channel;
+
+ url: string;
}