findyourpilot/src/lib/server/user.ts
2025-08-13 16:31:22 +02:00

110 lines
2.4 KiB
TypeScript

import { redirect } from "@tanstack/react-router"
import { createServerFn } from "@tanstack/react-start"
import { db } from "@/integrations/drizzle"
import { profiles, users } from "@/integrations/drizzle/db/schema"
import { getSupabaseServerClient } from "@/integrations/supabase/supabase"
import { loginFormSchema, profileFormSchema, signupFormSchema } from "../validation/user"
export const getUser = createServerFn().handler(async () => {
const supabase = getSupabaseServerClient()
const { data, error } = await supabase.auth.getUser()
if (error || !data.user) {
return {
error: true,
message: error?.message ?? "Unknown error"
}
}
return {
user: {
id: data.user.id,
email: data.user.email,
name: data.user.user_metadata.name || ""
},
error: false
}
})
export const loginUser = createServerFn({
method: "POST"
})
.validator(loginFormSchema)
.handler(async ({ data }) => {
const supabase = getSupabaseServerClient()
const login = await supabase.auth.signInWithPassword({
email: data.email,
password: data.password
})
if (login.error) {
return {
error: true,
message: login.error.message
}
}
return {
error: false
}
})
export const logoutUser = createServerFn().handler(async () => {
const supabase = getSupabaseServerClient()
const { error } = await supabase.auth.signOut()
if (error) {
return {
error: true,
message: error.message
}
}
throw redirect({
to: "/",
viewTransition: true,
replace: true
})
})
export const signupUser = createServerFn({ method: "POST" })
.validator(signupFormSchema)
.handler(async ({ data }) => {
const supabase = getSupabaseServerClient()
const { error } = await supabase.auth.signUp({
email: data.email,
password: data.password
})
if (error) {
return {
error: true,
message: error.message
}
}
throw redirect({
href: data.redirectUrl || "/"
})
})
export const getAllUsers = createServerFn().handler(async () => {
const response = await db.select().from(users)
return response
})
export const createProfile = createServerFn({ method: "POST" })
.validator(profileFormSchema)
.handler(async ({ data }) => {
await db.insert(profiles).values(data).returning();
})
export const getProfile = createServerFn().handler(async (data) => {
const { id } = data;
const response = await db
.select()
.from(profiles)
.where(eq(profiles.id, id))
.limit(1);
return response[0] ?? null;
});