diff --git a/src/routes/api/bulk-download/+server.ts b/src/routes/api/bulk-download/+server.ts index 051266e5..704482ea 100644 --- a/src/routes/api/bulk-download/+server.ts +++ b/src/routes/api/bulk-download/+server.ts @@ -1,16 +1,24 @@ import type { RequestHandler } from "./$types"; export const POST: RequestHandler = async ({ request, locals }) => { + const { apiURL, apiKey, user, pb } = locals; + + const data = await request.json(); const tickers = data?.tickers; // tickers assumed to be an array - const { apiURL, apiKey, user, pb } = locals; + let bulkData = data?.bulkData; + const totalCreditCost = + tickers?.length * + bulkData?.reduce((sum, item) => { + return item.selected ? sum + item.credit : sum; + }, 0); - // Check if user has enough credits - if (user?.credits < tickers?.length) { + // Check if user has enough credits + if (user?.credits < totalCreditCost) { return new Response(JSON.stringify({ error: "Insufficient credits" }), { status: 400 }); } - const postData = { tickers }; + const postData = { tickers, bulkData }; const response = await fetch(apiURL + "/bulk-download", { method: "POST", headers: { @@ -22,7 +30,7 @@ export const POST: RequestHandler = async ({ request, locals }) => { // Deduct credits after a successful request await pb.collection('users').update(user?.id, { - 'credits': user?.credits - tickers?.length + 'credits': user?.credits - totalCreditCost }); const contentType = response.headers.get("content-type") || ""; diff --git a/src/routes/watchlist/stocks/+page.svelte b/src/routes/watchlist/stocks/+page.svelte index 8db818bf..93b5419f 100644 --- a/src/routes/watchlist/stocks/+page.svelte +++ b/src/routes/watchlist/stocks/+page.svelte @@ -29,9 +29,9 @@ let searchQuery = ""; let switchWatchlist = false; let editMode = false; - let realtimeUpdates = true; let numberOfChecked = 0; let activeIdx = 0; + let totalCreditCost = 0; let rawTabData = []; let deleteTickerList = []; @@ -47,6 +47,23 @@ let checkedItems; let socket; + let bulkData = [ + { + name: "Price Data", + selected: true, + credit: 1, + }, + { + name: "Dividends Data", + selected: true, + credit: 1, + }, + { + name: "Options Data", + selected: true, + credit: 3, + }, + ]; const tabs = [ { title: "News", @@ -1048,14 +1065,25 @@ watchList = [...originalData].sort(compareValues)?.slice(0, 50); }; - async function downloadHistoricalData() { + async function handleBulkDownload() { const tickers = watchList?.map((item) => item?.symbol); // example tickers - if (data?.user?.credits > tickers?.length && tickers?.length > 0) { - data.user.credits = data?.user?.credits - tickers?.length; + + if (totalCreditCost === 0 || tickers?.length === 0) { + toast.error( + `Select at least one ${tickers?.length === 0 ? "symbol" : "bulk data"} to download`, + { + style: `border-radius: 5px; background: #fff; color: #000; border-color: ${$mode === "light" ? "#F9FAFB" : "#4B5563"}; font-size: 15px;`, + }, + ); + return; + } + + if (data?.user?.credits > totalCreditCost && tickers?.length > 0) { + data.user.credits = data?.user?.credits - totalCreditCost; const response = await fetch("/api/bulk-download", { method: "POST", headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ tickers }), + body: JSON.stringify({ tickers: tickers, bulkData: bulkData }), }); if (response.ok) { @@ -1079,6 +1107,18 @@ }); } } + + $: { + if (bulkData) { + const tickers = watchList?.map((item) => item?.symbol); // example tickers + + totalCreditCost = + tickers?.length * + bulkData?.reduce((sum, item) => { + return item.selected ? sum + item.credit : sum; + }, 0); + } + } OptionsBulk Download + + {data?.user?.credits} Credits left + - - - ({data?.user?.credits} Credits left) { + event.preventDefault(); + item.selected = !item?.selected; + }} + class="inline-flex justify-between w-full items-center cursor-pointer" > - - - - + + {/each} +
+ + = Credit Cost {totalCreditCost} + + +