Rollback tweet save if verification fails

This commit is contained in:
IshaVenikar 2025-02-06 15:45:44 +05:30
parent 7e59ee172e
commit 78f7bb8234
3 changed files with 37 additions and 23 deletions

View File

@ -1,7 +1,6 @@
import { NextRequest, NextResponse } from 'next/server';
import { saveTweet, verifySignatureInTweet } from '../../../utils/verifyTweet';
import { createRewardLock, extractInfo } from '../../../utils/create-lock';
import { processTweet, verifySignatureInTweet } from '../../../utils/verifyTweet';
export async function POST(req: NextRequest): Promise<NextResponse> {
try {
@ -30,21 +29,10 @@ export async function POST(req: NextRequest): Promise<NextResponse> {
throw new Error('Tweet is not valid');
}
const { isFourthUser } = await saveTweet({ transactionSignature: txSignature, url: memeUrl });
// Verify and store valid tweet
const result = await processTweet(txSignature, memeUrl);
if (isFourthUser) {
const { authority, amount } = await extractInfo(txSignature);
if (!authority || Number(amount) <= 0) {
return NextResponse.json({ error: "Invalid transaction details" }, { status: 400 });
}
const escrow = await createRewardLock(authority, amount);
return NextResponse.json({ success: true, data: { escrow } });
}
return NextResponse.json({ success: isVerified, message: 'Tweet verified' })
return NextResponse.json(result)
} catch (error) {
console.error('Error while verifying tweet:', error)
return NextResponse.json(

View File

@ -196,6 +196,8 @@ export async function createVestingPlanV2(params: CreateVestingPlanParams) {
return escrow;
}
throw new Error;
}
}

View File

@ -1,4 +1,7 @@
import { DataSource, EntityTarget } from 'typeorm';
import { Tweet } from '../entity/Tweet';
import { createRewardLock, extractInfo } from './create-lock';
export async function verifySignatureInTweet(transactionSignature: string): Promise<boolean> {
const paymentRepository = global.appDataSource.getRepository(global.entities.Payment);
@ -18,14 +21,35 @@ export async function verifySignatureInTweet(transactionSignature: string): Prom
return true;
}
export async function saveTweet(data: Partial<Tweet>): Promise<{ isFourthUser: boolean }> {
return await global.appDataSource.transaction(async (transactionalEntityManager) => {
const tweetRepository = transactionalEntityManager.getRepository(global.entities.Tweet);
export async function processTweet(txSignature: string, memeUrl: string | null) {
return await (global.appDataSource as DataSource).transaction(async (transactionalEntityManager) => {
const tweetRepository = transactionalEntityManager.getRepository(global.entities.Tweet as EntityTarget<Tweet>);
const tweet = await tweetRepository.save(data);
const tweet = await tweetRepository.save({
transactionSignature: txSignature,
url: memeUrl,
});
return {
isFourthUser: tweet.id % 4 === 0
};
const isFourthUser = tweet.id % 4 === 0;
try {
if (isFourthUser) {
const { authority, amount } = await extractInfo(txSignature);
if (!authority || Number(amount) <= 0) {
return { error: "Invalid transaction details" }
}
const escrow = await createRewardLock(authority, amount);
return { success: true, data: { escrow } };
}
return { success: true, message: 'Tweet verified' }
} catch (error) {
console.error('Error locking tokens.');
throw new Error("Transaction failed.");
}
});
}