From 5ccbc86d8b11524649ec758e3d4d32f76a1f18ff Mon Sep 17 00:00:00 2001 From: William Chong Date: Tue, 21 Jan 2025 23:21:06 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Add=20evm=20migration=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/api/routes/users/v2/wallet.js | 75 +++++++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) diff --git a/src/server/api/routes/users/v2/wallet.js b/src/server/api/routes/users/v2/wallet.js index 1faa4aa07..b9399b003 100644 --- a/src/server/api/routes/users/v2/wallet.js +++ b/src/server/api/routes/users/v2/wallet.js @@ -1,5 +1,5 @@ const { Router } = require('express'); -const { walletUserCollection } = require('../../../../modules/firebase'); +const { db, walletUserCollection } = require('../../../../modules/firebase'); const { GET_WALLET_API_SECRET } = require('../../../../config/config'); const router = Router(); @@ -58,4 +58,77 @@ router.get('/wallet', async (req, res, next) => { } }); +router.post('/wallet/evm/migrate', async (req, res, next) => { + try { + const key = req.headers['x-likerland-api-key']; + const { wallet } = req.query; + const { evmWallet } = req.body; + if (!wallet) { + res.status(400).send('INVALID_QUERY'); + return; + } + if (!evmWallet) { + res.status(400).send('MISSING_BODY'); + return; + } + if (!key || key !== GET_WALLET_API_SECRET) { + res.status(403).send('INVALID_KEY'); + return; + } + let user; + try { + user = await db.startTransaction(async t => { + const [walletQuery, userDoc] = await Promise.all([ + t.get( + walletUserCollection.where('evmWallet', '==', evmWallet).limit(1) + ), + t.get(walletUserCollection.doc(wallet)), + ]); + if (walletQuery.size > 0) { + throw new Error('WALLET_ALREADY_USED'); + } + if (!userDoc.exists) { + throw new Error('USER_NOT_FOUND'); + } + const userData = userDoc.data(); + if (userData.evmWallet) { + throw new Error('WALLET_ALREADY_MIGRATED'); + } + const likeWallet = userDoc.id; + t.update(walletUserCollection.doc(wallet), { + evmWallet, + likeWallet, + }); + return { + id: likeWallet, + likeWallet, + ...userData, + }; + }); + } catch (err) { + res.status(400).send(err.message); + return; + } + const { + lastLoginMethod, + registerLoginMethod, + displayName, + email: docEmail, + emailUnconfirmed, + } = user; + res.json({ + id: user.id, + likeWallet: user.likeWallet, + evmWallet: user.evmWallet, + lastLoginMethod, + registerLoginMethod, + displayName, + email: docEmail, + emailUnconfirmed, + }); + } catch (err) { + next(err); + } +}); + module.exports = router;