forked from DebaucheryLibrarian/traxxx
Further refactoring. Fixed actor pages and more.
This commit is contained in:
@@ -1,11 +1,21 @@
|
||||
'use strict';
|
||||
|
||||
async function upsert(table, items, identifier = 'id', knex) {
|
||||
const duplicates = await knex(table).whereIn(identifier, items.map(item => item[identifier]));
|
||||
const duplicatesByIdentifier = duplicates.reduce((acc, item) => ({ ...acc, [item[identifier]]: item }), {});
|
||||
const knex = require('../knex');
|
||||
|
||||
async function upsert(table, items, identifier = ['id'], _knex) {
|
||||
const identifiers = Array.isArray(identifier) ? identifier : [identifier];
|
||||
|
||||
const duplicates = await knex(table).whereIn(identifiers, items.map(item => identifiers.map(identifierX => item[identifierX])));
|
||||
const duplicatesByIdentifiers = duplicates.reduce((acc, duplicate) => {
|
||||
const duplicateIdentifier = identifiers.map(identifierX => duplicate[identifierX]).toString();
|
||||
|
||||
return { ...acc, [duplicateIdentifier]: duplicate };
|
||||
}, {});
|
||||
|
||||
const { insert, update } = items.reduce((acc, item) => {
|
||||
if (duplicatesByIdentifier[item[identifier]]) {
|
||||
const itemIdentifier = identifiers.map(identifierX => item[identifierX]).toString();
|
||||
|
||||
if (duplicatesByIdentifiers[itemIdentifier]) {
|
||||
acc.update.push(item);
|
||||
return acc;
|
||||
}
|
||||
@@ -23,11 +33,15 @@ async function upsert(table, items, identifier = 'id', knex) {
|
||||
|
||||
const [inserted, updated] = await Promise.all([
|
||||
knex(table).returning('*').insert(insert),
|
||||
knex.transaction(async trx => Promise.all(update.map(item => trx
|
||||
.where({ [identifier]: item[identifier] })
|
||||
.update(item)
|
||||
.into(table)
|
||||
.returning('*')))),
|
||||
knex.transaction(async trx => Promise.all(update.map((item) => {
|
||||
const clause = identifiers.reduce((acc, identifierX) => ({ ...acc, [identifierX]: item[identifierX] }), {});
|
||||
|
||||
return trx
|
||||
.where(clause)
|
||||
.update(item)
|
||||
.into(table)
|
||||
.returning('*');
|
||||
}))),
|
||||
]);
|
||||
|
||||
return {
|
||||
|
||||
Reference in New Issue
Block a user