frontend/src/routes/stock-screener/+page.server.ts
2024-11-24 21:47:45 +01:00

224 lines
5.1 KiB
TypeScript

import { error, fail, redirect } from "@sveltejs/kit";
import { validateData } from "$lib/utils";
import { loginUserSchema, registerUserSchema } from "$lib/schemas";
// Define the EMA parameters to check
const emaParameters = [
"sma20",
"sma50",
"sma100",
"sma200",
"ema20",
"ema50",
"ema100",
"ema200",
];
// Function to check and add missing EMA parameters
const ensureAllEmaParameters = (params) => {
const includedEmaParameters = params.filter((param) =>
emaParameters.includes(param)
);
if (includedEmaParameters.length > 0) {
emaParameters.forEach((param) => {
if (!params.includes(param)) {
params.push(param);
}
});
}
};
export const load = async ({ locals }) => {
const { apiURL, apiKey, user, pb } = locals;
const getAllStrategies = async () => {
let output = [];
try {
output = await pb.collection("stockscreener").getFullList({
filter: `user="${user?.id}"`,
});
output?.sort((a, b) => new Date(b?.updated) - new Date(a?.updated));
}
catch(e) {
output = [];
}
return output;
};
const getStockScreenerData = async () => {
const strategyList = await getAllStrategies();
const strategy = strategyList?.at(0);
let getRuleOfList = strategy?.rules?.map((item) => item?.name) || [];
// Ensure all required EMA parameters are included
ensureAllEmaParameters(getRuleOfList);
const postData = { ruleOfList: getRuleOfList };
// make the POST request to the endpoint
const response = await fetch(apiURL + "/stock-screener-data", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-KEY": apiKey,
},
body: JSON.stringify(postData),
});
const output = await response.json();
return output;
};
// Make sure to return a promise
return {
getStockScreenerData: await getStockScreenerData(),
getAllStrategies: await getAllStrategies(),
};
};
export const actions = {
login: async ({ request, locals }) => {
const { formData, errors } = await validateData(
await request.formData(),
loginUserSchema
);
if (errors) {
return fail(400, {
data: formData,
errors: errors.fieldErrors,
});
}
try {
await locals.pb
.collection("users")
.authWithPassword(formData.email, formData.password);
/*
if (!locals.pb?.authStore?.model?.verified) {
locals.pb.authStore.clear();
return {
notVerified: true,
};
}
*/
} catch (err) {
console.log("Error: ", err);
error(err.status, err.message);
}
redirect(303, "/");
},
register: async ({ locals, request }) => {
const { formData, errors } = await validateData(
await request.formData(),
registerUserSchema
);
if (errors) {
return fail(400, {
data: formData,
errors: errors.fieldErrors,
});
}
try {
let newUser = await locals.pb.collection("users").create(formData);
/*
await locals.pb?.collection('users').update(
newUser?.id, {
'freeTrial' : true,
'tier': 'Pro', //Give new users a free trial for the Pro Subscription
});
*/
await locals.pb.collection("users").requestVerification(formData.email);
} catch (err) {
console.log("Error: ", err);
error(err.status, err.message);
}
try {
await locals.pb
.collection("users")
.authWithPassword(formData.email, formData.password);
} catch (err) {
console.log("Error: ", err);
error(err.status, err.message);
}
redirect(303, "/");
},
oauth2: async ({ url, locals, request, cookies }) => {
const authMethods = (await locals?.pb
?.collection("users")
?.listAuthMethods())?.oauth2;
const data = await request?.formData();
const providerSelected = data?.get("provider");
if (!authMethods) {
return {
authProviderRedirect: "",
authProviderState: "",
};
}
const redirectURL = `${url.origin}/oauth`;
const targetItem = authMethods?.providers?.findIndex(
(item) => item?.name === providerSelected,
);
//console.log("==================")
//console.log(authMethods.authProviders)
//console.log('target item is: ', targetItem)
const provider = authMethods.providers[targetItem];
const authProviderRedirect = `${provider.authUrl}${redirectURL}`;
const state = provider.state;
const verifier = provider.codeVerifier;
cookies.set("state", state, {
httpOnly: true,
sameSite: "lax",
secure: true,
path: "/",
maxAge: 60 * 60,
});
cookies.set("verifier", verifier, {
httpOnly: true,
sameSite: "lax",
secure: true,
path: "/",
maxAge: 60 * 60,
});
cookies.set("provider", providerSelected, {
httpOnly: true,
sameSite: "lax",
secure: true,
path: "/",
maxAge: 60 * 60,
});
cookies.set("path", "/", {
httpOnly: true,
sameSite: "lax",
secure: true,
path: "/",
maxAge: 60,
});
redirect(302, authProviderRedirect);
},
};