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()
+---
+
+
+
+
\ 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')
+---
+
+
+
+
\ 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