feat: create zap split endpoint based in post/status id

This commit is contained in:
P. Reis 2024-08-06 20:55:40 -03:00
parent 75935d0b53
commit 32cecb5e6b
2 changed files with 37 additions and 1 deletions

View file

@ -41,6 +41,7 @@ import {
adminSetRelaysController, adminSetRelaysController,
deleteZapSplitsController, deleteZapSplitsController,
getZapSplitsController, getZapSplitsController,
getZapSplitsOfStatusController,
nameRequestController, nameRequestController,
nameRequestsController, nameRequestsController,
updateZapSplitsController, 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/names', requireSigner, nameRequestsController);
app.get('/api/v1/ditto/zap_splits', getZapSplitsController); 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.put('/api/v1/admin/ditto/zap_splits', requireRole('admin'), updateZapSplitsController);
app.delete('/api/v1/admin/ditto/zap_splits', requireRole('admin'), deleteZapSplitsController); app.delete('/api/v1/admin/ditto/zap_splits', requireRole('admin'), deleteZapSplitsController);

View file

@ -5,10 +5,11 @@ import { accountFromPubkey } from '@/views/mastodon/accounts.ts';
import { AppController } from '@/app.ts'; import { AppController } from '@/app.ts';
import { addTag } from '@/utils/tags.ts'; import { addTag } from '@/utils/tags.ts';
import { AdminSigner } from '@/signers/AdminSigner.ts'; import { AdminSigner } from '@/signers/AdminSigner.ts';
import { booleanParamSchema } from '@/schema.ts'; import { booleanParamSchema, percentageSchema } from '@/schema.ts';
import { Conf } from '@/config.ts'; import { Conf } from '@/config.ts';
import { createEvent, paginated, paginationSchema, parseBody } from '@/utils/api.ts'; import { createEvent, paginated, paginationSchema, parseBody } from '@/utils/api.ts';
import { deleteTag } from '@/utils/tags.ts'; import { deleteTag } from '@/utils/tags.ts';
import { DittoEvent } from '@/interfaces/DittoEvent.ts';
import { DittoZapSplits, getZapSplits } from '@/utils/zap-split.ts'; import { DittoZapSplits, getZapSplits } from '@/utils/zap-split.ts';
import { getAuthor } from '@/queries.ts'; import { getAuthor } from '@/queries.ts';
import { hydrateEvents } from '@/storages/hydrate.ts'; import { hydrateEvents } from '@/storages/hydrate.ts';
@ -251,3 +252,36 @@ export const getZapSplitsController: AppController = async (c) => {
return c.json(zapSplits, 200); 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);
};