From 95a713b50a54e0bb719c378bcd07c9bb1f927b47 Mon Sep 17 00:00:00 2001 From: danidfra Date: Tue, 24 Dec 2024 15:28:05 -0300 Subject: [PATCH 1/5] Refactor reactions: removed unnecessary lines --- src/controllers/api/reactions.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/controllers/api/reactions.ts b/src/controllers/api/reactions.ts index 7d42c197..b7a18549 100644 --- a/src/controllers/api/reactions.ts +++ b/src/controllers/api/reactions.ts @@ -29,7 +29,6 @@ const reactionController: AppController = async (c) => { await createEvent({ kind: 7, content: emoji, - created_at: Math.floor(Date.now() / 1000), tags: [['e', id], ['p', event.pubkey]], }, c); @@ -74,7 +73,6 @@ const deleteReactionController: AppController = async (c) => { await createEvent({ kind: 5, content: '', - created_at: Math.floor(Date.now() / 1000), tags, }, c); From 2486830856fbe2b1d601d0bd03e68e949b132af1 Mon Sep 17 00:00:00 2001 From: danidfra Date: Tue, 24 Dec 2024 15:31:56 -0300 Subject: [PATCH 2/5] Implement unfavourite controller --- src/app.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/app.ts b/src/app.ts index 29886c89..5378f915 100644 --- a/src/app.ts +++ b/src/app.ts @@ -103,6 +103,7 @@ import { reblogStatusController, statusController, unbookmarkController, + unfavouriteController, unpinController, unreblogStatusController, zapController, @@ -239,6 +240,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', requireSigner, favouriteController); +app.delete('/api/v1/statuses/:id{[0-9a-f]{64}}/unfavourite', requireSigner, unfavouriteController); app.post('/api/v1/statuses/:id{[0-9a-f]{64}}/bookmark', requireSigner, bookmarkController); app.post('/api/v1/statuses/:id{[0-9a-f]{64}}/unbookmark', requireSigner, unbookmarkController); app.post('/api/v1/statuses/:id{[0-9a-f]{64}}/pin', requireSigner, pinController); From 62258f7ee5dbcc539f82e695fe2a608f1fd54bff Mon Sep 17 00:00:00 2001 From: danidfra Date: Tue, 24 Dec 2024 15:33:41 -0300 Subject: [PATCH 3/5] Create unfavouriteController --- src/controllers/api/statuses.ts | 48 ++++++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 9 deletions(-) diff --git a/src/controllers/api/statuses.ts b/src/controllers/api/statuses.ts index ea7a16b2..7ea9fd60 100644 --- a/src/controllers/api/statuses.ts +++ b/src/controllers/api/statuses.ts @@ -316,15 +316,6 @@ const favouriteController: AppController = async (c) => { const target = await getEvent(id, { kind: 1, relations: ['author', 'event_stats', 'author_stats'] }); if (target) { - await createEvent({ - kind: 7, - content: '+', - tags: [ - ['e', target.id, Conf.relay, '', target.pubkey], - ['p', target.pubkey, Conf.relay], - ], - }, c); - const status = await renderStatus(target, { viewerPubkey: await c.get('signer')?.getPublicKey() }); if (status) { @@ -338,6 +329,44 @@ const favouriteController: AppController = async (c) => { } }; +const unfavouriteController: AppController = async (c) => { + const id = c.req.param('id'); + const signer = c.get('signer')!; + const pubkey = await signer.getPublicKey(); + const store = await Storages.db(); + const { signal } = c.req.raw; + + const [event] = await store.query([{ ids: [id] }], { signal }); + if (!event) { + return c.json({ error: 'Record not found.' }, 404); + } + + const favouriteEvents = await store.query([ + { kinds: [7], authors: [pubkey], '#e': [id] }, + ]); + if (!favouriteEvents.length) { + return c.json({ error: 'Record not found.' }, 404); + } + + favouriteEvents.forEach(async (e) => { + if (e.content === '+') { + await createEvent({ + kind: 5, + tags: [ + ['e', e.id], + ], + content: 'unfavourite', + }, c); + } + }) + + await hydrateEvents({ events: [event], store, signal }) + + const status = await renderStatus(event, { viewerPubkey: pubkey }); + + return c.json(status); +}; + const favouritedByController: AppController = (c) => { const id = c.req.param('id'); const params = c.get('pagination'); @@ -660,6 +689,7 @@ export { reblogStatusController, statusController, unbookmarkController, + unfavouriteController, unpinController, unreblogStatusController, zapController, From 21247b31ea749530baaf93ebde69429aef3050ae Mon Sep 17 00:00:00 2001 From: danidfra Date: Thu, 6 Mar 2025 17:06:48 -0300 Subject: [PATCH 4/5] 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, From aa0ada8943764ae4df53ed1025196262a7792d88 Mon Sep 17 00:00:00 2001 From: danidfra Date: Thu, 6 Mar 2025 17:18:25 -0300 Subject: [PATCH 5/5] Add missing tag --- packages/ditto/controllers/api/accounts.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/ditto/controllers/api/accounts.ts b/packages/ditto/controllers/api/accounts.ts index 42c0c7eb..720647a8 100644 --- a/packages/ditto/controllers/api/accounts.ts +++ b/packages/ditto/controllers/api/accounts.ts @@ -510,7 +510,7 @@ const favouritesController: AppController = async (c) => { }; const unfavouriteController: AppController = async (c) => { - const { relay, user, signal } = c.var + const { relay, user, signal } = c.var; const id = c.req.param('id'); const pubkey = await user!.signer.getPublicKey(); @@ -532,13 +532,14 @@ const unfavouriteController: AppController = async (c) => { kind: 5, tags: [ ['e', e.id], + ['k', '7'], ], content: 'unfavourite', }, c); } } - await hydrateEvents({ ...c.var, events: [event], relay, signal }) + await hydrateEvents({ ...c.var, events: [event], relay, signal }); const status = await renderStatus(relay, event, { viewerPubkey: pubkey });