'use strict'; const knex = require('./knex'); 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 storeTags(release, releaseEntry) { return knex('tags_associated').insert(release.tags.map(tagId => ({ tag_id: tagId, release_id: releaseEntry.id, }))); } async function fetchTags(tagId, tagSlug) { const tags = await knex('tags') .where({ 'tags.id': tagId }) .orWhere({ 'tags.slug': tagSlug }) .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 = { storeTags, fetchTags, matchTags, };