@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.
- package/Changelog.md +1 -1
- package/README.md +26 -26
- package/config.js +10 -10
- package/cron/controllers/cronApi.js +22 -22
- package/cron/controllers/utils/cronList.js +1 -1
- package/cron/index.js +10 -10
- package/crud/controllers/deleteCrud.js +9 -4
- package/crud/controllers/insert.js +9 -6
- package/crud/controllers/update.js +13 -10
- package/crud/controllers/utils/checkXSS.js +3 -2
- package/crud/controllers/utils/xssInjection.js +72 -72
- package/crud/funcs/getAccess.js +14 -13
- package/crud/funcs/getToken.js +27 -27
- package/crud/funcs/isFileExists.js +13 -13
- package/crud/funcs/setToken.js +53 -53
- package/docs/.vitepress/abbr.mjs +26 -0
- package/docs/.vitepress/config.mjs +127 -0
- package/docs/.vitepress/navigation.mjs +82 -0
- package/docs/.vitepress/theme/Layout.vue +17 -0
- package/docs/.vitepress/theme/components/NavigationLinks.vue +102 -0
- package/docs/.vitepress/theme/components/Panzoom.vue +169 -0
- package/docs/.vitepress/theme/index.mjs +15 -0
- package/docs/.vitepress/theme/style.scss +163 -0
- package/docs/abbr.json +4 -0
- package/docs/api/cron/cronApi.md +56 -0
- package/docs/api/crud/deleteCrud.md +58 -0
- package/docs/api/crud/insert.md +82 -0
- package/docs/api/crud/update.md +85 -0
- package/docs/api/index.md +47 -0
- package/docs/api/notification/testEmail.md +91 -0
- package/docs/api/table/card.md +73 -0
- package/docs/api/table/data.md +134 -0
- package/docs/api/table/export.md +60 -0
- package/docs/api/table/filter.md +104 -0
- package/docs/api/table/form.md +126 -0
- package/docs/api/table/search.md +123 -0
- package/docs/api/table/suggest.md +156 -0
- package/docs/api/table/table.md +107 -0
- package/docs/api/user/user.cls.id.md +77 -0
- package/docs/api/user/user.cls.md +49 -0
- package/docs/api/user/user.cls.post.md +62 -0
- package/docs/api/user/user.info.md +37 -0
- package/docs/api/utils/logger.file.md +61 -0
- package/docs/api/utils/next.id.md +34 -0
- package/docs/api/utils/properties.add.md +127 -0
- package/docs/api/utils/properties.get.md +73 -0
- package/docs/api/utils/status.monitor.md +36 -0
- package/docs/api/widget/widget.del.md +76 -0
- package/docs/api/widget/widget.get.md +233 -0
- package/docs/api/widget/widget.set.md +88 -0
- package/docs/db/admin.md +947 -0
- package/docs/db/crm.md +564 -0
- package/docs/db/index.md +9 -0
- package/docs/db/log.md +204 -0
- package/docs/hook/card/afterCard.md +20 -0
- package/docs/hook/card/preCard.md +25 -0
- package/docs/hook/data/afterData.md +26 -0
- package/docs/hook/data/preData.md +26 -0
- package/docs/hook/deleteCrud/afterDelete.md +21 -0
- package/docs/hook/deleteCrud/preDelete.md +26 -0
- package/docs/hook/form/afterForm.md +19 -0
- package/docs/hook/form/preForm.md +26 -0
- package/docs/hook/getTemplate/afterTemplate.md +24 -0
- package/docs/hook/getTemplate/preTemplate.md +29 -0
- package/docs/hook/index.md +45 -0
- package/docs/hook/insert/afterInsert.md +41 -0
- package/docs/hook/insert/preInsert.md +25 -0
- package/docs/hook/table/afterTable.md +20 -0
- package/docs/hook/table/preTable.md +25 -0
- package/docs/hook/update/afterUpdate.md +41 -0
- package/docs/hook/update/preUpdate.md +25 -0
- package/docs/index.md +42 -0
- package/docs/public/fastify-dark.svg +4 -0
- package/docs/public/fastify.svg +1 -0
- package/docs/public/logo-short-dark.svg +12 -0
- package/docs/public/logo-short.svg +11 -0
- package/docs/public/logo.svg +19 -0
- package/docs/readme/index.md +121 -0
- package/docs/templates/card.md +83 -0
- package/docs/templates/cls.md +29 -0
- package/docs/templates/filters.md +91 -0
- package/docs/templates/forms.md +139 -0
- package/docs/templates/image.png +0 -0
- package/docs/templates/index.md +28 -0
- package/docs/templates/select.md +90 -0
- package/docs/templates/table.md +162 -0
- package/docs/utils/cron/addCron.md +29 -0
- package/docs/utils/crud/dataInsert.md +52 -0
- package/docs/utils/crud/dataUpdate.md +53 -0
- package/docs/utils/crud/getOpt.md +34 -0
- package/docs/utils/crud/isFileExists.md +38 -0
- package/docs/utils/crud/setOpt.md +38 -0
- package/docs/utils/hook/addHook.md +74 -0
- package/docs/utils/hook/applyHook.md +64 -0
- package/docs/utils/index.md +48 -0
- package/docs/utils/notification/addNotification.md +28 -0
- package/docs/utils/notification/notification.md +41 -0
- package/docs/utils/pg/autoIndex.md +22 -0
- package/docs/utils/pg/getMeta.md +59 -0
- package/docs/utils/pg/getPG.md +34 -0
- package/docs/utils/pg/init.md +30 -0
- package/docs/utils/pg/pg.md +70 -0
- package/docs/utils/redis/getRedis.md +36 -0
- package/docs/utils/redis/rclient.md +74 -0
- package/docs/utils/table/getForm.md +69 -0
- package/docs/utils/table/getMeta.md +56 -0
- package/docs/utils/table/getSelect.md +39 -0
- package/docs/utils/table/getSelectMeta.md +47 -0
- package/docs/utils/table/getTable.md +78 -0
- package/logger/createFileStream.js +1 -1
- package/package.json +15 -3
- package/redis/funcs/getRedis.js +23 -23
- package/server/migrations/log.sql +80 -80
- package/table/controllers/data.js +31 -23
- package/table/controllers/table.js +26 -22
- package/table/index.js +3 -50
- package/table/schema.js +54 -0
- package/test/api/crud.xss.test.js +38 -22
- package/test/config.example +18 -18
- package/test/funcs/pg.test.js +34 -34
- package/test/funcs/redis.test.js +19 -19
- package/test/templates/cls/test.json +9 -9
- package/test/templates/form/cp_building.form.json +32 -32
- package/test/templates/select/account_id.json +3 -3
- package/test/templates/select/storage.data.json +2 -2
- package/test/templates/table/gis.dataset.table.json +20 -20
- package/util/controllers/next.id.js +4 -4
- package/util/controllers/properties.get.js +19 -19
- 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
|
+
:::
|