transactions for entry module endpoints
This commit is contained in:
parent
e1c1bb8425
commit
b38605442e
|
@ -89,7 +89,7 @@ module.exports = Self => {
|
||||||
|
|
||||||
const newBuy = await models.Buy.create(ctx.args, myOptions);
|
const newBuy = await models.Buy.create(ctx.args, myOptions);
|
||||||
|
|
||||||
let filter = {
|
const filter = {
|
||||||
fields: [
|
fields: [
|
||||||
'id',
|
'id',
|
||||||
'itemFk',
|
'itemFk',
|
||||||
|
@ -136,7 +136,7 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let stmts = [];
|
const stmts = [];
|
||||||
let stmt;
|
let stmt;
|
||||||
|
|
||||||
stmts.push('DROP TEMPORARY TABLE IF EXISTS tmp.buyRecalc');
|
stmts.push('DROP TEMPORARY TABLE IF EXISTS tmp.buyRecalc');
|
||||||
|
|
|
@ -32,7 +32,7 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
let promises = [];
|
const promises = [];
|
||||||
for (let buy of ctx.args.buys) {
|
for (let buy of ctx.args.buys) {
|
||||||
const buysToDelete = models.Buy.destroyById(buy.id, myOptions);
|
const buysToDelete = models.Buy.destroyById(buy.id, myOptions);
|
||||||
promises.push(buysToDelete);
|
promises.push(buysToDelete);
|
||||||
|
|
|
@ -30,7 +30,18 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Self.editLatestBuys = async(field, newValue, lines) => {
|
Self.editLatestBuys = async(field, newValue, lines, options) => {
|
||||||
|
let tx;
|
||||||
|
let myOptions = {};
|
||||||
|
|
||||||
|
if (typeof options == 'object')
|
||||||
|
Object.assign(myOptions, options);
|
||||||
|
|
||||||
|
if (!myOptions.transaction) {
|
||||||
|
tx = await Self.beginTransaction({});
|
||||||
|
myOptions.transaction = tx;
|
||||||
|
}
|
||||||
|
|
||||||
let modelName;
|
let modelName;
|
||||||
let identifier;
|
let identifier;
|
||||||
|
|
||||||
|
@ -60,28 +71,27 @@ module.exports = Self => {
|
||||||
const models = Self.app.models;
|
const models = Self.app.models;
|
||||||
const model = models[modelName];
|
const model = models[modelName];
|
||||||
|
|
||||||
let tx = await model.beginTransaction({});
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
let promises = [];
|
let promises = [];
|
||||||
let options = {transaction: tx};
|
|
||||||
|
|
||||||
let targets = lines.map(line => {
|
const targets = lines.map(line => {
|
||||||
return line[identifier];
|
return line[identifier];
|
||||||
});
|
});
|
||||||
|
|
||||||
let value = {};
|
const value = {};
|
||||||
value[field] = newValue;
|
value[field] = newValue;
|
||||||
|
|
||||||
// intentarlo con updateAll
|
|
||||||
for (let target of targets)
|
for (let target of targets)
|
||||||
promises.push(model.upsertWithWhere({id: target}, value, options));
|
promises.push(model.upsertWithWhere({id: target}, value, myOptions));
|
||||||
|
|
||||||
await Promise.all(promises);
|
const result = await Promise.all(promises, myOptions);
|
||||||
await tx.commit();
|
|
||||||
} catch (error) {
|
if (tx) await tx.commit();
|
||||||
await tx.rollback();
|
|
||||||
throw error;
|
return result;
|
||||||
|
} catch (e) {
|
||||||
|
if (tx) await tx.rollback();
|
||||||
|
throw e;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -13,71 +13,85 @@ module.exports = Self => {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
description: 'Filter defining where, order, offset, and limit - must be a JSON-encoded string',
|
description: 'Filter defining where, order, offset, and limit - must be a JSON-encoded string',
|
||||||
http: {source: 'query'}
|
http: {source: 'query'}
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
arg: 'search',
|
arg: 'search',
|
||||||
type: 'string',
|
type: 'string',
|
||||||
description: 'Searchs the entry by id',
|
description: 'Searchs the entry by id',
|
||||||
http: {source: 'query'}
|
http: {source: 'query'}
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
arg: 'id',
|
arg: 'id',
|
||||||
type: 'integer',
|
type: 'integer',
|
||||||
description: 'The entry id',
|
description: 'The entry id',
|
||||||
http: {source: 'query'}
|
http: {source: 'query'}
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
arg: 'created',
|
arg: 'created',
|
||||||
type: 'date',
|
type: 'date',
|
||||||
description: 'The created date to filter',
|
description: 'The created date to filter',
|
||||||
http: {source: 'query'}
|
http: {source: 'query'}
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
arg: 'travelFk',
|
arg: 'travelFk',
|
||||||
type: 'number',
|
type: 'number',
|
||||||
description: 'The travel id to filter',
|
description: 'The travel id to filter',
|
||||||
http: {source: 'query'}
|
http: {source: 'query'}
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
arg: 'companyFk',
|
arg: 'companyFk',
|
||||||
type: 'number',
|
type: 'number',
|
||||||
description: 'The company to filter',
|
description: 'The company to filter',
|
||||||
http: {source: 'query'}
|
http: {source: 'query'}
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
arg: 'isBooked',
|
arg: 'isBooked',
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
description: 'The isBokked filter',
|
description: 'The isBokked filter',
|
||||||
http: {source: 'query'}
|
http: {source: 'query'}
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
arg: 'isConfirmed',
|
arg: 'isConfirmed',
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
description: 'The isConfirmed filter',
|
description: 'The isConfirmed filter',
|
||||||
http: {source: 'query'}
|
http: {source: 'query'}
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
arg: 'isOrdered',
|
arg: 'isOrdered',
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
description: 'The isOrdered filter',
|
description: 'The isOrdered filter',
|
||||||
http: {source: 'query'}
|
http: {source: 'query'}
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
arg: 'ref',
|
arg: 'ref',
|
||||||
type: 'string',
|
type: 'string',
|
||||||
description: 'The ref filter',
|
description: 'The ref filter',
|
||||||
http: {source: 'query'}
|
http: {source: 'query'}
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
arg: 'supplierFk',
|
arg: 'supplierFk',
|
||||||
type: 'number',
|
type: 'number',
|
||||||
description: 'The supplier id to filter',
|
description: 'The supplier id to filter',
|
||||||
http: {source: 'query'}
|
http: {source: 'query'}
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
arg: 'invoiceInFk',
|
arg: 'invoiceInFk',
|
||||||
type: 'number',
|
type: 'number',
|
||||||
description: 'The invoiceIn id to filter',
|
description: 'The invoiceIn id to filter',
|
||||||
http: {source: 'query'}
|
http: {source: 'query'}
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
arg: 'currencyFk',
|
arg: 'currencyFk',
|
||||||
type: 'number',
|
type: 'number',
|
||||||
description: 'The currency id to filter',
|
description: 'The currency id to filter',
|
||||||
http: {source: 'query'}
|
http: {source: 'query'}
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
arg: 'from',
|
arg: 'from',
|
||||||
type: 'date',
|
type: 'date',
|
||||||
description: `The from date filter`
|
description: `The from date filter`
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
arg: 'to',
|
arg: 'to',
|
||||||
type: 'date',
|
type: 'date',
|
||||||
description: `The to date filter`
|
description: `The to date filter`
|
||||||
|
@ -93,9 +107,14 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Self.filter = async(ctx, filter) => {
|
Self.filter = async(ctx, filter, options) => {
|
||||||
let conn = Self.dataSource.connector;
|
let myOptions = {};
|
||||||
let where = buildFilter(ctx.args, (param, value) => {
|
|
||||||
|
if (typeof options == 'object')
|
||||||
|
Object.assign(myOptions, options);
|
||||||
|
|
||||||
|
const conn = Self.dataSource.connector;
|
||||||
|
const where = buildFilter(ctx.args, (param, value) => {
|
||||||
switch (param) {
|
switch (param) {
|
||||||
case 'search':
|
case 'search':
|
||||||
return /^\d+$/.test(value)
|
return /^\d+$/.test(value)
|
||||||
|
@ -128,7 +147,7 @@ module.exports = Self => {
|
||||||
});
|
});
|
||||||
filter = mergeFilters(ctx.args.filter, {where});
|
filter = mergeFilters(ctx.args.filter, {where});
|
||||||
|
|
||||||
let stmts = [];
|
const stmts = [];
|
||||||
let stmt;
|
let stmt;
|
||||||
stmt = new ParameterizedSQL(
|
stmt = new ParameterizedSQL(
|
||||||
`SELECT
|
`SELECT
|
||||||
|
@ -163,10 +182,10 @@ module.exports = Self => {
|
||||||
);
|
);
|
||||||
|
|
||||||
stmt.merge(conn.makeSuffix(filter));
|
stmt.merge(conn.makeSuffix(filter));
|
||||||
let itemsIndex = stmts.push(stmt) - 1;
|
const itemsIndex = stmts.push(stmt) - 1;
|
||||||
|
|
||||||
let sql = ParameterizedSQL.join(stmts, ';');
|
const sql = ParameterizedSQL.join(stmts, ';');
|
||||||
let result = await conn.executeStmt(sql);
|
const result = await conn.executeStmt(sql, myOptions);
|
||||||
return itemsIndex === 0 ? result : result[itemsIndex];
|
return itemsIndex === 0 ? result : result[itemsIndex];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -19,8 +19,14 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Self.getBuys = async id => {
|
Self.getBuys = async(id, options) => {
|
||||||
let filter = {
|
const models = Self.app.models;
|
||||||
|
let myOptions = {};
|
||||||
|
|
||||||
|
if (typeof options == 'object')
|
||||||
|
Object.assign(myOptions, options);
|
||||||
|
|
||||||
|
const filter = {
|
||||||
where: {entryFk: id},
|
where: {entryFk: id},
|
||||||
fields: [
|
fields: [
|
||||||
'id',
|
'id',
|
||||||
|
@ -68,7 +74,6 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let buys = await Self.app.models.Buy.find(filter);
|
return models.Buy.find(filter, myOptions);
|
||||||
return buys;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -19,8 +19,14 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Self.getEntry = async id => {
|
Self.getEntry = async(id, options) => {
|
||||||
let filter = {
|
const models = Self.app.models;
|
||||||
|
let myOptions = {};
|
||||||
|
|
||||||
|
if (typeof options == 'object')
|
||||||
|
Object.assign(myOptions, options);
|
||||||
|
|
||||||
|
const filter = {
|
||||||
where: {id: id},
|
where: {id: id},
|
||||||
include: [
|
include: [
|
||||||
{
|
{
|
||||||
|
@ -70,7 +76,6 @@ module.exports = Self => {
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
let entry = await Self.app.models.Entry.findOne(filter);
|
return models.Entry.findOne(filter, myOptions);
|
||||||
return entry;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -45,8 +45,8 @@ module.exports = Self => {
|
||||||
const conn = Self.dataSource.connector;
|
const conn = Self.dataSource.connector;
|
||||||
const args = ctx.args;
|
const args = ctx.args;
|
||||||
const models = Self.app.models;
|
const models = Self.app.models;
|
||||||
|
|
||||||
let tx;
|
let tx;
|
||||||
|
|
||||||
if (!options.transaction) {
|
if (!options.transaction) {
|
||||||
tx = await Self.beginTransaction({});
|
tx = await Self.beginTransaction({});
|
||||||
options.transaction = tx;
|
options.transaction = tx;
|
||||||
|
@ -76,7 +76,7 @@ module.exports = Self => {
|
||||||
const createdBuys = await models.Buy.create(buys, options);
|
const createdBuys = await models.Buy.create(buys, options);
|
||||||
const buyIds = createdBuys.map(buy => buy.id);
|
const buyIds = createdBuys.map(buy => buy.id);
|
||||||
|
|
||||||
let stmts = [];
|
const stmts = [];
|
||||||
let stmt;
|
let stmt;
|
||||||
|
|
||||||
stmts.push('DROP TEMPORARY TABLE IF EXISTS tmp.buyRecalc');
|
stmts.push('DROP TEMPORARY TABLE IF EXISTS tmp.buyRecalc');
|
||||||
|
|
|
@ -24,14 +24,19 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Self.importBuysPreview = async(id, buys) => {
|
Self.importBuysPreview = async(id, buys, options) => {
|
||||||
const models = Self.app.models;
|
const models = Self.app.models;
|
||||||
|
let myOptions = {};
|
||||||
|
|
||||||
|
if (typeof options == 'object')
|
||||||
|
Object.assign(myOptions, options);
|
||||||
|
|
||||||
for (let buy of buys) {
|
for (let buy of buys) {
|
||||||
const packaging = await models.Packaging.findOne({
|
const packaging = await models.Packaging.findOne({
|
||||||
fields: ['id'],
|
fields: ['id'],
|
||||||
where: {volume: {gte: buy.volume}},
|
where: {volume: {gte: buy.volume}},
|
||||||
order: 'volume ASC'
|
order: 'volume ASC'
|
||||||
});
|
}, myOptions);
|
||||||
buy.packageFk = packaging.id;
|
buy.packageFk = packaging.id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,36 +17,44 @@ module.exports = Self => {
|
||||||
arg: 'search',
|
arg: 'search',
|
||||||
type: 'String',
|
type: 'String',
|
||||||
description: `If it's and integer searchs by id, otherwise it searchs by name`,
|
description: `If it's and integer searchs by id, otherwise it searchs by name`,
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
arg: 'id',
|
arg: 'id',
|
||||||
type: 'Integer',
|
type: 'Integer',
|
||||||
description: 'Item id',
|
description: 'Item id',
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
arg: 'tags',
|
arg: 'tags',
|
||||||
type: ['Object'],
|
type: ['Object'],
|
||||||
description: 'List of tags to filter with',
|
description: 'List of tags to filter with',
|
||||||
http: {source: 'query'}
|
http: {source: 'query'}
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
arg: 'description',
|
arg: 'description',
|
||||||
type: 'String',
|
type: 'String',
|
||||||
description: 'The item description',
|
description: 'The item description',
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
arg: 'salesPersonFk',
|
arg: 'salesPersonFk',
|
||||||
type: 'Integer',
|
type: 'Integer',
|
||||||
description: 'The buyer of the item',
|
description: 'The buyer of the item',
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
arg: 'active',
|
arg: 'active',
|
||||||
type: 'Boolean',
|
type: 'Boolean',
|
||||||
description: 'Whether the item is or not active',
|
description: 'Whether the item is or not active',
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
arg: 'visible',
|
arg: 'visible',
|
||||||
type: 'Boolean',
|
type: 'Boolean',
|
||||||
description: 'Whether the item is or not visible',
|
description: 'Whether the item is or not visible',
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
arg: 'typeFk',
|
arg: 'typeFk',
|
||||||
type: 'Integer',
|
type: 'Integer',
|
||||||
description: 'Type id',
|
description: 'Type id',
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
arg: 'categoryFk',
|
arg: 'categoryFk',
|
||||||
type: 'Integer',
|
type: 'Integer',
|
||||||
description: 'Category id',
|
description: 'Category id',
|
||||||
|
@ -62,9 +70,14 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Self.latestBuysFilter = async(ctx, filter) => {
|
Self.latestBuysFilter = async(ctx, filter, options) => {
|
||||||
let conn = Self.dataSource.connector;
|
let myOptions = {};
|
||||||
let where = buildFilter(ctx.args, (param, value) => {
|
|
||||||
|
if (typeof options == 'object')
|
||||||
|
Object.assign(myOptions, options);
|
||||||
|
|
||||||
|
const conn = Self.dataSource.connector;
|
||||||
|
const where = buildFilter(ctx.args, (param, value) => {
|
||||||
switch (param) {
|
switch (param) {
|
||||||
case 'search':
|
case 'search':
|
||||||
return /^\d+$/.test(value)
|
return /^\d+$/.test(value)
|
||||||
|
@ -93,7 +106,7 @@ module.exports = Self => {
|
||||||
});
|
});
|
||||||
filter = mergeFilters(ctx.args.filter, {where});
|
filter = mergeFilters(ctx.args.filter, {where});
|
||||||
|
|
||||||
let stmts = [];
|
const stmts = [];
|
||||||
let stmt;
|
let stmt;
|
||||||
|
|
||||||
stmts.push('CALL cache.last_buy_refresh(FALSE)');
|
stmts.push('CALL cache.last_buy_refresh(FALSE)');
|
||||||
|
@ -179,10 +192,10 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
|
|
||||||
stmt.merge(conn.makeSuffix(filter));
|
stmt.merge(conn.makeSuffix(filter));
|
||||||
let buysIndex = stmts.push(stmt) - 1;
|
const buysIndex = stmts.push(stmt) - 1;
|
||||||
|
|
||||||
let sql = ParameterizedSQL.join(stmts, ';');
|
const sql = ParameterizedSQL.join(stmts, ';');
|
||||||
let result = await conn.executeStmt(sql);
|
const result = await conn.executeStmt(sql, myOptions);
|
||||||
return buysIndex === 0 ? result : result[buysIndex];
|
return buysIndex === 0 ? result : result[buysIndex];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -3,29 +3,32 @@ const model = app.models.Buy;
|
||||||
|
|
||||||
describe('Buy editLatestsBuys()', () => {
|
describe('Buy editLatestsBuys()', () => {
|
||||||
it('should change the value of a given column for the selected buys', async() => {
|
it('should change the value of a given column for the selected buys', async() => {
|
||||||
|
const tx = await app.models.Entry.beginTransaction({});
|
||||||
|
const options = {transaction: tx};
|
||||||
|
|
||||||
|
try {
|
||||||
let ctx = {
|
let ctx = {
|
||||||
args: {
|
args: {
|
||||||
search: 'Ranged weapon longbow 2m'
|
search: 'Ranged weapon longbow 2m'
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let [original] = await model.latestBuysFilter(ctx);
|
const [original] = await model.latestBuysFilter(ctx, null, options);
|
||||||
|
|
||||||
const field = 'size';
|
const field = 'size';
|
||||||
let newValue = 99;
|
const newValue = 99;
|
||||||
const lines = [{itemFk: original.itemFk, id: original.id}];
|
const lines = [{itemFk: original.itemFk, id: original.id}];
|
||||||
|
|
||||||
await model.editLatestBuys(field, newValue, lines);
|
await model.editLatestBuys(field, newValue, lines, options);
|
||||||
|
|
||||||
let [result] = await model.latestBuysFilter(ctx);
|
const [result] = await model.latestBuysFilter(ctx, null, options);
|
||||||
|
|
||||||
expect(result.size).toEqual(99);
|
expect(result[field]).toEqual(newValue);
|
||||||
|
|
||||||
newValue = original.size;
|
await tx.rollback();
|
||||||
await model.editLatestBuys(field, newValue, lines);
|
} catch (e) {
|
||||||
|
await tx.rollback();
|
||||||
let [restoredFixture] = await model.latestBuysFilter(ctx);
|
throw e;
|
||||||
|
}
|
||||||
expect(restoredFixture.size).toEqual(original.size);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue