summaryrefslogtreecommitdiff
path: root/packages/backend/src/server/api
diff options
context:
space:
mode:
authorMar0xy <marie@kaifa.ch>2023-09-24 05:02:36 +0200
committerMar0xy <marie@kaifa.ch>2023-09-24 05:02:36 +0200
commit168c041373d69173bcdd05fcdb534e91e82879e1 (patch)
tree6cf2bb9f5b7862d3132cdbb6cbefb1ef72ee7cfe /packages/backend/src/server/api
parentadd: search endpoints to masto api (diff)
downloadsharkey-168c041373d69173bcdd05fcdb534e91e82879e1.tar.gz
sharkey-168c041373d69173bcdd05fcdb534e91e82879e1.tar.bz2
sharkey-168c041373d69173bcdd05fcdb534e91e82879e1.zip
add: notification endpoints to masto api
Diffstat (limited to 'packages/backend/src/server/api')
-rw-r--r--packages/backend/src/server/api/mastodon/MastodonApiServerService.ts59
-rw-r--r--packages/backend/src/server/api/mastodon/endpoints/notifications.ts71
2 files changed, 130 insertions, 0 deletions
diff --git a/packages/backend/src/server/api/mastodon/MastodonApiServerService.ts b/packages/backend/src/server/api/mastodon/MastodonApiServerService.ts
index 34c06d094a..467ce2b9e0 100644
--- a/packages/backend/src/server/api/mastodon/MastodonApiServerService.ts
+++ b/packages/backend/src/server/api/mastodon/MastodonApiServerService.ts
@@ -14,6 +14,7 @@ import multer from 'fastify-multer';
import { apiAuthMastodon } from './endpoints/auth.js';
import { apiAccountMastodon } from './endpoints/account.js';
import { apiSearchMastodon } from './endpoints/search.js';
+import { apiNotifyMastodon } from './endpoints/notifications.js';
const staticAssets = fileURLToPath(new URL('../../../../assets/', import.meta.url));
@@ -609,6 +610,64 @@ export class MastodonApiServerService {
}
});
//#endregion
+
+ //#region Notifications
+ fastify.get("/v1/notifications", async (_request, reply) => {
+ const BASE_URL = `${_request.protocol}://${_request.hostname}`;
+ const accessTokens = _request.headers.authorization;
+ const client = getClient(BASE_URL, accessTokens);
+ try {
+ const notify = new apiNotifyMastodon(_request, client);
+ reply.send(await notify.getNotifications());
+ } catch (e: any) {
+ console.error(e);
+ console.error(e.response.data);
+ reply.code(401).send(e.response.data);
+ }
+ });
+
+ fastify.get<{ Params: { id: string } }>("/v1/notification/:id", async (_request, reply) => {
+ const BASE_URL = `${_request.protocol}://${_request.hostname}`;
+ const accessTokens = _request.headers.authorization;
+ const client = getClient(BASE_URL, accessTokens);
+ try {
+ const notify = new apiNotifyMastodon(_request, client);
+ reply.send(await notify.getNotification());
+ } catch (e: any) {
+ console.error(e);
+ console.error(e.response.data);
+ reply.code(401).send(e.response.data);
+ }
+ });
+
+ fastify.post<{ Params: { id: string } }>("/v1/notification/:id/dismiss", async (_request, reply) => {
+ const BASE_URL = `${_request.protocol}://${_request.hostname}`;
+ const accessTokens = _request.headers.authorization;
+ const client = getClient(BASE_URL, accessTokens);
+ try {
+ const notify = new apiNotifyMastodon(_request, client);
+ reply.send(await notify.rmNotification());
+ } catch (e: any) {
+ console.error(e);
+ console.error(e.response.data);
+ reply.code(401).send(e.response.data);
+ }
+ });
+
+ fastify.post("/v1/notifications/clear", async (_request, reply) => {
+ const BASE_URL = `${_request.protocol}://${_request.hostname}`;
+ const accessTokens = _request.headers.authorization;
+ const client = getClient(BASE_URL, accessTokens);
+ try {
+ const notify = new apiNotifyMastodon(_request, client);
+ reply.send(await notify.rmNotifications());
+ } catch (e: any) {
+ console.error(e);
+ console.error(e.response.data);
+ reply.code(401).send(e.response.data);
+ }
+ });
+ //#endregion
done();
}
} \ No newline at end of file
diff --git a/packages/backend/src/server/api/mastodon/endpoints/notifications.ts b/packages/backend/src/server/api/mastodon/endpoints/notifications.ts
new file mode 100644
index 0000000000..4e8c314a54
--- /dev/null
+++ b/packages/backend/src/server/api/mastodon/endpoints/notifications.ts
@@ -0,0 +1,71 @@
+import type { MegalodonInterface } from "megalodon";
+import type { FastifyRequest } from 'fastify';
+import { convertTimelinesArgsId } from "./timeline.js";
+import { IdConvertType as IdType, convertId, convertNotification } from '../converters.js';
+
+function toLimitToInt(q: any) {
+ if (q.limit) if (typeof q.limit === "string") q.limit = parseInt(q.limit, 10);
+ return q;
+}
+
+export class apiNotifyMastodon {
+ private request: FastifyRequest;
+ private client: MegalodonInterface;
+
+ constructor(request: FastifyRequest, client: MegalodonInterface) {
+ this.request = request;
+ this.client = client;
+ }
+
+ public async getNotifications() {
+ try {
+ const data = await this.client.getNotifications( convertTimelinesArgsId(toLimitToInt(this.request.query)) );
+ const notifs = data.data;
+ const processed = notifs.map((n) => {
+ n = convertNotification(n);
+ if (n.type !== "follow" && n.type !== "follow_request") {
+ if (n.type === "reaction") n.type = "favourite";
+ return n;
+ } else {
+ return n;
+ }
+ });
+ return processed;
+ } catch (e: any) {
+ console.error(e);
+ return e.response.data;
+ }
+ }
+
+ public async getNotification() {
+ try {
+ const data = await this.client.getNotification( convertId((this.request.params as any).id, IdType.SharkeyId) );
+ const notif = convertNotification(data.data);
+ if (notif.type !== "follow" && notif.type !== "follow_request" && notif.type === "reaction") notif.type = "favourite";
+ return notif;
+ } catch (e: any) {
+ console.error(e);
+ return e.response.data;
+ }
+ }
+
+ public async rmNotification() {
+ try {
+ const data = await this.client.dismissNotification( convertId((this.request.params as any).id, IdType.SharkeyId) );
+ return data.data;
+ } catch (e: any) {
+ console.error(e);
+ return e.response.data;
+ }
+ }
+
+ public async rmNotifications() {
+ try {
+ const data = await this.client.dismissNotifications();
+ return data.data;
+ } catch (e: any) {
+ console.error(e);
+ return e.response.data;
+ }
+ }
+} \ No newline at end of file