@opengis/fastify-table 2.6.1 → 2.6.2

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.
Files changed (91) hide show
  1. package/README.md +86 -86
  2. package/dist/functions.js +20 -20
  3. package/dist/helper.d.ts +1 -20
  4. package/dist/helper.d.ts.map +1 -1
  5. package/dist/module/core/cls/constraint_action.json +9 -9
  6. package/dist/module/core/cls/constraint_matchtype.json +5 -5
  7. package/dist/module/core/cls/constraint_type_full.json +17 -17
  8. package/dist/module/core/cls/core.user_type.json +13 -13
  9. package/dist/module/core/pt/schemaItem.pt.hbs +17 -17
  10. package/dist/module/core/select/core.user_mentioned.sql +1 -1
  11. package/dist/script/adduser +14 -14
  12. package/dist/script/dump.js +48 -48
  13. package/dist/script/dump.ts +216 -216
  14. package/dist/script/migrate.ts +23 -23
  15. package/dist/server/helpers/core/badge.js +1 -1
  16. package/dist/server/helpers/list/descriptionList.js +8 -8
  17. package/dist/server/helpers/list/tableList.js +4 -4
  18. package/dist/server/helpers/list/utils/button.js +1 -1
  19. package/dist/server/helpers/list/utils/buttonDel.js +3 -3
  20. package/dist/server/helpers/list/utils/buttonEdit.js +3 -3
  21. package/dist/server/helpers/utils/button.js +1 -1
  22. package/dist/server/helpers/utils/buttonAdd.js +15 -15
  23. package/dist/server/helpers/utils/buttonDel.js +11 -11
  24. package/dist/server/helpers/utils/buttonEdit.js +3 -3
  25. package/dist/server/migrations/0.sql +99 -99
  26. package/dist/server/migrations/1_users.sql +145 -145
  27. package/dist/server/migrations/cls.sql +105 -105
  28. package/dist/server/migrations/context.sql +136 -136
  29. package/dist/server/migrations/dictionaries.sql +78 -78
  30. package/dist/server/migrations/oauth.sql +79 -79
  31. package/dist/server/migrations/properties.sql +115 -115
  32. package/dist/server/migrations/roles.sql +201 -200
  33. package/dist/server/migrations/template.sql +43 -43
  34. package/dist/server/plugins/access/funcs/getUserPermissions.js +7 -7
  35. package/dist/server/plugins/auth/funcs/authorizeUser.js +4 -4
  36. package/dist/server/plugins/auth/funcs/getQuery.js +20 -20
  37. package/dist/server/plugins/crud/funcs/dataUpdate.js +7 -7
  38. package/dist/server/plugins/crud/funcs/getAccess.js +14 -14
  39. package/dist/server/plugins/crud/funcs/utils/getInsertQuery.js +6 -6
  40. package/dist/server/plugins/crud/funcs/utils/logChanges.js +18 -18
  41. package/dist/server/plugins/grpc/utils/convertp.proto +143 -143
  42. package/dist/server/plugins/grpc/utils/htmlTemplate.js +10 -10
  43. package/dist/server/plugins/grpc/utils/office2pdf.proto +13 -13
  44. package/dist/server/plugins/metric/loggerSystem.js +1 -1
  45. package/dist/server/plugins/pg/funcs/autoIndex.js +5 -5
  46. package/dist/server/plugins/pg/funcs/getMeta.js +15 -15
  47. package/dist/server/plugins/pg/funcs/init.js +36 -36
  48. package/dist/server/plugins/sqlite/funcs/init.js +22 -22
  49. package/dist/server/plugins/table/funcs/getData.js +13 -13
  50. package/dist/server/plugins/table/funcs/getFilterSQL/util/getCustomQuery.js +1 -1
  51. package/dist/server/plugins/table/funcs/getSelect.js +1 -1
  52. package/dist/server/plugins/table/funcs/gisIRColumn.js +3 -3
  53. package/dist/server/plugins/usercls/index.js +2 -2
  54. package/dist/server/routes/access/controllers/access.group.js +6 -6
  55. package/dist/server/routes/access/controllers/access.group.post.js +3 -3
  56. package/dist/server/routes/access/controllers/access.interface.js +14 -14
  57. package/dist/server/routes/access/controllers/access.user.js +6 -6
  58. package/dist/server/routes/auth/controllers/2factor/providers/totp.js +5 -5
  59. package/dist/server/routes/auth/controllers/2factor/qrcode.js +1 -1
  60. package/dist/server/routes/auth/controllers/2factor/recovery.js +1 -1
  61. package/dist/server/routes/auth/controllers/2factor/verify.js +1 -1
  62. package/dist/server/routes/auth/controllers/core/getUserInfo.js +33 -33
  63. package/dist/server/routes/auth/controllers/core/passwordRecovery.js +1 -1
  64. package/dist/server/routes/auth/controllers/core/registration.js +2 -2
  65. package/dist/server/routes/auth/controllers/page/login2faTemplate.js +1 -1
  66. package/dist/server/routes/crud/functions/deleteTableRelation.js +9 -9
  67. package/dist/server/routes/crud/functions/updateTableRelation.js +9 -9
  68. package/dist/server/routes/file/controllers/resizeAll.js +7 -7
  69. package/dist/server/routes/grpc/controllers/file2geojson.js +13 -13
  70. package/dist/server/routes/menu/controllers/getMenu.js +9 -9
  71. package/dist/server/routes/notifications/controllers/readNotifications.js +4 -4
  72. package/dist/server/routes/notifications/controllers/userNotifications.js +3 -3
  73. package/dist/server/routes/table/controllers/card.js +1 -1
  74. package/dist/server/routes/table/controllers/filter.js +6 -6
  75. package/dist/server/routes/table/controllers/form.js +1 -1
  76. package/dist/server/routes/table/controllers/getFormByTable.js +6 -6
  77. package/dist/server/routes/table/controllers/suggest.js +10 -10
  78. package/dist/server/routes/table/controllers/tableData.js +2 -2
  79. package/dist/server/routes/table/controllers/tableInfo.js +10 -10
  80. package/dist/server/routes/table/functions/getData.js +13 -13
  81. package/dist/server/routes/widget/controllers/widget.get.js +33 -33
  82. package/dist/server/routes/widget/controllers/widget.set.js +4 -4
  83. package/dist/server/routes/widget/services/widget.entity.get.js +33 -33
  84. package/dist/server/routes/widget/services/widget.entity.set.js +4 -4
  85. package/dist/server/templates/page/2factor-recovery.html +101 -101
  86. package/dist/server/templates/page/2factor.html +140 -140
  87. package/dist/server/templates/page/login.html +90 -90
  88. package/dist/server/templates/pt/recovery-codes-email-template.hbs +12 -12
  89. package/dist/server/templates/pt/recovery-password-email-template.html +20 -20
  90. package/package.json +99 -99
  91. package/dist/module/core/select/core.user_mentioned.json +0 -3
@@ -1,79 +1,79 @@
1
- create schema if not exists admin;
2
-
3
- DO $$
4
- BEGIN
5
- IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'dictionary_source_enum') THEN
6
- CREATE TYPE admin.dictionary_source_enum AS ENUM (
7
- 'git',
8
- 'custom'
9
- );
10
- END IF;
11
- END $$;
12
-
13
- CREATE TABLE if not exists admin.dictionaries (
14
- id text PRIMARY KEY DEFAULT public.next_id(),
15
-
16
- code VARCHAR(100) NOT NULL UNIQUE,
17
- name VARCHAR(255) NOT NULL,
18
- module VARCHAR(50),
19
- description TEXT,
20
-
21
- source admin.dictionary_source_enum NOT NULL DEFAULT 'custom',
22
- editable BOOLEAN NOT NULL DEFAULT true,
23
- system BOOLEAN NOT NULL DEFAULT false,
24
-
25
- hash text,
26
-
27
- created_at TIMESTAMP NOT NULL DEFAULT now(),
28
- updated_at TIMESTAMP NOT NULL DEFAULT now()
29
- );
30
-
31
- CREATE TABLE if not exists admin.dictionary_items (
32
- id text PRIMARY KEY DEFAULT public.next_id(),
33
-
34
- dictionary_id text NOT NULL REFERENCES admin.dictionaries(id) ON DELETE CASCADE,
35
-
36
- code VARCHAR(100) NOT NULL,
37
- name VARCHAR(255) NOT NULL,
38
- description TEXT,
39
-
40
- color VARCHAR(20),
41
- icon VARCHAR(50),
42
-
43
- sort_order INTEGER NOT NULL DEFAULT 0,
44
-
45
- parent_id text,
46
-
47
- active BOOLEAN NOT NULL DEFAULT true,
48
- system BOOLEAN NOT NULL DEFAULT false,
49
-
50
- metadata JSONB NOT NULL DEFAULT '{}'::jsonb,
51
-
52
- created_at TIMESTAMP NOT NULL DEFAULT now(),
53
- updated_at TIMESTAMP NOT NULL DEFAULT now(),
54
-
55
- CONSTRAINT admin_dictionary_items_dictionary_code_unique
56
- UNIQUE (code, dictionary_id)
57
- );
58
-
59
- ALTER TABLE admin.dictionary_items
60
- DROP CONSTRAINT if exists admin_dictionary_items_dictionary_code_unique cascade;
61
-
62
- ALTER TABLE admin.dictionary_items
63
- ADD CONSTRAINT admin_dictionary_items_dictionary_code_unique UNIQUE (code, dictionary_id);
64
-
65
- ALTER TABLE admin.dictionary_items
66
- DROP CONSTRAINT if exists admin_dictionary_items_parent_same_dictionary_fk;
67
-
68
- ALTER TABLE admin.dictionary_items
69
- ADD CONSTRAINT admin_dictionary_items_parent_same_dictionary_fk FOREIGN KEY (parent_id, dictionary_id)
70
- REFERENCES admin.dictionary_items (code, dictionary_id)
71
- ON DELETE SET NULL;
72
-
73
- CREATE INDEX if not exists admin_dictionary_items_dictionary_id_idx ON admin.dictionary_items (dictionary_id);
74
-
75
- CREATE INDEX if not exists admin_dictionary_items_parent_id_idx ON admin.dictionary_items (parent_id);
76
-
77
- CREATE INDEX if not exists admin_dictionary_items_sort_order_idx ON admin.dictionary_items (dictionary_id, sort_order);
78
-
1
+ create schema if not exists admin;
2
+
3
+ DO $$
4
+ BEGIN
5
+ IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'dictionary_source_enum') THEN
6
+ CREATE TYPE admin.dictionary_source_enum AS ENUM (
7
+ 'git',
8
+ 'custom'
9
+ );
10
+ END IF;
11
+ END $$;
12
+
13
+ CREATE TABLE if not exists admin.dictionaries (
14
+ id text PRIMARY KEY DEFAULT public.next_id(),
15
+
16
+ code VARCHAR(100) NOT NULL UNIQUE,
17
+ name VARCHAR(255) NOT NULL,
18
+ module VARCHAR(50),
19
+ description TEXT,
20
+
21
+ source admin.dictionary_source_enum NOT NULL DEFAULT 'custom',
22
+ editable BOOLEAN NOT NULL DEFAULT true,
23
+ system BOOLEAN NOT NULL DEFAULT false,
24
+
25
+ hash text,
26
+
27
+ created_at TIMESTAMP NOT NULL DEFAULT now(),
28
+ updated_at TIMESTAMP NOT NULL DEFAULT now()
29
+ );
30
+
31
+ CREATE TABLE if not exists admin.dictionary_items (
32
+ id text PRIMARY KEY DEFAULT public.next_id(),
33
+
34
+ dictionary_id text NOT NULL REFERENCES admin.dictionaries(id) ON DELETE CASCADE,
35
+
36
+ code VARCHAR(100) NOT NULL,
37
+ name VARCHAR(255) NOT NULL,
38
+ description TEXT,
39
+
40
+ color VARCHAR(20),
41
+ icon VARCHAR(50),
42
+
43
+ sort_order INTEGER NOT NULL DEFAULT 0,
44
+
45
+ parent_id text,
46
+
47
+ active BOOLEAN NOT NULL DEFAULT true,
48
+ system BOOLEAN NOT NULL DEFAULT false,
49
+
50
+ metadata JSONB NOT NULL DEFAULT '{}'::jsonb,
51
+
52
+ created_at TIMESTAMP NOT NULL DEFAULT now(),
53
+ updated_at TIMESTAMP NOT NULL DEFAULT now(),
54
+
55
+ CONSTRAINT admin_dictionary_items_dictionary_code_unique
56
+ UNIQUE (code, dictionary_id)
57
+ );
58
+
59
+ ALTER TABLE admin.dictionary_items
60
+ DROP CONSTRAINT if exists admin_dictionary_items_dictionary_code_unique cascade;
61
+
62
+ ALTER TABLE admin.dictionary_items
63
+ ADD CONSTRAINT admin_dictionary_items_dictionary_code_unique UNIQUE (code, dictionary_id);
64
+
65
+ ALTER TABLE admin.dictionary_items
66
+ DROP CONSTRAINT if exists admin_dictionary_items_parent_same_dictionary_fk;
67
+
68
+ ALTER TABLE admin.dictionary_items
69
+ ADD CONSTRAINT admin_dictionary_items_parent_same_dictionary_fk FOREIGN KEY (parent_id, dictionary_id)
70
+ REFERENCES admin.dictionary_items (code, dictionary_id)
71
+ ON DELETE SET NULL;
72
+
73
+ CREATE INDEX if not exists admin_dictionary_items_dictionary_id_idx ON admin.dictionary_items (dictionary_id);
74
+
75
+ CREATE INDEX if not exists admin_dictionary_items_parent_id_idx ON admin.dictionary_items (parent_id);
76
+
77
+ CREATE INDEX if not exists admin_dictionary_items_sort_order_idx ON admin.dictionary_items (dictionary_id, sort_order);
78
+
79
79
  CREATE INDEX if not exists admin_dictionary_items_active_idx ON admin.dictionary_items (dictionary_id, active);
@@ -1,80 +1,80 @@
1
- CREATE schema if not exists oauth;
2
-
3
- CREATE TABLE if not exists oauth.clients (
4
- client_id text PRIMARY KEY DEFAULT next_id(), -- ID клієнта (публічний ідентифікатор)
5
- client_secret_hash text, -- Хеш секрету (NULL для public-клієнтів)
6
- name text NOT NULL, -- Назва застосунку
7
- type text NOT NULL CHECK (type IN ('public','confidential')),
8
- token_endpoint_auth_method text NOT NULL CHECK (token_endpoint_auth_method IN ('client_secret_basic','client_secret_post','private_key_jwt','none')),
9
- owner_user_id text, -- Власник/адміністратор клієнта (посилання на users.id or other id)
10
-
11
- redirect_uris text[], -- Дозволені redirect_uri
12
- grant_types text[] CHECK (case when grant_types is not null then grant_types <@ ARRAY['authorization_code','refresh_token','client_credentials','device_code']::text[] else true end),
13
- require_pkce boolean NOT NULL DEFAULT true,
14
- scopes text[],
15
- allowed_cors_origins text[],
16
- jwks jsonb, -- Вбудований JWK Set (опційно)
17
-
18
- created_at timestamptz NOT NULL DEFAULT now(),
19
- updated_at timestamptz NOT NULL DEFAULT now(),
20
- allowed_ips text[]
21
- );
22
-
23
- CREATE TABLE if not exists oauth.tokens (
24
- id text PRIMARY KEY DEFAULT next_id(),
25
- token_type text NOT NULL CHECK (token_type IN ('access','refresh')),
26
- token_hash text NOT NULL UNIQUE, -- Argon2/bcrypt/SCrypt (хеш у застосунку)
27
- token_hint text, -- останні 6-8 символів для діагностики (необов’язково)
28
- jti text UNIQUE, -- JWT ID, якщо токен — JWT
29
- client_id text NOT NULL REFERENCES oauth.clients(client_id) ON DELETE CASCADE,
30
- user_id text, -- NULL для client_credentials
31
- issuer text, -- iss
32
- scopes text[],
33
- claims jsonb, -- додаткові клейми
34
- issued_at timestamptz NOT NULL DEFAULT now(),
35
- expires_at timestamptz NOT NULL,
36
- revoked_at timestamptz,
37
- revocation_reason text,
38
- ip inet -- IP видачі/використання (опційно)
39
- );
40
-
41
- COMMENT ON SCHEMA oauth IS 'Schema for OAuth2 / OpenID Connect clients and tokens';
42
-
43
- -- Comments for oauth.clients
44
- COMMENT ON TABLE oauth.clients IS 'OAuth 2.0 clients (applications) that can request tokens';
45
-
46
- COMMENT ON COLUMN oauth.clients.client_id IS 'Client identifier (public ID, generated by next_id())';
47
- COMMENT ON COLUMN oauth.clients.client_secret_hash IS 'Hashed client secret (NULL for public clients)';
48
- COMMENT ON COLUMN oauth.clients.name IS 'Name of the application/client';
49
- COMMENT ON COLUMN oauth.clients.type IS 'Client type: public or confidential';
50
- COMMENT ON COLUMN oauth.clients.token_endpoint_auth_method IS 'Authentication method at token endpoint (client_secret_basic, client_secret_post, private_key_jwt, none)';
51
- COMMENT ON COLUMN oauth.clients.owner_user_id IS 'Owner/administrator of the client (reference to users.id or external id)';
52
- COMMENT ON COLUMN oauth.clients.redirect_uris IS 'Allowed redirect URIs';
53
- COMMENT ON COLUMN oauth.clients.grant_types IS 'Allowed grant types (authorization_code, refresh_token, client_credentials, device_code)';
54
- COMMENT ON COLUMN oauth.clients.require_pkce IS 'Whether PKCE is required (default true)';
55
- COMMENT ON COLUMN oauth.clients.scopes IS 'Allowed OAuth2 scopes';
56
- COMMENT ON COLUMN oauth.clients.allowed_cors_origins IS 'Allowed CORS origins for browser-based apps';
57
- COMMENT ON COLUMN oauth.clients.jwks IS 'Embedded JSON Web Key Set (optional)';
58
- COMMENT ON COLUMN oauth.clients.created_at IS 'Creation timestamp';
59
- COMMENT ON COLUMN oauth.clients.updated_at IS 'Last update timestamp';
60
-
61
- -- Comments for oauth.tokens
62
- COMMENT ON TABLE oauth.tokens IS 'Issued OAuth 2.0 tokens (access or refresh)';
63
-
64
- COMMENT ON COLUMN oauth.tokens.id IS 'Internal token ID (generated by next_id())';
65
- COMMENT ON COLUMN oauth.tokens.token_type IS 'Type of token: access or refresh';
66
- COMMENT ON COLUMN oauth.tokens.token_hash IS 'Secure hash of the token (Argon2/bcrypt/SCrypt)';
67
- COMMENT ON COLUMN oauth.tokens.token_hint IS 'Optional hint (last 6–8 characters of token) for diagnostics';
68
- COMMENT ON COLUMN oauth.tokens.jti IS 'JWT ID if token is a JWT (unique)';
69
- COMMENT ON COLUMN oauth.tokens.client_id IS 'Reference to oauth.clients (issuing client)';
70
- COMMENT ON COLUMN oauth.tokens.user_id IS 'User ID if bound to user (NULL for client_credentials flow)';
71
- COMMENT ON COLUMN oauth.tokens.issuer IS 'Token issuer (iss claim)';
72
- COMMENT ON COLUMN oauth.tokens.scopes IS 'Granted OAuth2 scopes for this token';
73
- COMMENT ON COLUMN oauth.tokens.claims IS 'Additional claims (JSONB)';
74
- COMMENT ON COLUMN oauth.tokens.issued_at IS 'Timestamp when issued';
75
- COMMENT ON COLUMN oauth.tokens.expires_at IS 'Timestamp when token expires';
76
- COMMENT ON COLUMN oauth.tokens.revoked_at IS 'Timestamp when revoked';
77
- COMMENT ON COLUMN oauth.tokens.revocation_reason IS 'Reason for revocation (if any)';
78
- COMMENT ON COLUMN oauth.tokens.ip IS 'IP address of issuance/usage (optional)';
79
-
1
+ CREATE schema if not exists oauth;
2
+
3
+ CREATE TABLE if not exists oauth.clients (
4
+ client_id text PRIMARY KEY DEFAULT next_id(), -- ID клієнта (публічний ідентифікатор)
5
+ client_secret_hash text, -- Хеш секрету (NULL для public-клієнтів)
6
+ name text NOT NULL, -- Назва застосунку
7
+ type text NOT NULL CHECK (type IN ('public','confidential')),
8
+ token_endpoint_auth_method text NOT NULL CHECK (token_endpoint_auth_method IN ('client_secret_basic','client_secret_post','private_key_jwt','none')),
9
+ owner_user_id text, -- Власник/адміністратор клієнта (посилання на users.id or other id)
10
+
11
+ redirect_uris text[], -- Дозволені redirect_uri
12
+ grant_types text[] CHECK (case when grant_types is not null then grant_types <@ ARRAY['authorization_code','refresh_token','client_credentials','device_code']::text[] else true end),
13
+ require_pkce boolean NOT NULL DEFAULT true,
14
+ scopes text[],
15
+ allowed_cors_origins text[],
16
+ jwks jsonb, -- Вбудований JWK Set (опційно)
17
+
18
+ created_at timestamptz NOT NULL DEFAULT now(),
19
+ updated_at timestamptz NOT NULL DEFAULT now(),
20
+ allowed_ips text[]
21
+ );
22
+
23
+ CREATE TABLE if not exists oauth.tokens (
24
+ id text PRIMARY KEY DEFAULT next_id(),
25
+ token_type text NOT NULL CHECK (token_type IN ('access','refresh')),
26
+ token_hash text NOT NULL UNIQUE, -- Argon2/bcrypt/SCrypt (хеш у застосунку)
27
+ token_hint text, -- останні 6-8 символів для діагностики (необов’язково)
28
+ jti text UNIQUE, -- JWT ID, якщо токен — JWT
29
+ client_id text NOT NULL REFERENCES oauth.clients(client_id) ON DELETE CASCADE,
30
+ user_id text, -- NULL для client_credentials
31
+ issuer text, -- iss
32
+ scopes text[],
33
+ claims jsonb, -- додаткові клейми
34
+ issued_at timestamptz NOT NULL DEFAULT now(),
35
+ expires_at timestamptz NOT NULL,
36
+ revoked_at timestamptz,
37
+ revocation_reason text,
38
+ ip inet -- IP видачі/використання (опційно)
39
+ );
40
+
41
+ COMMENT ON SCHEMA oauth IS 'Schema for OAuth2 / OpenID Connect clients and tokens';
42
+
43
+ -- Comments for oauth.clients
44
+ COMMENT ON TABLE oauth.clients IS 'OAuth 2.0 clients (applications) that can request tokens';
45
+
46
+ COMMENT ON COLUMN oauth.clients.client_id IS 'Client identifier (public ID, generated by next_id())';
47
+ COMMENT ON COLUMN oauth.clients.client_secret_hash IS 'Hashed client secret (NULL for public clients)';
48
+ COMMENT ON COLUMN oauth.clients.name IS 'Name of the application/client';
49
+ COMMENT ON COLUMN oauth.clients.type IS 'Client type: public or confidential';
50
+ COMMENT ON COLUMN oauth.clients.token_endpoint_auth_method IS 'Authentication method at token endpoint (client_secret_basic, client_secret_post, private_key_jwt, none)';
51
+ COMMENT ON COLUMN oauth.clients.owner_user_id IS 'Owner/administrator of the client (reference to users.id or external id)';
52
+ COMMENT ON COLUMN oauth.clients.redirect_uris IS 'Allowed redirect URIs';
53
+ COMMENT ON COLUMN oauth.clients.grant_types IS 'Allowed grant types (authorization_code, refresh_token, client_credentials, device_code)';
54
+ COMMENT ON COLUMN oauth.clients.require_pkce IS 'Whether PKCE is required (default true)';
55
+ COMMENT ON COLUMN oauth.clients.scopes IS 'Allowed OAuth2 scopes';
56
+ COMMENT ON COLUMN oauth.clients.allowed_cors_origins IS 'Allowed CORS origins for browser-based apps';
57
+ COMMENT ON COLUMN oauth.clients.jwks IS 'Embedded JSON Web Key Set (optional)';
58
+ COMMENT ON COLUMN oauth.clients.created_at IS 'Creation timestamp';
59
+ COMMENT ON COLUMN oauth.clients.updated_at IS 'Last update timestamp';
60
+
61
+ -- Comments for oauth.tokens
62
+ COMMENT ON TABLE oauth.tokens IS 'Issued OAuth 2.0 tokens (access or refresh)';
63
+
64
+ COMMENT ON COLUMN oauth.tokens.id IS 'Internal token ID (generated by next_id())';
65
+ COMMENT ON COLUMN oauth.tokens.token_type IS 'Type of token: access or refresh';
66
+ COMMENT ON COLUMN oauth.tokens.token_hash IS 'Secure hash of the token (Argon2/bcrypt/SCrypt)';
67
+ COMMENT ON COLUMN oauth.tokens.token_hint IS 'Optional hint (last 6–8 characters of token) for diagnostics';
68
+ COMMENT ON COLUMN oauth.tokens.jti IS 'JWT ID if token is a JWT (unique)';
69
+ COMMENT ON COLUMN oauth.tokens.client_id IS 'Reference to oauth.clients (issuing client)';
70
+ COMMENT ON COLUMN oauth.tokens.user_id IS 'User ID if bound to user (NULL for client_credentials flow)';
71
+ COMMENT ON COLUMN oauth.tokens.issuer IS 'Token issuer (iss claim)';
72
+ COMMENT ON COLUMN oauth.tokens.scopes IS 'Granted OAuth2 scopes for this token';
73
+ COMMENT ON COLUMN oauth.tokens.claims IS 'Additional claims (JSONB)';
74
+ COMMENT ON COLUMN oauth.tokens.issued_at IS 'Timestamp when issued';
75
+ COMMENT ON COLUMN oauth.tokens.expires_at IS 'Timestamp when token expires';
76
+ COMMENT ON COLUMN oauth.tokens.revoked_at IS 'Timestamp when revoked';
77
+ COMMENT ON COLUMN oauth.tokens.revocation_reason IS 'Reason for revocation (if any)';
78
+ COMMENT ON COLUMN oauth.tokens.ip IS 'IP address of issuance/usage (optional)';
79
+
80
80
  alter table oauth.clients add column if not exists allowed_ips text[];
@@ -1,115 +1,115 @@
1
- create schema if not exists admin;
2
- create schema if not exists crm;
3
-
4
- CREATE EXTENSION if not exists pg_trgm SCHEMA public VERSION "1.5";
5
-
6
- -- drop old
7
- DROP TABLE IF EXISTS admin.user_properties;
8
- DROP TABLE IF EXISTS admin.table_properties;
9
- -- DROP SCHEMA IF EXISTS setting cascade;
10
-
11
- CREATE TABLE IF NOT EXISTS admin.properties();
12
- ALTER TABLE admin.properties DROP CONSTRAINT IF EXISTS admin_properties_property_id_pkey;
13
- ALTER TABLE admin.properties ADD COLUMN IF NOT EXISTS property_id text NOT NULL DEFAULT next_id();
14
-
15
- ALTER TABLE admin.properties ADD COLUMN IF NOT EXISTS property_entity text;
16
- COMMENT ON COLUMN admin.properties.property_entity IS 'Сутність';
17
- ALTER TABLE admin.properties ADD COLUMN IF NOT EXISTS property_key text;
18
- COMMENT ON COLUMN admin.properties.property_key IS 'Ключ';
19
- ALTER TABLE admin.properties ADD COLUMN IF NOT EXISTS property_text text;
20
- COMMENT ON COLUMN admin.properties.property_text IS 'Текстове значення налаштування';
21
- ALTER TABLE admin.properties ADD COLUMN IF NOT EXISTS property_int integer;
22
- COMMENT ON COLUMN admin.properties.property_int IS 'Цілочислове значения';
23
- ALTER TABLE admin.properties ADD COLUMN IF NOT EXISTS property_json json;
24
- COMMENT ON COLUMN admin.properties.property_json IS 'Значення налаштування';
25
- ALTER TABLE admin.properties ADD COLUMN IF NOT EXISTS level text;
26
- COMMENT ON COLUMN admin.properties.level IS 'Рівень (user/system)';
27
- ALTER TABLE admin.properties ADD COLUMN IF NOT EXISTS object_id text;
28
- COMMENT ON COLUMN admin.properties.object_id IS 'ID Об''єкту';
29
-
30
- ALTER TABLE admin.properties ADD COLUMN IF NOT EXISTS uid text NOT NULL DEFAULT '1'::text;
31
- ALTER TABLE admin.properties ADD COLUMN IF NOT EXISTS editor_id text;
32
- ALTER TABLE admin.properties ADD COLUMN IF NOT EXISTS editor_date timestamp without time zone;
33
- ALTER TABLE admin.properties ADD COLUMN IF NOT EXISTS cdate timestamp without time zone DEFAULT now();
34
- ALTER TABLE admin.properties ADD COLUMN IF NOT EXISTS files json;
35
-
36
- ALTER TABLE admin.properties ADD CONSTRAINT admin_properties_property_id_pkey PRIMARY KEY(property_id);
37
-
38
- COMMENT ON TABLE admin.properties IS 'Налаштування';
39
-
40
- CREATE TABLE IF NOT EXISTS admin.custom_column();
41
- ALTER TABLE admin.custom_column DROP CONSTRAINT IF EXISTS admin_custom_column_column_id_pkey cascade;
42
- alter table admin.custom_column drop constraint if exists admin_custom_column_name_entity_uid_unique;
43
-
44
- ALTER TABLE admin.custom_column ADD COLUMN IF NOT EXISTS column_id text;
45
- ALTER TABLE admin.custom_column ALTER COLUMN column_id SET NOT NULL;
46
- ALTER TABLE admin.custom_column ALTER COLUMN column_id SET DEFAULT next_id();
47
-
48
- ALTER TABLE admin.custom_column ADD COLUMN IF NOT EXISTS name text;
49
- ALTER TABLE admin.custom_column ADD COLUMN IF NOT EXISTS entity text;
50
- ALTER TABLE admin.custom_column ADD COLUMN IF NOT EXISTS title text;
51
- ALTER TABLE admin.custom_column ADD COLUMN IF NOT EXISTS format text;
52
- ALTER TABLE admin.custom_column ADD COLUMN IF NOT EXISTS data text;
53
- ALTER TABLE admin.custom_column ADD COLUMN IF NOT EXISTS filter boolean;
54
- ALTER TABLE admin.custom_column ADD COLUMN IF NOT EXISTS _table boolean;
55
-
56
- ALTER TABLE admin.custom_column ADD COLUMN IF NOT EXISTS uid text NOT NULL DEFAULT '1'::text;
57
- ALTER TABLE admin.custom_column ADD COLUMN IF NOT EXISTS editor_id text;
58
- ALTER TABLE admin.custom_column ADD COLUMN IF NOT EXISTS editor_date timestamp without time zone;
59
- ALTER TABLE admin.custom_column ADD COLUMN IF NOT EXISTS cdate timestamp without time zone DEFAULT now();
60
- ALTER TABLE admin.custom_column ADD COLUMN IF NOT EXISTS files json;
61
-
62
- ALTER TABLE admin.custom_column ADD CONSTRAINT admin_custom_column_column_id_pkey PRIMARY KEY(column_id);
63
- ALTER TABLE admin.custom_column ADD CONSTRAINT admin_custom_column_name_entity_uid_unique UNIQUE (name,entity,uid);
64
-
65
- COMMENT ON TABLE admin.custom_column IS 'Налаштування таблиць користувача';
66
- COMMENT ON COLUMN admin.custom_column.name IS 'Ключ';
67
- COMMENT ON COLUMN admin.custom_column.entity IS 'Таблиця';
68
- COMMENT ON COLUMN admin.custom_column.title IS 'Підпис';
69
- COMMENT ON COLUMN admin.custom_column.format IS 'Формат';
70
- COMMENT ON COLUMN admin.custom_column.data IS 'Класифікатор';
71
- COMMENT ON COLUMN admin.custom_column.filter IS 'Виводити у фільтрах';
72
- COMMENT ON COLUMN admin.custom_column._table IS 'Відображати у таблиці';
73
-
74
- CREATE TABLE if not exists crm.extra_data();
75
- ALTER TABLE crm.extra_data DROP CONSTRAINT IF EXISTS crm_extra_data_pkey;
76
- ALTER TABLE crm.extra_data DROP CONSTRAINT IF EXISTS crm_extra_data_property_id_fkey;
77
- ALTER TABLE crm.extra_data DROP CONSTRAINT IF EXISTS crm_extra_data_property_key_object_id_entity_unique;
78
-
79
- ALTER TABLE crm.extra_data ADD COLUMN IF NOT EXISTS extra_data_id text;
80
- ALTER TABLE crm.extra_data ALTER COLUMN extra_data_id SET NOT NULL;
81
- ALTER TABLE crm.extra_data ALTER COLUMN extra_data_id SET DEFAULT next_id();
82
-
83
- ALTER TABLE crm.extra_data ADD COLUMN IF NOT EXISTS property_id text;
84
- ALTER TABLE crm.extra_data ADD COLUMN IF NOT EXISTS property_key text;
85
- ALTER TABLE crm.extra_data ADD COLUMN IF NOT EXISTS property_entity text;
86
- ALTER TABLE crm.extra_data ADD COLUMN IF NOT EXISTS object_id text;
87
- ALTER TABLE crm.extra_data ADD COLUMN IF NOT EXISTS value_text text;
88
- ALTER TABLE crm.extra_data ADD COLUMN IF NOT EXISTS value_date timestamp without time zone;
89
- ALTER TABLE crm.extra_data ADD COLUMN IF NOT EXISTS value_array text[];
90
- ALTER TABLE crm.extra_data ADD COLUMN IF NOT EXISTS uid text;
91
- ALTER TABLE crm.extra_data ALTER COLUMN uid SET DEFAULT '1'::text;
92
- ALTER TABLE crm.extra_data ADD COLUMN IF NOT EXISTS cdate timestamp without time zone;
93
- ALTER TABLE crm.extra_data ALTER COLUMN cdate SET DEFAULT date_trunc('seconds'::text, now());
94
- ALTER TABLE crm.extra_data ADD COLUMN IF NOT EXISTS editor_id text;
95
- ALTER TABLE crm.extra_data ADD COLUMN IF NOT EXISTS editor_date timestamp without time zone;
96
- ALTER TABLE crm.extra_data ADD COLUMN IF NOT EXISTS files json;
97
-
98
- ALTER TABLE crm.extra_data ADD CONSTRAINT crm_extra_data_pkey PRIMARY KEY (extra_data_id);
99
- -- delete from crm.extra_data where property_id not in (select column_id from admin.custom_column);
100
- ALTER TABLE crm.extra_data ADD CONSTRAINT crm_extra_data_property_id_fkey FOREIGN KEY (property_id) REFERENCES admin.custom_column (column_id) MATCH SIMPLE;
101
- ALTER TABLE crm.extra_data ADD CONSTRAINT crm_extra_data_property_key_object_id_entity_unique UNIQUE (property_key, object_id, property_entity);
102
-
103
- COMMENT ON TABLE crm.extra_data IS 'Значення користувацьких полів';
104
- COMMENT ON COLUMN crm.extra_data.property_id IS 'ID поля користувача';
105
- COMMENT ON COLUMN crm.extra_data.property_key IS 'Назва колонки';
106
- COMMENT ON COLUMN crm.extra_data.property_entity IS 'Таблиця';
107
- COMMENT ON COLUMN crm.extra_data.object_id IS 'Ідентифікатор об''єкту';
108
- COMMENT ON COLUMN crm.extra_data.value_text IS 'Значення';
109
- COMMENT ON COLUMN crm.extra_data.value_date IS 'Дата';
110
- COMMENT ON COLUMN crm.extra_data.uid IS 'ID користувача';
111
-
112
- CREATE INDEX IF NOT EXISTS crm_extra_data_cdate_btree_idx ON crm.extra_data USING btree (cdate);
113
- CREATE INDEX IF NOT EXISTS crm_extra_data_property_id_btree_idx ON crm.extra_data USING btree (property_id COLLATE pg_catalog."default");
114
- CREATE INDEX IF NOT EXISTS crm_extra_data_property_entity_btree_idx ON crm.extra_data USING btree (property_entity COLLATE pg_catalog."default");
115
- CREATE INDEX IF NOT EXISTS crm_extra_data_object_id_btree_idx ON crm.extra_data USING btree (object_id COLLATE pg_catalog."default");
1
+ create schema if not exists admin;
2
+ create schema if not exists crm;
3
+
4
+ CREATE EXTENSION if not exists pg_trgm SCHEMA public VERSION "1.5";
5
+
6
+ -- drop old
7
+ DROP TABLE IF EXISTS admin.user_properties;
8
+ DROP TABLE IF EXISTS admin.table_properties;
9
+ -- DROP SCHEMA IF EXISTS setting cascade;
10
+
11
+ CREATE TABLE IF NOT EXISTS admin.properties();
12
+ ALTER TABLE admin.properties DROP CONSTRAINT IF EXISTS admin_properties_property_id_pkey;
13
+ ALTER TABLE admin.properties ADD COLUMN IF NOT EXISTS property_id text NOT NULL DEFAULT next_id();
14
+
15
+ ALTER TABLE admin.properties ADD COLUMN IF NOT EXISTS property_entity text;
16
+ COMMENT ON COLUMN admin.properties.property_entity IS 'Сутність';
17
+ ALTER TABLE admin.properties ADD COLUMN IF NOT EXISTS property_key text;
18
+ COMMENT ON COLUMN admin.properties.property_key IS 'Ключ';
19
+ ALTER TABLE admin.properties ADD COLUMN IF NOT EXISTS property_text text;
20
+ COMMENT ON COLUMN admin.properties.property_text IS 'Текстове значення налаштування';
21
+ ALTER TABLE admin.properties ADD COLUMN IF NOT EXISTS property_int integer;
22
+ COMMENT ON COLUMN admin.properties.property_int IS 'Цілочислове значения';
23
+ ALTER TABLE admin.properties ADD COLUMN IF NOT EXISTS property_json json;
24
+ COMMENT ON COLUMN admin.properties.property_json IS 'Значення налаштування';
25
+ ALTER TABLE admin.properties ADD COLUMN IF NOT EXISTS level text;
26
+ COMMENT ON COLUMN admin.properties.level IS 'Рівень (user/system)';
27
+ ALTER TABLE admin.properties ADD COLUMN IF NOT EXISTS object_id text;
28
+ COMMENT ON COLUMN admin.properties.object_id IS 'ID Об''єкту';
29
+
30
+ ALTER TABLE admin.properties ADD COLUMN IF NOT EXISTS uid text NOT NULL DEFAULT '1'::text;
31
+ ALTER TABLE admin.properties ADD COLUMN IF NOT EXISTS editor_id text;
32
+ ALTER TABLE admin.properties ADD COLUMN IF NOT EXISTS editor_date timestamp without time zone;
33
+ ALTER TABLE admin.properties ADD COLUMN IF NOT EXISTS cdate timestamp without time zone DEFAULT now();
34
+ ALTER TABLE admin.properties ADD COLUMN IF NOT EXISTS files json;
35
+
36
+ ALTER TABLE admin.properties ADD CONSTRAINT admin_properties_property_id_pkey PRIMARY KEY(property_id);
37
+
38
+ COMMENT ON TABLE admin.properties IS 'Налаштування';
39
+
40
+ CREATE TABLE IF NOT EXISTS admin.custom_column();
41
+ ALTER TABLE admin.custom_column DROP CONSTRAINT IF EXISTS admin_custom_column_column_id_pkey cascade;
42
+ alter table admin.custom_column drop constraint if exists admin_custom_column_name_entity_uid_unique;
43
+
44
+ ALTER TABLE admin.custom_column ADD COLUMN IF NOT EXISTS column_id text;
45
+ ALTER TABLE admin.custom_column ALTER COLUMN column_id SET NOT NULL;
46
+ ALTER TABLE admin.custom_column ALTER COLUMN column_id SET DEFAULT next_id();
47
+
48
+ ALTER TABLE admin.custom_column ADD COLUMN IF NOT EXISTS name text;
49
+ ALTER TABLE admin.custom_column ADD COLUMN IF NOT EXISTS entity text;
50
+ ALTER TABLE admin.custom_column ADD COLUMN IF NOT EXISTS title text;
51
+ ALTER TABLE admin.custom_column ADD COLUMN IF NOT EXISTS format text;
52
+ ALTER TABLE admin.custom_column ADD COLUMN IF NOT EXISTS data text;
53
+ ALTER TABLE admin.custom_column ADD COLUMN IF NOT EXISTS filter boolean;
54
+ ALTER TABLE admin.custom_column ADD COLUMN IF NOT EXISTS _table boolean;
55
+
56
+ ALTER TABLE admin.custom_column ADD COLUMN IF NOT EXISTS uid text NOT NULL DEFAULT '1'::text;
57
+ ALTER TABLE admin.custom_column ADD COLUMN IF NOT EXISTS editor_id text;
58
+ ALTER TABLE admin.custom_column ADD COLUMN IF NOT EXISTS editor_date timestamp without time zone;
59
+ ALTER TABLE admin.custom_column ADD COLUMN IF NOT EXISTS cdate timestamp without time zone DEFAULT now();
60
+ ALTER TABLE admin.custom_column ADD COLUMN IF NOT EXISTS files json;
61
+
62
+ ALTER TABLE admin.custom_column ADD CONSTRAINT admin_custom_column_column_id_pkey PRIMARY KEY(column_id);
63
+ ALTER TABLE admin.custom_column ADD CONSTRAINT admin_custom_column_name_entity_uid_unique UNIQUE (name,entity,uid);
64
+
65
+ COMMENT ON TABLE admin.custom_column IS 'Налаштування таблиць користувача';
66
+ COMMENT ON COLUMN admin.custom_column.name IS 'Ключ';
67
+ COMMENT ON COLUMN admin.custom_column.entity IS 'Таблиця';
68
+ COMMENT ON COLUMN admin.custom_column.title IS 'Підпис';
69
+ COMMENT ON COLUMN admin.custom_column.format IS 'Формат';
70
+ COMMENT ON COLUMN admin.custom_column.data IS 'Класифікатор';
71
+ COMMENT ON COLUMN admin.custom_column.filter IS 'Виводити у фільтрах';
72
+ COMMENT ON COLUMN admin.custom_column._table IS 'Відображати у таблиці';
73
+
74
+ CREATE TABLE if not exists crm.extra_data();
75
+ ALTER TABLE crm.extra_data DROP CONSTRAINT IF EXISTS crm_extra_data_pkey;
76
+ ALTER TABLE crm.extra_data DROP CONSTRAINT IF EXISTS crm_extra_data_property_id_fkey;
77
+ ALTER TABLE crm.extra_data DROP CONSTRAINT IF EXISTS crm_extra_data_property_key_object_id_entity_unique;
78
+
79
+ ALTER TABLE crm.extra_data ADD COLUMN IF NOT EXISTS extra_data_id text;
80
+ ALTER TABLE crm.extra_data ALTER COLUMN extra_data_id SET NOT NULL;
81
+ ALTER TABLE crm.extra_data ALTER COLUMN extra_data_id SET DEFAULT next_id();
82
+
83
+ ALTER TABLE crm.extra_data ADD COLUMN IF NOT EXISTS property_id text;
84
+ ALTER TABLE crm.extra_data ADD COLUMN IF NOT EXISTS property_key text;
85
+ ALTER TABLE crm.extra_data ADD COLUMN IF NOT EXISTS property_entity text;
86
+ ALTER TABLE crm.extra_data ADD COLUMN IF NOT EXISTS object_id text;
87
+ ALTER TABLE crm.extra_data ADD COLUMN IF NOT EXISTS value_text text;
88
+ ALTER TABLE crm.extra_data ADD COLUMN IF NOT EXISTS value_date timestamp without time zone;
89
+ ALTER TABLE crm.extra_data ADD COLUMN IF NOT EXISTS value_array text[];
90
+ ALTER TABLE crm.extra_data ADD COLUMN IF NOT EXISTS uid text;
91
+ ALTER TABLE crm.extra_data ALTER COLUMN uid SET DEFAULT '1'::text;
92
+ ALTER TABLE crm.extra_data ADD COLUMN IF NOT EXISTS cdate timestamp without time zone;
93
+ ALTER TABLE crm.extra_data ALTER COLUMN cdate SET DEFAULT date_trunc('seconds'::text, now());
94
+ ALTER TABLE crm.extra_data ADD COLUMN IF NOT EXISTS editor_id text;
95
+ ALTER TABLE crm.extra_data ADD COLUMN IF NOT EXISTS editor_date timestamp without time zone;
96
+ ALTER TABLE crm.extra_data ADD COLUMN IF NOT EXISTS files json;
97
+
98
+ ALTER TABLE crm.extra_data ADD CONSTRAINT crm_extra_data_pkey PRIMARY KEY (extra_data_id);
99
+ -- delete from crm.extra_data where property_id not in (select column_id from admin.custom_column);
100
+ ALTER TABLE crm.extra_data ADD CONSTRAINT crm_extra_data_property_id_fkey FOREIGN KEY (property_id) REFERENCES admin.custom_column (column_id) MATCH SIMPLE;
101
+ ALTER TABLE crm.extra_data ADD CONSTRAINT crm_extra_data_property_key_object_id_entity_unique UNIQUE (property_key, object_id, property_entity);
102
+
103
+ COMMENT ON TABLE crm.extra_data IS 'Значення користувацьких полів';
104
+ COMMENT ON COLUMN crm.extra_data.property_id IS 'ID поля користувача';
105
+ COMMENT ON COLUMN crm.extra_data.property_key IS 'Назва колонки';
106
+ COMMENT ON COLUMN crm.extra_data.property_entity IS 'Таблиця';
107
+ COMMENT ON COLUMN crm.extra_data.object_id IS 'Ідентифікатор об''єкту';
108
+ COMMENT ON COLUMN crm.extra_data.value_text IS 'Значення';
109
+ COMMENT ON COLUMN crm.extra_data.value_date IS 'Дата';
110
+ COMMENT ON COLUMN crm.extra_data.uid IS 'ID користувача';
111
+
112
+ CREATE INDEX IF NOT EXISTS crm_extra_data_cdate_btree_idx ON crm.extra_data USING btree (cdate);
113
+ CREATE INDEX IF NOT EXISTS crm_extra_data_property_id_btree_idx ON crm.extra_data USING btree (property_id COLLATE pg_catalog."default");
114
+ CREATE INDEX IF NOT EXISTS crm_extra_data_property_entity_btree_idx ON crm.extra_data USING btree (property_entity COLLATE pg_catalog."default");
115
+ CREATE INDEX IF NOT EXISTS crm_extra_data_object_id_btree_idx ON crm.extra_data USING btree (object_id COLLATE pg_catalog."default");