u
This commit is contained in:
@@ -11,6 +11,7 @@ import { CREATE as SQLITE_CREATE_PIC } from '../../providers/sqlite3/queries/pic
|
|||||||
import processAvifImage from '../../util/processAvifImage.js';
|
import processAvifImage from '../../util/processAvifImage.js';
|
||||||
import newFullHash from '../../util/newFullHash.js';
|
import newFullHash from '../../util/newFullHash.js';
|
||||||
import resolveArticleBySku from './resolveArticleBySku.js';
|
import resolveArticleBySku from './resolveArticleBySku.js';
|
||||||
|
import { recordImageAddHistory } from '../articlehistory/record.js';
|
||||||
import makeRunner from '../runner.js';
|
import makeRunner from '../runner.js';
|
||||||
|
|
||||||
export default function addImage(provider) {
|
export default function addImage(provider) {
|
||||||
@@ -39,7 +40,7 @@ export default function addImage(provider) {
|
|||||||
const fullHash = newFullHash(processed.full.buffer);
|
const fullHash = newFullHash(processed.full.buffer);
|
||||||
|
|
||||||
const runAdd = async (runner) => {
|
const runAdd = async (runner) => {
|
||||||
const { articleId } = await resolve(googleAuthId, sku, runner);
|
const { articleId, companyuserId } = await resolve(googleAuthId, sku, runner);
|
||||||
|
|
||||||
const sortResult = await runner.query(getSortSql, { articleId });
|
const sortResult = await runner.query(getSortSql, { articleId });
|
||||||
const sort = sortResult.rows[0].sort;
|
const sort = sortResult.rows[0].sort;
|
||||||
@@ -96,6 +97,13 @@ export default function addImage(provider) {
|
|||||||
picId,
|
picId,
|
||||||
sort,
|
sort,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
await recordImageAddHistory(runner, {
|
||||||
|
articleId,
|
||||||
|
companyuserId,
|
||||||
|
fullHash,
|
||||||
|
sort: effectiveSort,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { DELETE_BY_ARTICLE_AND_HASH as MSSQL_QUERY } from '../../providers/mssql/queries/pic.js';
|
import { DELETE_BY_ARTICLE_AND_HASH as MSSQL_QUERY } from '../../providers/mssql/queries/pic.js';
|
||||||
import { DELETE_BY_ARTICLE_AND_HASH as SQLITE_QUERY } from '../../providers/sqlite3/queries/pic.js';
|
import { DELETE_BY_ARTICLE_AND_HASH as SQLITE_QUERY } from '../../providers/sqlite3/queries/pic.js';
|
||||||
import resolveArticleBySku from './resolveArticleBySku.js';
|
import resolveArticleBySku from './resolveArticleBySku.js';
|
||||||
|
import { recordImageDeleteHistory } from '../articlehistory/record.js';
|
||||||
import makeRunner from '../runner.js';
|
import makeRunner from '../runner.js';
|
||||||
|
|
||||||
export default function deleteImage(provider) {
|
export default function deleteImage(provider) {
|
||||||
@@ -21,21 +22,36 @@ export default function deleteImage(provider) {
|
|||||||
* await store.article.deleteImage(42, 'SKU-1', 'abc123');
|
* await store.article.deleteImage(42, 'SKU-1', 'abc123');
|
||||||
*/
|
*/
|
||||||
return async (googleAuthId, sku, fullHash, tx) => {
|
return async (googleAuthId, sku, fullHash, tx) => {
|
||||||
const { articleId } = await resolve(googleAuthId, sku, tx);
|
const runDelete = async (runner) => {
|
||||||
const runner = makeRunner(provider, tx);
|
const { articleId, companyuserId } = await resolve(googleAuthId, sku, runner);
|
||||||
const result = await runner.query(sql, { articleId, fullHash });
|
const result = await runner.query(sql, { articleId, fullHash });
|
||||||
|
|
||||||
if (!result.rowsAffected) {
|
if (!result.rowsAffected) {
|
||||||
throw new Error('Image not found');
|
throw new Error('Image not found');
|
||||||
}
|
|
||||||
|
|
||||||
if (provider?.dialect === 'sqlite3') {
|
|
||||||
if (runner.deletePic) {
|
|
||||||
await runner.deletePic(fullHash);
|
|
||||||
} else if (provider?.deletePic) {
|
|
||||||
await provider.deletePic(fullHash);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (provider?.dialect === 'sqlite3') {
|
||||||
|
if (runner.deletePic) {
|
||||||
|
await runner.deletePic(fullHash);
|
||||||
|
} else if (provider?.deletePic) {
|
||||||
|
await provider.deletePic(fullHash);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await recordImageDeleteHistory(runner, {
|
||||||
|
articleId,
|
||||||
|
companyuserId,
|
||||||
|
fullHash,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
if (tx) {
|
||||||
|
return runDelete(makeRunner(provider, tx));
|
||||||
}
|
}
|
||||||
|
if (typeof provider?.transaction === 'function') {
|
||||||
|
return provider.transaction(runDelete);
|
||||||
|
}
|
||||||
|
return runDelete(makeRunner(provider));
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import * as mssqlPic from '../../providers/mssql/queries/articlepic.js';
|
import * as mssqlPic from '../../providers/mssql/queries/articlepic.js';
|
||||||
import * as sqlitePic from '../../providers/sqlite3/queries/articlepic.js';
|
import * as sqlitePic from '../../providers/sqlite3/queries/articlepic.js';
|
||||||
import resolveArticleBySku from './resolveArticleBySku.js';
|
import resolveArticleBySku from './resolveArticleBySku.js';
|
||||||
|
import { recordImageOrderHistory } from '../articlehistory/record.js';
|
||||||
import makeRunner from '../runner.js';
|
import makeRunner from '../runner.js';
|
||||||
|
|
||||||
export default function orderImages(provider) {
|
export default function orderImages(provider) {
|
||||||
@@ -29,7 +30,7 @@ export default function orderImages(provider) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const runOrder = async (runner) => {
|
const runOrder = async (runner) => {
|
||||||
const { articleId } = await resolve(googleAuthId, sku, runner);
|
const { articleId, companyuserId } = await resolve(googleAuthId, sku, runner);
|
||||||
|
|
||||||
const current = await runner.query(queries.LIST_HASHES_BY_ARTICLE, { articleId });
|
const current = await runner.query(queries.LIST_HASHES_BY_ARTICLE, { articleId });
|
||||||
const existing = new Set(current.rows.map((r) => r.fullHash));
|
const existing = new Set(current.rows.map((r) => r.fullHash));
|
||||||
@@ -60,6 +61,16 @@ export default function orderImages(provider) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const oldOrder = current.rows.map((r) => r.fullHash);
|
||||||
|
const isSameOrder = oldOrder.length === fullHashes.length && oldOrder.every((h, i) => h === fullHashes[i]);
|
||||||
|
if (!isSameOrder) {
|
||||||
|
await recordImageOrderHistory(runner, {
|
||||||
|
articleId,
|
||||||
|
companyuserId,
|
||||||
|
fullHashes,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
return { fullHashes };
|
return { fullHashes };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1018,3 +1018,78 @@ export async function recordOptionsListChangeHistory(runner, {
|
|||||||
meta,
|
meta,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Records image addition to an article.
|
||||||
|
*/
|
||||||
|
export async function recordImageAddHistory(runner, {
|
||||||
|
articleId,
|
||||||
|
companyuserId,
|
||||||
|
date,
|
||||||
|
fullHash,
|
||||||
|
sort,
|
||||||
|
}) {
|
||||||
|
const text = typeof sort === 'number'
|
||||||
|
? `Bild hinzugefügt (Position ${sort + 1})`
|
||||||
|
: 'Bild hinzugefügt';
|
||||||
|
const meta = {
|
||||||
|
type: 'image_add',
|
||||||
|
fullHash,
|
||||||
|
sort,
|
||||||
|
};
|
||||||
|
return recordArticleHistory(runner, {
|
||||||
|
articleId,
|
||||||
|
companyuserId,
|
||||||
|
date,
|
||||||
|
text,
|
||||||
|
meta,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Records image deletion from an article.
|
||||||
|
*/
|
||||||
|
export async function recordImageDeleteHistory(runner, {
|
||||||
|
articleId,
|
||||||
|
companyuserId,
|
||||||
|
date,
|
||||||
|
fullHash,
|
||||||
|
}) {
|
||||||
|
const text = 'Bild gelöscht';
|
||||||
|
const meta = {
|
||||||
|
type: 'image_delete',
|
||||||
|
fullHash,
|
||||||
|
};
|
||||||
|
return recordArticleHistory(runner, {
|
||||||
|
articleId,
|
||||||
|
companyuserId,
|
||||||
|
date,
|
||||||
|
text,
|
||||||
|
meta,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Records image reordering for an article.
|
||||||
|
*/
|
||||||
|
export async function recordImageOrderHistory(runner, {
|
||||||
|
articleId,
|
||||||
|
companyuserId,
|
||||||
|
date,
|
||||||
|
fullHashes,
|
||||||
|
}) {
|
||||||
|
const count = Array.isArray(fullHashes) ? fullHashes.length : 0;
|
||||||
|
const text = `Bildreihenfolge geändert (${count} Bilder)`;
|
||||||
|
const meta = {
|
||||||
|
type: 'image_order',
|
||||||
|
fullHashes,
|
||||||
|
};
|
||||||
|
return recordArticleHistory(runner, {
|
||||||
|
articleId,
|
||||||
|
companyuserId,
|
||||||
|
date,
|
||||||
|
text,
|
||||||
|
meta,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -626,6 +626,12 @@ describe('store.article', () => {
|
|||||||
() => store.article.deleteImage(gid, art.sku, img2.fullHash),
|
() => store.article.deleteImage(gid, art.sku, img2.fullHash),
|
||||||
{ message: 'Image not found' },
|
{ message: 'Image not found' },
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const history = await store.article.getHistoryBySku(gid, art.sku);
|
||||||
|
const texts = history.map((h) => h.text);
|
||||||
|
assert.ok(texts.some((t) => t.includes('Bild hinzugefügt')));
|
||||||
|
assert.ok(texts.some((t) => t.includes('Bildreihenfolge geändert')));
|
||||||
|
assert.ok(texts.some((t) => t.includes('Bild gelöscht')));
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user