update project
This commit is contained in:
23
apps/api/src/controllers/vault.controller.ts
Normal file
23
apps/api/src/controllers/vault.controller.ts
Normal file
@@ -0,0 +1,23 @@
|
||||
import { Request, Response } from 'express';
|
||||
import { UserModel } from '../models/user.model';
|
||||
|
||||
export const VaultController = {
|
||||
async getVault(req: Request, res: Response) {
|
||||
try {
|
||||
const user = await UserModel.findByBitokUserId(req.user!.bitokUserId);
|
||||
if (!user) {
|
||||
res.status(404).json({ success: false, error: 'User not found' });
|
||||
return;
|
||||
}
|
||||
res.json({
|
||||
success: true,
|
||||
data: {
|
||||
encryptedVault: user.encrypted_vault,
|
||||
vaultSalt: user.vault_salt,
|
||||
},
|
||||
});
|
||||
} catch (err: any) {
|
||||
res.status(500).json({ success: false, error: err.message });
|
||||
}
|
||||
},
|
||||
};
|
||||
118
apps/api/src/controllers/wallet-setup.controller.ts
Normal file
118
apps/api/src/controllers/wallet-setup.controller.ts
Normal file
@@ -0,0 +1,118 @@
|
||||
import { Request, Response } from 'express';
|
||||
import { UserModel } from '../models/user.model';
|
||||
import { WalletModel } from '../models/wallet.model';
|
||||
import { db } from '../config/database';
|
||||
import { generateUlid } from '../utils/ulid';
|
||||
|
||||
export const WalletSetupController = {
|
||||
async setup(req: Request, res: Response) {
|
||||
try {
|
||||
const { bitokUserId, email } = req.user!;
|
||||
const { encryptedVault, vaultSalt, wallets } = req.body;
|
||||
|
||||
// Check if user already exists
|
||||
const existing = await UserModel.findByBitokUserId(bitokUserId);
|
||||
if (existing) {
|
||||
res.status(409).json({ success: false, error: 'Wallet already set up for this user' });
|
||||
return;
|
||||
}
|
||||
|
||||
const result = await db.transaction(async (trx) => {
|
||||
const [user] = await trx('users')
|
||||
.insert({
|
||||
id: generateUlid(),
|
||||
bitok_user_id: bitokUserId,
|
||||
email: email || null,
|
||||
encrypted_vault: encryptedVault,
|
||||
vault_salt: vaultSalt,
|
||||
})
|
||||
.returning('*');
|
||||
|
||||
const walletRows = await trx('wallets')
|
||||
.insert(
|
||||
wallets.map((w: { chain: string; address: string; derivationPath: string }) => ({
|
||||
id: generateUlid(),
|
||||
user_id: user.id,
|
||||
chain: w.chain,
|
||||
address: w.address,
|
||||
derivation_path: w.derivationPath,
|
||||
}))
|
||||
)
|
||||
.returning('*');
|
||||
|
||||
return { user, wallets: walletRows };
|
||||
});
|
||||
|
||||
res.status(201).json({
|
||||
success: true,
|
||||
data: {
|
||||
user: {
|
||||
id: result.user.id,
|
||||
bitokUserId: result.user.bitok_user_id,
|
||||
email: result.user.email,
|
||||
},
|
||||
wallets: result.wallets.map((w: any) => ({
|
||||
chain: w.chain,
|
||||
address: w.address,
|
||||
derivationPath: w.derivation_path,
|
||||
})),
|
||||
},
|
||||
});
|
||||
} catch (err: any) {
|
||||
console.error('[WalletSetup] Error:', err.message);
|
||||
res.status(500).json({ success: false, error: 'Failed to set up wallet' });
|
||||
}
|
||||
},
|
||||
|
||||
async confirmMnemonic(req: Request, res: Response) {
|
||||
try {
|
||||
const { bitokUserId } = req.user!;
|
||||
const user = await UserModel.findByBitokUserId(bitokUserId);
|
||||
if (!user) {
|
||||
res.status(404).json({ success: false, error: 'Wallet not found' });
|
||||
return;
|
||||
}
|
||||
await UserModel.setMnemonicShown(user.id);
|
||||
res.json({ success: true, data: { mnemonicShown: true } });
|
||||
} catch (err: any) {
|
||||
console.error('[ConfirmMnemonic] Error:', err.message);
|
||||
res.status(500).json({ success: false, error: 'Failed to confirm mnemonic' });
|
||||
}
|
||||
},
|
||||
|
||||
async unlock(req: Request, res: Response) {
|
||||
try {
|
||||
const { bitokUserId } = req.user!;
|
||||
|
||||
const user = await UserModel.findByBitokUserId(bitokUserId);
|
||||
if (!user) {
|
||||
res.status(404).json({ success: false, error: 'Wallet not found' });
|
||||
return;
|
||||
}
|
||||
|
||||
if (user.deleted) {
|
||||
res.status(403).json({ success: false, error: 'Account has been deleted' });
|
||||
return;
|
||||
}
|
||||
|
||||
const wallets = await WalletModel.findByUserId(user.id);
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: {
|
||||
encryptedVault: user.encrypted_vault,
|
||||
vaultSalt: user.vault_salt,
|
||||
wallets: wallets.map((w) => ({
|
||||
chain: w.chain,
|
||||
address: w.address,
|
||||
derivationPath: w.derivation_path,
|
||||
})),
|
||||
mnemonicShown: user.mnemonic_shown,
|
||||
},
|
||||
});
|
||||
} catch (err: any) {
|
||||
console.error('[WalletUnlock] Error:', err.message);
|
||||
res.status(500).json({ success: false, error: 'Failed to unlock wallet' });
|
||||
}
|
||||
},
|
||||
};
|
||||
@@ -1,10 +1,17 @@
|
||||
import { Request, Response } from 'express';
|
||||
import { UserModel } from '../models/user.model';
|
||||
import { WalletModel } from '../models/wallet.model';
|
||||
|
||||
export const WalletController = {
|
||||
async getWallets(req: Request, res: Response) {
|
||||
try {
|
||||
const wallets = await WalletModel.findByUserId(req.auth!.userId);
|
||||
const user = await UserModel.findByBitokUserId(req.user!.bitokUserId);
|
||||
if (!user) {
|
||||
res.status(404).json({ success: false, error: 'User not found' });
|
||||
return;
|
||||
}
|
||||
|
||||
const wallets = await WalletModel.findByUserId(user.id);
|
||||
res.json({
|
||||
success: true,
|
||||
data: wallets.map((w) => ({
|
||||
|
||||
Reference in New Issue
Block a user