Rework database Conf to easily get the dialect

This commit is contained in:
Alex Gleason 2024-05-24 20:07:38 -05:00
parent ab22feacd2
commit 250998405a
No known key found for this signature in database
GPG Key ID: 7211D1F99744FBB7
5 changed files with 24 additions and 42 deletions

View File

@ -61,27 +61,6 @@ class Conf {
static get externalDomain() {
return Deno.env.get('NOSTR_EXTERNAL') || Conf.localDomain;
}
/** Path to the main SQLite database which stores users, events, and more. */
static get dbPath() {
if (Deno.env.get('DATABASE_URL') === 'sqlite://:memory:') {
return ':memory:';
}
const { host, pathname } = Conf.databaseUrl;
if (!pathname) return '';
// Get relative path.
if (host === '') {
return pathname;
} else if (host === '.') {
return pathname;
} else if (host) {
return host + pathname;
}
return '';
}
/**
* Heroku-style database URL. This is used in production to connect to the
* database.
@ -92,9 +71,24 @@ class Conf {
* protocol://username:password@host:port/database_name
* ```
*/
static get databaseUrl(): url.UrlWithStringQuery {
return url.parse(Deno.env.get('DATABASE_URL') ?? 'sqlite://data/db.sqlite3');
static get databaseUrl(): string {
return Deno.env.get('DATABASE_URL') ?? 'sqlite://data/db.sqlite3';
}
static db = {
get url(): url.UrlWithStringQuery {
return url.parse(Deno.env.get('DATABASE_URL') ?? 'sqlite://data/db.sqlite3');
},
get dialect(): 'sqlite' | 'postgres' | undefined {
switch (Conf.db.url.protocol) {
case 'sqlite:':
return 'sqlite';
case 'postgres:':
case 'postgresql:':
return 'postgres';
}
return undefined;
},
};
/** Character limit to enforce for posts made through Mastodon API. */
static get postCharLimit() {
return Number(Deno.env.get('POST_CHAR_LIMIT') || 5000);

View File

@ -19,16 +19,13 @@ export class DittoDB {
}
static async _getInstance(): Promise<Kysely<DittoTables>> {
const { databaseUrl } = Conf;
let kysely: Kysely<DittoTables>;
switch (databaseUrl.protocol) {
case 'sqlite:':
switch (Conf.db.dialect) {
case 'sqlite':
kysely = await DittoSQLite.getInstance();
break;
case 'postgres:':
case 'postgresql:':
case 'postgres':
kysely = await DittoPostgres.getInstance();
break;
default:

View File

@ -19,7 +19,7 @@ export class DittoPostgres {
// @ts-ignore mismatched kysely versions probably
createDriver() {
return new PostgreSQLDriver(
{ connectionString: Deno.env.get('DATABASE_URL') },
{ connectionString: Conf.databaseUrl },
Conf.pg.poolSize,
);
},

View File

@ -36,11 +36,11 @@ export class DittoSQLite {
/** Get the relative or absolute path based on the `DATABASE_URL`. */
static get path() {
if (Deno.env.get('DATABASE_URL') === 'sqlite://:memory:') {
if (Conf.databaseUrl === 'sqlite://:memory:') {
return ':memory:';
}
const { host, pathname } = Conf.databaseUrl;
const { host, pathname } = Conf.db.url;
if (!pathname) return '';

View File

@ -42,17 +42,8 @@ class EventsDB implements NStore {
};
constructor(private kysely: Kysely<DittoTables>) {
let fts: 'sqlite' | 'postgres' | undefined;
if (Conf.databaseUrl.protocol === 'sqlite:') {
fts = 'sqlite';
}
if (['postgres:', 'postgresql:'].includes(Conf.databaseUrl.protocol!)) {
fts = 'postgres';
}
this.store = new NDatabase(kysely, {
fts,
fts: Conf.db.dialect,
indexTags: EventsDB.indexTags,
searchText: EventsDB.searchText,
});