@oktis-works/database 0.4.30 → 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.
@@ -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', 'acf_after_title')),
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 $$;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oktis-works/database",
3
- "version": "0.4.30",
3
+ "version": "0.5.0",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",