74 lines
1.7 KiB
TypeScript
74 lines
1.7 KiB
TypeScript
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,
|
|
};
|
|
},
|
|
},
|
|
});
|