From 32cecb5e6bf26e4c2a4ba261b3cfd37e75208a54 Mon Sep 17 00:00:00 2001 From: "P. Reis" Date: Tue, 6 Aug 2024 20:55:40 -0300 Subject: [PATCH] feat: create zap split endpoint based in post/status id --- src/app.ts | 2 ++ src/controllers/api/ditto.ts | 36 +++++++++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/app.ts b/src/app.ts index 4fd1a52a..71d1b4cc 100644 --- a/src/app.ts +++ b/src/app.ts @@ -41,6 +41,7 @@ import { adminSetRelaysController, deleteZapSplitsController, getZapSplitsController, + getZapSplitsOfStatusController, nameRequestController, nameRequestsController, updateZapSplitsController, @@ -265,6 +266,7 @@ app.post('/api/v1/ditto/names', requireSigner, nameRequestController); app.get('/api/v1/ditto/names', requireSigner, nameRequestsController); app.get('/api/v1/ditto/zap_splits', getZapSplitsController); +app.get('/api/v1/ditto/:id{[0-9a-f]{64}}/zap_splits', getZapSplitsOfStatusController); app.put('/api/v1/admin/ditto/zap_splits', requireRole('admin'), updateZapSplitsController); app.delete('/api/v1/admin/ditto/zap_splits', requireRole('admin'), deleteZapSplitsController); diff --git a/src/controllers/api/ditto.ts b/src/controllers/api/ditto.ts index ed1f500d..e3361354 100644 --- a/src/controllers/api/ditto.ts +++ b/src/controllers/api/ditto.ts @@ -5,10 +5,11 @@ import { accountFromPubkey } from '@/views/mastodon/accounts.ts'; import { AppController } from '@/app.ts'; import { addTag } from '@/utils/tags.ts'; import { AdminSigner } from '@/signers/AdminSigner.ts'; -import { booleanParamSchema } from '@/schema.ts'; +import { booleanParamSchema, percentageSchema } from '@/schema.ts'; import { Conf } from '@/config.ts'; import { createEvent, paginated, paginationSchema, parseBody } from '@/utils/api.ts'; import { deleteTag } from '@/utils/tags.ts'; +import { DittoEvent } from '@/interfaces/DittoEvent.ts'; import { DittoZapSplits, getZapSplits } from '@/utils/zap-split.ts'; import { getAuthor } from '@/queries.ts'; import { hydrateEvents } from '@/storages/hydrate.ts'; @@ -251,3 +252,36 @@ export const getZapSplitsController: AppController = async (c) => { return c.json(zapSplits, 200); }; + +export const getZapSplitsOfStatusController: AppController = async (c) => { + const store = c.get('store'); + const id = c.req.param('id'); + const { signal } = c.req.raw; + + const [event] = await store.query([{ kinds: [1], ids: [id], limit: 1 }], { signal }); + if (!event) { + return c.json({ error: 'Event not found' }, 404); + } + + const zapsTag = event.tags.filter(([name]) => name === 'zap'); + + const pubkeys = zapsTag.map((name) => name[1]); + + const users = await store.query([{ authors: pubkeys, kinds: [0], limit: pubkeys.length }], { signal }); + await hydrateEvents({ events: users, store, signal }); + + const zapSplits = (await Promise.all(pubkeys.map(async (pubkey) => { + const author = (users.find((event) => event.pubkey === pubkey) as DittoEvent | undefined)?.author; + const account = author ? await renderAccount(author) : await accountFromPubkey(pubkey); + + const weight = percentageSchema.catch(0).parse(zapsTag.find((name) => name[1] === pubkey)![3]) ?? 0; + + return { + account, + message: '', + weight: weight, + }; + }))).filter((zapSplit) => zapSplit.weight > 0); + + return c.json(zapSplits, 200); +};