Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion models/Award.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,10 @@ export type Award = Record<
| 'reason'
| 'nominator'
| 'createdAt'
| 'votes',
| 'votes'
| 'walletAddress'
| 'transactionHash'
| 'tokenId',
TableCellValue
>;

Expand Down
62 changes: 62 additions & 0 deletions pages/api/Lark/award/issue.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import { Context } from 'koa';
import { createKoaRouter, withKoaRouter } from 'next-ssr-middleware';
import { AwardModel } from '../../../../models/Award';
import { safeAPI, verifyJWT } from '../../core';

export const config = { api: { bodyParser: true } };

const router = createKoaRouter(import.meta.url);

const EthereumAddressPattern = /^0x[a-fA-F0-9]{40}$/;

router.post('/issue', safeAPI, verifyJWT, async (context: Context) => {
Comment thread
coderabbitai[bot] marked this conversation as resolved.
const { recordId, walletAddress } = (context.request as any).body;

if (!recordId || !walletAddress) {
context.throw(400, 'recordId and walletAddress are required');
}

if (typeof walletAddress !== 'string' || !EthereumAddressPattern.test(walletAddress)) {
context.throw(400, 'walletAddress must be a valid Ethereum address');
}

let transactionHash: string;
let tokenId: string;

try {
const mintApiUrl = process.env.NFT_MINT_API || 'https://api.octoken.org/mint';
const response = await fetch(mintApiUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ walletAddress, recordId }),
});

if (!response.ok) {
throw new Error(`NFT issuance failed with status ${response.status}`);
}

const data = await response.json();
transactionHash = data.transactionHash;
tokenId = data.tokenId;

if (!transactionHash || !tokenId) {
throw new Error('Invalid response from minting service');
}
} catch (error) {
return context.throw(502, (error as Error).message || 'NFT issuance failed');
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.

const awardModel = new AwardModel();
await awardModel.updateOne(
{
transactionHash,
tokenId,
walletAddress,
},
recordId,
);
Comment thread
coderabbitai[bot] marked this conversation as resolved.

context.body = { success: true, transactionHash, tokenId };
});

export default withKoaRouter(router);