import knex from './knex.js'; import redis from './redis.js'; import initLogger from './logger.js'; const logger = initLogger(); function curateEntity(entity, context) { if (!entity) { return null; } return { id: entity.id, name: entity.name, slug: entity.slug, type: entity.type, isIndependent: entity.independent, hasLogo: entity.has_logo, parent: curateEntity(entity.parent, context), ...context?.append?.[entity.id], }; } export async function fetchEntitiesById(entityIds, options = {}) { const [entities] = await Promise.all([ knex('entities') .select('entities.*', knex.raw('row_to_json(parents) as parent')) .whereIn('entities.id', entityIds) .leftJoin('entities as parents', 'parents.id', 'entities.parent_id') .modify((builder) => { if (options.order) { builder.orderBy(...options.order); } }) .groupBy('entities.id', 'parents.id'), ]); if (options.order) { return entities.map((entityEntry) => curateEntity(entityEntry, { append: options.append })); } const curatedEntities = entityIds.map((entityId) => { const entity = entities.find((entityEntry) => entityEntry.id === entityId); if (!entity) { console.warn(`Can't match entity ${entityId}`); return null; } return curateEntity(entity, { append: options.append }); }).filter(Boolean); return curatedEntities; } export async function cacheEntityIds() { const entities = await knex('entities').select('id', 'slug', 'type'); await redis.del('traxxx:entities:id_by_slug'); await redis.hSet('traxxx:entities:id_by_slug', entities.map((entity) => [entity.type === 'network' ? `_${entity.slug}` : entity.slug, entity.id])); logger.info('Cached entity IDs by slug'); }