Refactored seed files to use programmatic upsert instead of SQL duplicate ignore.
This commit is contained in:
parent
e0542c26d7
commit
0567b1b2ff
|
@ -1,5 +1,3 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
database: {
|
database: {
|
||||||
host: '127.0.0.1',
|
host: '127.0.0.1',
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
/* eslint-disable max-len */
|
/* eslint-disable max-len */
|
||||||
exports.seed = knex => Promise.resolve()
|
const upsert = require('../src/utils/upsert');
|
||||||
.then(() => knex.raw(`${knex('networks').insert([
|
|
||||||
|
const networks = [
|
||||||
{
|
{
|
||||||
slug: '21sextury',
|
slug: '21sextury',
|
||||||
name: '21Sextury',
|
name: '21Sextury',
|
||||||
|
@ -109,4 +110,13 @@ exports.seed = knex => Promise.resolve()
|
||||||
url: 'https://www.xempire.com',
|
url: 'https://www.xempire.com',
|
||||||
description: 'XEmpire.com brings you today\'s top pornstars in beautifully shot, HD sex scenes across 4 unique porn sites of gonzo porn, interracial, lesbian & erotica!',
|
description: 'XEmpire.com brings you today\'s top pornstars in beautifully shot, HD sex scenes across 4 unique porn sites of gonzo porn, interracial, lesbian & erotica!',
|
||||||
},
|
},
|
||||||
]).toString()} ON CONFLICT DO NOTHING`));
|
];
|
||||||
|
|
||||||
|
exports.seed = knex => Promise.resolve()
|
||||||
|
.then(async () => {
|
||||||
|
// find network IDs
|
||||||
|
const duplicates = await knex('networks').select('*');
|
||||||
|
const duplicatesBySlug = duplicates.reduce((acc, network) => ({ ...acc, [network.slug]: network }), {});
|
||||||
|
|
||||||
|
return upsert('networks', networks, duplicatesBySlug, 'slug', knex);
|
||||||
|
});
|
||||||
|
|
4476
seeds/01_sites.js
4476
seeds/01_sites.js
File diff suppressed because it is too large
Load Diff
2813
seeds/02_tags.js
2813
seeds/02_tags.js
File diff suppressed because it is too large
Load Diff
|
@ -1,145 +1,157 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
const upsert = require('../src/utils/upsert');
|
||||||
|
|
||||||
|
function getStudios(networksMap) {
|
||||||
|
return [
|
||||||
|
// LegalPorno
|
||||||
|
{
|
||||||
|
slug: 'gonzocom',
|
||||||
|
name: 'Gonzo.com',
|
||||||
|
url: 'https://www.legalporno.com/studios/gonzo_com',
|
||||||
|
network_id: networksMap['legalporno'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: 'giorgiograndi',
|
||||||
|
name: 'Giorgio Grandi',
|
||||||
|
url: 'https://www.legalporno.com/studios/giorgio-grandi',
|
||||||
|
network_id: networksMap['legalporno'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: 'hardpornworld',
|
||||||
|
name: 'Hard Porn World',
|
||||||
|
url: 'https://www.legalporno.com/studios/hard-porn-world',
|
||||||
|
network_id: networksMap['legalporno'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: 'interracialvision',
|
||||||
|
name: 'Interracial Vision',
|
||||||
|
url: 'https://www.legalporno.com/studios/interracial-vision',
|
||||||
|
network_id: networksMap['legalporno'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: 'giorgioslab',
|
||||||
|
name: 'Giorgio\'s Lab',
|
||||||
|
url: 'https://www.legalporno.com/studios/giorgio--s-lab',
|
||||||
|
network_id: networksMap['legalporno'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: 'americananal',
|
||||||
|
name: 'American Anal',
|
||||||
|
url: 'https://www.legalporno.com/studios/american-anal',
|
||||||
|
network_id: networksMap['legalporno'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: 'assablanca',
|
||||||
|
name: 'Assablanca',
|
||||||
|
url: 'https://www.legalporno.com/studios/assablanca',
|
||||||
|
network_id: networksMap['legalporno'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: 'focus',
|
||||||
|
name: 'Focus',
|
||||||
|
url: 'https://www.legalporno.com/studios/focus',
|
||||||
|
network_id: networksMap['legalporno'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: 'analforever',
|
||||||
|
name: 'Anal Forever',
|
||||||
|
url: 'https://www.legalporno.com/studios/anal-forever',
|
||||||
|
network_id: networksMap['legalporno'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: 'gonzoinbrazil',
|
||||||
|
name: 'Gonzo in Brazil',
|
||||||
|
url: 'https://www.legalporno.com/studios/gonzo-in-brazil',
|
||||||
|
network_id: networksMap['legalporno'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: 'mranal',
|
||||||
|
name: 'Mr Anal',
|
||||||
|
url: 'https://www.legalporno.com/studios/mr-anal',
|
||||||
|
network_id: networksMap['legalporno'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: 'tarrawhite',
|
||||||
|
name: 'Tarra White',
|
||||||
|
url: 'https://www.legalporno.com/studios/tarra-white',
|
||||||
|
network_id: networksMap['legalporno'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: 'sineplexsos',
|
||||||
|
name: 'Sineplex SOS',
|
||||||
|
url: 'https://www.legalporno.com/studios/sineplex-sos',
|
||||||
|
network_id: networksMap['legalporno'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: 'fmodels',
|
||||||
|
name: 'F Models',
|
||||||
|
url: 'https://www.legalporno.com/studios/f-models',
|
||||||
|
network_id: networksMap['legalporno'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: 'sineplexcz',
|
||||||
|
name: 'Sineplex CZ',
|
||||||
|
url: 'https://www.legalporno.com/studios/sineplex-cz',
|
||||||
|
network_id: networksMap['legalporno'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: 'gg',
|
||||||
|
name: 'GG',
|
||||||
|
url: 'https://www.legalporno.com/studios/gg',
|
||||||
|
network_id: networksMap['legalporno'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: 'firstgape',
|
||||||
|
name: 'First Gape',
|
||||||
|
url: 'https://www.legalporno.com/studios/first-gape',
|
||||||
|
network_id: networksMap['legalporno'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: 'omargalantiproductions',
|
||||||
|
name: 'Omar Galanti Productions',
|
||||||
|
url: 'https://www.legalporno.com/studios/omar-galanti-productions',
|
||||||
|
network_id: networksMap['legalporno'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: 'norestfortheass',
|
||||||
|
name: 'No Rest For The Ass',
|
||||||
|
url: 'https://www.legalporno.com/studios/no-rest-for-the-ass',
|
||||||
|
network_id: networksMap['legalporno'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: 'hairygonzo',
|
||||||
|
name: 'Hairy Gonzo',
|
||||||
|
url: 'https://www.legalporno.com/studios/hairy-gonzo',
|
||||||
|
network_id: networksMap['legalporno'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: 'sineplexclassic',
|
||||||
|
name: 'Sineplex Classic',
|
||||||
|
url: 'https://www.legalporno.com/studios/sineplex-classic',
|
||||||
|
network_id: networksMap['legalporno'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: 'sinemale',
|
||||||
|
name: 'Sinemale',
|
||||||
|
url: 'https://www.legalporno.com/studios/sinemale',
|
||||||
|
network_id: networksMap['legalporno'],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
/* eslint-disable max-len */
|
/* eslint-disable max-len */
|
||||||
exports.seed = knex => Promise.resolve()
|
exports.seed = knex => Promise.resolve()
|
||||||
.then(async () => {
|
.then(async () => {
|
||||||
// find network IDs
|
const [duplicates, networks] = await Promise.all([
|
||||||
const networks = await knex('networks').select('*');
|
knex('studios').select('*'),
|
||||||
|
knex('networks').select('*'),
|
||||||
|
]);
|
||||||
|
|
||||||
|
const duplicatesBySlug = duplicates.reduce((acc, studio) => ({ ...acc, [studio.slug]: studio }), {});
|
||||||
const networksMap = networks.reduce((acc, { id, slug }) => ({ ...acc, [slug]: id }), {});
|
const networksMap = networks.reduce((acc, { id, slug }) => ({ ...acc, [slug]: id }), {});
|
||||||
|
|
||||||
return knex.raw(`${knex('studios').insert([
|
const studios = getStudios(networksMap);
|
||||||
// LegalPorno
|
|
||||||
{
|
return upsert('studios', studios, duplicatesBySlug, 'slug', knex);
|
||||||
slug: 'gonzocom',
|
|
||||||
name: 'Gonzo.com',
|
|
||||||
url: 'https://www.legalporno.com/studios/gonzo_com',
|
|
||||||
network_id: networksMap['legalporno'],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
slug: 'giorgiograndi',
|
|
||||||
name: 'Giorgio Grandi',
|
|
||||||
url: 'https://www.legalporno.com/studios/giorgio-grandi',
|
|
||||||
network_id: networksMap['legalporno'],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
slug: 'hardpornworld',
|
|
||||||
name: 'Hard Porn World',
|
|
||||||
url: 'https://www.legalporno.com/studios/hard-porn-world',
|
|
||||||
network_id: networksMap['legalporno'],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
slug: 'interracialvision',
|
|
||||||
name: 'Interracial Vision',
|
|
||||||
url: 'https://www.legalporno.com/studios/interracial-vision',
|
|
||||||
network_id: networksMap['legalporno'],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
slug: 'giorgioslab',
|
|
||||||
name: 'Giorgio\'s Lab',
|
|
||||||
url: 'https://www.legalporno.com/studios/giorgio--s-lab',
|
|
||||||
network_id: networksMap['legalporno'],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
slug: 'americananal',
|
|
||||||
name: 'American Anal',
|
|
||||||
url: 'https://www.legalporno.com/studios/american-anal',
|
|
||||||
network_id: networksMap['legalporno'],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
slug: 'assablanca',
|
|
||||||
name: 'Assablanca',
|
|
||||||
url: 'https://www.legalporno.com/studios/assablanca',
|
|
||||||
network_id: networksMap['legalporno'],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
slug: 'focus',
|
|
||||||
name: 'Focus',
|
|
||||||
url: 'https://www.legalporno.com/studios/focus',
|
|
||||||
network_id: networksMap['legalporno'],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
slug: 'analforever',
|
|
||||||
name: 'Anal Forever',
|
|
||||||
url: 'https://www.legalporno.com/studios/anal-forever',
|
|
||||||
network_id: networksMap['legalporno'],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
slug: 'gonzoinbrazil',
|
|
||||||
name: 'Gonzo in Brazil',
|
|
||||||
url: 'https://www.legalporno.com/studios/gonzo-in-brazil',
|
|
||||||
network_id: networksMap['legalporno'],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
slug: 'mranal',
|
|
||||||
name: 'Mr Anal',
|
|
||||||
url: 'https://www.legalporno.com/studios/mr-anal',
|
|
||||||
network_id: networksMap['legalporno'],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
slug: 'tarrawhite',
|
|
||||||
name: 'Tarra White',
|
|
||||||
url: 'https://www.legalporno.com/studios/tarra-white',
|
|
||||||
network_id: networksMap['legalporno'],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
slug: 'sineplexsos',
|
|
||||||
name: 'Sineplex SOS',
|
|
||||||
url: 'https://www.legalporno.com/studios/sineplex-sos',
|
|
||||||
network_id: networksMap['legalporno'],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
slug: 'fmodels',
|
|
||||||
name: 'F Models',
|
|
||||||
url: 'https://www.legalporno.com/studios/f-models',
|
|
||||||
network_id: networksMap['legalporno'],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
slug: 'sineplexcz',
|
|
||||||
name: 'Sineplex CZ',
|
|
||||||
url: 'https://www.legalporno.com/studios/sineplex-cz',
|
|
||||||
network_id: networksMap['legalporno'],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
slug: 'gg',
|
|
||||||
name: 'GG',
|
|
||||||
url: 'https://www.legalporno.com/studios/gg',
|
|
||||||
network_id: networksMap['legalporno'],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
slug: 'firstgape',
|
|
||||||
name: 'First Gape',
|
|
||||||
url: 'https://www.legalporno.com/studios/first-gape',
|
|
||||||
network_id: networksMap['legalporno'],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
slug: 'omargalantiproductions',
|
|
||||||
name: 'Omar Galanti Productions',
|
|
||||||
url: 'https://www.legalporno.com/studios/omar-galanti-productions',
|
|
||||||
network_id: networksMap['legalporno'],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
slug: 'norestfortheass',
|
|
||||||
name: 'No Rest For The Ass',
|
|
||||||
url: 'https://www.legalporno.com/studios/no-rest-for-the-ass',
|
|
||||||
network_id: networksMap['legalporno'],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
slug: 'hairygonzo',
|
|
||||||
name: 'Hairy Gonzo',
|
|
||||||
url: 'https://www.legalporno.com/studios/hairy-gonzo',
|
|
||||||
network_id: networksMap['legalporno'],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
slug: 'sineplexclassic',
|
|
||||||
name: 'Sineplex Classic',
|
|
||||||
url: 'https://www.legalporno.com/studios/sineplex-classic',
|
|
||||||
network_id: networksMap['legalporno'],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
slug: 'sinemale',
|
|
||||||
name: 'Sinemale',
|
|
||||||
url: 'https://www.legalporno.com/studios/sinemale',
|
|
||||||
network_id: networksMap['legalporno'],
|
|
||||||
},
|
|
||||||
]).toString()} ON CONFLICT DO NOTHING`);
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
async function upsert(table, items, duplicatesById, identifier = 'id', knex) {
|
||||||
|
const { insert, update } = items.reduce((acc, item) => {
|
||||||
|
if (duplicatesById[item[identifier]]) {
|
||||||
|
return {
|
||||||
|
...acc,
|
||||||
|
update: [
|
||||||
|
...acc.update,
|
||||||
|
{
|
||||||
|
...duplicatesById[item[identifier]],
|
||||||
|
...item,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
...acc,
|
||||||
|
insert: [
|
||||||
|
...acc.insert,
|
||||||
|
item,
|
||||||
|
],
|
||||||
|
};
|
||||||
|
},
|
||||||
|
{
|
||||||
|
insert: [],
|
||||||
|
update: [],
|
||||||
|
});
|
||||||
|
|
||||||
|
if (knex) {
|
||||||
|
console.log(`${table}: Inserting ${insert.length}`);
|
||||||
|
console.log(`${table}: Updating ${update.length}`);
|
||||||
|
|
||||||
|
return Promise.all([
|
||||||
|
knex(table).insert(insert),
|
||||||
|
knex.transaction(async trx => Promise.all(update.map(item => trx
|
||||||
|
.where({ id: item.id })
|
||||||
|
.update(item)
|
||||||
|
.into(table)))),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return { insert, update };
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = upsert;
|
Loading…
Reference in New Issue