import { UPDATE_BY_ARTICLE_AND_LANGUAGE } from '../../sql/articletext.js'; import request from '../request.js'; import queryBySku from './queryBySku.js'; import resolveArticleBySku from './resolveArticleBySku.js'; function slugify(name) { return name .trim() .toLowerCase() .normalize('NFD') .replace(/\p{M}/gu, '') .replace(/[^a-z0-9]+/g, '-') .replace(/^-+|-+$/g, ''); } export default function updateBySku(pool) { const resolve = resolveArticleBySku(pool); const load = queryBySku(pool); return async (googleAuthId, sku, { name }) => { if (!name?.trim()) { throw new Error('Name required'); } const { articleId, languageId } = await resolve(googleAuthId, sku); const slug = slugify(name); const tx = pool.transaction(); await tx.begin(); try { const update = await request(pool, tx) .input('articleId', articleId) .input('languageId', languageId) .input('name', name.trim()) .input('slug', slug) .query(UPDATE_BY_ARTICLE_AND_LANGUAGE); if (!update.rowsAffected[0]) { throw new Error('Article not found'); } await tx.commit(); const article = await load(articleId, languageId); if (!article) { throw new Error('Article not found'); } return article; } catch (err) { try { await tx.rollback(); } catch { // ignore } throw err; } }; }