Hey is a decentralized and permissionless social media app built with Lens Protocol 馃尶
1import { withPrefix } from "@hey/helpers/logger";
2import dotenv from "dotenv";
3import type { IDatabase, IFormatting, IHelpers, IMain } from "pg-promise";
4import pgPromise from "pg-promise";
5import type pg from "pg-promise/typescript/pg-subset";
6import type { IConnectionParameters } from "pg-promise/typescript/pg-subset";
7
8dotenv.config({ override: true });
9
10type DatabaseInstance = IDatabase<unknown, pg.IClient>;
11
12interface InitializeDbResult {
13 instance: DatabaseInstance;
14 pg: IMain<unknown, pg.IClient>;
15}
16
17type DatabaseParams = null | Record<string, any>;
18type DatabaseQuery = string;
19
20class Database {
21 private _connectionBase: IConnectionParameters = {
22 connectionString: process.env.LENS_DATABASE_URL,
23 idleTimeoutMillis: 30000,
24 max: 15
25 };
26
27 private _readDb: DatabaseInstance;
28 public as: IFormatting;
29 public helpers: IHelpers;
30
31 constructor() {
32 const readDb = this._initializeDb();
33 this._readDb = readDb.instance;
34 this.helpers = readDb.pg.helpers;
35 this.as = readDb.pg.as;
36 }
37
38 private _initializeDb(): InitializeDbResult {
39 return this._createDbInstance(this._connectionBase);
40 }
41
42 private _createDbInstance(
43 connectionParameters: IConnectionParameters
44 ): InitializeDbResult {
45 const pgp = pgPromise({
46 error: (error: unknown) => {
47 const log = withPrefix("[API]");
48 const errorMessage =
49 error instanceof Error ? error.message : String(error);
50 log.error(`LENS POSTGRES ERROR WITH TRACE: ${errorMessage}`);
51 }
52 });
53
54 return {
55 instance: pgp(connectionParameters),
56 pg: pgp
57 };
58 }
59
60 public multi<T = unknown>(
61 query: DatabaseQuery,
62 params: DatabaseParams = null
63 ): Promise<T[][]> {
64 return this._readDb.multi<T>(query, params);
65 }
66
67 public query<T = unknown>(
68 query: DatabaseQuery,
69 params: DatabaseParams = null
70 ): Promise<T> {
71 return this._readDb.query<T>(query, params);
72 }
73}
74
75export default new Database();