Skip to content

Commit e89afb8

Browse files
committed
Update env config, database setup, seed, index; add public index and migration script
1 parent eba6a5e commit e89afb8

File tree

7 files changed

+431
-15
lines changed

7 files changed

+431
-15
lines changed

.env.example

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
# databases
1+
# databases (use DATABASE_PRO_URL for app, migrations, and seed)
2+
DATABASE_PRO_URL=
23
DATABASE_URL=
34

45
# URIs

config/database/db.ts

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
*
44
* Chooses PostgreSQL (node-postgres) for local/development and Neon serverless
55
* for production. Exports { pool, db } for use by services and session store.
6-
* Requires DATABASE_PRO_URL and DATABASE_URL in the environment.
6+
* Requires DATABASE_PRO_URL in the environment.
77
*
88
* @module config/database/db
99
*/
@@ -18,31 +18,33 @@ import { drizzle as neonDrizzle } from 'drizzle-orm/neon-serverless';
1818

1919
dotenv.config();
2020

21-
if (!process.env.DATABASE_PRO_URL || !process.env.DATABASE_URL) {
21+
if (!process.env.DATABASE_PRO_URL && !process.env.DATABASE_URL) {
2222
throw new Error(
23-
"DATABASE_URL must be set. Did you forget to provision a database?",
23+
"DATABASE_PRO_URL must be set. Did you forget to provision a database?",
2424
);
2525
}
2626

27-
const isLocal = process.env.DATABASE_URL.includes('localhost') ||
28-
process.env.NODE_ENV === 'development';
27+
const connectionString = process.env.DATABASE_PRO_URL || process.env.DATABASE_URL;
28+
const isNeon = connectionString?.includes('neon.tech') || connectionString?.includes('neon.azure');
29+
const isLocal = connectionString?.includes('localhost');
2930

3031
let pool: PgPool | NeonPool;
3132
let db: ReturnType<typeof pgDrizzle> | ReturnType<typeof neonDrizzle>;
3233

33-
if (isLocal) {
34+
if (isNeon || !isLocal) {
35+
// Use Neon driver for Neon URLs or any non-local DB (e.g. production or dev against cloud)
36+
neonConfig.webSocketConstructor = ws;
37+
pool = new NeonPool({ connectionString, ssl: true });
38+
db = neonDrizzle(pool, { schema });
39+
} else {
3440
pool = new PgPool({
35-
connectionString: process.env.DATABASE_PRO_URL,
41+
connectionString,
3642
max: 20,
3743
idleTimeoutMillis: 30000,
38-
connectionTimeoutMillis: 2000,
44+
connectionTimeoutMillis: 10000,
3945
ssl: true,
4046
});
4147
db = pgDrizzle(pool as PgPool, { schema });
42-
} else {
43-
neonConfig.webSocketConstructor = ws;
44-
pool = new NeonPool({ connectionString: process.env.DATABASE_PRO_URL, ssl: true });
45-
db = neonDrizzle(pool, { schema });
4648
}
4749

4850
export default { pool, db };

config/database/seed.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ async function seed() {
2424
await db.delete(timelines);
2525
await db.delete(mediaItems);
2626
await db.delete(stories);
27-
// await db.delete(users);
27+
await db.delete(users);
2828
await db.delete(libraries);
2929
await db.delete(emailTemplates);
3030
await db.delete(messageResponses);

index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@ app.use(session({
7878
// Request logging middleware
7979
app.use(requestLogger);
8080

81+
/** Static files and landing page: GET / serves public/index.html */
82+
app.use(express.static("public"));
83+
8184
(async () => {
8285
const server = await registerRoutes("/api/v1", app);
8386
app.use(errorHandler);

0 commit comments

Comments
 (0)