feat: rewrite project

This commit is contained in:
2025-02-01 01:23:55 -05:00
parent a4c8fdc0c3
commit e6962aef79
181 changed files with 18053 additions and 12327 deletions

109
src/server/auth/config.ts Normal file
View File

@@ -0,0 +1,109 @@
import { DrizzleAdapter } from "@auth/drizzle-adapter";
import type { Session } from "@auth/core/types";
import type { DefaultSession } from "@auth/core/types";
import type { User } from "@auth/core/types";
import type { AuthConfig } from "@auth/core/types";
import CredentialsProvider from "@auth/core/providers/credentials";
import bcrypt from "bcryptjs";
import { eq } from "drizzle-orm";
import { db } from "~/server/db";
import {
accounts,
sessions,
users,
verificationTokens,
} from "~/server/db/schema";
/**
* Module augmentation for `next-auth` types. Allows us to add custom properties to the `session`
* object and keep type safety.
*
* @see https://next-auth.js.org/getting-started/typescript#module-augmentation
*/
declare module "@auth/core/types" {
interface Session extends DefaultSession {
user: {
id: string;
email: string;
} & DefaultSession["user"];
}
// interface User {
// // ...other properties
// // role: UserRole;
// }
}
/**
* Options for NextAuth.js used to configure adapters, providers, callbacks, etc.
*
* @see https://next-auth.js.org/configuration/options
*/
export const authConfig = {
adapter: DrizzleAdapter(db, {
usersTable: users,
accountsTable: accounts,
sessionsTable: sessions,
verificationTokensTable: verificationTokens,
}),
providers: [
CredentialsProvider({
name: "credentials",
credentials: {
email: { label: "Email", type: "email" },
password: { label: "Password", type: "password" }
},
async authorize(credentials) {
if (!credentials?.email || !credentials?.password) {
throw new Error("Missing credentials");
}
const userEmail = credentials.email as string;
const userPassword = credentials.password as string;
const user = await db
.select()
.from(users)
.where(eq(users.email, userEmail))
.limit(1)
.then(rows => rows[0]);
if (!user) {
throw new Error("Invalid credentials");
}
if (!user.password) {
throw new Error("Invalid credentials");
}
const isValid = await bcrypt.compare(
userPassword,
user.password
);
if (!isValid) {
throw new Error("Invalid credentials");
}
return {
id: user.id,
email: user.email,
name: user.name ?? null,
};
}
})
],
callbacks: {
session: ({ session, user }: { session: Session; user: User }) => ({
...session,
user: {
...session.user,
id: user.id,
},
}),
},
pages: {
signIn: '/login',
},
} satisfies AuthConfig;