From 21247b31ea749530baaf93ebde69429aef3050ae Mon Sep 17 00:00:00 2001 From: danidfra Date: Thu, 6 Mar 2025 17:06:48 -0300 Subject: [PATCH] Implement removal of "thumbs up" reaction --- packages/ditto/app.ts | 2 ++ packages/ditto/controllers/api/accounts.ts | 37 ++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/packages/ditto/app.ts b/packages/ditto/app.ts index af0f9cfb..531bdd90 100644 --- a/packages/ditto/app.ts +++ b/packages/ditto/app.ts @@ -34,6 +34,7 @@ import { muteController, relationshipsController, unblockController, + unfavouriteController, unfollowController, unmuteController, updateCredentialsController, @@ -357,6 +358,7 @@ app.get('/api/v1/statuses/:id{[0-9a-f]{64}}/reblogged_by', rebloggedByController app.get('/api/v1/statuses/:id{[0-9a-f]{64}}/context', contextController); app.get('/api/v1/statuses/:id{[0-9a-f]{64}}', statusController); app.post('/api/v1/statuses/:id{[0-9a-f]{64}}/favourite', userMiddleware(), favouriteController); +app.post('/api/v1/statuses/:id{[0-9a-f]{64}}/unfavourite', userMiddleware(), unfavouriteController); app.post('/api/v1/statuses/:id{[0-9a-f]{64}}/bookmark', userMiddleware(), bookmarkController); app.post('/api/v1/statuses/:id{[0-9a-f]{64}}/unbookmark', userMiddleware(), unbookmarkController); app.post('/api/v1/statuses/:id{[0-9a-f]{64}}/pin', userMiddleware(), pinController); diff --git a/packages/ditto/controllers/api/accounts.ts b/packages/ditto/controllers/api/accounts.ts index a01c0038..42c0c7eb 100644 --- a/packages/ditto/controllers/api/accounts.ts +++ b/packages/ditto/controllers/api/accounts.ts @@ -509,6 +509,42 @@ const favouritesController: AppController = async (c) => { return paginated(c, events1, statuses); }; +const unfavouriteController: AppController = async (c) => { + const { relay, user, signal } = c.var + const id = c.req.param('id'); + const pubkey = await user!.signer.getPublicKey(); + + const [event] = await relay.query([{ ids: [id], kinds: [1] }], { signal }); + if (!event) { + return c.json({ error: 'Record not found.' }, 404); + } + + const favouriteEvents = await relay.query([ + { kinds: [7], authors: [pubkey], '#e': [id] }, + ]); + if (!favouriteEvents.length) { + return c.json({ error: 'Record not found.' }, 404); + } + + for (const e of favouriteEvents) { + if (e.content === '+') { + await createEvent({ + kind: 5, + tags: [ + ['e', e.id], + ], + content: 'unfavourite', + }, c); + } + } + + await hydrateEvents({ ...c.var, events: [event], relay, signal }) + + const status = await renderStatus(relay, event, { viewerPubkey: pubkey }); + + return c.json(status); +}; + const familiarFollowersController: AppController = async (c) => { const { relay, user, signal } = c.var; @@ -560,6 +596,7 @@ export { muteController, relationshipsController, unblockController, + unfavouriteController, unfollowController, unmuteController, updateCredentialsController,