refactor: zap amount parsed with zod, change zapped_by fields name

This commit is contained in:
P. Reis 2024-06-13 14:21:01 -03:00
parent 7474c1b288
commit 22dbddb5d3
2 changed files with 11 additions and 12 deletions

View File

@ -545,6 +545,7 @@ const zapController: AppController = async (c) => {
const zappedByController: AppController = async (c) => { const zappedByController: AppController = async (c) => {
const id = c.req.param('id'); const id = c.req.param('id');
const store = await Storages.db(); const store = await Storages.db();
const amountSchema = z.coerce.number().int().nonnegative().catch(0);
const events: DittoEvent[] = (await store.query([{ kinds: [9735], '#e': [id], limit: 100 }])).map((event) => { const events: DittoEvent[] = (await store.query([{ kinds: [9735], '#e': [id], limit: 100 }])).map((event) => {
const zapRequest = event.tags.find(([name]) => name === 'description')?.[1]; const zapRequest = event.tags.find(([name]) => name === 'description')?.[1];
@ -560,17 +561,13 @@ const zappedByController: AppController = async (c) => {
const results = (await Promise.all( const results = (await Promise.all(
events.map(async (event) => { events.map(async (event) => {
const amount = event.tags.find(([name]) => name === 'amount')?.[1]; const amount = amountSchema.parse(event.tags.find(([name]) => name === 'amount')?.[1]);
const onlyDigits = /^\d+$/;
if (!amount || !onlyDigits.test(amount)) return;
const comment = event?.content ?? ''; const comment = event?.content ?? '';
const account = event?.author ? await renderAccount(event.author) : await accountFromPubkey(event.pubkey); const account = event?.author ? await renderAccount(event.author) : await accountFromPubkey(event.pubkey);
return { return {
zap_comment: comment, comment,
zap_amount: Number(amount), amount,
account, account,
}; };
}), }),

View File

@ -1,7 +1,8 @@
import { NostrEvent, NStore } from '@nostrify/nostrify'; import { NostrEvent, NStore } from '@nostrify/nostrify';
import { Kysely, UpdateObject } from 'kysely'; import { Kysely, UpdateObject } from 'kysely';
import { SetRequired } from 'type-fest'; import { SetRequired } from 'type-fest';
import { z } from 'zod';
import { DittoTables } from '@/db/DittoTables.ts'; import { DittoTables } from '@/db/DittoTables.ts';
import { findQuoteTag, findReplyTag, getTagSet } from '@/utils/tags.ts'; import { findQuoteTag, findReplyTag, getTagSet } from '@/utils/tags.ts';
import { Conf } from '@/config.ts'; import { Conf } from '@/config.ts';
@ -140,19 +141,20 @@ async function handleEvent9735(kysely: Kysely<DittoTables>, event: NostrEvent):
const id = event.tags.find(([name]) => name === 'e')?.[1]; const id = event.tags.find(([name]) => name === 'e')?.[1];
if (!id) return; if (!id) return;
let amount = '0'; const amountSchema = z.coerce.number().int().nonnegative().catch(0);
let amount = 0;
try { try {
const zapRequest = JSON.parse(event.tags.find(([name]) => name === 'description')?.[1]!) as NostrEvent; const zapRequest = JSON.parse(event.tags.find(([name]) => name === 'description')?.[1]!) as NostrEvent;
amount = zapRequest.tags.find(([name]) => name === 'amount')?.[1]!; amount = amountSchema.parse(zapRequest.tags.find(([name]) => name === 'amount')?.[1]);
if (amount <= 0) return;
} catch { } catch {
return; return;
} }
if (amount === '0' || !amount || (/^\d+$/).test(amount) === false) return;
await updateEventStats( await updateEventStats(
kysely, kysely,
id, id,
({ zaps_amount }) => ({ zaps_amount: Math.max(0, zaps_amount + Number(amount)) }), ({ zaps_amount }) => ({ zaps_amount: Math.max(0, zaps_amount + amount) }),
); );
} }