sqlite
This commit is contained in:
@@ -1,15 +1,16 @@
|
||||
import {
|
||||
UPDATE_UNIT,
|
||||
UPDATE_UNITAMOUNT,
|
||||
UPDATE_UNIT_AND_AMOUNT,
|
||||
} from '../../providers/mssql/queries/article.js';
|
||||
import { INSERT as INSERT_HISTORY } from '../../providers/mssql/queries/articlehistory.js';
|
||||
import { UPDATE_BY_ARTICLE_AND_LANGUAGE } from '../../providers/mssql/queries/articletext.js';
|
||||
import { GET_DETAIL_BY_ARTICLE_ID } from '../../providers/mssql/queries/articleDetail.js';
|
||||
import { GET_FULL_BY_SI } from '../../providers/mssql/queries/unit.js';
|
||||
import request from '../request.js';
|
||||
import * as mssqlArticle from '../../providers/mssql/queries/article.js';
|
||||
import * as sqliteArticle from '../../providers/sqlite3/queries/article.js';
|
||||
import { INSERT as MSSQL_INSERT_HISTORY } from '../../providers/mssql/queries/articlehistory.js';
|
||||
import { INSERT as SQLITE_INSERT_HISTORY } from '../../providers/sqlite3/queries/articlehistory.js';
|
||||
import { UPDATE_BY_ARTICLE_AND_LANGUAGE as MSSQL_UPDATE_TEXT } from '../../providers/mssql/queries/articletext.js';
|
||||
import { UPDATE_BY_ARTICLE_AND_LANGUAGE as SQLITE_UPDATE_TEXT } from '../../providers/sqlite3/queries/articletext.js';
|
||||
import { GET_DETAIL_BY_ARTICLE_ID as MSSQL_GET_DETAIL } from '../../providers/mssql/queries/articleDetail.js';
|
||||
import { GET_DETAIL_BY_ARTICLE_ID as SQLITE_GET_DETAIL } from '../../providers/sqlite3/queries/articleDetail.js';
|
||||
import { GET_FULL_BY_SI as MSSQL_GET_UNIT } from '../../providers/mssql/queries/unit.js';
|
||||
import { GET_FULL_BY_SI as SQLITE_GET_UNIT } from '../../providers/sqlite3/queries/unit.js';
|
||||
import queryBySku from './queryBySku.js';
|
||||
import resolveArticleBySku from './resolveArticleBySku.js';
|
||||
import makeRunner from '../runner.js';
|
||||
import slugify from '../slugify.js';
|
||||
|
||||
function formatUnitLabel(amount, symbol) {
|
||||
@@ -20,9 +21,16 @@ function formatUnitLabel(amount, symbol) {
|
||||
return `${Number(amount)}${sym}`;
|
||||
}
|
||||
|
||||
export default function updateBySku(pool) {
|
||||
const resolve = resolveArticleBySku(pool);
|
||||
const load = queryBySku(pool);
|
||||
export default function updateBySku(provider) {
|
||||
const resolve = resolveArticleBySku(provider);
|
||||
const load = queryBySku(provider);
|
||||
const isSqlite = provider?.dialect === 'sqlite3';
|
||||
|
||||
const articleQueries = isSqlite ? sqliteArticle : mssqlArticle;
|
||||
const insertHistorySql = isSqlite ? SQLITE_INSERT_HISTORY : MSSQL_INSERT_HISTORY;
|
||||
const updateTextSql = isSqlite ? SQLITE_UPDATE_TEXT : MSSQL_UPDATE_TEXT;
|
||||
const getDetailSql = isSqlite ? SQLITE_GET_DETAIL : MSSQL_GET_DETAIL;
|
||||
const getUnitSql = isSqlite ? SQLITE_GET_UNIT : MSSQL_GET_UNIT;
|
||||
|
||||
/**
|
||||
* Updates an article's name and/or unit (SI and amount), recording history.
|
||||
@@ -33,6 +41,7 @@ export default function updateBySku(pool) {
|
||||
* @param {string} [patch.name] - The new article name.
|
||||
* @param {string} [patch.unitSi] - The new unit SI code.
|
||||
* @param {number} [patch.unitamount] - The new unit amount (must be > 0).
|
||||
* @param {object} [tx] - Optional transaction to run within.
|
||||
* @returns {Promise<object>} The updated article.
|
||||
* @throws {Error} If no valid field is provided or the article is not found.
|
||||
*
|
||||
@@ -40,7 +49,7 @@ export default function updateBySku(pool) {
|
||||
* const article = await store.article.updateBySku(42, 'SKU-1', { name: 'Cola 1L', unitSi: 'l', unitamount: 1 });
|
||||
* // => { id, sku, name, ... }
|
||||
*/
|
||||
return async (googleAuthId, sku, patch = {}) => {
|
||||
return async (googleAuthId, sku, patch = {}, tx) => {
|
||||
const hasName = Object.prototype.hasOwnProperty.call(patch, 'name');
|
||||
const hasUnitamount = Object.prototype.hasOwnProperty.call(patch, 'unitamount');
|
||||
const hasUnitSi = Object.prototype.hasOwnProperty.call(patch, 'unitSi');
|
||||
@@ -57,122 +66,118 @@ export default function updateBySku(pool) {
|
||||
throw new Error('Invalid unitamount');
|
||||
}
|
||||
|
||||
const { articleId, languageId, companyId, companyuserId } = await resolve(
|
||||
googleAuthId,
|
||||
sku,
|
||||
);
|
||||
|
||||
const currentResult = await pool
|
||||
.request()
|
||||
.input('articleId', articleId)
|
||||
.input('languageId', languageId)
|
||||
.query(GET_DETAIL_BY_ARTICLE_ID);
|
||||
const current = currentResult.recordset[0];
|
||||
if (!current) {
|
||||
throw new Error('Article not found');
|
||||
}
|
||||
|
||||
let unitId;
|
||||
let newUnitSymbol = current.unitSymbol ?? current.unitSi ?? '';
|
||||
if (hasUnitSi) {
|
||||
if (!patch.unitSi?.trim()) {
|
||||
throw new Error('Unit not found');
|
||||
}
|
||||
const unit = await pool
|
||||
.request()
|
||||
.input('companyId', companyId)
|
||||
.input('si', patch.unitSi.trim())
|
||||
.input('languageId', languageId)
|
||||
.query(GET_FULL_BY_SI);
|
||||
const unitRow = unit.recordset[0];
|
||||
unitId = unitRow?.id;
|
||||
if (!unitId) {
|
||||
throw new Error('Unit not found');
|
||||
}
|
||||
newUnitSymbol = unitRow.symbol ?? unitRow.si ?? '';
|
||||
}
|
||||
|
||||
const historyLines = [];
|
||||
if (hasName) {
|
||||
const oldName = current.name ?? '';
|
||||
const newName = patch.name.trim();
|
||||
if (oldName !== newName) {
|
||||
historyLines.push(`Name geändert von "${oldName}" auf "${newName}"`);
|
||||
}
|
||||
}
|
||||
if (hasUnitSi || hasUnitamount) {
|
||||
const oldLabel = formatUnitLabel(
|
||||
current.unitamount,
|
||||
current.unitSymbol ?? current.unitSi ?? '',
|
||||
const runUpdate = async (runner) => {
|
||||
const { articleId, languageId, companyId, companyuserId } = await resolve(
|
||||
googleAuthId,
|
||||
sku,
|
||||
runner,
|
||||
);
|
||||
const newLabel = formatUnitLabel(
|
||||
hasUnitamount ? patch.unitamount : current.unitamount,
|
||||
newUnitSymbol,
|
||||
);
|
||||
if (oldLabel !== newLabel) {
|
||||
historyLines.push(`Einheit geändert von "${oldLabel}" auf "${newLabel}"`);
|
||||
|
||||
const currentResult = await runner.query(getDetailSql, {
|
||||
articleId,
|
||||
languageId,
|
||||
});
|
||||
const current = currentResult.rows[0];
|
||||
if (!current) {
|
||||
throw new Error('Article not found');
|
||||
}
|
||||
}
|
||||
|
||||
const tx = pool.transaction();
|
||||
await tx.begin();
|
||||
let unitId;
|
||||
let newUnitSymbol = current.unitSymbol ?? current.unitSi ?? '';
|
||||
if (hasUnitSi) {
|
||||
if (!patch.unitSi?.trim()) {
|
||||
throw new Error('Unit not found');
|
||||
}
|
||||
const unit = await runner.query(getUnitSql, {
|
||||
companyId,
|
||||
si: patch.unitSi.trim(),
|
||||
languageId,
|
||||
});
|
||||
const unitRow = unit.rows[0];
|
||||
unitId = unitRow?.id;
|
||||
if (!unitId) {
|
||||
throw new Error('Unit not found');
|
||||
}
|
||||
newUnitSymbol = unitRow.symbol ?? unitRow.si ?? '';
|
||||
}
|
||||
|
||||
const historyLines = [];
|
||||
if (hasName) {
|
||||
const oldName = current.name ?? '';
|
||||
const newName = patch.name.trim();
|
||||
if (oldName !== newName) {
|
||||
historyLines.push(`Name geändert von "${oldName}" auf "${newName}"`);
|
||||
}
|
||||
}
|
||||
if (hasUnitSi || hasUnitamount) {
|
||||
const oldLabel = formatUnitLabel(
|
||||
current.unitamount,
|
||||
current.unitSymbol ?? current.unitSi ?? '',
|
||||
);
|
||||
const newLabel = formatUnitLabel(
|
||||
hasUnitamount ? patch.unitamount : current.unitamount,
|
||||
newUnitSymbol,
|
||||
);
|
||||
if (oldLabel !== newLabel) {
|
||||
historyLines.push(`Einheit geändert von "${oldLabel}" auf "${newLabel}"`);
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
if (hasName) {
|
||||
const slug = slugify(patch.name);
|
||||
const update = await request(pool, tx)
|
||||
.input('articleId', articleId)
|
||||
.input('languageId', languageId)
|
||||
.input('name', patch.name.trim())
|
||||
.input('slug', slug)
|
||||
.query(UPDATE_BY_ARTICLE_AND_LANGUAGE);
|
||||
const update = await runner.query(updateTextSql, {
|
||||
articleId,
|
||||
languageId,
|
||||
name: patch.name.trim(),
|
||||
slug,
|
||||
});
|
||||
|
||||
if (!update.rowsAffected[0]) {
|
||||
if (!update.rowsAffected) {
|
||||
throw new Error('Article not found');
|
||||
}
|
||||
}
|
||||
|
||||
if (hasUnitSi && hasUnitamount) {
|
||||
await request(pool, tx)
|
||||
.input('articleId', articleId)
|
||||
.input('unitId', unitId)
|
||||
.input('unitamount', patch.unitamount)
|
||||
.query(UPDATE_UNIT_AND_AMOUNT);
|
||||
await runner.query(articleQueries.UPDATE_UNIT_AND_AMOUNT, {
|
||||
articleId,
|
||||
unitId,
|
||||
unitamount: patch.unitamount,
|
||||
});
|
||||
} else if (hasUnitSi) {
|
||||
await request(pool, tx)
|
||||
.input('articleId', articleId)
|
||||
.input('unitId', unitId)
|
||||
.query(UPDATE_UNIT);
|
||||
await runner.query(articleQueries.UPDATE_UNIT, {
|
||||
articleId,
|
||||
unitId,
|
||||
});
|
||||
} else if (hasUnitamount) {
|
||||
await request(pool, tx)
|
||||
.input('articleId', articleId)
|
||||
.input('unitamount', patch.unitamount)
|
||||
.query(UPDATE_UNITAMOUNT);
|
||||
await runner.query(articleQueries.UPDATE_UNITAMOUNT, {
|
||||
articleId,
|
||||
unitamount: patch.unitamount,
|
||||
});
|
||||
}
|
||||
|
||||
if (historyLines.length) {
|
||||
await request(pool, tx)
|
||||
.input('articleId', articleId)
|
||||
.input('companyuserId', companyuserId)
|
||||
.input('text', historyLines.join('\n'))
|
||||
.query(INSERT_HISTORY);
|
||||
await runner.query(insertHistorySql, {
|
||||
articleId,
|
||||
companyuserId,
|
||||
text: historyLines.join('\n'),
|
||||
});
|
||||
}
|
||||
|
||||
await tx.commit();
|
||||
} catch (err) {
|
||||
try {
|
||||
await tx.rollback();
|
||||
} catch {
|
||||
// ignore
|
||||
const article = await load(articleId, languageId, runner);
|
||||
if (!article) {
|
||||
throw new Error('Article not found');
|
||||
}
|
||||
throw err;
|
||||
}
|
||||
|
||||
const article = await load(articleId, languageId);
|
||||
if (!article) {
|
||||
throw new Error('Article not found');
|
||||
}
|
||||
return article;
|
||||
};
|
||||
|
||||
return article;
|
||||
if (tx) {
|
||||
return runUpdate(makeRunner(provider, tx));
|
||||
}
|
||||
if (typeof provider?.transaction === 'function') {
|
||||
return provider.transaction(runUpdate);
|
||||
}
|
||||
return runUpdate(makeRunner(provider));
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user