'use strict'; const upsert = require('../src/utils/upsert'); const groups = [ { slug: 'age', group: 'Age', }, { slug: 'body', group: 'Body', }, { slug: 'clothing', group: 'Clothing', }, { slug: 'ethnicity', group: 'Ethnicity', }, { slug: 'group', group: 'Group sex', }, { slug: 'hair', group: 'Hair', }, { slug: 'location', group: 'Location', }, { slug: 'orientation', group: 'Orientation', }, { slug: 'penetration', group: 'Penetration', }, { slug: 'position', group: 'Position', }, { slug: 'roleplay', group: 'Roleplay', }, ]; function getTags(groupsMap) { return [ { name: '4K', slug: '4k', alias_for: null, }, { name: '69', slug: '69', alias_for: null, group_id: groupsMap['position'], }, { name: 'airtight', slug: 'airtight', alias_for: null, group_id: groupsMap['penetration'], }, { name: 'amateur', slug: 'amateur', alias_for: null, }, { name: 'american', slug: 'american', alias_for: null, group_id: groupsMap['ethnicity'], }, { name: 'anal creampie', slug: 'anal-creampie', alias_for: null, }, { name: 'anal', slug: 'anal', alias_for: null, }, { name: 'anal fingering', slug: 'anal-fingering', alias_for: null, }, { name: 'anal fisting', slug: 'anal-fisting', alias_for: null, }, { name: 'anal prolapse', slug: 'anal-prolapse', alias_for: null, }, { name: 'anal toys', slug: 'anal-toys', alias_for: null, }, { name: 'asian', slug: 'asian', alias_for: null, group_id: groupsMap['ethnicity'], }, { name: 'athletic', slug: 'athletic', alias_for: null, group_id: groupsMap['body'], }, { name: 'ass to mouth', slug: 'ass-to-mouth', alias_for: null, }, { name: 'ass eating', slug: 'ass-eating', alias_for: null, }, { name: 'ball licking', slug: 'ball-licking', alias_for: null, }, { name: 'ballerina', slug: 'ballerina', alias_for: null, group_id: groupsMap['roleplay'], }, { name: 'bathroom', slug: 'bathroom', alias_for: null, group_id: groupsMap['location'], }, { name: 'BDSM', slug: 'bdsm', alias_for: null, }, { name: 'BBC', slug: 'bbc', alias_for: null, group_id: groupsMap['body'], }, { name: 'big cock', slug: 'big-cock', alias_for: null, group_id: groupsMap['body'], }, { name: 'big butt', slug: 'big-butt', alias_for: null, group_id: groupsMap['body'], }, { name: 'big boobs', slug: 'big-boobs', alias_for: null, group_id: groupsMap['body'], }, { name: 'bisexual', slug: 'bisexual', alias_for: null, }, { name: 'black hair', slug: 'black-hair', alias_for: null, group_id: groupsMap['hair'], }, { name: 'blonde', slug: 'blonde', alias_for: null, group_id: groupsMap['hair'], }, { name: 'blowjob', slug: 'blowjob', alias_for: null, }, { name: 'blowbang', slug: 'blowbang', alias_for: null, group_id: groupsMap['group'], }, { name: 'bondage', slug: 'bondage', alias_for: null, }, { name: 'brunette', slug: 'brunette', alias_for: null, group_id: groupsMap['hair'], }, { name: 'bukkake', slug: 'bukkake', alias_for: null, }, { name: 'cheerleader', slug: 'cheerleader', alias_for: null, group_id: groupsMap['roleplay'], }, { name: 'choking', slug: 'choking', alias_for: null, }, { name: 'corporal punishment', slug: 'corporal-punishment', alias_for: null, }, { name: 'couples', slug: 'couples', alias_for: null, }, { name: 'cowgirl', slug: 'cowgirl', alias_for: null, }, { name: 'creampie', slug: 'creampie', alias_for: null, }, { name: 'cum licking', slug: 'cum-licking', alias_for: null, }, { name: 'cum on butt', slug: 'cum-on-butt', alias_for: null, }, { name: 'cum on boobs', slug: 'cum-on-boobs', alias_for: null, }, { name: 'cumshot', slug: 'cumshot', alias_for: null, }, { name: 'curvy', slug: 'curvy', alias_for: null, }, { name: 'double anal penetration', slug: 'double-anal', alias_for: null, }, { name: 'deepthroat', slug: 'deepthroat', alias_for: null, }, { name: 'double penetration', slug: 'double-penetration', alias_for: null, }, { name: 'dungeon', slug: 'dungeon', alias_for: null, }, { name: 'double vaginal penetration', slug: 'double-vaginal', alias_for: null, }, { name: 'double blowjob', slug: 'double-blowjob', alias_for: null, }, { name: 'doggy style', slug: 'doggy-style', alias_for: null, }, { name: 'dress', slug: 'dress', alias_for: null, group_id: groupsMap['clothing'], }, { name: 'ebony', slug: 'ebony', alias_for: null, group_id: groupsMap['ethnicity'], }, { name: 'electric shock', slug: 'electric-shock', alias_for: null, }, { name: 'enhanced boobs', slug: 'enhanced-boobs', alias_for: null, }, { name: 'European', slug: 'european', alias_for: null, group_id: groupsMap['ethnicity'], }, { name: 'facefuck', slug: 'facefuck', alias_for: null, group_id: groupsMap['position'], }, { name: 'facesitting', slug: 'facesitting', alias_for: null, group_id: groupsMap['position'], }, { name: 'facial', slug: 'facial', alias_for: null, }, { name: 'feet', slug: 'feet', alias_for: null, }, { name: 'femdom', slug: 'femdom', alias_for: null, }, { name: 'fingering', slug: 'fingering', alias_for: null, }, { name: 'fisting', slug: 'fisting', alias_for: null, }, { name: 'FMF threesome', slug: 'fmf', alias_for: null, group_id: groupsMap['group'], }, { name: 'gag', slug: 'gag', alias_for: null, }, { name: 'gangbang', slug: 'gangbang', alias_for: null, group_id: groupsMap['group'], }, { name: 'gapes', slug: 'gapes', alias_for: null, }, { name: 'gay', slug: 'gay', alias_for: null, }, { name: 'gonzo', slug: 'gonzo', alias_for: null, }, { name: 'hairy', slug: 'hairy', alias_for: null, group_id: groupsMap['body'], }, { name: 'hardcore', slug: 'hardcore', alias_for: null, }, { name: 'high heels', slug: 'high-heels', alias_for: null, group_id: groupsMap['clothing'], }, { name: 'hungarian', slug: 'hungarian', alias_for: null, group_id: groupsMap['ethnicity'], }, { name: 'humiliation', slug: 'humiliation', alias_for: null, }, { name: 'innie pussy', slug: 'innie-pussy', alias_for: null, }, { name: 'interracial', slug: 'interracial', alias_for: null, }, { name: 'kissing', slug: 'kissing', alias_for: null, }, { name: 'latex', slug: 'latex', alias_for: null, }, { name: 'Latina', slug: 'latina', alias_for: null, }, { name: 'leather', slug: 'leather', alias_for: null, }, { name: 'lesbian', slug: 'lesbian', alias_for: null, }, { name: 'machine dildo', slug: 'machine-dildo', alias_for: null, }, { name: 'lingerie', slug: 'lingerie', alias_for: null, group_id: groupsMap['clothing'], }, { name: 'maid', slug: 'maid', alias_for: null, group_id: groupsMap['roleplay'], }, { name: 'masturbation', slug: 'masturbation', alias_for: null, }, { name: 'MILF', slug: 'milf', alias_for: null, group_id: groupsMap['age'], }, { name: 'MFM threesome', slug: 'mfm', alias_for: null, group_id: groupsMap['group'], }, { name: 'miniskirt', slug: 'miniskirt', alias_for: null, group_id: groupsMap['clothing'], }, { name: 'missionary', slug: 'missionary', alias_for: null, group_id: groupsMap['position'], }, { name: 'natural boobs', slug: 'natural-boobs', alias_for: null, group_id: groupsMap['body'], }, { name: 'nipple clamps', slug: 'nipple-clamps', alias_for: null, }, { name: 'oral creampie', slug: 'oral-creampie', alias_for: null, }, { name: 'orgy', slug: 'orgy', alias_for: null, group_id: groupsMap['group'], }, { name: 'outdoors', slug: 'outdoors', alias_for: null, group_id: groupsMap['location'], }, { name: 'outie pussy', slug: 'outie-pussy', alias_for: null, }, { name: 'pain', slug: 'pain', alias_for: null, }, { name: 'pegging', slug: 'pegging', alias_for: null, }, { name: 'petite', slug: 'petite', alias_for: null, }, { name: 'piercings', slug: 'piercings', alias_for: null, }, { name: 'POV', slug: 'pov', alias_for: null, }, { name: 'pussy eating', slug: 'pussy-eating', alias_for: null, }, { name: 'redhead', slug: 'redhead', alias_for: null, group_id: groupsMap['hair'], }, { name: 'reverse cowgirl', slug: 'reverse-cowgirl', alias_for: null, }, { name: 'roleplay', slug: 'roleplay', alias_for: null, }, { name: 'rough', slug: 'rough', alias_for: null, }, { name: 'russian', slug: 'russian', alias_for: null, group_id: groupsMap['ethnicity'], }, { name: 'saliva', slug: 'saliva', alias_for: null, }, { name: 'schoolgirl', slug: 'schoolgirl', alias_for: null, group_id: groupsMap['roleplay'], }, { name: 'shaved', slug: 'shaved', alias_for: null, }, { name: 'shoes on', slug: 'shoes-on', alias_for: null, group_id: groupsMap['clothing'], }, { name: 'short hair', slug: 'short-hair', alias_for: null, group_id: groupsMap['hair'], }, { name: 'skirt', slug: 'skirt', alias_for: null, group_id: groupsMap['clothing'], }, { name: 'slapping', slug: 'slapping', alias_for: null, }, { name: 'sloppy blowjob', slug: 'sloppy-blowjob', alias_for: null, }, { name: 'socks', slug: 'socks', alias_for: null, group_id: groupsMap['clothing'], }, { name: 'spanking', slug: 'spanking', alias_for: null, }, { name: 'strapon', slug: 'strapon', group_id: groupsMap['strap-on-dildo'], }, { name: 'small boobs', slug: 'small-boobs', alias_for: null, }, { name: 'small butt', slug: 'small-butt', alias_for: null, }, { name: 'speculum', slug: 'speculum', alias_for: null, }, { name: 'squirting', slug: 'squirting', alias_for: null, }, { name: 'standing doggy style', slug: 'standing-doggy-style', alias_for: null, }, { name: 'stockings', slug: 'stockings', alias_for: null, group_id: groupsMap['clothing'], }, { name: 'strap-on dildo', slug: 'strap-on-dildo', alias_for: null, }, { name: 'suspension', slug: 'suspension', alias_for: null, }, { name: 'swallowing', slug: 'swallowing', alias_for: null, }, { name: 'tattoo', slug: 'tattoo', alias_for: null, group_id: groupsMap['body'], }, { name: 'threesome', slug: 'threesome', alias_for: null, group_id: groupsMap['group'], }, { name: 'teen', slug: 'teen', alias_for: null, group_id: groupsMap['age'], }, { name: 'titty fuck', slug: 'titty-fuck', alias_for: null, }, { name: 'toys', slug: 'toys', alias_for: null, }, { name: 'transsexual', slug: 'transsexual', alias_for: null, }, { name: 'triple penetration', slug: 'triple-penetration', alias_for: null, }, { name: 'trimmed', slug: 'trimmed', alias_for: null, }, { name: 'uniform', slug: 'uniform', alias_for: null, }, { name: 'vibrator', slug: 'vibrator', alias_for: null, }, { name: 'voyeur', slug: 'voyeur', alias_for: null, }, { name: 'wet', slug: 'wet', alias_for: null, }, { name: 'white', slug: 'white', alias_for: null, group_id: groupsMap['ethnicity'], }, { name: 'wife', slug: 'wife', alias_for: null, }, { name: 'office', slug: 'office', alias_for: null, group_id: groupsMap['location'], }, ]; } function getTagAliases(tagsMap) { return [ { name: '2-on-1', alias_for: tagsMap['mfm'], }, { name: '2 on 1', alias_for: tagsMap['mfm'], }, { name: '3+ on 1', alias_for: tagsMap['gangbang'], }, { name: 'anal sex', alias_for: tagsMap['anal'], }, { name: 'anal gape', alias_for: tagsMap['gapes'], }, { name: 'anilingus', alias_for: tagsMap['ass-eating'], }, { name: 'asians', alias_for: tagsMap['asian'], }, { name: 'ass licking', alias_for: tagsMap['ass-eating'], }, { name: 'ass fucking', alias_for: tagsMap['anal'], }, { name: 'atm', alias_for: tagsMap['ass-to-mouth'], }, { name: 'bald pussy', alias_for: tagsMap['shaved'], }, { name: 'ball gag', alias_for: tagsMap['gag'], }, { name: 'mfm', alias_for: tagsMap['mfm'], }, { name: 'fmf', alias_for: tagsMap['fmf'], }, { name: 'bgb', alias_for: tagsMap['mfm'], }, { name: 'big ass', alias_for: tagsMap['big-butt'], }, { name: 'big black cock', alias_for: tagsMap['bbc'], }, { name: 'big black cocks', alias_for: tagsMap['bbc'], }, { name: 'big cocks', alias_for: tagsMap['big-cock'], }, { name: 'big dick', alias_for: tagsMap['big-cock'], }, { name: 'big booty', alias_for: tagsMap['big-butt'], }, { name: 'big butts', alias_for: tagsMap['big-butt'], }, { name: 'big tits', alias_for: tagsMap['big-boobs'], }, { name: 'bi', alias_for: tagsMap['bisexual'], }, { name: 'black', alias_for: tagsMap['ebony'], }, { name: 'blonde hair', alias_for: tagsMap['blonde'], }, { name: 'blondes', alias_for: tagsMap['blonde'], }, { name: 'blow job', alias_for: tagsMap['blowjob'], }, { name: 'blowjobs', alias_for: tagsMap['blowjob'], }, { name: 'blowjob pov', alias_for: tagsMap['blowjob'], }, { name: 'blowjob (double)', alias_for: tagsMap['double-blowjob'], }, { name: 'blowjob (pov)', alias_for: tagsMap['blowjob'], }, { name: 'boob job', alias_for: tagsMap['enhanced-boobs'], }, { name: 'boobjob', alias_for: tagsMap['enhanced-boobs'], }, { name: 'brown hair', alias_for: tagsMap['brunette'], }, { name: 'brunettes', alias_for: tagsMap['brunette'], }, { name: 'buttplug', alias_for: tagsMap['anal-toys'], }, { name: 'caning', alias_for: tagsMap['corporal-punishment'], }, { name: 'cattle prod', alias_for: tagsMap['electric-shock'], }, { name: 'cheer leader', alias_for: tagsMap['cheerleader'], }, { name: 'clover clamps', alias_for: tagsMap['nipple-clamps'], }, { name: 'couples fantasies', alias_for: tagsMap['couples'], }, { name: 'creampies', alias_for: tagsMap['creampie'], }, { name: 'crop', // a type of whip, not [sic] short for corporal alias_for: tagsMap['corporal-punishment'], }, { name: 'cum cleaning', alias_for: tagsMap['cum-licking'], }, { name: 'cum in mouth', alias_for: tagsMap['oral-creampie'], }, { name: 'cum on ass', alias_for: tagsMap['cum-on-butt'], }, { name: 'cum on tits', alias_for: tagsMap['cum-on-boobs'], }, { name: 'cum swallowing', alias_for: tagsMap['swallowing'], }, { name: 'cum shot', alias_for: tagsMap['cumshot'], }, { name: 'cunnilingus', alias_for: tagsMap['pussy-eating'], }, { name: 'pussy licking', alias_for: tagsMap['pussy-eating'], }, { name: 'deep throat', alias_for: tagsMap['deepthroat'], }, { name: 'deepthroating', alias_for: tagsMap['deepthroat'], }, { name: 'dildo', alias_for: tagsMap['toys'], }, { name: 'doggystyle', alias_for: tagsMap['doggy-style'], }, { name: 'doggie style', alias_for: tagsMap['doggy-style'], }, { name: 'doggystyle (standing)', alias_for: tagsMap['standing-doggy-style'], }, { name: 'doggystyle - standing', alias_for: tagsMap['standing-doggy-style'], }, { name: 'dom', alias_for: tagsMap['bdsm'], }, { name: 'domination', alias_for: tagsMap['bdsm'], }, { name: 'dominatrix', alias_for: tagsMap['femdom'], }, { name: 'dp', alias_for: tagsMap['double-penetration'], }, { name: 'double penetration (dp)', alias_for: tagsMap['double-penetration'], }, { name: 'dap', alias_for: tagsMap['double-anal'], }, { name: 'double anal (dap)', alias_for: tagsMap['double-anal'], }, { name: 'double anal penetration (dap)', alias_for: tagsMap['double-anal'], }, { name: 'dpp', alias_for: tagsMap['double-vaginal'], }, { name: 'dvp', alias_for: tagsMap['double-vaginal'], }, { name: 'double vaginal (dvp)', alias_for: tagsMap['double-vaginal'], }, { name: 'double vaginal penetration (dvp)', alias_for: tagsMap['double-vaginal'], }, { name: 'double vaginal (dpp)', alias_for: tagsMap['double-vaginal'], }, { name: 'double pussy penetration', alias_for: tagsMap['double-vaginal'], }, { name: 'double pussy penetration (dpp)', alias_for: tagsMap['double-vaginal'], }, { name: 'drool', alias_for: tagsMap['saliva'], }, { name: 'enhanced', alias_for: tagsMap['enhanced-boobs'], }, { name: 'enhanced tits', alias_for: tagsMap['enhanced-boobs'], }, { name: 'facefucking', alias_for: tagsMap['facefuck'], }, { name: 'face fuck', alias_for: tagsMap['facefuck'], }, { name: 'face fucking', alias_for: tagsMap['facefuck'], }, { name: 'face sitting', alias_for: tagsMap['facesitting'], }, { name: 'facial cumshot', alias_for: tagsMap['facial'], }, { name: 'facials', alias_for: tagsMap['facial'], }, { name: 'fake boobs', alias_for: tagsMap['enhanced-boobs'], }, { name: 'fake tits', alias_for: tagsMap['enhanced-boobs'], }, { name: 'flogging', alias_for: tagsMap['corporal-punishment'], }, { name: 'foot fetish', alias_for: tagsMap['feet'], }, { name: 'french kissing', alias_for: tagsMap['kissing'], }, { name: 'gape', alias_for: tagsMap['gapes'], }, { name: 'gaping', alias_for: tagsMap['gapes'], }, { name: 'gapes (gaping asshole)', alias_for: tagsMap['gapes'], }, { name: 'group sex', alias_for: tagsMap['orgy'], }, { name: 'flagellation', alias_for: tagsMap['corporal-punishment'], }, { name: 'huge tits', alias_for: tagsMap['big-boobs'], }, { name: 'huge toys', alias_for: tagsMap['toys'], }, { name: 'innie', alias_for: tagsMap['innie-pussy'], }, { name: 'lashing', alias_for: tagsMap['corporal-punishment'], }, { name: 'lezdom', alias_for: tagsMap['lesbian'], }, { name: 'mini-skirt', alias_for: tagsMap['miniskirt'], }, { name: 'mmf', alias_for: tagsMap['mfm'], }, { name: 'mff', alias_for: tagsMap['fmf'], }, { name: 'mature & milf', alias_for: tagsMap['milf'], }, { name: 'natural', alias_for: tagsMap['natural-boobs'], }, { name: 'natural tits', alias_for: tagsMap['natural-boobs'], }, { name: 'oral', alias_for: tagsMap['blowjob'], }, { name: 'outie', alias_for: tagsMap['outie-pussy'], }, { name: 'piercing', alias_for: tagsMap['piercings'], }, { name: 'pierced', alias_for: tagsMap['piercings'], }, { name: 'prolapse', alias_for: tagsMap['anal-prolapse'], }, { name: 'prolapsing', alias_for: tagsMap['anal-prolapse'], }, { name: 'raven', alias_for: tagsMap['black-hair'], }, { name: 'raven hair', alias_for: tagsMap['black-hair'], }, { name: 'red hair', alias_for: tagsMap['redhead'], }, { name: 'red head', alias_for: tagsMap['redhead'], }, { name: 'rimming', alias_for: tagsMap['ass-eating'], }, { name: 'rimjob', alias_for: tagsMap['ass-eating'], }, { name: 'role play', alias_for: tagsMap['roleplay'], }, { name: 'rope bondage', alias_for: tagsMap['bondage'], }, { name: 'rough sex', alias_for: tagsMap['rough'], }, { name: 'school girl', alias_for: tagsMap['schoolgirl'], }, { name: 'sadomasochism', alias_for: tagsMap['bdsm'], }, { name: 'sadism', alias_for: tagsMap['bdsm'], }, { name: 'scissoring', alias_for: tagsMap['lesbian'], }, { name: 'sex toys', alias_for: tagsMap['toys'], }, { name: 'shaved pussy', alias_for: tagsMap['shaved'], }, { name: 'shoes', alias_for: tagsMap['shoes-on'], }, { name: 'slave', alias_for: tagsMap['bdsm'], }, { name: 'small ass', alias_for: tagsMap['small-butt'], }, { name: 'small tits', alias_for: tagsMap['small-boobs'], }, { name: 'spit', alias_for: tagsMap['saliva'], }, { name: 'spitroast', alias_for: tagsMap['mfm'], }, { name: 'standing doggystyle', alias_for: tagsMap['standing-doggy-style'], }, { name: 'swallow', alias_for: tagsMap['swallowing'], }, { name: 'strap-on', alias_for: tagsMap['strap-on-dildo'], }, { name: 'strap on', alias_for: tagsMap['strap-on-dildo'], }, { name: 'strap on dildo', alias_for: tagsMap['strap-on-dildo'], }, { name: 'sub', alias_for: tagsMap['bdsm'], }, { name: 'submission', alias_for: tagsMap['bdsm'], }, { name: 'tattoos', alias_for: tagsMap['tattoo'], }, { name: 'teens', alias_for: tagsMap['teen'], }, { name: 'tiny boobs', alias_for: tagsMap['small-boobs'], }, { name: 'tiny tits', alias_for: tagsMap['small-boobs'], }, { name: 'tittyfuck', alias_for: tagsMap['titty-fuck'], }, { name: 'trans', alias_for: tagsMap['transsexual'], }, { name: 'trimmed pussy', alias_for: tagsMap['trimmed'], }, { name: 'tp', alias_for: tagsMap['triple-penetration'], }, { name: 'whipping', alias_for: tagsMap['corporal-punishment'], }, { name: 'work', alias_for: tagsMap['office'], }, { name: 'workplace', alias_for: tagsMap['office'], }, { name: 'zapper', alias_for: tagsMap['electric-shock'], }, ]; } exports.seed = knex => Promise.resolve() .then(async () => { const duplicates = await knex('tags_groups').select('*'); const duplicatesBySlug = duplicates.reduce((acc, group) => ({ ...acc, [group.slug]: group }), {}); return upsert('tags_groups', groups, duplicatesBySlug, 'slug', knex); }) .then(async () => { const [duplicates, groups] = await Promise.all([ knex('tags').select('*'), knex('tags_groups').select('*'), ]); const duplicatesBySlug = duplicates.reduce((acc, tag) => ({ ...acc, [tag.slug]: tag }), {}); const groupsMap = groups.reduce((acc, { id, slug }) => ({ ...acc, [slug]: id }), {}); const tags = getTags(groupsMap); return upsert('tags', tags, duplicatesBySlug, 'slug', knex); }) .then(async () => { const [duplicates, tags] = await Promise.all([ knex('tags').select('*').whereNotNull('alias_for'), knex('tags').select('*').where({ alias_for: null }), ]); const duplicatesByName = duplicates.reduce((acc, tag) => ({ ...acc, [tag.name]: tag }), {}); const tagsMap = tags.reduce((acc, { id, slug }) => ({ ...acc, [slug]: id }), {}); const tagAliases = getTagAliases(tagsMap); return upsert('tags', tagAliases, duplicatesByName, 'name', knex); });