@opengis/fastify-table 1.1.45 → 1.1.47

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 (129) hide show
  1. package/Changelog.md +1 -1
  2. package/README.md +26 -26
  3. package/config.js +10 -10
  4. package/cron/controllers/cronApi.js +22 -22
  5. package/cron/controllers/utils/cronList.js +1 -1
  6. package/cron/index.js +10 -10
  7. package/crud/controllers/deleteCrud.js +9 -4
  8. package/crud/controllers/insert.js +9 -6
  9. package/crud/controllers/update.js +13 -10
  10. package/crud/controllers/utils/checkXSS.js +3 -2
  11. package/crud/controllers/utils/xssInjection.js +72 -72
  12. package/crud/funcs/getAccess.js +14 -13
  13. package/crud/funcs/getToken.js +27 -27
  14. package/crud/funcs/isFileExists.js +13 -13
  15. package/crud/funcs/setToken.js +53 -53
  16. package/docs/.vitepress/abbr.mjs +26 -0
  17. package/docs/.vitepress/config.mjs +127 -0
  18. package/docs/.vitepress/navigation.mjs +82 -0
  19. package/docs/.vitepress/theme/Layout.vue +17 -0
  20. package/docs/.vitepress/theme/components/NavigationLinks.vue +102 -0
  21. package/docs/.vitepress/theme/components/Panzoom.vue +169 -0
  22. package/docs/.vitepress/theme/index.mjs +15 -0
  23. package/docs/.vitepress/theme/style.scss +163 -0
  24. package/docs/abbr.json +4 -0
  25. package/docs/api/cron/cronApi.md +56 -0
  26. package/docs/api/crud/deleteCrud.md +58 -0
  27. package/docs/api/crud/insert.md +82 -0
  28. package/docs/api/crud/update.md +85 -0
  29. package/docs/api/index.md +47 -0
  30. package/docs/api/notification/testEmail.md +91 -0
  31. package/docs/api/table/card.md +73 -0
  32. package/docs/api/table/data.md +134 -0
  33. package/docs/api/table/export.md +60 -0
  34. package/docs/api/table/filter.md +104 -0
  35. package/docs/api/table/form.md +126 -0
  36. package/docs/api/table/search.md +123 -0
  37. package/docs/api/table/suggest.md +156 -0
  38. package/docs/api/table/table.md +107 -0
  39. package/docs/api/user/user.cls.id.md +77 -0
  40. package/docs/api/user/user.cls.md +49 -0
  41. package/docs/api/user/user.cls.post.md +62 -0
  42. package/docs/api/user/user.info.md +37 -0
  43. package/docs/api/utils/logger.file.md +61 -0
  44. package/docs/api/utils/next.id.md +34 -0
  45. package/docs/api/utils/properties.add.md +127 -0
  46. package/docs/api/utils/properties.get.md +73 -0
  47. package/docs/api/utils/status.monitor.md +36 -0
  48. package/docs/api/widget/widget.del.md +76 -0
  49. package/docs/api/widget/widget.get.md +233 -0
  50. package/docs/api/widget/widget.set.md +88 -0
  51. package/docs/db/admin.md +947 -0
  52. package/docs/db/crm.md +564 -0
  53. package/docs/db/index.md +9 -0
  54. package/docs/db/log.md +204 -0
  55. package/docs/hook/card/afterCard.md +20 -0
  56. package/docs/hook/card/preCard.md +25 -0
  57. package/docs/hook/data/afterData.md +26 -0
  58. package/docs/hook/data/preData.md +26 -0
  59. package/docs/hook/deleteCrud/afterDelete.md +21 -0
  60. package/docs/hook/deleteCrud/preDelete.md +26 -0
  61. package/docs/hook/form/afterForm.md +19 -0
  62. package/docs/hook/form/preForm.md +26 -0
  63. package/docs/hook/getTemplate/afterTemplate.md +24 -0
  64. package/docs/hook/getTemplate/preTemplate.md +29 -0
  65. package/docs/hook/index.md +45 -0
  66. package/docs/hook/insert/afterInsert.md +41 -0
  67. package/docs/hook/insert/preInsert.md +25 -0
  68. package/docs/hook/table/afterTable.md +20 -0
  69. package/docs/hook/table/preTable.md +25 -0
  70. package/docs/hook/update/afterUpdate.md +41 -0
  71. package/docs/hook/update/preUpdate.md +25 -0
  72. package/docs/index.md +42 -0
  73. package/docs/public/fastify-dark.svg +4 -0
  74. package/docs/public/fastify.svg +1 -0
  75. package/docs/public/logo-short-dark.svg +12 -0
  76. package/docs/public/logo-short.svg +11 -0
  77. package/docs/public/logo.svg +19 -0
  78. package/docs/readme/index.md +121 -0
  79. package/docs/templates/card.md +83 -0
  80. package/docs/templates/cls.md +29 -0
  81. package/docs/templates/filters.md +91 -0
  82. package/docs/templates/forms.md +139 -0
  83. package/docs/templates/image.png +0 -0
  84. package/docs/templates/index.md +28 -0
  85. package/docs/templates/select.md +90 -0
  86. package/docs/templates/table.md +162 -0
  87. package/docs/utils/cron/addCron.md +29 -0
  88. package/docs/utils/crud/dataInsert.md +52 -0
  89. package/docs/utils/crud/dataUpdate.md +53 -0
  90. package/docs/utils/crud/getOpt.md +34 -0
  91. package/docs/utils/crud/isFileExists.md +38 -0
  92. package/docs/utils/crud/setOpt.md +38 -0
  93. package/docs/utils/hook/addHook.md +74 -0
  94. package/docs/utils/hook/applyHook.md +64 -0
  95. package/docs/utils/index.md +48 -0
  96. package/docs/utils/notification/addNotification.md +28 -0
  97. package/docs/utils/notification/notification.md +41 -0
  98. package/docs/utils/pg/autoIndex.md +22 -0
  99. package/docs/utils/pg/getMeta.md +59 -0
  100. package/docs/utils/pg/getPG.md +34 -0
  101. package/docs/utils/pg/init.md +30 -0
  102. package/docs/utils/pg/pg.md +70 -0
  103. package/docs/utils/redis/getRedis.md +36 -0
  104. package/docs/utils/redis/rclient.md +74 -0
  105. package/docs/utils/table/getForm.md +69 -0
  106. package/docs/utils/table/getMeta.md +56 -0
  107. package/docs/utils/table/getSelect.md +39 -0
  108. package/docs/utils/table/getSelectMeta.md +47 -0
  109. package/docs/utils/table/getTable.md +78 -0
  110. package/logger/createFileStream.js +1 -1
  111. package/package.json +15 -3
  112. package/redis/funcs/getRedis.js +23 -23
  113. package/server/migrations/log.sql +80 -80
  114. package/table/controllers/data.js +31 -23
  115. package/table/controllers/table.js +26 -22
  116. package/table/index.js +3 -50
  117. package/table/schema.js +54 -0
  118. package/test/api/crud.xss.test.js +38 -22
  119. package/test/config.example +18 -18
  120. package/test/funcs/pg.test.js +34 -34
  121. package/test/funcs/redis.test.js +19 -19
  122. package/test/templates/cls/test.json +9 -9
  123. package/test/templates/form/cp_building.form.json +32 -32
  124. package/test/templates/select/account_id.json +3 -3
  125. package/test/templates/select/storage.data.json +2 -2
  126. package/test/templates/table/gis.dataset.table.json +20 -20
  127. package/util/controllers/next.id.js +4 -4
  128. package/util/controllers/properties.get.js +19 -19
  129. package/util/index.js +23 -23
@@ -0,0 +1,90 @@
1
+ # Select
2
+
3
+ Зберігаються файли у форматі .sql. Принцип виклику відрізняється від класифікаторів - запит значень йде у базу даних до конкретної таблиці.
4
+ В папці `server/templates/select`
5
+
6
+ Складається з 1 або 2-х файлів
7
+
8
+ 1. `select.sql` - SQL запит
9
+ 2. `select.json` - Налаштування select
10
+
11
+ ```sql
12
+ select conformity from data_barlessness.entrance_group
13
+ ```
14
+
15
+ ## Налаштування + Оптимізація
16
+
17
+ ```json
18
+ {
19
+ "db": "geo_atu", // інша база
20
+
21
+ // для оптимізації
22
+ "only": "sql", // sql, redis
23
+ "searchColumn": "name_nominative,katottg", // колонки пошуку
24
+ "minLengthSql": 4, //
25
+ "limit": 20, // максимальний ліміт пошуку
26
+ "count": 0, // загальна кількість число, не буде робити запит кількості
27
+ "minLength": 4 // мінімальна кількість символів пошуку
28
+ }
29
+ ```
30
+
31
+ ::: details Приклад `edrato.atu.katottg`
32
+
33
+ ```sql
34
+ select atu_id,
35
+ coalesce(edrato.atu_full_name(atu_id),'')||coalesce(' #'||katottg,''),
36
+ name_nominative,
37
+ katottg
38
+ from edrato.atu a
39
+ where version=(select max(version) from edrato.atu where atu_id=a.atu_id)
40
+ ```
41
+
42
+ ---
43
+
44
+ ```json
45
+ {
46
+ "only": "sql",
47
+ "searchColumn1": "name_nominative,katottg",
48
+ "limit": 2,
49
+ "minLength": 4
50
+ }
51
+ ```
52
+
53
+ :::
54
+
55
+ ::: warning
56
+
57
+ 1. Якщо запит працює більше 100ms - це баг і треба робити оптимізацію.
58
+ 2. searchColumn - пошук має бути по нативній колонці щоб індекс спрацював. Порядок searchColumn = `searchColumn` || колонка `search` || колонка `text`
59
+ 3. не намагатись загаянти статистику в пошук
60
+ :::
61
+
62
+ ## Використання API
63
+
64
+ Викликається через команду [suggest](../api/fastify-table/table/suggest.md) `/api/suggest/{name}` на конкретному порталі.
65
+
66
+ Повертаються значення **id** та **text**. Приклад:
67
+
68
+ ```json
69
+ {
70
+ "limit": 50,
71
+ "count": 2,
72
+ "mode": "array",
73
+ "time": 2,
74
+ "data": [
75
+ {
76
+ "id": "1",
77
+ "text": "Комунальна"
78
+ },
79
+ {
80
+ "id": "2",
81
+ "text": "Державна"
82
+ },
83
+ {
84
+ "id": "3",
85
+ "text": "Приватна"
86
+ }
87
+ ]
88
+ }
89
+
90
+ ```
@@ -0,0 +1,162 @@
1
+ ---
2
+ title: Таблиця
3
+ ---
4
+
5
+ # Таблиця
6
+
7
+ Використовується для виводу інформації з бази даних. В папці `server/templates/table`
8
+
9
+ ::: info
10
+ Рекомендовано створювати окремі таблиці для виводу інформації до адміністративної, публічної частини та для виводу об'єктів на карту
11
+ :::
12
+
13
+ ## Основні параметри **таблиці**
14
+
15
+ Таблиця формується у форматі `.json` та має бути розташована у відповідній папці `templates/table/{file}.json`
16
+
17
+ Нижче наведено приклад файлу таблиці інтерфейсу:
18
+
19
+ ``` json
20
+ {
21
+ "table": "billing.service", // Таблиця БД, з якої беруться дані
22
+ "query": "service_name is not null", // Фільтрування даних
23
+ "sqlColumns": "*", // Віддає у об'єкті rows усі колонки із таблиці, використовується коли треба кастомну компоненту вивести як колонку в таблиці, щоб у цю компоненту передати усі колонки таблиці, і їх не прописувати в масиві columns
24
+
25
+ "order": "cdate", // колонка для сортування
26
+
27
+ "key": "service_id", // ID таблиці БД
28
+
29
+ "limit": 5, // Обмеження по кількості об'єктів
30
+
31
+ "form": "web.customize_menu.form", // Форма
32
+
33
+ "columns": [ // Колонки таблиці та їхні налаштування
34
+ {
35
+ "ua": "Назва", // Назва для відображення користувачам
36
+ "meta": "title", // Тип стандартизованого поля
37
+ "format": "text", // Тип даних
38
+ "name": "service_name", // Колонка таблиці Бд
39
+ "data": "service_name_cls", // Назва класифікатора/селекта
40
+ },
41
+ {
42
+ "ua": "Контактні дані", // Заголовок колонки
43
+ "name": "email", // Колонка таблиці із цього шаблону
44
+ "format": "custom", // Форматування даних
45
+ "componentName": "admin-users-contacts" //Кастомна компонента vue для колонки
46
+ }
47
+ ],
48
+
49
+ "filterList": [ // Фільтри таблиці
50
+ {
51
+ "ua": "Назва", // Підпис фільтру
52
+ "name": "service_name", // Колонка таблиці
53
+ "type": "Check" // Тип фільтру
54
+ }
55
+ ],
56
+
57
+ "filterInline": [ // Фільтри таблиці
58
+ {
59
+ "ua": "Назва", // Підпис фільтру
60
+ "name": "service_name", // Колонка таблиці
61
+ "type": "Check" // Тип фільтру
62
+ }
63
+ ],
64
+
65
+ "filterState": [ // Фільтри статусу
66
+ {
67
+ "sql": "status=1", // sql
68
+ "name": "archive", // назва ключ або номер 1
69
+ "ua": "Підпис", // підпис
70
+ }
71
+ ],
72
+
73
+ "filterCustom": [ // Фільтри користувача
74
+ {
75
+ "sql": "status=1", // Підпис фільтру
76
+ "name": "archive", // ключ або номер 1
77
+ "ua": "Підпис", // підпис
78
+ }
79
+ ],
80
+
81
+ "meta":{
82
+ "cls": {
83
+ "service_id": "billing.service_id",
84
+ "service_status": "billing.service_status"
85
+ }, // присвоєння колонкам класифікаторів для виведення даних (альтернатива columns)
86
+ "bbox": "geom", // колонка для пошуку по BBOX
87
+ "search":"name,address", // колоноки, за якими відбувається пошук
88
+ "title":"service_name", // колонка статус
89
+ "key":"service_key", // колонка ключ / code
90
+ "status":"service_status", // колонка статус
91
+ "type":"service_type", // колонка тип
92
+ "address":"address", // колонки адрес
93
+ "image":"image" // аватар, іконка і т.д.
94
+ }
95
+ }
96
+ ```
97
+
98
+ - [Детально про фільтри](./filters.md)
99
+
100
+ ## Format
101
+
102
+ | Формат | Опис |
103
+ | ------------------------ | --------------- |
104
+ | text | по замовчюванню |
105
+ | select | з класифікатора |
106
+ | tags | у вигляді label |
107
+ | badge | label з кольором |
108
+ | age | час |
109
+ | html | свій шаблон |
110
+ | number | число |
111
+ | boolean | switcher |
112
+
113
+ ::: details Основні параметри **колонки**
114
+
115
+ - `ua` - Назва українською для відображення користувачам
116
+ - `format` - тип даних. Допустимі значення: `text`, `select`, `age`, `date`, `html`, `boolean`, `geom`, badge, tags, `number`
117
+ - `meta` - стандартизоване поле. Допустимі значення: `key`, `title`, `status`, `description`, `type`, category, `image`, `priority`, `teaser`, `start`, `end`, `deadline`, `address`
118
+ - `hidden` - приховати колонку зі стандартного вигляду. Допустимі значення: `true`, `false`
119
+ - `editable` - швидке редагування значення поля. Допустимі значення: `true`, `false`
120
+ - `data` - довідник, з якого беруться значення даних по колонці. Вказується назва селекту чи класифікатора.
121
+
122
+ :::
123
+
124
+ :::details Поле meta (стандартизоване поле)
125
+
126
+ Застосовуються для поля **meta**. Полегшують вивід даних в компоненти за даними від API.
127
+
128
+ Також може визначатися автоматично - за назвами колонок.
129
+
130
+ Перелік полів meta:
131
+
132
+ 1. `key` - Код / номер
133
+ 2. `title` - Назва
134
+ 3. `status` - Статус
135
+ 4. `description` - Повний опис
136
+ 5. `type` - Тип
137
+ 6. `category` - Категорія/Розділ
138
+ 7. `image` - Зображення
139
+ 8. `priority` - Пріоритет
140
+ 9. `teaser` - Короткий опис
141
+ 10. `start` - Дата початку
142
+ 11. `end` - Дата закінчення
143
+ 12. `deadline` - Дедлайн (очікувана дата завершення)
144
+ 13. `address` - Адреса
145
+ 14. `bbox` - BBOX
146
+ 15. `cls` - Форматування даних за доп. класифікаторів
147
+
148
+ :::
149
+
150
+ :::details Службові колонки
151
+
152
+ При створенні таблиці потрібно створювати службові колонки:
153
+
154
+ | Підпис колонки | Назва | Тип |
155
+ | ------------------------------------------- | --------------- | ---------------------------------- |
156
+ | Дата створення | cdate | date_trunc('seconds'::text, now()) |
157
+ | Користувач, що востаннє відредагував об'єкт | editor_id | text |
158
+ | Дата редагування | editor_date | timestamp without time zone |
159
+ | Файли | files | json |
160
+ | Користувач, який створив | uid | text |
161
+
162
+ :::
@@ -0,0 +1,29 @@
1
+ # addCron
2
+
3
+ ## Опис
4
+
5
+ Додає планувальник
6
+
7
+ ## Параметри
8
+
9
+ ```js
10
+ import updateParcelObjectGeometry from './cron/updateParcelObjectGeometry.js';
11
+
12
+ export default async function app(fastify, opts) {
13
+ // cron after core init
14
+ fastify.addHook('onReady', () => {
15
+ fastify.addCron(updateParcelObjectGeometry, 60 * 60 * 24, fastify);
16
+ });
17
+ }
18
+ ```
19
+
20
+ :::tabs
21
+ == params
22
+
23
+ | Параметр | Тип | Опис |
24
+ | -------- | --------------- | ------------------------------------------------- |
25
+ | func | Object | Функція, яка буде викликатись планувальником |
26
+ | interval | String / Number | Інтервал часу між запусками |
27
+ | fastify | Object | Передача параметрів, в т.ч. funcs, log, config |
28
+
29
+ :::
@@ -0,0 +1,52 @@
1
+ # dataInsert
2
+
3
+ ## Опис
4
+
5
+ Імпорт даних у таблицю
6
+
7
+ ```js
8
+ dataInsert({ table, data });
9
+ ```
10
+
11
+ ## Параметри
12
+
13
+ ::: tabs
14
+ ==params
15
+
16
+ | Параметр | Тип | Опис |
17
+ | -------- | ------ | ------- |
18
+ | table | String | Таблиця |
19
+ | data | String | Дані |
20
+ :::
21
+
22
+ ## Приклад
23
+
24
+ ```js
25
+ dataInsert({
26
+ table: "data_user.work", data: {
27
+ type_work: "2",
28
+ number_services: "25",
29
+ }
30
+ })
31
+ ```
32
+
33
+ ## Відповідь
34
+
35
+ :::details Приклад відповіді
36
+
37
+ ```js
38
+ {
39
+ id_work: "3342501119648597051",
40
+ type_work: 2,
41
+ date_in: null,
42
+ date_out: null,
43
+ number_services: "25",
44
+ number_order: null,
45
+ shop: null,
46
+ geom: null,
47
+ editor_id: null,
48
+ uid: null,
49
+ editor_date: null,
50
+ }
51
+ ```
52
+ :::
@@ -0,0 +1,53 @@
1
+ # dataUpdate
2
+
3
+ ## Опис
4
+
5
+ Оновлення даних у таблиці
6
+
7
+ ```js
8
+ dataUpdate({table, id, data});
9
+ ```
10
+
11
+ ## Параметри
12
+
13
+ ::: tabs
14
+ ==params
15
+
16
+ | Параметр | Тип | Опис |
17
+ | -------- | ------ | ------------------- |
18
+ | table | String | Таблиця |
19
+ | id | String | Ідентифікатор рядка |
20
+ | data | Object | Дані для оновлення |
21
+ :::
22
+
23
+ ## Приклад
24
+
25
+ ```js
26
+ dataUpdate({
27
+ table: 'data_user.work', id: '3342439977240757305', data: {
28
+ type_work: "2",
29
+ number_services: "25",
30
+ }
31
+ })
32
+ ```
33
+
34
+ ## Відповідь
35
+
36
+ :::details Приклад відповіді
37
+
38
+ ```js
39
+ {
40
+ id_work: "3342439977240757305",
41
+ type_work: 2,
42
+ date_in: null,
43
+ date_out: null,
44
+ number_services: "25",
45
+ number_order: null,
46
+ shop: null,
47
+ geom: null,
48
+ editor_id: null,
49
+ uid: null,
50
+ editor_date: "2024-04-09T12:22:09.000Z",
51
+ }
52
+ ```
53
+ :::
@@ -0,0 +1,34 @@
1
+ # getOpt
2
+
3
+ ## Опис
4
+
5
+ Функція призначена для отримання опцій (налаштувань) за токеном. Повертає json.
6
+
7
+ ```js
8
+ getOpt(token)
9
+ ```
10
+
11
+ ## Параметри
12
+
13
+ ::: tabs
14
+ ==params
15
+
16
+ | Параметр | Тип | Опис |
17
+ | -------- | ------ | ----- |
18
+ | token | String | Токен |
19
+ :::
20
+
21
+ ## Приклад
22
+
23
+ ```js
24
+ getOpt('UfTTVsVKxBXchKlzRKIg')
25
+ ```
26
+
27
+ ## Відповідь
28
+
29
+ :::details Приклад відповіді
30
+
31
+ ```json
32
+ "data_user.work"
33
+ ```
34
+ :::
@@ -0,0 +1,38 @@
1
+ # isFileExists
2
+
3
+ ## Опис
4
+
5
+ Перевірка чи існує файл
6
+
7
+ ```js
8
+ isFileExists(filepath);
9
+ ```
10
+
11
+ ## Параметри
12
+
13
+ ::: tabs
14
+ ==params
15
+
16
+ | Параметр | Тип | Опис |
17
+ | -------- | ------ | ------- |
18
+ | filepath | String | Шлях до файлу |
19
+ :::
20
+
21
+ ## Приклад
22
+
23
+ ```js
24
+ isFileExists('test.txt')
25
+ ```
26
+
27
+ ## Відповідь
28
+
29
+ :::details Приклад відповіді
30
+
31
+ ```js
32
+ true
33
+ ```
34
+ ---
35
+ ```js
36
+ false
37
+ ```
38
+ :::
@@ -0,0 +1,38 @@
1
+ # setOpt
2
+
3
+ ## Опис
4
+
5
+ Функція призначена для збереження опцій (налаштувань) в базі даних Redis.
6
+ Повертає токен за вхідними параметрами
7
+
8
+ ```js
9
+ setOpt(opt)
10
+ ```
11
+
12
+ ## Параметри
13
+
14
+ Якщо параметри представлені у вигляді об'єкта, вони конвертуються в JSON-рядок перед обчисленням хешу. Якщо параметри представлені у вигляді рядка, вони використовуються напряму для обчислення хешу
15
+
16
+ ::: tabs
17
+ ==params
18
+
19
+ | Параметр | Тип | Опис |
20
+ | -------- | --------------- | ------------------------- |
21
+ | opt | Object / String | Параметри для збереження. |
22
+ :::
23
+
24
+ ## Приклад
25
+
26
+ ```js
27
+ setOpt('data_user.work')
28
+ ```
29
+
30
+ ## Відповідь
31
+
32
+ ::: details Приклад відповіді
33
+
34
+ ```
35
+ opt:UfTTVsVKxBXchKlzRKIg
36
+ ```
37
+
38
+ :::
@@ -0,0 +1,74 @@
1
+ # addHook
2
+
3
+ ## Опис
4
+
5
+ Функція використовується для додавання хуків (функцій-обробників) до списку хуків.
6
+
7
+ Можна додавати кастомні хуки у файлі `hooks.js`
8
+
9
+ Всі необхідні параметри передаються явно
10
+
11
+ На даний момент підтримуються наступні кастомні хуки:
12
+
13
+ * preData - попередня обробка, можливість блокування доступу
14
+ * afterData - `модифікація` результату, додавання пов'язаних даних тощо
15
+ * preForm - попередня обробка, можливість блокування доступу
16
+ * afterForm - `модифікація` форми, додавання користувацьких полів тощо
17
+ * preTable - попередня обробка, можливість блокування доступу
18
+ * afterTable - `модифікація` результату, додавання пов'язаних даних тощо
19
+ * preTemplate - попередня обробка, можливість блокування доступу [template](https://apidocs.softpro.ua/admin/api/templates/template.html)
20
+ * afterTemplate - `модифікації` payload [template](https://apidocs.softpro.ua/admin/api/templates/template.html)
21
+ * preInsert - попередня обробка, можливість блокування доступу
22
+ * afterInsert - виконання додаткових дій після внесення даних до БД [insert](../../api/crud/insert.md)
23
+ * preUpdate - попередня обробка, можливість блокування доступу
24
+ * afterUpdate - виконання додаткових дій після внесення змін до БД [update](../../api/crud/update.md)
25
+ * preDelete - попередня обробка, можливість блокування доступу
26
+ * afterDelete - виконання додаткових дій після внесення змін до БД [delete](../../api/crud/deleteCrud.md)
27
+
28
+ Приклади виклику кастомних хуків можна переглянути [тут](./applyHook.md)
29
+
30
+ ## Параметри
31
+
32
+ ```js
33
+ addHook(name, fn);
34
+ ```
35
+
36
+ | Параметр | Тип | Опис |
37
+ | -------- | -------- | --------------------------------------------- |
38
+ | name | string | Назва хука, до якого буде доданий обробник |
39
+ | fn | function | Функція-обробник, яку потрібно додати до хука |
40
+
41
+ ## Приклади
42
+
43
+ :::details
44
+
45
+ ```js
46
+ import { addHook, config, getTemplate, pgClients } from '@opengis/fastify-table/utils.js';
47
+
48
+ addHook('afterInsert', async ({ table, body = {}, payload: res = {}, user = {} }) => {
49
+ const { client: pg } = pgClients || {};
50
+ const { uid } = config?.auth?.disable ? { uid: '1' } : user;
51
+ if (!uid || !table || !Object.keys(body)?.length) return null;
52
+
53
+ const loadTable = await getTemplate('table', table);
54
+ if (!pg.pk[loadTable?.table || table]) return null;
55
+ const pk = pg.pk[loadTable?.table || table];
56
+ const id = res.rows?.[0]?.[pk];
57
+
58
+ const { rows: properties = [] } = await pg.query(`select column_id, name, title, format, data from admin.custom_column
59
+ where entity=$1 and uid=$2`, [table, uid]);
60
+
61
+ if (!id || !properties?.length) return null;
62
+
63
+ const q = properties
64
+ .filter((el) => Object.keys(body).includes(el.name))
65
+ .map((el) => `insert into crm.extra_data(property_id,property_key,property_entity,object_id,${el.format?.toLowerCase() === 'date' ? 'value_date' : 'value_text'})
66
+ select '${el.column_id}', '${el.name}', '${table}', '${id}', ${el.format?.toLowerCase() === 'date' ? `'${body[el.name]}'::timestamp without time zone` : `'${body[el.name]}'::text`}`)
67
+ .join(';\n');
68
+ return pg.query(q);
69
+ });
70
+ ```
71
+
72
+ :::
73
+
74
+ Більше прикладів можна переглянути [тут](../../hook/index.md)
@@ -0,0 +1,64 @@
1
+ # applyHook
2
+
3
+ ## Опис
4
+
5
+ Функція призначена для виклику хуків (функцій-обробників) з певним ім'ям та передачі їм даних та додаткових аргументів.
6
+
7
+ Хуки можуть бути використані для повернення відповіді. Для цього достатньо повернути `messagge` та `status`
8
+
9
+ Приклади додавання кастомних хуків можна переглянути [тут](./addHook.md)
10
+
11
+ ## Параметри
12
+
13
+ ```js
14
+ import { applyHook } from '@opengis/fastify-table/utils.js';
15
+ applyHook(name, data);
16
+ ```
17
+
18
+ | Параметр | Тип | Опис |
19
+ | -------- | ------ | ---------------------------------------------------------------------------------- |
20
+ | name | string | Назва хука, який потрібно викликати |
21
+ | data | object | Дані, які будуть передані кожному обробнику хука |
22
+
23
+ ## Приклади
24
+
25
+ :::tabs
26
+
27
+ ==data
28
+
29
+ ```js
30
+ import { applyHook } from '@opengis/fastify-table/utils.js';
31
+
32
+ export default async function data(req) {
33
+ const check = await applyHook('preData', { req });
34
+ if (check?.message && check?.status) {
35
+ return { message: check?.message, status: check?.status};
36
+ }
37
+ const { pg, funcs, query, params, user } = req;
38
+ const { rows = [] } = await pg.query(`select * from admin.users where 1=1`);
39
+ const res = { rows };
40
+ const hookData = await applyHook('afterData', { table, payload: res, user });
41
+ return hookData || res;
42
+ }
43
+ ```
44
+
45
+ ==table
46
+
47
+ ```js
48
+ import { applyHook, getTemplate } from '@opengis/fastify-table/utils.js';
49
+
50
+ export default async function table(req) {
51
+ const timeStart = Date.now();
52
+ const { pg, funcs, query, params, user } = req;
53
+ const { table } = await getTemplate('table', params?.table);
54
+ const hookData = await applyHook('preTable', { table: params.table, id: params.id, user });
55
+ if (hookData?.message && hookData?.status) {
56
+ return { message: hookData?.message, status: hookData?.status};
57
+ }
58
+ const { rows = [] } = await pg.query(`select * from admin.users where 1=1 limit 1`);
59
+ const afterHookData = await applyHook('afterTable', { table, payload: rows[0], user });
60
+ return afterHookData || rows[0];
61
+ }
62
+ ```
63
+
64
+ :::