224 lines
5.1 KiB
TypeScript
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);
|
|
},
|
|
};
|