A location based messaging app built on ATProto.
at main 68 lines 1.6 kB view raw
1import knex, { Knex } from "knex"; 2import { env } from "#/lib/env"; 3import { Post, Rating } from "#/lib/repositories/entities"; 4 5// Database instance 6let dbInstance: Database | null = null; 7 8export const createDb = (): Database => { 9 if (dbInstance) { 10 return dbInstance; 11 } 12 let connection; 13 if (env.DB_URL) { 14 console.log("Using DATABASE_URL for database connection"); 15 connection = env.DB_URL; 16 } else { 17 console.log( 18 `Using individual DB_* env vars for database connection: host=${env.DB_HOST} port=${env.DB_PORT} db=${env.DB_NAME} user=${env.DB_USER}`, 19 ); 20 connection = { 21 host: env.DB_HOST, 22 port: env.DB_PORT, 23 database: env.DB_NAME, 24 user: env.DB_USER, 25 password: env.DB_PASSWORD, 26 ssl: env.DB_CA_CERT 27 ? { 28 ca: env.DB_CA_CERT, 29 rejectUnauthorized: true, 30 } 31 : undefined, 32 } as Knex.PgConnectionConfig; 33 } 34 35 const config: Knex.Config = { 36 client: "pg", 37 connection: connection, 38 pool: { 39 min: 2, 40 max: 10, 41 }, 42 migrations: { 43 tableName: "knex_migrations", 44 directory: "./migrations", 45 }, 46 }; 47 48 dbInstance = knex(config); 49 return dbInstance; 50}; 51 52export const migrateToLatest = async (db: Database) => { 53 try { 54 await db.migrate.latest(); 55 } catch (error) { 56 console.error("Migration failed:", error); 57 throw error; 58 } 59}; 60 61export const closeDb = async () => { 62 if (dbInstance) { 63 await dbInstance.destroy(); 64 dbInstance = null; 65 } 66}; 67 68export type Database = Knex<Rating & Post>;