'use strict'; const knex = require('./knex'); const whereOr = require('./utils/where-or'); async function curateTag(tag) { const aliases = await knex('tags').where({ alias_for: tag.id }); return { id: tag.id, name: tag.name, description: tag.description, group: { id: tag.group_id, name: tag.group_name, description: tag.group_description, slug: tag.group_slug, }, aliases: aliases.map(({ name }) => name), }; } function curateTags(tags) { return Promise.all(tags.map(async tag => curateTag(tag))); } async function associateTags(release, releaseId) { if (!release.tags || release.tags.length === 0) { console.warn(`No tags available for (${release.site.name}, ${releaseId}}) "${release.title}"`); return; } await knex('tags_associated').insert(release.tags.map(tagId => ({ tag_id: tagId, release_id: releaseId, }))); } async function fetchTags(queryObject) { const tags = await knex('tags') .where(builder => whereOr(queryObject, 'tags', builder)) .andWhere({ 'tags.alias_for': null }) .select( 'tags.*', 'tags_groups.id as group_id', 'tags_groups.name as group_name', 'tags_groups.slug as group_slug', 'tags_groups.description as groups_description', ) .leftJoin('tags_groups', 'tags.group_id', 'tags_groups.id') .limit(100); return curateTags(tags); } async function matchTags(rawTags) { const tags = rawTags .concat(rawTags.map(tag => tag.toLowerCase())) .concat(rawTags.map(tag => tag.toUpperCase())); const tagEntries = await knex('tags') .pluck('aliases.id') .whereIn('tags.name', tags) .where(function where() { this .whereNull('tags.alias_for') .orWhereNull('aliases.alias_for'); }) .join('tags as aliases', function join() { this .on('tags.alias_for', 'aliases.id') .orOn('tags.id', 'aliases.id'); }) .groupBy('aliases.id'); return tagEntries; } module.exports = { associateTags, fetchTags, matchTags, };