@oktis-works/database 0.4.29 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/schema/schema.sql +117 -1
- package/package.json +1 -1
package/dist/schema/schema.sql
CHANGED
|
@@ -580,7 +580,7 @@ CREATE TABLE IF NOT EXISTS field_groups (
|
|
|
580
580
|
title VARCHAR(255) NOT NULL,
|
|
581
581
|
key VARCHAR(255) NOT NULL UNIQUE,
|
|
582
582
|
location_rules JSONB NOT NULL DEFAULT '[]'::jsonb,
|
|
583
|
-
position VARCHAR(20) NOT NULL DEFAULT 'normal' CHECK (position IN ('normal', 'side', '
|
|
583
|
+
position VARCHAR(20) NOT NULL DEFAULT 'normal' CHECK (position IN ('normal', 'side', 'after_title')),
|
|
584
584
|
display_style VARCHAR(20) NOT NULL DEFAULT 'standard' CHECK (display_style IN ('standard', 'seamless', 'grouped')),
|
|
585
585
|
active BOOLEAN NOT NULL DEFAULT true,
|
|
586
586
|
metadata JSONB NOT NULL DEFAULT '{}'::jsonb,
|
|
@@ -937,3 +937,119 @@ BEGIN
|
|
|
937
937
|
CREATE POLICY tenant_isolation_webhooks ON webhooks USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid);
|
|
938
938
|
END IF;
|
|
939
939
|
END $$;
|
|
940
|
+
|
|
941
|
+
-- ============================================================
|
|
942
|
+
-- Delta de dados (idempotente, best-effort): valor neutro para a
|
|
943
|
+
-- posição do field group em bancos já existentes. Falhas viram
|
|
944
|
+
-- WARNING e nunca bloqueiam o bootstrap.
|
|
945
|
+
-- ============================================================
|
|
946
|
+
DO $$
|
|
947
|
+
BEGIN
|
|
948
|
+
ALTER TABLE field_groups DROP CONSTRAINT IF EXISTS field_groups_position_check;
|
|
949
|
+
UPDATE field_groups
|
|
950
|
+
SET position = 'after_title'
|
|
951
|
+
WHERE position NOT IN ('normal', 'side', 'after_title');
|
|
952
|
+
ALTER TABLE field_groups
|
|
953
|
+
ADD CONSTRAINT field_groups_position_check
|
|
954
|
+
CHECK (position IN ('normal', 'side', 'after_title'));
|
|
955
|
+
EXCEPTION WHEN OTHERS THEN
|
|
956
|
+
RAISE WARNING 'okcms: delta de position do field_groups nao aplicado: %', SQLERRM;
|
|
957
|
+
END $$;
|
|
958
|
+
|
|
959
|
+
-- ============================================================
|
|
960
|
+
-- Delta de dados (idempotente, best-effort): normaliza a chave de
|
|
961
|
+
-- layout dos registros existentes para `fc_layout` (chaves legadas
|
|
962
|
+
-- terminadas em `_fc_layout`), em content.body, content.data,
|
|
963
|
+
-- content_versions.body e field_values.value. Varre tenant a
|
|
964
|
+
-- tenant porque content tem FORCE ROW LEVEL SECURITY.
|
|
965
|
+
-- ============================================================
|
|
966
|
+
DO $$
|
|
967
|
+
DECLARE
|
|
968
|
+
cur_tenant record;
|
|
969
|
+
BEGIN
|
|
970
|
+
CREATE OR REPLACE FUNCTION okcms_normalize_layout_key(p jsonb) RETURNS jsonb
|
|
971
|
+
LANGUAGE plpgsql IMMUTABLE AS $fn$
|
|
972
|
+
BEGIN
|
|
973
|
+
IF p IS NULL THEN
|
|
974
|
+
RETURN NULL;
|
|
975
|
+
ELSIF jsonb_typeof(p) = 'object' THEN
|
|
976
|
+
RETURN (
|
|
977
|
+
SELECT COALESCE(jsonb_object_agg(
|
|
978
|
+
CASE WHEN key ~ '_fc_layout$' THEN 'fc_layout' ELSE key END,
|
|
979
|
+
okcms_normalize_layout_key(value)
|
|
980
|
+
), '{}'::jsonb)
|
|
981
|
+
FROM jsonb_each(p)
|
|
982
|
+
);
|
|
983
|
+
ELSIF jsonb_typeof(p) = 'array' THEN
|
|
984
|
+
RETURN (
|
|
985
|
+
SELECT COALESCE(jsonb_agg(okcms_normalize_layout_key(value)), '[]'::jsonb)
|
|
986
|
+
FROM jsonb_array_elements(p)
|
|
987
|
+
);
|
|
988
|
+
END IF;
|
|
989
|
+
RETURN p;
|
|
990
|
+
END;
|
|
991
|
+
$fn$;
|
|
992
|
+
|
|
993
|
+
UPDATE field_values
|
|
994
|
+
SET value = okcms_normalize_layout_key(value)
|
|
995
|
+
WHERE strpos(value::text, '_fc_layout') > 0;
|
|
996
|
+
|
|
997
|
+
UPDATE content_versions
|
|
998
|
+
SET body = okcms_normalize_layout_key(body)
|
|
999
|
+
WHERE strpos(body::text, '_fc_layout') > 0;
|
|
1000
|
+
|
|
1001
|
+
FOR cur_tenant IN SELECT id FROM tenants LOOP
|
|
1002
|
+
PERFORM set_config('app.current_tenant_id', cur_tenant.id::text, true);
|
|
1003
|
+
UPDATE content
|
|
1004
|
+
SET body = okcms_normalize_layout_key(body),
|
|
1005
|
+
data = okcms_normalize_layout_key(data)
|
|
1006
|
+
WHERE tenant_id = cur_tenant.id
|
|
1007
|
+
AND (strpos(body::text, '_fc_layout') > 0
|
|
1008
|
+
OR strpos(data::text, '_fc_layout') > 0);
|
|
1009
|
+
END LOOP;
|
|
1010
|
+
|
|
1011
|
+
DROP FUNCTION okcms_normalize_layout_key(jsonb);
|
|
1012
|
+
EXCEPTION WHEN OTHERS THEN
|
|
1013
|
+
RAISE WARNING 'okcms: normalizacao da chave de layout nao aplicada: %', SQLERRM;
|
|
1014
|
+
END $$;
|
|
1015
|
+
|
|
1016
|
+
-- ============================================================
|
|
1017
|
+
-- Delta de dados (idempotente, best-effort): field_values não pode
|
|
1018
|
+
-- ficar órfã. 1) remove values cujo campo definição não existe mais;
|
|
1019
|
+
-- 2) remove values de termos apagados (taxonomy_terms é delete duro e
|
|
1020
|
+
-- entity_id é polimórfico, sem FK); 3) garante a FK ON DELETE CASCADE
|
|
1021
|
+
-- do campo (tabelas criadas por versões antigas do schema podem não
|
|
1022
|
+
-- tê-la — sem ela, apagar grupos/campos deixa values para trás).
|
|
1023
|
+
-- content é soft-delete (TRASHED), então nunca há órfãs do lado de
|
|
1024
|
+
-- content. Falhas viram WARNING e não bloqueiam o bootstrap.
|
|
1025
|
+
-- ============================================================
|
|
1026
|
+
DO $$
|
|
1027
|
+
BEGIN
|
|
1028
|
+
DELETE FROM field_values fv
|
|
1029
|
+
WHERE NOT EXISTS (SELECT 1 FROM field_definitions fd WHERE fd.id = fv.field_definition_id);
|
|
1030
|
+
|
|
1031
|
+
DELETE FROM field_values fv
|
|
1032
|
+
WHERE fv.entity_type = 'taxonomy_term'
|
|
1033
|
+
AND NOT EXISTS (SELECT 1 FROM taxonomy_terms t WHERE t.id = fv.entity_id);
|
|
1034
|
+
EXCEPTION WHEN OTHERS THEN
|
|
1035
|
+
RAISE WARNING 'okcms: limpeza de field_values orfaos nao aplicada: %', SQLERRM;
|
|
1036
|
+
END $$;
|
|
1037
|
+
|
|
1038
|
+
DO $$
|
|
1039
|
+
BEGIN
|
|
1040
|
+
IF NOT EXISTS (
|
|
1041
|
+
SELECT 1 FROM pg_constraint
|
|
1042
|
+
WHERE conrelid = 'field_values'::regclass
|
|
1043
|
+
AND contype = 'f'
|
|
1044
|
+
AND conkey = ARRAY[(
|
|
1045
|
+
SELECT attnum FROM pg_attribute
|
|
1046
|
+
WHERE attrelid = 'field_values'::regclass AND attname = 'field_definition_id'
|
|
1047
|
+
)]::smallint[]
|
|
1048
|
+
) THEN
|
|
1049
|
+
ALTER TABLE field_values
|
|
1050
|
+
ADD CONSTRAINT field_values_field_definition_id_fkey
|
|
1051
|
+
FOREIGN KEY (field_definition_id) REFERENCES field_definitions(id) ON DELETE CASCADE;
|
|
1052
|
+
END IF;
|
|
1053
|
+
EXCEPTION WHEN OTHERS THEN
|
|
1054
|
+
RAISE WARNING 'okcms: FK de cascade de field_values nao aplicada: %', SQLERRM;
|
|
1055
|
+
END $$;
|