diff --git a/backend/src/db/migrate/store.js b/backend/src/db/migrate/store.js index ac762647b..0c0b63943 100644 --- a/backend/src/db/migrate/store.js +++ b/backend/src/db/migrate/store.js @@ -86,13 +86,6 @@ class Store { if (CONFIG.CATEGORIES_ACTIVE) await createCategories(session) const writeTxResultPromise = session.writeTransaction(async (txc) => { await txc.run('CALL apoc.schema.assert({},{},true)') // drop all indices and constraints - return Promise.all( - [ - 'CALL db.index.fulltext.createNodeIndex("user_fulltext_search",["User"],["name", "slug"])', - 'CALL db.index.fulltext.createNodeIndex("post_fulltext_search",["Post"],["title", "content"])', - 'CALL db.index.fulltext.createNodeIndex("tag_fulltext_search",["Tag"],["id"])', - ].map((statement) => txc.run(statement)), - ) }) try { await writeTxResultPromise diff --git a/backend/src/db/migrations/20230320130345-fulltext-search-indexes.js b/backend/src/db/migrations/20230320130345-fulltext-search-indexes.js new file mode 100644 index 000000000..11029bea6 --- /dev/null +++ b/backend/src/db/migrations/20230320130345-fulltext-search-indexes.js @@ -0,0 +1,68 @@ +import { getDriver } from '../../db/neo4j' + +export const description = '' + +export async function up(next) { + const driver = getDriver() + const session = driver.session() + const transaction = session.beginTransaction() + + try { + // Drop indexes if they exist because due to legacy code they might be set already + const indexesResponse = await transaction.run(`CALL db.indexes()`) + const indexes = indexesResponse.records.map((record) => record.get('indexName')) + if (indexes.indexOf('user_fulltext_search') > -1) { + await transaction.run(`CALL db.index.fulltext.drop("user_fulltext_search")`) + } + if (indexes.indexOf('post_fulltext_search') > -1) { + await transaction.run(`CALL db.index.fulltext.drop("post_fulltext_search")`) + } + if (indexes.indexOf('tag_fulltext_search') > -1) { + await transaction.run(`CALL db.index.fulltext.drop("tag_fulltext_search")`) + } + // Create indexes + await transaction.run( + `CALL db.index.fulltext.createNodeIndex("user_fulltext_search",["User"],["name", "slug"])`, + ) + await transaction.run( + `CALL db.index.fulltext.createNodeIndex("post_fulltext_search",["Post"],["title", "content"])`, + ) + await transaction.run( + `CALL db.index.fulltext.createNodeIndex("tag_fulltext_search",["Tag"],["id"])`, + ) + await transaction.commit() + next() + } catch (error) { + // eslint-disable-next-line no-console + console.log(error) + await transaction.rollback() + // eslint-disable-next-line no-console + console.log('rolled back') + throw new Error(error) + } finally { + session.close() + } +} + +export async function down(next) { + const driver = getDriver() + const session = driver.session() + const transaction = session.beginTransaction() + + try { + await transaction.run(`CALL db.index.fulltext.drop("user_fulltext_search")`) + await transaction.run(`CALL db.index.fulltext.drop("post_fulltext_search")`) + await transaction.run(`CALL db.index.fulltext.drop("tag_fulltext_search")`) + await transaction.commit() + next() + } catch (error) { + // eslint-disable-next-line no-console + console.log(error) + await transaction.rollback() + // eslint-disable-next-line no-console + console.log('rolled back') + throw new Error(error) + } finally { + session.close() + } +}