frontend-app / server /controllers /PracticeZoneController.js
Keys
fixes
2ecbb66
import Portfolio from '../model/PracticeZoneModel.js';
import User from '../model/UserModel.js';
export const initializePortfolio = async (req, res) => {
try {
const userId = req.userId; // From your auth middleware
// Check if portfolio exists
let portfolio = await Portfolio.findOne({ userId });
if (!portfolio) {
// Create new portfolio with initial balance
portfolio = await Portfolio.create({
userId,
balance: 10000,
stocks: [],
transactions: []
});
}
res.json(portfolio);
} catch (error) {
res.status(500).json({ error: error.message });
}
};
export const getPortfolio = async (req, res) => {
try {
const userId = req.userId;
const portfolio = await Portfolio.findOne({ userId });
if (!portfolio) {
return res.status(404).json({ error: "Portfolio not found" });
}
res.json(portfolio);
} catch (error) {
res.status(500).json({ error: error.message });
}
};
export const buyStock = async (req, res) => {
try {
const userId = req.userId;
const { code, quantity, price } = req.body;
// Input validation
if (!code || !quantity || !price) {
return res.status(400).json({ error: "Missing required fields" });
}
if (quantity <= 0 || price <= 0) {
return res.status(400).json({ error: "Invalid quantity or price" });
}
let portfolio = await Portfolio.findOne({ userId });
if (!portfolio) {
return res.status(404).json({ error: "Portfolio not found" });
}
const totalCost = price * quantity;
if (portfolio.balance < totalCost) {
return res.status(400).json({ error: "Insufficient balance" });
}
// Find existing stock or create new entry
const stockIndex = portfolio.stocks.findIndex(s => s.code === code.toUpperCase());
if (stockIndex >= 0) {
const existingStock = portfolio.stocks[stockIndex];
const newQuantity = existingStock.quantity + quantity;
const newAvgPrice = ((existingStock.avgPrice * existingStock.quantity) + (price * quantity)) / newQuantity;
portfolio.stocks[stockIndex].quantity = newQuantity;
portfolio.stocks[stockIndex].avgPrice = newAvgPrice;
} else {
portfolio.stocks.push({
code: code.toUpperCase(),
quantity,
avgPrice: price
});
}
// Update balance and add transaction
portfolio.balance -= totalCost;
portfolio.transactions.push({
type: "BUY",
code: code.toUpperCase(),
quantity,
price,
timestamp: new Date()
});
await portfolio.save();
res.json(portfolio);
} catch (error) {
res.status(500).json({ error: error.message });
}
};
export const sellStock = async (req, res) => {
try {
const userId = req.userId;
const { code, quantity, price } = req.body;
// Input validation
if (!code || !quantity || !price) {
return res.status(400).json({ error: "Missing required fields" });
}
if (quantity <= 0 || price <= 0) {
return res.status(400).json({ error: "Invalid quantity or price" });
}
let portfolio = await Portfolio.findOne({ userId });
if (!portfolio) {
return res.status(404).json({ error: "Portfolio not found" });
}
const stock = portfolio.stocks.find(s => s.code === code.toUpperCase());
if (!stock || stock.quantity < quantity) {
return res.status(400).json({ error: "Insufficient stock quantity" });
}
// Update stock quantity
stock.quantity -= quantity;
const saleAmount = price * quantity;
// Remove stock if quantity becomes 0
if (stock.quantity === 0) {
portfolio.stocks = portfolio.stocks.filter(s => s.code !== code.toUpperCase());
}
// Update balance and add transaction
portfolio.balance += saleAmount;
portfolio.transactions.push({
type: "SELL",
code: code.toUpperCase(),
quantity,
price,
timestamp: new Date()
});
await portfolio.save();
res.json(portfolio);
} catch (error) {
res.status(500).json({ error: error.message });
}
};
// Add helper function to calculate portfolio statistics
export const getPortfolioStats = async (req, res) => {
try {
const userId = req.userId;
const portfolio = await Portfolio.findOne({ userId });
if (!portfolio) {
return res.status(404).json({ error: "Portfolio not found" });
}
// Calculate total investment value
const totalInvestment = portfolio.stocks.reduce((total, stock) => {
return total + (stock.quantity * stock.avgPrice);
}, 0);
// Calculate number of different stocks
const numberOfStocks = portfolio.stocks.length;
// Get latest transaction
const latestTransaction = portfolio.transactions[portfolio.transactions.length - 1];
const stats = {
totalInvestment,
availableBalance: portfolio.balance,
numberOfStocks,
latestTransaction,
totalPortfolioValue: totalInvestment + portfolio.balance
};
res.json(stats);
} catch (error) {
res.status(500).json({ error: error.message });
}
};