From 57c36b277e68b764dd34cb2e449f6e2ca3d1e9b6 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Thu, 19 Jul 2018 16:17:54 +0200 Subject: Begin advanced search --- server/initializers/database.ts | 43 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'server/initializers/database.ts') diff --git a/server/initializers/database.ts b/server/initializers/database.ts index 434d7ef19..045f41a96 100644 --- a/server/initializers/database.ts +++ b/server/initializers/database.ts @@ -80,6 +80,14 @@ async function initDatabaseModels (silent: boolean) { ScheduleVideoUpdateModel ]) + // Check extensions exist in the database + await checkPostgresExtensions() + + // Create custom PostgreSQL functions + await createFunctions() + + await sequelizeTypescript.query('CREATE EXTENSION IF NOT EXISTS pg_trgm', { raw: true }) + if (!silent) logger.info('Database %s is ready.', dbname) return @@ -91,3 +99,38 @@ export { initDatabaseModels, sequelizeTypescript } + +// --------------------------------------------------------------------------- + +async function checkPostgresExtensions () { + const extensions = [ + 'pg_trgm', + 'unaccent' + ] + + for (const extension of extensions) { + const query = `SELECT true AS enabled FROM pg_available_extensions WHERE name = '${extension}' AND installed_version IS NOT NULL;` + const [ res ] = await sequelizeTypescript.query(query, { raw: true }) + + if (!res || res.length === 0 || res[ 0 ][ 'enabled' ] !== true) { + // Try to create the extension ourself + try { + await sequelizeTypescript.query(`CREATE EXTENSION ${extension};`, { raw: true }) + + } catch { + const errorMessage = `You need to enable ${extension} extension in PostgreSQL. ` + + `You can do so by running 'CREATE EXTENSION ${extension};' as a PostgreSQL super user in ${CONFIG.DATABASE.DBNAME} database.` + throw new Error(errorMessage) + } + } + } +} + +async function createFunctions () { + const query = `CREATE OR REPLACE FUNCTION immutable_unaccent(varchar) + RETURNS text AS $$ + SELECT unaccent($1) + $$ LANGUAGE sql IMMUTABLE;` + + return sequelizeTypescript.query(query, { raw: true }) +} -- cgit v1.2.3