A location based messaging app built on ATProto.
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>;