diff --git a/src/routes/stocks/[tickerID]/dividends/+page.server.ts b/src/routes/stocks/[tickerID]/dividends/+page.server.ts index b5f8e493..191e625e 100644 --- a/src/routes/stocks/[tickerID]/dividends/+page.server.ts +++ b/src/routes/stocks/[tickerID]/dividends/+page.server.ts @@ -1,3 +1,8 @@ +import { error, fail, redirect } from "@sveltejs/kit"; +import { validateData } from "$lib/utils"; +import { loginUserSchema, registerUserSchema } from "$lib/schemas"; + + export const load = async ({ params, locals }) => { const getStockDividend = async () => { let newsList; @@ -28,3 +33,155 @@ export const load = async ({ params, locals }) => { getStockDividend: await getStockDividend(), }; }; + + + +export const actions = { + login: async ({ url, request, locals }) => { + + const path = url?.href?.replace("/oauth2","") + + 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(302, path); + }, + + register: async ({ url, locals, request }) => { + const path = url?.href?.replace("/oauth2","") + + 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, path); + }, + + oauth2: async ({ url, locals, request, cookies }) => { + + const path = url?.href?.replace("/oauth2","") + 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", path, { + httpOnly: true, + sameSite: "lax", + secure: true, + path: "/", + maxAge: 60, + }); + + redirect(302, authProviderRedirect); + }, + +}; diff --git a/src/routes/stocks/[tickerID]/financials/+page.server.ts b/src/routes/stocks/[tickerID]/financials/+page.server.ts index 6960a6cc..a708c5cb 100644 --- a/src/routes/stocks/[tickerID]/financials/+page.server.ts +++ b/src/routes/stocks/[tickerID]/financials/+page.server.ts @@ -1,3 +1,9 @@ +import { error, fail, redirect } from "@sveltejs/kit"; +import { validateData } from "$lib/utils"; +import { loginUserSchema, registerUserSchema } from "$lib/schemas"; + + + export const load = async ({ locals, params }) => { const getIncomeStatement = async () => { const { apiKey, apiURL } = locals; @@ -25,3 +31,154 @@ export const load = async ({ locals, params }) => { getIncomeStatement: await getIncomeStatement(), }; }; + + +export const actions = { + login: async ({ url, request, locals }) => { + + const path = url?.href?.replace("/oauth2","") + + 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(302, path); + }, + + register: async ({ url, locals, request }) => { + const path = url?.href?.replace("/oauth2","") + + 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, path); + }, + + oauth2: async ({ url, locals, request, cookies }) => { + + const path = url?.href?.replace("/oauth2","") + 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", path, { + httpOnly: true, + sameSite: "lax", + secure: true, + path: "/", + maxAge: 60, + }); + + redirect(302, authProviderRedirect); + }, + +}; \ No newline at end of file diff --git a/src/routes/stocks/[tickerID]/forecast/+page.server.ts b/src/routes/stocks/[tickerID]/forecast/+page.server.ts new file mode 100644 index 00000000..a57e90ee --- /dev/null +++ b/src/routes/stocks/[tickerID]/forecast/+page.server.ts @@ -0,0 +1,153 @@ +import { error, fail, redirect } from "@sveltejs/kit"; +import { validateData } from "$lib/utils"; +import { loginUserSchema, registerUserSchema } from "$lib/schemas"; + +export const actions = { + login: async ({ url, request, locals }) => { + + const path = url?.href?.replace("/oauth2","") + + 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(302, path); + }, + + register: async ({ url, locals, request }) => { + const path = url?.href?.replace("/oauth2","") + + 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, path); + }, + + oauth2: async ({ url, locals, request, cookies }) => { + + const path = url?.href?.replace("/oauth2","") + 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", path, { + httpOnly: true, + sameSite: "lax", + secure: true, + path: "/", + maxAge: 60, + }); + + redirect(302, authProviderRedirect); + }, + +}; \ No newline at end of file diff --git a/src/routes/stocks/[tickerID]/forecast/ai/+page.server.ts b/src/routes/stocks/[tickerID]/forecast/ai/+page.server.ts index c3096e0e..9d884c5f 100644 --- a/src/routes/stocks/[tickerID]/forecast/ai/+page.server.ts +++ b/src/routes/stocks/[tickerID]/forecast/ai/+page.server.ts @@ -1,3 +1,7 @@ +import { error, fail, redirect } from "@sveltejs/kit"; +import { validateData } from "$lib/utils"; +import { loginUserSchema, registerUserSchema } from "$lib/schemas"; + export const load = async ({ locals, params }) => { const { apiURL, apiKey } = locals; const postData = { @@ -52,3 +56,156 @@ export const load = async ({ locals, params }) => { getSentimentAnalysis: await getSentimentAnalysis(), }; }; + + + + +export const actions = { + login: async ({ url, request, locals }) => { + + const path = url?.href?.replace("/oauth2","") + + 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(302, path); + }, + + register: async ({ url, locals, request }) => { + const path = url?.href?.replace("/oauth2","") + + 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, path); + }, + + oauth2: async ({ url, locals, request, cookies }) => { + + const path = url?.href?.replace("/oauth2","") + 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", path, { + httpOnly: true, + sameSite: "lax", + secure: true, + path: "/", + maxAge: 60, + }); + + redirect(302, authProviderRedirect); + }, + +}; \ No newline at end of file diff --git a/src/routes/stocks/[tickerID]/forecast/analyst/+page.server.ts b/src/routes/stocks/[tickerID]/forecast/analyst/+page.server.ts new file mode 100644 index 00000000..bc6f25c3 --- /dev/null +++ b/src/routes/stocks/[tickerID]/forecast/analyst/+page.server.ts @@ -0,0 +1,155 @@ +import { error, fail, redirect } from "@sveltejs/kit"; +import { validateData } from "$lib/utils"; +import { loginUserSchema, registerUserSchema } from "$lib/schemas"; + + + +export const actions = { + login: async ({ url, request, locals }) => { + + const path = url?.href?.replace("/oauth2","") + + 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(302, path); + }, + + register: async ({ url, locals, request }) => { + const path = url?.href?.replace("/oauth2","") + + 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, path); + }, + + oauth2: async ({ url, locals, request, cookies }) => { + + const path = url?.href?.replace("/oauth2","") + 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", path, { + httpOnly: true, + sameSite: "lax", + secure: true, + path: "/", + maxAge: 60, + }); + + redirect(302, authProviderRedirect); + }, + +}; \ No newline at end of file diff --git a/src/routes/stocks/[tickerID]/insider/+page.server.ts b/src/routes/stocks/[tickerID]/insider/+page.server.ts index 7688a8c5..f180d314 100644 --- a/src/routes/stocks/[tickerID]/insider/+page.server.ts +++ b/src/routes/stocks/[tickerID]/insider/+page.server.ts @@ -1,3 +1,8 @@ +import { error, fail, redirect } from "@sveltejs/kit"; +import { validateData } from "$lib/utils"; +import { loginUserSchema, registerUserSchema } from "$lib/schemas"; + + const transactionTypeMap = { "P-Purchase": "Bought", "A-Award": "Grant", @@ -93,3 +98,155 @@ export const load = async ({ locals, params }) => { //getInsiderTradingStatistics: await getInsiderTradingStatistics(), }; }; + + + +export const actions = { + login: async ({ url, request, locals }) => { + + const path = url?.href?.replace("/oauth2","") + + 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(302, path); + }, + + register: async ({ url, locals, request }) => { + const path = url?.href?.replace("/oauth2","") + + 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, path); + }, + + oauth2: async ({ url, locals, request, cookies }) => { + + const path = url?.href?.replace("/oauth2","") + 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", path, { + httpOnly: true, + sameSite: "lax", + secure: true, + path: "/", + maxAge: 60, + }); + + redirect(302, authProviderRedirect); + }, + +};