From cde283698294aa9a3df1d2985ffbf7baf5ed49d0 Mon Sep 17 00:00:00 2001 From: Jesse Wierzbinski Date: Thu, 2 Jan 2025 04:13:12 +0100 Subject: [PATCH] fix(api): :alien: Ignore what the Mastodon docs say, they're wrong --- api/api/v1/push/subscription/index.post.ts | 4 +-- .../v1/push/subscription/index.put.schema.ts | 0 api/api/v1/push/subscription/index.put.ts | 17 +++++++----- api/api/v1/push/subscription/index.test.ts | 26 ++++++++++++------- classes/schemas/pushsubscription.ts | 15 +++++------ 5 files changed, 35 insertions(+), 27 deletions(-) delete mode 100644 api/api/v1/push/subscription/index.put.schema.ts diff --git a/api/api/v1/push/subscription/index.post.ts b/api/api/v1/push/subscription/index.post.ts index 061cdd3f..926aae32 100644 --- a/api/api/v1/push/subscription/index.post.ts +++ b/api/api/v1/push/subscription/index.post.ts @@ -47,7 +47,7 @@ export default apiRoute((app) => }), async (context) => { const { user, token } = context.get("auth"); - const { subscription, data } = context.req.valid("json"); + const { subscription, data, policy } = context.req.valid("json"); if ( data.alerts["admin.report"] && @@ -68,7 +68,7 @@ export default apiRoute((app) => const ps = await PushSubscription.insert({ alerts: data.alerts, - policy: data.policy, + policy, endpoint: subscription.endpoint, publicKey: subscription.keys.p256dh, authSecret: subscription.keys.auth, diff --git a/api/api/v1/push/subscription/index.put.schema.ts b/api/api/v1/push/subscription/index.put.schema.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/api/api/v1/push/subscription/index.put.ts b/api/api/v1/push/subscription/index.put.ts index 96baedb9..c9736c95 100644 --- a/api/api/v1/push/subscription/index.put.ts +++ b/api/api/v1/push/subscription/index.put.ts @@ -28,7 +28,10 @@ export default apiRoute((app) => body: { content: { "application/json": { - schema: WebPushSubscriptionInput.shape.data, + schema: WebPushSubscriptionInput.pick({ + data: true, + policy: true, + }), }, }, }, @@ -46,7 +49,7 @@ export default apiRoute((app) => }), async (context) => { const { user, token } = context.get("auth"); - const { alerts, policy } = context.req.valid("json"); + const { data, policy } = context.req.valid("json"); const ps = await PushSubscription.fromToken(token); @@ -58,25 +61,25 @@ export default apiRoute((app) => } if ( - alerts["admin.report"] && + data.alerts["admin.report"] && !user.hasPermission(RolePermissions.ManageReports) ) { // This shouldn't throw an error in mastodon either - alerts["admin.report"] = false; + data.alerts["admin.report"] = false; } if ( - alerts["admin.sign_up"] && + data.alerts["admin.sign_up"] && !user.hasPermission(RolePermissions.ManageAccounts) ) { - alerts["admin.sign_up"] = false; + data.alerts["admin.sign_up"] = false; } await ps.update({ policy, alerts: { ...ps.data.alerts, - ...alerts, + ...data.alerts, }, }); diff --git a/api/api/v1/push/subscription/index.test.ts b/api/api/v1/push/subscription/index.test.ts index ad694d95..e6acddac 100644 --- a/api/api/v1/push/subscription/index.test.ts +++ b/api/api/v1/push/subscription/index.test.ts @@ -26,8 +26,8 @@ describe("/api/v1/push/subscriptions", () => { alerts: { update: true, }, - policy: "all", }, + policy: "all", subscription: { endpoint: "https://example.com", keys: { @@ -117,9 +117,11 @@ describe("/api/v1/push/subscriptions", () => { "Content-Type": "application/json", }, body: JSON.stringify({ - alerts: { - update: false, - favourite: true, + data: { + alerts: { + update: false, + favourite: true, + }, }, policy: "follower", }), @@ -147,8 +149,8 @@ describe("/api/v1/push/subscriptions", () => { alerts: { "admin.report": true, }, - policy: "all", }, + policy: "all", subscription: { endpoint: "https://example.com", keys: { @@ -183,8 +185,8 @@ describe("/api/v1/push/subscriptions", () => { alerts: { "admin.report": true, }, - policy: "all", }, + policy: "all", subscription: { endpoint: "https://example.com", keys: { @@ -230,8 +232,10 @@ describe("/api/v1/push/subscriptions", () => { "Content-Type": "application/json", }, body: JSON.stringify({ - alerts: { - "admin.report": true, + data: { + alerts: { + "admin.report": true, + }, }, policy: "all", }), @@ -277,8 +281,10 @@ describe("/api/v1/push/subscriptions", () => { "Content-Type": "application/json", }, body: JSON.stringify({ - alerts: { - "admin.report": true, + data: { + alerts: { + "admin.report": true, + }, }, policy: "all", }), diff --git a/classes/schemas/pushsubscription.ts b/classes/schemas/pushsubscription.ts index 9918641c..0d8b565c 100644 --- a/classes/schemas/pushsubscription.ts +++ b/classes/schemas/pushsubscription.ts @@ -24,20 +24,19 @@ export const WebPushSubscriptionInput = z }) .strict(), }), + policy: z + .enum(["all", "followed", "follower", "none"]) + .default("all") + .openapi({ + description: + "Specify whether to receive push notifications from all, followed, follower, or none users.", + }), data: z .object({ - policy: z - .enum(["all", "followed", "follower", "none"]) - .default("all") - .openapi({ - description: - "Specify whether to receive push notifications from all, followed, follower, or none users.", - }), alerts: PushSubscription.schema.shape.alerts, }) .strict() .default({ - policy: "all", alerts: { mention: false, favourite: false,