update endpoint

This commit is contained in:
MuslemRahimi 2024-09-19 09:15:52 +02:00
parent 6812cef274
commit 1d86d0a62c
4 changed files with 129 additions and 78 deletions

View File

@ -1,57 +1,82 @@
import PocketBase from "pocketbase";
import { serializeNonPOJOs } from '$lib/utils';
import { serializeNonPOJOs } from "$lib/utils";
const usRegion = new Set(['cle1', 'iad1', 'pdx1', 'sfo1']);
const usRegion = new Set(["cle1", "iad1", "pdx1", "sfo1"]);
export const handle = async ({ event, resolve }) => {
// Use optional chaining and nullish coalescing for safer property access
const regionHeader = event?.request?.headers?.get('x-vercel-id') ?? 'fra1::fra1::8t4xg-1700258428633-157d82fdfcc7';
// Use a more compatible way to get the first element of the split array
const userRegion = regionHeader.split('::')[0] || '';
// Use optional chaining and nullish coalescing for safer property access
const regionHeader =
event?.request?.headers?.get("x-vercel-id") ??
"fra1::fra1::8t4xg-1700258428633-157d82fdfcc7";
const isUsRegion = usRegion.has(userRegion);
const ip =
event.request.headers.get("x-forwarded-for") ||
event.request.headers.get("remote-address");
// Use a ternary operator instead of the logical OR for better compatibility
const pbURL = isUsRegion ? import.meta.env.VITE_USEAST_POCKETBASE_URL : import.meta.env.VITE_EU_POCKETBASE_URL;
const apiURL = isUsRegion ? import.meta.env.VITE_USEAST_API_URL : import.meta.env.VITE_EU_API_URL;
const fastifyURL = isUsRegion ? import.meta.env.VITE_USEAST_FASTIFY_URL : import.meta.env.VITE_EU_FASTIFY_URL;
const wsURL = isUsRegion ? import.meta.env.VITE_USEAST_WS_URL : import.meta.env.VITE_EU_WS_URL;
let isUS = false;
event.locals = {
region: decodeURIComponent(regionHeader),
pb: new PocketBase(pbURL),
apiURL,
fastifyURL,
wsURL,
apiKey: import.meta.env.VITE_STOCKNEAR_API_KEY
};
const authCookie = event?.request?.headers?.get('cookie') || '';
event.locals.pb.authStore.loadFromCookie(authCookie);
if (event?.locals?.pb?.authStore?.isValid) {
try {
await event.locals.pb.collection('users').authRefresh();
event.locals.user = serializeNonPOJOs(event.locals.pb.authStore.model);
} catch (_) {
event.locals.pb.authStore.clear();
event.locals.user = undefined;
}
if (ip) {
const geoResponse = await fetch(`https://ipinfo.io/${ip}/geo`);
const geoData = await geoResponse.json();
if (geoData.country === "US") {
isUS = true;
console.log("yelllo", geoData);
}
}
const response = await resolve(event);
// Use a more compatible way to get the first element of the split array
const userRegion = regionHeader.split("::")[0] || "";
// Use a more compatible way to set the cookie
const cookieString = event.locals.pb.authStore.exportToCookie({
httpOnly: true,
path: '/',
sameSite: 'lax',
secure: true,
maxAge: 60 * 60 * 24 * 365
});
const isUsRegion = usRegion.has(userRegion);
response.headers.append('set-cookie', cookieString);
// Use a ternary operator instead of the logical OR for better compatibility
const pbURL = isUsRegion
? import.meta.env.VITE_USEAST_POCKETBASE_URL
: import.meta.env.VITE_EU_POCKETBASE_URL;
const apiURL = isUsRegion
? import.meta.env.VITE_USEAST_API_URL
: import.meta.env.VITE_EU_API_URL;
const fastifyURL = isUsRegion
? import.meta.env.VITE_USEAST_FASTIFY_URL
: import.meta.env.VITE_EU_FASTIFY_URL;
const wsURL = isUsRegion
? import.meta.env.VITE_USEAST_WS_URL
: import.meta.env.VITE_EU_WS_URL;
return response;
};
event.locals = {
region: decodeURIComponent(regionHeader),
pb: new PocketBase(pbURL),
apiURL,
fastifyURL,
wsURL,
apiKey: import.meta.env.VITE_STOCKNEAR_API_KEY,
};
const authCookie = event?.request?.headers?.get("cookie") || "";
event.locals.pb.authStore.loadFromCookie(authCookie);
if (event?.locals?.pb?.authStore?.isValid) {
try {
await event.locals.pb.collection("users").authRefresh();
event.locals.user = serializeNonPOJOs(event.locals.pb.authStore.model);
} catch (_) {
event.locals.pb.authStore.clear();
event.locals.user = undefined;
}
}
const response = await resolve(event);
// Use a more compatible way to set the cookie
const cookieString = event.locals.pb.authStore.exportToCookie({
httpOnly: true,
path: "/",
sameSite: "lax",
secure: true,
maxAge: 60 * 60 * 24 * 365,
});
response.headers.append("set-cookie", cookieString);
return response;
};

View File

@ -3,23 +3,27 @@ import type { RequestHandler } from "./$types";
export const POST: RequestHandler = async ({ request, locals }) => {
const data = await request.json();
const selectedDate = data?.selectedDate;
const { apiURL, apiKey } = locals;
const { apiURL, apiKey, user } = locals;
let output;
try {
const postData = { date: selectedDate };
const response = await fetch(apiURL + "/options-historical-flow", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-KEY": apiKey,
},
body: JSON.stringify(postData),
});
if (user?.tier === "Pro") {
try {
const postData = { date: selectedDate };
const response = await fetch(apiURL + "/options-historical-flow", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-KEY": apiKey,
},
body: JSON.stringify(postData),
});
output = await response.json();
} catch (e) {
console.error(e);
output = await response.json();
} catch (e) {
console.error(e);
output = [];
}
} else {
output = [];
}

View File

@ -794,7 +794,7 @@ $: {
{#if !$isOpen}
<div class="text-white text-sm sm:text-[1rem] italic text-center sm:text-start w-full ml-2 mb-3">
Live flow of {nyseDate} (NYSE Time)
Live flow of {data?.user?.tier === 'Pro' && selectedDate ? df.format(selectedDate?.toDate()) : nyseDate} (NYSE Time)
</div>
{/if}

View File

@ -1,35 +1,57 @@
import { isOpen} from '$lib/store';
import { isOpen } from "$lib/store";
const checkMarketHour = async () => {
const holidays = ['2024-01-01', '2024-01-15','2024-02-19','2024-03-29','2024-05-27','2024-06-19','2024-07-04','2024-09-02','2024-11-28','2024-12-25'];
const currentDate = new Date().toISOString().split('T')[0];
const holidays = [
"2024-01-01",
"2024-01-15",
"2024-02-19",
"2024-03-29",
"2024-05-27",
"2024-06-19",
"2024-07-04",
"2024-09-02",
"2024-11-28",
"2024-12-25",
];
const currentDate = new Date().toISOString().split("T")[0];
// Get the current time in the ET time zone
const etTimeZone = 'America/New_York';
const currentTime = new Date().toLocaleString('en-US', { timeZone: etTimeZone });
const etTimeZone = "America/New_York";
const currentTime = new Date().toLocaleString("en-US", {
timeZone: etTimeZone,
});
// Determine if the NYSE is currently open or closed
const currentHour = new Date(currentTime).getHours();
const isWeekendValue = new Date(currentTime).getDay() === 6 || new Date(currentTime).getDay() === 0;
const isBeforeMarketOpenValue = currentHour < 9 || (currentHour === 9 && new Date(currentTime).getMinutes() < 30);
const isWeekendValue =
new Date(currentTime).getDay() === 6 ||
new Date(currentTime).getDay() === 0;
const isBeforeMarketOpenValue =
currentHour < 9 ||
(currentHour === 9 && new Date(currentTime).getMinutes() < 30);
const isAfterMarketCloseValue = currentHour >= 16;
isOpen.set(!(isWeekendValue || isBeforeMarketOpenValue || isAfterMarketCloseValue || holidays?.includes(currentDate)));
}
isOpen.set(
!(
isWeekendValue ||
isBeforeMarketOpenValue ||
isAfterMarketCloseValue ||
holidays?.includes(currentDate)
)
);
};
export const load = async ({parent}) => {
export const load = async ({ parent }) => {
await checkMarketHour();
const { apiURL, apiKey} = await parent();
const { apiURL, apiKey } = await parent();
const getOptionsFlowFeed = async () => {
// make the POST request to the endpoint
const response = await fetch(apiURL + '/options-flow-feed', {
method: 'GET',
const response = await fetch(apiURL + "/options-flow-feed", {
method: "GET",
headers: {
"Content-Type": "application/json", "X-API-KEY": apiKey
"Content-Type": "application/json",
"X-API-KEY": apiKey,
},
});
const output = await response.json();
@ -41,4 +63,4 @@ export const load = async ({parent}) => {
return {
getOptionsFlowFeed: await getOptionsFlowFeed(),
};
};
};