import { SpotifyApi } from "@spotify/web-api-ts-sdk"; import { betterAuth } from "better-auth"; import { drizzleAdapter } from "better-auth/adapters/drizzle"; import Elysia from "elysia"; import { db } from "./db"; import * as schema from "./db/auth-schema"; const requireEnv = (name: string): string => { const value = process.env[name]; if (!value) throw new Error(`Missing required env var: ${name}`); return value; }; export const SPOTIFY_CLIENT_ID = requireEnv("SPOTIFY_CLIENT_ID"); export const SPOTIFY_CLIENT_SECRET = requireEnv("SPOTIFY_CLIENT_SECRET"); export const defaultSdk = SpotifyApi.withClientCredentials( SPOTIFY_CLIENT_ID, SPOTIFY_CLIENT_SECRET, ); export const auth = betterAuth({ user: { additionalFields: { lastSyncAt: { type: "date", required: false, input: false, }, }, }, database: drizzleAdapter(db, { provider: "pg", schema, }), socialProviders: { spotify: { clientId: SPOTIFY_CLIENT_ID, clientSecret: SPOTIFY_CLIENT_SECRET, scope: [ "user-read-playback-state", "user-read-currently-playing", "user-modify-playback-state", "playlist-read-private", "playlist-read-collaborative", "user-follow-read", "user-top-read", "user-read-recently-played", "user-library-read", // "user-personalized", "user-read-email", ], }, }, }); export const betterAuthElysia = new Elysia({ name: "better-auth" }) .mount(auth.handler) .macro({ auth: { async resolve({ status, request: { headers } }) { const session = await auth.api.getSession({ headers, }); if (!session) return status(401); return { user: session.user, session: session.session, }; }, }, });