let UserError = require('../../helpers').UserError; module.exports = Self => { Self.remoteMethod('clone', { description: 'clone item', accessType: 'WRITE', accepts: [{ arg: 'id', type: 'number', required: true, description: 'origin itemId', http: {source: 'path'} }], returns: { arg: 'id', description: 'new cloned itemId' }, http: { path: `/:id/clone`, verb: 'post' } }); Self.clone = async itemId => { let filter = { where: { id: itemId }, include: [ {relation: 'tags', scope: {order: 'priority ASC', include: {relation: 'tag'}}} ] }; try { let origin = await Self.findOne(filter); let copy = JSON.parse(JSON.stringify(origin)); delete copy.id; delete copy.itemTag; delete copy.description; delete copy.image; let newItem = await Self.create(copy); let promises = []; let createBotanical = `INSERT INTO vn.itemBotanical (itemFk, botanical, genusFk, specieFk) SELECT ?, botanical, genusFk, specieFk FROM vn.itemBotanical ib WHERE itemFk = ?`; promises.push(Self.rawSql(createBotanical, [newItem.id, origin.id])); let createTags = `INSERT INTO vn.itemTag(itemFk, tagFk, value, priority) SELECT ?, i.tagFk, i.value,i.priority FROM vn.itemTag i WHERE i.itemFk = ? ON DUPLICATE KEY UPDATE value = i.value, priority = i.priority`; promises.push(Self.rawSql(createTags, [newItem.id, origin.id])); let createTax = `REPLACE INTO vn.itemTaxCountry (itemFk, countryFk, taxClassFk) SELECT ?, countryFk, taxClassFk FROM vn.itemTaxCountry WHERE itemFk = ?`; promises.push(Self.rawSql(createTax, [newItem.id, origin.id])); await Promise.all(promises); return newItem.id; } catch (err) { throw new UserError(err); } }; };