feat: add CoinIcon component for displaying cryptocurrency icons
feat: implement TradeModal for buying and selling coins with validation and transaction handling feat: create server-side trade API for executing buy/sell transactions and updating user balances feat: add transactions API to fetch user transaction history feat: implement portfolio page to display user's holdings and recent transactions
This commit is contained in:
parent
0784e0f3d3
commit
a278d0c6a5
13 changed files with 1342 additions and 210 deletions
51
website/src/routes/api/transactions/+server.ts
Normal file
51
website/src/routes/api/transactions/+server.ts
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
import { auth } from '$lib/auth';
|
||||
import { error, json } from '@sveltejs/kit';
|
||||
import { db } from '$lib/server/db';
|
||||
import { transaction, coin } from '$lib/server/db/schema';
|
||||
import { eq, desc } from 'drizzle-orm';
|
||||
|
||||
export async function GET({ request }) {
|
||||
const session = await auth.api.getSession({
|
||||
headers: request.headers
|
||||
});
|
||||
|
||||
if (!session?.user) {
|
||||
throw error(401, 'Not authenticated');
|
||||
}
|
||||
|
||||
const userId = Number(session.user.id);
|
||||
|
||||
const transactions = await db
|
||||
.select({
|
||||
id: transaction.id,
|
||||
type: transaction.type,
|
||||
quantity: transaction.quantity,
|
||||
pricePerCoin: transaction.pricePerCoin,
|
||||
totalBaseCurrencyAmount: transaction.totalBaseCurrencyAmount,
|
||||
timestamp: transaction.timestamp,
|
||||
coinSymbol: coin.symbol,
|
||||
coinName: coin.name,
|
||||
coinIcon: coin.icon
|
||||
})
|
||||
.from(transaction)
|
||||
.innerJoin(coin, eq(transaction.coinId, coin.id))
|
||||
.where(eq(transaction.userId, userId))
|
||||
.orderBy(desc(transaction.timestamp))
|
||||
.limit(100);
|
||||
|
||||
return json({
|
||||
transactions: transactions.map(t => ({
|
||||
id: t.id,
|
||||
type: t.type,
|
||||
quantity: Number(t.quantity),
|
||||
pricePerCoin: Number(t.pricePerCoin),
|
||||
totalBaseCurrencyAmount: Number(t.totalBaseCurrencyAmount),
|
||||
timestamp: t.timestamp,
|
||||
coin: {
|
||||
symbol: t.coinSymbol,
|
||||
name: t.coinName,
|
||||
icon: t.coinIcon
|
||||
}
|
||||
}))
|
||||
});
|
||||
}
|
||||
Reference in a new issue