From 2e66af26db2d5bed2cce39593afebc2b7f0b6111 Mon Sep 17 00:00:00 2001 From: "P. Reis" Date: Sun, 21 Jul 2024 19:21:33 -0300 Subject: [PATCH] feat: create updateZapSplitsController --- src/app.ts | 4 ++++ src/controllers/api/ditto.ts | 41 ++++++++++++++++++++++++++++++++---- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/app.ts b/src/app.ts index 1cb3746b..7538fea2 100644 --- a/src/app.ts +++ b/src/app.ts @@ -44,6 +44,7 @@ import { adminSetRelaysController, nameRequestController, nameRequestsController, + updateZapSplitsController, } from '@/controllers/api/ditto.ts'; import { emptyArrayController, emptyObjectController, notImplementedController } from '@/controllers/api/fallback.ts'; import { @@ -270,6 +271,9 @@ app.put('/api/v1/admin/ditto/relays', requireRole('admin'), adminSetRelaysContro app.post('/api/v1/ditto/names', requireSigner, nameRequestController); app.get('/api/v1/ditto/names', requireSigner, nameRequestsController); +app.put('/api/v1/admin/ditto/zap_splits', requireRole('admin'), updateZapSplitsController); +//app.delete('/api/v1/admin/ditto/zap_splits', requireRole('admin'), deleteZapSplitsController); + app.post('/api/v1/ditto/zap', requireSigner, zapController); app.get('/api/v1/ditto/statuses/:id{[0-9a-f]{64}}/zapped_by', zappedByController); diff --git a/src/controllers/api/ditto.ts b/src/controllers/api/ditto.ts index 841eb861..c3381a66 100644 --- a/src/controllers/api/ditto.ts +++ b/src/controllers/api/ditto.ts @@ -1,14 +1,17 @@ -import { NostrEvent, NostrFilter } from '@nostrify/nostrify'; +import { NostrEvent, NostrFilter, NSchema as n } from '@nostrify/nostrify'; import { z } from 'zod'; import { AppController } from '@/app.ts'; -import { Conf } from '@/config.ts'; -import { booleanParamSchema } from '@/schema.ts'; import { AdminSigner } from '@/signers/AdminSigner.ts'; +import { booleanParamSchema } from '@/schema.ts'; +import { Conf } from '@/config.ts'; import { Storages } from '@/storages.ts'; import { hydrateEvents } from '@/storages/hydrate.ts'; -import { createEvent, paginated, paginationSchema } from '@/utils/api.ts'; +import { createEvent, paginated, paginationSchema, parseBody } from '@/utils/api.ts'; import { renderNameRequest } from '@/views/ditto.ts'; +import { getZapSplits } from '@/utils/zap_split.ts'; +import { updateListAdminEvent } from '@/utils/api.ts'; +import { addTag } from '@/utils/tags.ts'; const markerSchema = z.enum(['read', 'write']); @@ -148,3 +151,33 @@ export const nameRequestsController: AppController = async (c) => { return paginated(c, orig, nameRequests); }; + +const zapSplitSchema = z.array(z.tuple([n.id(), z.number().int().min(1).max(100), z.string().max(500)])).min(1); + +export const updateZapSplitsController: AppController = async (c) => { + const body = await parseBody(c.req.raw); + const result = zapSplitSchema.safeParse(body); + const store = c.get('store'); + + if (!result.success) { + return c.json({ error: result.error }, 400); + } + + const zap_split = await getZapSplits(store, Conf.pubkey); + if (!zap_split) { + return c.json({ error: 'Zap split not activated, visit `/api/v1/instance` to activate it.' }, 404); + } + + const { data } = result; + + await updateListAdminEvent( + { kinds: [30078], authors: [Conf.pubkey], '#d': ['pub.ditto.zapSplits'], limit: 1 }, + (tags) => + data.reduce((accumulator, currentValue) => { + return addTag(accumulator, ['p', currentValue[0], String(currentValue[1]), currentValue[2]]); + }, tags), + c, + ); + + return c.json(200); +};