VvebOIDC/admin/sql/pgsql/menu.sql

472 lines
8.6 KiB
SQL

-- Menus
-- get menu
CREATE PROCEDURE get(
-- variables
IN language_id INT,
IN menu_id INT,
IN site_id INT,
IN slug CHAR,
-- return menus count for count query
OUT fetch_row, --menu
OUT fetch_all -- menu_to_site
)
BEGIN
SELECT *
FROM menu AS _
@IF isset(:site_id)
THEN
INNER JOIN menu_to_site ON (_.menu_id = menu_to_site.menu_id)
END @IF
WHERE 1 = 1
@IF isset(:slug)
THEN
AND _.slug = :slug
END @IF
@IF isset(:menu_id)
THEN
AND _.menu_id = :menu_id
END @IF
@IF isset(:site_id)
THEN
AND menu_to_site.site_id = :site_id
END @IF
LIMIT 1;
-- menu_to_site
SELECT site_id as array_key, site_id FROM menu_to_site
WHERE menu_to_site.menu_id = :menu_id;
END
-- edit menu
CREATE PROCEDURE editMenu(
-- variables
IN language_id INT,
IN menu_id INT,
IN site_id ARRAY,
IN slug CHAR,
IN name CHAR,
-- return menus count for count query
OUT affected_rows
)
BEGIN
UPDATE menu SET slug = :slug, name = :name WHERE menu_id = :menu_id;
@IF isset(:site_id)
THEN
DELETE FROM menu_to_site WHERE menu_id = :menu_id
END @IF;
@EACH(:site_id)
INSERT INTO menu_to_site
( menu_id, site_id )
VALUES ( :menu_id, :each );
END -- edit menu
-- add menu
CREATE PROCEDURE addMenu(
-- variables
IN language_id INT,
IN menu_id INT,
IN site_id ARRAY,
IN menu ARRAY,
-- return menus count for count query
OUT fetch_one
)
BEGIN
@FILTER(:menu, menu)
INSERT INTO menu
( @KEYS(:menu) )
VALUES ( :menu ) RETURNING menu_id;
@EACH(:site_id)
INSERT INTO menu_to_site
( menu_id, site_id )
VALUES ( @result.menu, :each );
END
-- delete menu
CREATE PROCEDURE deleteMenu(
-- variables
IN menu_id ARRAY,
-- return affected rows
OUT affected_rows,
OUT affected_rows,
OUT affected_rows
)
BEGIN
DELETE FROM menu_item_content WHERE menu_item_id IN (SELECT menu_item_id FROM menu_item WHERE menu_item_id IN (:menu_id));
DELETE FROM menu_item WHERE menu_id IN (:menu_id);
DELETE FROM menu WHERE menu_id IN (:menu_id);
END
-- get all menus
CREATE PROCEDURE getAll(
-- variables
IN language_id INT,
IN menu_id INT,
IN site_id INT,
IN type CHAR,
-- pagination
IN start INT,
IN limit INT,
-- return array of menu for menus query
OUT fetch_all,
-- return menus count for count query
OUT fetch_one,
)
BEGIN
SELECT *, menu.menu_id as array_key
FROM menu
@IF isset(:site_id)
THEN
INNER JOIN menu_to_site ON (menu.menu_id = menu_to_site.menu_id)
END @IF
WHERE 1 = 1
@IF isset(:menu_id)
THEN
AND menu.menu_id IN (:menu_id)
END @IF
@IF isset(:site_id)
THEN
AND menu_to_site.site_id = :site_id
END @IF
-- limit
@IF isset(:limit)
THEN
@SQL_LIMIT(:start, :limit)
END @IF;
SELECT count(*) FROM (
@SQL_COUNT(menu.menu_id, menu) -- this takes previous query removes limit and replaces select columns with parameter menu_id
) as count;
END
-- get menu
CREATE PROCEDURE getMenuItems(
-- variables
IN language_id INT,
IN menu_id INT,
IN site_id INT,
IN post_id INT,
IN slug CHAR,
-- pagination
IN start INT,
IN limit INT,
-- return array of menus for menus query
OUT fetch_all,
-- return menus count for count query
-- OUT fetch_one
)
BEGIN
SELECT menu_item.url, menu_item.sort_order, menu_item.parent_id, menu_item.type, menu_item.item_id, td.*, menu_item.menu_item_id as menu_item_id, menu_item.menu_item_id as array_key
FROM menu_item
-- INNER JOIN menu_to_site c2s ON (menu.menu_id = c2s.menu_id AND c2s.site_id = :site_id)
LEFT JOIN menu_item_content td ON (menu_item.menu_item_id = td.menu_item_id AND td.language_id = :language_id)
WHERE 1 = 1
@IF isset(:menu_id)
THEN
AND menu_item.menu_id = :menu_id
END @IF
@IF isset(:slug)
THEN
AND menu_item.menu_id = (SELECT menu_id FROM menu WHERE slug = :slug LIMIT 1)
END @IF
ORDER BY menu_item.parent_id, menu_item.sort_order, menu_item.menu_id
@IF isset(:limit)
THEN
@SQL_LIMIT(:start, :limit)
END @IF
;
END-- get all menus
CREATE PROCEDURE getMenuAllLanguages(
-- variables
IN user_group_id INT,
IN site_id INT,
IN menu_id INT,
IN search CHAR,
-- pagination
IN start INT,
IN limit INT,
-- return array of categories for categories query
OUT fetch_all,
-- return categories count for count query
OUT fetch_one,
)
BEGIN
SELECT *,
(
SELECT
json_agg(json_build_object('language_id',language_id,'name',name,'slug',slug,'content',content))
FROM menu_item_content as cd
WHERE
cd.menu_item_id = categories.menu_item_id GROUP BY cd.menu_item_id
) as languages
FROM menu_item AS categories
WHERE 1 = 1
@IF isset(:search)
THEN
AND td.name LIKE :search
END @IF
@IF isset(:menu_id)
THEN
AND categories.menu_id = :menu_id
END @IF
ORDER BY categories.parent_id, categories.sort_order, categories.menu_item_id
@IF isset(:limit)
THEN
@SQL_LIMIT(:start, :limit)
END @IF
;
SELECT count(*) FROM (
@SQL_COUNT(categories.menu_item_id, menu) -- this takes previous query removes limit and replaces select columns with parameter product_id
) as count;
END
-- Edit menu
CREATE PROCEDURE editMenuItem(
IN menu_item ARRAY,
IN menu_item_id INT,
OUT insert_id
)
BEGIN
-- allow only table fields and set defaults for missing values
:menu_item_content_data = @FILTER(:menu_item.menu_item_content, menu_item_content)
@EACH(:menu_item_content_data)
INSERT INTO menu_item_content
( @KEYS(:each), menu_item_id)
VALUES ( :each, :menu_item_id)
ON CONFLICT ("menu_item_id","language_id") DO UPDATE SET @LIST(:each);
-- allow only table fields and set defaults for missing values
@FILTER(:menu_item, menu_item)
UPDATE menu_item
SET @LIST(:menu_item)
WHERE menu_item_id = :menu_item_id;
END
-- Add new menu
CREATE PROCEDURE addMenuItem(
IN menu_item ARRAY,
OUT fetch_one,
OUT insert_id
)
BEGIN
-- allow only table fields and set defaults for missing values
:menu_item_content_data = @FILTER(:menu_item.menu_item_content, menu_item_content)
:menu_item_data = @FILTER(:menu_item, menu_item)
INSERT INTO menu_item
( @KEYS(:menu_item_data) )
VALUES ( :menu_item_data ) RETURNING menu_item_id;
@EACH(:menu_item_content_data)
INSERT INTO menu_item_content
( menu_item_id, @KEYS(:each) )
VALUES ( @result.menu_item, :each );
END
-- Reorder menu items
CREATE PROCEDURE updateMenuItems(
IN menu_items ARRAY,
OUT insert_id
)
BEGIN
:menu_item_data = @FILTER(:menu_items, menu_item)
@EACH(:menu_item_data)
UPDATE menu_item
SET @LIST(:each)
WHERE menu_item_id = :each.menu_item_id;
END
-- Delete menu item recursive
CREATE PROCEDURE deleteMenuItemRecursive(
IN menu_item_id ARRAY,
OUT affected_rows,
OUT affected_rows,
)
BEGIN
-- delete menu_item_content
DELETE FROM menu_item_content WHERE menu_item_id IN (
WITH RECURSIVE tree AS (
SELECT menu_item_id,
parent_id
FROM menu_item
WHERE menu_item_id IN (:menu_item_id)
UNION ALL
SELECT p.menu_item_id,
p.parent_id
FROM menu_item p
JOIN tree t ON t.menu_item_id = p.parent_id
)
SELECT menu_item_id FROM tree);
-- delete menu_item
DELETE FROM menu_item WHERE menu_item_id IN (
WITH RECURSIVE tree AS (
SELECT menu_item_id,
parent_id
FROM menu_item
WHERE menu_item_id IN (:menu_item_id)
UNION ALL
SELECT p.menu_item_id,
p.parent_id
FROM menu_item p
JOIN tree t ON t.menu_item_id = p.parent_id
)
SELECT menu_item_id FROM tree);
END
-- Delete menu item
CREATE PROCEDURE deleteMenuItem(
IN menu_item_id ARRAY,
OUT affected_rows,
OUT affected_rows
)
BEGIN
-- non CTE for older mysql versions, does not delete grand child menu items
DELETE FROM menu_item_content WHERE menu_item_id IN (SELECT menu_item_id FROM menu_item WHERE parent_id = :menu_item_id);
DELETE FROM menu_item_content WHERE menu_item_id IN (:menu_item_id);
DELETE FROM menu_item WHERE menu_item_id IN (SELECT menu_item_id FROM (SELECT menu_item_id FROM menu_item) as mi WHERE parent_id = :menu_item_id);
DELETE FROM menu_item WHERE menu_item_id IN (:menu_item_id);
END