export const GET_TREE_FOR_COMPANY = ` WITH tree AS ( SELECT id, parent_id, sort FROM category WHERE id = @rootId UNION ALL SELECT c.id, c.parent_id, c.sort FROM category c INNER JOIN tree t ON c.parent_id = t.id ) SELECT t.id, t.parent_id AS parentId, t.sort, ct.name, ct.slug, p.hash AS fullHash, p.thumbw AS thumbW, p.thumbh AS thumbH, p.thumbhash AS thumbHash, ( SELECT COUNT(*) FROM categoryarticle ca INNER JOIN article a ON a.id = ca.article_id WHERE ca.category_id = t.id AND a.parentarticle_id IS NULL ) AS articleCount FROM tree t LEFT JOIN categorytext ct ON ct.category_id = t.id AND ct.language_id = @languageId OUTER APPLY ( SELECT TOP 1 cp.pic_id FROM categorypic cp WHERE cp.category_id = t.id ORDER BY cp.sort ASC, cp.id ASC ) first_pic LEFT JOIN pic p ON p.id = first_pic.pic_id ORDER BY t.sort, t.id `; export const COUNT_ARTICLES_IN_TREE = ` WITH tree AS ( SELECT id FROM category WHERE id = @rootId UNION ALL SELECT c.id FROM category c INNER JOIN tree t ON c.parent_id = t.id ) SELECT COUNT(DISTINCT ca.article_id) AS total FROM categoryarticle ca INNER JOIN article a ON a.id = ca.article_id WHERE ca.category_id IN (SELECT id FROM tree) AND a.parentarticle_id IS NULL `; import { ARTICLE_LIST_COLUMNS, ARTICLE_LIST_JOINS, } from './article.js'; export const GET_CATEGORY_ARTICLES = ` SELECT ${ARTICLE_LIST_COLUMNS} FROM categoryarticle ca INNER JOIN article a ON a.id = ca.article_id ${ARTICLE_LIST_JOINS} WHERE ca.category_id = @categoryId AND a.parentarticle_id IS NULL ORDER BY a.id `; export const GET_CATEGORY_ARTICLE_WAREHOUSE_SUMMARIES = ` SELECT aws.id, aws.article_id AS articleId, aws.warehouse_id AS warehouseId, w.name AS warehouseName, aws.stock FROM articlewarehousesummary aws INNER JOIN warehouse w ON w.id = aws.warehouse_id INNER JOIN categoryarticle ca ON ca.article_id = aws.article_id INNER JOIN article a ON a.id = ca.article_id WHERE ca.category_id = @categoryId AND a.parentarticle_id IS NULL ORDER BY w.sort ASC, w.name ASC, aws.id ASC `; export const CREATE = ` INSERT INTO category (parent_id, sort) OUTPUT INSERTED.id, INSERTED.parent_id AS parentId, INSERTED.sort VALUES (@parentId, @sort) `; export const RESOLVE_CATEGORY_ACCESS = ` WITH ancestors AS ( SELECT id, parent_id FROM category WHERE id = @categoryId UNION ALL SELECT c.id, c.parent_id FROM category c INNER JOIN ancestors a ON c.id = a.parent_id ), root AS ( SELECT TOP 1 id AS rootCategoryId FROM ancestors WHERE parent_id IS NULL ) SELECT p.id AS categoryId, r.rootCategoryId, co.id AS companyId, co.default_language_id AS languageId, co.poscustomergroup_id AS posCustomerGroupId, cu.id AS companyuserId FROM category p LEFT JOIN root r ON 1 = 1 LEFT JOIN company co ON co.root_category_id = r.rootCategoryId LEFT JOIN companyuser cu ON cu.company_id = co.id AND cu.google_auth_id = @googleAuthId WHERE p.id = @categoryId `; export const GET_NEXT_SIBLING_SORT = ` SELECT ISNULL(MAX(sort), -1) + 1 AS sort FROM category WHERE parent_id = @parentId `; /** Resolve a child category by its parent id and name (language-sensitive). */ export const GET_BY_PARENT_AND_NAME = ` SELECT c.id FROM category c INNER JOIN categorytext ct ON ct.category_id = c.id AND ct.language_id = @languageId WHERE c.parent_id = @parentId AND ct.name = @name `; export const LIST_CHILD_IDS = ` SELECT id FROM category WHERE parent_id = @parentId `; export const UPDATE_SORT = ` UPDATE category SET sort = @sort, updated_at = SYSUTCDATETIME() WHERE id = @id AND parent_id = @parentId `; /** True if @id is an ancestor of @parentId (would create a cycle when moving). */ export const IS_ANCESTOR = ` WITH ancestors AS ( SELECT id, parent_id FROM category WHERE id = @parentId UNION ALL SELECT c.id, c.parent_id FROM category c INNER JOIN ancestors a ON c.id = a.parent_id ) SELECT id FROM ancestors WHERE id = @id `; export const MOVE = ` UPDATE category SET parent_id = @parentId, sort = @sort, updated_at = SYSUTCDATETIME() WHERE id = @id `; export const DELETE = ` DELETE FROM category WHERE id = @id `;