diff --git a/src/pages/api/account/add.astro b/src/pages/api/account/add.astro new file mode 100644 index 0000000..970b38a --- /dev/null +++ b/src/pages/api/account/add.astro @@ -0,0 +1,22 @@ +--- +import Base from "@layouts/Base.astro" +const CreatorId = Astro.url.href.split("add?=").pop() +import { supabase } from "../../../library/supabase" +const { data: { user } } = await supabase.auth.getUser() +const { data, error } = await supabase + .from('subs') + .insert([ + { + UserSubscribed: user?.id, + Id: CreatorId, + Platform: "YouTube" + }, + ]) + .select() +--- + + +
+

One moment...

+
+ \ No newline at end of file diff --git a/src/pages/api/account/beta-off.ts b/src/pages/api/account/beta-off.ts new file mode 100644 index 0000000..0587f68 --- /dev/null +++ b/src/pages/api/account/beta-off.ts @@ -0,0 +1,18 @@ +import type { APIRoute } from "astro" +import { supabase } from "@library/supabase" + +export const POST: APIRoute = async ({ redirect }) => { + + // https://supabase.com/docs/reference/javascript/auth-updateuser?example=update-the-users-metadata + const { error } = await supabase.auth.updateUser({ + data: { + beta: false + } + }) + + if (error) { + return new Response(error.message, { status: 500 }) + } + + return redirect("/account") +} diff --git a/src/pages/api/account/beta-on.ts b/src/pages/api/account/beta-on.ts new file mode 100644 index 0000000..d60725d --- /dev/null +++ b/src/pages/api/account/beta-on.ts @@ -0,0 +1,18 @@ +import type { APIRoute } from "astro" +import { supabase } from "@library/supabase" + +export const POST: APIRoute = async ({ redirect }) => { + + // https://supabase.com/docs/reference/javascript/auth-updateuser?example=update-the-users-metadata + const { error } = await supabase.auth.updateUser({ + data: { + beta: true + } + }) + + if (error) { + return new Response(error.message, { status: 500 }) + } + + return redirect("/account") +} diff --git a/src/pages/api/account/delete.ts b/src/pages/api/account/delete.ts new file mode 100644 index 0000000..0df196d --- /dev/null +++ b/src/pages/api/account/delete.ts @@ -0,0 +1,14 @@ +import type { APIRoute } from "astro" +import { supabase } from "@library/supabase" + +export const POST: APIRoute = async ({ redirect }) => { + + // https://supabase.com/docs/reference/javascript/auth-updateuser?example=update-the-users-metadata + const { error } = await supabase.rpc('delete_user'); + + if (error) { + return new Response(error.message, { status: 500 }) + } + + return redirect("/signout") +} diff --git a/src/pages/api/account/remove.astro b/src/pages/api/account/remove.astro new file mode 100644 index 0000000..65cd4a9 --- /dev/null +++ b/src/pages/api/account/remove.astro @@ -0,0 +1,19 @@ +--- +import Base from "@layouts/Base.astro" +const CreatorId = Astro.url.href.split("remove?=").pop() +import { supabase } from "../../../library/supabase" +const { data: { user } } = await supabase.auth.getUser() +const id = user?.id +const { data, error } = await supabase + .from('subs') + .delete() + .eq('UserSubscribed', id) + .eq('Id', CreatorId) + .eq('Platform', 'YouTube') +--- + + +
+

One moment...

+
+ \ No newline at end of file diff --git a/src/pages/api/account/reset-password.ts b/src/pages/api/account/reset-password.ts new file mode 100644 index 0000000..d887c98 --- /dev/null +++ b/src/pages/api/account/reset-password.ts @@ -0,0 +1,21 @@ +import type { APIRoute } from "astro" +import { supabase } from "@library/supabase" + +export const POST: APIRoute = async ({ request, redirect }) => { + const formData = await request.formData() + const password = formData.get("password")?.toString() + + if (!password) { + return new Response("Error.", { status: 400 }) + } + + const { error } = await supabase.auth.updateUser({ + password: password, + }) + + if (error) { + return new Response(error.message, { status: 500 }) + } + + return redirect("/signin") +} \ No newline at end of file diff --git a/src/pages/api/account/update-avatar.ts b/src/pages/api/account/update-avatar.ts new file mode 100644 index 0000000..5fad8ce --- /dev/null +++ b/src/pages/api/account/update-avatar.ts @@ -0,0 +1,24 @@ +import type { APIRoute } from "astro" +import { supabase } from "@library/supabase" + +export const POST: APIRoute = async ({ request, redirect }) => { + const formData = await request.formData() + const avatar_url = formData.get("avatar_url")?.toString() + + if (!avatar_url) { + return new Response("Error.", { status: 400 }) + } + + // https://supabase.com/docs/reference/javascript/auth-updateuser?example=update-the-users-metadata + const { error } = await supabase.auth.updateUser({ + data: { + avatar_url: avatar_url + } + }) + + if (error) { + return new Response(error.message, { status: 500 }) + } + + return redirect("/account?=AvatarUpdated") +} diff --git a/src/pages/api/account/update-email.ts b/src/pages/api/account/update-email.ts new file mode 100644 index 0000000..8717749 --- /dev/null +++ b/src/pages/api/account/update-email.ts @@ -0,0 +1,24 @@ +import type { APIRoute } from "astro" +import { supabase } from "@library/supabase" + +export const POST: APIRoute = async ({ request, redirect }) => { + const formData = await request.formData() + const NewEmail = formData.get("email")?.toString() + + if (!NewEmail) { + return new Response("Error.", { status: 400 }) + } + + const { error } = await supabase.auth.updateUser({ + email: NewEmail, + data: { + email_verified: false + } + }) + + if (error) { + return new Response(error.message, { status: 500 }) + } + + return redirect("/account?=CheckEmail") +} \ No newline at end of file diff --git a/src/pages/api/account/update-name.ts b/src/pages/api/account/update-name.ts new file mode 100644 index 0000000..be068e2 --- /dev/null +++ b/src/pages/api/account/update-name.ts @@ -0,0 +1,22 @@ +import type { APIRoute } from "astro" +import { supabase } from "@library/supabase" + +export const POST: APIRoute = async ({ request, redirect }) => { + const formData = await request.formData() + const name = formData.get("name")?.toString() + + if (!name) { + return new Response("Error.", { status: 400 }) + } + + // https://supabase.com/docs/reference/javascript/auth-updateuser?example=update-the-users-metadata + const { error } = await supabase.auth.updateUser({ + data: {full_name: name} + }) + + if (error) { + return new Response(error.message, { status: 500 }) + } + + return redirect("/account?=NameUpdated") +} diff --git a/src/pages/api/account/update-password.ts b/src/pages/api/account/update-password.ts new file mode 100644 index 0000000..670da63 --- /dev/null +++ b/src/pages/api/account/update-password.ts @@ -0,0 +1,21 @@ +import type { APIRoute } from "astro" +import { supabase } from "@library/supabase" + +export const POST: APIRoute = async ({ request, redirect }) => { + const formData = await request.formData() + const password = formData.get("password")?.toString() + + if (!password) { + return new Response("Error.", { status: 400 }) + } + + const { error } = await supabase.auth.updateUser({ + password: password, + }) + + if (error) { + return new Response(error.message, { status: 500 }) + } + + return redirect("/account?=PasswordReset") +} \ No newline at end of file diff --git a/src/pages/api/auth/callback.ts b/src/pages/api/auth/callback.ts new file mode 100644 index 0000000..2cc7416 --- /dev/null +++ b/src/pages/api/auth/callback.ts @@ -0,0 +1,31 @@ +import type { APIRoute } from "astro" +import { supabase } from "@library/supabase" + +export const GET: APIRoute = async ({ url, cookies, redirect }) => { + const authCode = url.searchParams.get("code") + + if (!authCode) { + return new Response("No code provided", { status: 400 }) + } + + // https://supabase.com/docs/reference/javascript/auth-mfa-api + const { data, error } = await supabase.auth.exchangeCodeForSession(authCode) + + if (error) { + return new Response(error.message, { status: 500 }) + } + + const { access_token, refresh_token } = data.session + + cookies.set("sb-access-token", access_token, { + path: "/", + secure: true, + httpOnly: true, + }) + cookies.set("sb-refresh-token", refresh_token, { + path: "/", + secure: true, + httpOnly: true, + }) + return redirect("/") +} diff --git a/src/pages/api/auth/register.ts b/src/pages/api/auth/register.ts new file mode 100644 index 0000000..42dfa6d --- /dev/null +++ b/src/pages/api/auth/register.ts @@ -0,0 +1,36 @@ +import type { APIRoute } from "astro" +import { supabase } from "@library/supabase" + +export const POST: APIRoute = async ({ request, redirect }) => { + const formData = await request.formData() + const avatar_url = formData.get("avatar_url")?.toString() + const name = formData.get("name")?.toString() + const email = formData.get("email")?.toString() + const password = formData.get("password")?.toString() + + if (!email || !password || !name || !avatar_url) { + return new Response("Email and password are required", { status: 400 }) + } + + // https://supabase.com/docs/reference/javascript/auth-signup?example=sign-up-with-additional-user-metadata + const { error } = await supabase.auth.signUp({ + options: { + data: { + full_name: name, + avatar_url: avatar_url, + plan: "Free", + theme: "Dark", + color_scheme: "Green", + beta: true + } + }, + email, + password, + }) + + if (error) { + return new Response(error.message, { status: 500 }) + } + + return redirect("/") +} diff --git a/src/pages/api/auth/signin.ts b/src/pages/api/auth/signin.ts new file mode 100644 index 0000000..962c19c --- /dev/null +++ b/src/pages/api/auth/signin.ts @@ -0,0 +1,52 @@ +import type { APIRoute } from "astro" +import { supabase } from "@library/supabase" +import type { Provider } from "@supabase/supabase-js" + +export const POST: APIRoute = async ({ request, cookies, redirect }) => { + const formData = await request.formData() + const email = formData.get("email")?.toString() + const password = formData.get("password")?.toString() + const provider = formData.get("provider")?.toString() + + // https://supabase.com/docs/reference/javascript/auth-signinwithoauth?example=sign-in-using-a-third-party-provider + if (provider) { + const { data, error } = await supabase.auth.signInWithOAuth({ + provider: provider as Provider, + options: {redirectTo: "http://localhost:4321/api/auth/callback"}, + }) + + if (error) { + return new Response(error.message, { status: 500 }) + } + + return redirect(data.url) + } + + if (!email || !password) { + return new Response("Email and password are required", { status: 400 }) + } + + // https://supabase.com/docs/reference/javascript/auth-signinwithpassword?example=sign-in-with-email-and-password + const { data, error } = await supabase.auth.signInWithPassword({ + email, + password, + }) + + if (error) { + return new Response(error.message, { status: 500 }) + } + + const { access_token, refresh_token } = data.session + cookies.set("sb-access-token", access_token, { + sameSite: "strict", + path: "/", + secure: true, + }) + cookies.set("sb-refresh-token", refresh_token, { + sameSite: "strict", + path: "/", + secure: true, + }) + + return redirect("/") +} diff --git a/src/pages/api/auth/signout.ts b/src/pages/api/auth/signout.ts new file mode 100644 index 0000000..a8583a4 --- /dev/null +++ b/src/pages/api/auth/signout.ts @@ -0,0 +1,7 @@ +import type { APIRoute } from "astro" + +export const GET: APIRoute = async ({ cookies, redirect }) => { + cookies.delete("sb-access-token", { path: "/" }) + cookies.delete("sb-refresh-token", { path: "/" }) + return redirect("/signin") +} \ No newline at end of file