diff --git a/teressa-copeland-homes/drizzle.config.ts b/teressa-copeland-homes/drizzle.config.ts new file mode 100644 index 0000000..abd77f8 --- /dev/null +++ b/teressa-copeland-homes/drizzle.config.ts @@ -0,0 +1,11 @@ +import "dotenv/config"; +import { defineConfig } from "drizzle-kit"; + +export default defineConfig({ + schema: "./src/lib/db/schema.ts", + out: "./drizzle", + dialect: "postgresql", + dbCredentials: { + url: process.env.DATABASE_URL!, + }, +}); diff --git a/teressa-copeland-homes/drizzle/0000_milky_black_cat.sql b/teressa-copeland-homes/drizzle/0000_milky_black_cat.sql new file mode 100644 index 0000000..665173c --- /dev/null +++ b/teressa-copeland-homes/drizzle/0000_milky_black_cat.sql @@ -0,0 +1,7 @@ +CREATE TABLE "users" ( + "id" text PRIMARY KEY NOT NULL, + "email" text NOT NULL, + "password_hash" text NOT NULL, + "created_at" timestamp DEFAULT now() NOT NULL, + CONSTRAINT "users_email_unique" UNIQUE("email") +); diff --git a/teressa-copeland-homes/drizzle/meta/0000_snapshot.json b/teressa-copeland-homes/drizzle/meta/0000_snapshot.json new file mode 100644 index 0000000..ab919fb --- /dev/null +++ b/teressa-copeland-homes/drizzle/meta/0000_snapshot.json @@ -0,0 +1,65 @@ +{ + "id": "67889008-a13f-4b7e-9a7e-87d0e0ca3fd4", + "prevId": "00000000-0000-0000-0000-000000000000", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password_hash": { + "name": "password_hash", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_email_unique": { + "name": "users_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/teressa-copeland-homes/drizzle/meta/_journal.json b/teressa-copeland-homes/drizzle/meta/_journal.json new file mode 100644 index 0000000..b89f750 --- /dev/null +++ b/teressa-copeland-homes/drizzle/meta/_journal.json @@ -0,0 +1,13 @@ +{ + "version": "7", + "dialect": "postgresql", + "entries": [ + { + "idx": 0, + "version": "7", + "when": 1773948629637, + "tag": "0000_milky_black_cat", + "breakpoints": true + } + ] +} \ No newline at end of file diff --git a/teressa-copeland-homes/scripts/seed.ts b/teressa-copeland-homes/scripts/seed.ts new file mode 100644 index 0000000..1e26cc0 --- /dev/null +++ b/teressa-copeland-homes/scripts/seed.ts @@ -0,0 +1,29 @@ +import "dotenv/config"; +import { drizzle } from "drizzle-orm/neon-http"; +import { neon } from "@neondatabase/serverless"; +import { users } from "../src/lib/db/schema"; +import bcrypt from "bcryptjs"; + +const sql = neon(process.env.DATABASE_URL!); +const db = drizzle({ client: sql }); + +async function seed() { + const email = process.env.AGENT_EMAIL; + const password = process.env.AGENT_PASSWORD; + + if (!email || !password) { + throw new Error("AGENT_EMAIL and AGENT_PASSWORD env vars are required"); + } + + const passwordHash = await bcrypt.hash(password, 12); + + await db.insert(users).values({ email, passwordHash }).onConflictDoNothing(); + + console.log(`Seeded agent account: ${email}`); + process.exit(0); +} + +seed().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/teressa-copeland-homes/src/lib/db/index.ts b/teressa-copeland-homes/src/lib/db/index.ts new file mode 100644 index 0000000..fabb6c0 --- /dev/null +++ b/teressa-copeland-homes/src/lib/db/index.ts @@ -0,0 +1,6 @@ +import { drizzle } from "drizzle-orm/neon-http"; +import { neon } from "@neondatabase/serverless"; +import * as schema from "./schema"; + +const sql = neon(process.env.DATABASE_URL!); +export const db = drizzle({ client: sql, schema }); diff --git a/teressa-copeland-homes/src/lib/db/schema.ts b/teressa-copeland-homes/src/lib/db/schema.ts new file mode 100644 index 0000000..d67261d --- /dev/null +++ b/teressa-copeland-homes/src/lib/db/schema.ts @@ -0,0 +1,8 @@ +import { pgTable, text, timestamp } from "drizzle-orm/pg-core"; + +export const users = pgTable("users", { + id: text("id").primaryKey().$defaultFn(() => crypto.randomUUID()), + email: text("email").notNull().unique(), + passwordHash: text("password_hash").notNull(), + createdAt: timestamp("created_at").defaultNow().notNull(), +});