feat: delete ticker from database when removed from portfolio
- Add DELETE support to /api/stocks endpoint via _method parameter - Modify removeStock to delete db- prefixed entries from database - Add confirmation dialog on delete button click - Add test for stock deletion
This commit is contained in:
+29
-7
@@ -221,7 +221,25 @@ export default function Analyze() {
|
||||
updatePositions();
|
||||
}, [stocks.length]);
|
||||
|
||||
const removeStock = (id: string) => {
|
||||
const removeStock = async (id: string) => {
|
||||
const stock = stocks.find((s) => s.id === id);
|
||||
if (!stock) return;
|
||||
|
||||
// Delete from database if this was a manually added stock (db- prefix)
|
||||
if (id.startsWith("db-")) {
|
||||
try {
|
||||
const formData = new FormData();
|
||||
formData.append("_method", "DELETE");
|
||||
formData.append("ticker", stock.ticker);
|
||||
await fetch("/api/stocks", {
|
||||
method: "POST",
|
||||
body: formData,
|
||||
});
|
||||
} catch (err) {
|
||||
console.error("[analyze] Error deleting stock from DB:", err);
|
||||
}
|
||||
}
|
||||
|
||||
setStocks((s) => s.filter((stock) => stock.id !== id));
|
||||
};
|
||||
|
||||
@@ -346,12 +364,16 @@ export default function Analyze() {
|
||||
>
|
||||
{stock.loading ? "Running..." : "Analyze"}
|
||||
</button>
|
||||
<button
|
||||
onClick={() => removeStock(stock.id)}
|
||||
className="bg-red-600 text-white px-3 py-1 rounded text-sm hover:bg-red-700"
|
||||
>
|
||||
Delete
|
||||
</button>
|
||||
<button
|
||||
onClick={async () => {
|
||||
if (confirm(`Remove ${stock.ticker}?`)) {
|
||||
await removeStock(stock.id);
|
||||
}
|
||||
}}
|
||||
className="bg-red-600 text-white px-3 py-1 rounded text-sm hover:bg-red-700"
|
||||
>
|
||||
Delete
|
||||
</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -10,11 +10,19 @@ export async function loader() {
|
||||
export async function action({ request }: { request: Request }) {
|
||||
const formData = await request.formData();
|
||||
const ticker = formData.get("ticker")?.toString().toUpperCase();
|
||||
const method = formData.get("_method")?.toString() || "POST";
|
||||
|
||||
if (!ticker) {
|
||||
return Response.json({ error: "Ticker is required" }, { status: 400 });
|
||||
}
|
||||
|
||||
if (method === "DELETE") {
|
||||
await db.stock.deleteMany({
|
||||
where: { ticker },
|
||||
});
|
||||
return Response.json({ success: true });
|
||||
}
|
||||
|
||||
const stock = await db.stock.create({
|
||||
data: { ticker },
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user