import { Client } from 'typesense'; import chalk from 'chalk'; import { db, poolConnection } from '../src/db/index.ts'; import { client } from '../src/db/typesense.ts'; async function createCollection(client: Client) { // Delete the collection if it already exists to ensure a clean slate try { const response = await client.collections('cards').delete(); //console.log(`Collection "cards" deleted successfully:`, response); } catch (error) { //console.error(`Error deleting collection "cards":`, error); } // Create the collection with the specified schema try { await client.collections('cards').retrieve(); console.log(chalk.yellow('Collection "cards" already exists.')); } catch (error) { if (error instanceof Error && error.message.includes('404')) { await client.collections().create({ name: 'cards', fields: [ { name: 'productId', type: 'int32' }, { name: 'variant', type: 'string' }, { name: 'productName', type: 'string' }, { name: 'productLineName', type: 'string', facet: true }, { name: 'rarityName', type: 'string', facet: true }, { name: 'setName', type: 'string', facet: true }, { name: 'cardType', type: 'string', facet: true }, { name: 'energyType', type: 'string', facet: true }, { name: 'number', type: 'string' }, { name: 'Artist', type: 'string' }, { name: 'sealed', type: 'bool' }, ], //default_sorting_field: 'productId', }); console.log(chalk.green('Collection "cards" created successfully.')); } else { console.error(chalk.red('Error checking/creating collection:'), error); process.exit(1); } } } async function preloadSearchIndex() { const pokemon = await db.query.cards.findMany({ with: { set: true, } }); // Ensure the collection exists before importing documents await createCollection(client); await client.collections('cards').documents().import(pokemon.map(card => ({ productId: card.productId, variant: card.variant, productName: card.productName, productLineName: card.productLineName, rarityName: card.rarityName, setName: card.set?.setName || "", cardType: card.cardType || "", energyType: card.energyType || "", number: card.number, Artist: card.Artist || "", sealed: card.sealed, })), { action: 'upsert' }); console.log(chalk.green('Search index preloaded with Pokémon cards.')); } await preloadSearchIndex().catch((error) => { console.error(chalk.red('Error preloading search index:'), error); for (const e of error.importResults) { if (!e.success) { console.error(chalk.red(`Error importing document ${e.id}:`), e.error); } } process.exit(1); }).finally(() => { poolConnection.end(); console.log(chalk.blue('Database connection closed.')); process.exit(0); });