flamerest 1.0.125 → 1.0.128

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/README.md CHANGED
@@ -18,6 +18,31 @@ import FLAMEREST from "flamerest";
18
18
  window.REST = new FLAMEREST('localhost');
19
19
  ```
20
20
 
21
+ ## Callbacks
22
+
23
+ ### Unauthorized Callback
24
+ Обработка 401 ошибок (неавторизован):
25
+ ```javascript
26
+ const rest = new FLAMEREST('https://api.example.com', undefined, () => {
27
+ // Пользователь не авторизован - перенаправляем на страницу входа
28
+ window.location.href = '/login';
29
+ });
30
+ ```
31
+
32
+ ### Maintenance Callback
33
+ Обработка 503 ошибок (сервер на обслуживании):
34
+ ```javascript
35
+ const rest = new FLAMEREST('https://api.example.com', undefined, undefined, 'v1', (errorMessage) => {
36
+ // Сервер на обслуживании
37
+ if (errorMessage) {
38
+ alert(`Сервер временно недоступен: ${errorMessage}`);
39
+ } else {
40
+ alert('Сервер временно недоступен. Попробуйте позже.');
41
+ }
42
+ // Можно показать модальное окно с сообщением об обслуживании
43
+ });
44
+ ```
45
+
21
46
  # Create and Update
22
47
 
23
48
  Just field list, but any field can be HTML Input [type=file], Clipboard object, DataTransfer [Drag&Drop/Clipboard] or FileList (automatically upload any of that)
package/REST.d.ts ADDED
@@ -0,0 +1,301 @@
1
+ /**
2
+ * Базовый ответ от сервера
3
+ */
4
+ export declare type BaseResponse<T> = {
5
+ type: string;
6
+ status: number;
7
+ ok: boolean;
8
+ data?: T;
9
+ errors: object | undefined;
10
+ message: string | undefined;
11
+ };
12
+ /**
13
+ * Часть ответа с пагинацией
14
+ */
15
+ export declare type Paginated = {
16
+ pages: {
17
+ page: number;
18
+ perPage: number;
19
+ count: number;
20
+ total: number;
21
+ };
22
+ };
23
+ /**
24
+ * Стандартный ответ от Request с несколькими строками
25
+ */
26
+ export declare type Rows<T> = BaseResponse<Array<T>> & Paginated;
27
+ export declare type Row<T> = BaseResponse<T> & Paginated;
28
+ export declare type CustomRequest<T> = BaseResponse<T>;
29
+ export declare type CustomAnyRequest = BaseResponse<any>;
30
+ /**
31
+ * Стандартный ответ от Request с изменённой строкой
32
+ */
33
+ export declare type SavedObject<T> = BaseResponse<T>;
34
+ /**
35
+ * Элемент баланса пользователя
36
+ */
37
+ export interface BalanceItem {
38
+ name: string;
39
+ balance_decimal: string;
40
+ value: number;
41
+ }
42
+ /**
43
+ * Результат авторизации
44
+ */
45
+ export declare type Authorized = {
46
+ isAuthorized: boolean;
47
+ User: {
48
+ avatar: string;
49
+ country: string;
50
+ id: number;
51
+ lang: string;
52
+ name: string;
53
+ role: string;
54
+ user_hash?: string;
55
+ balance: 0;
56
+ balance_all: {
57
+ [key: string]: BalanceItem;
58
+ };
59
+ };
60
+ errors: {
61
+ [key: string]: any;
62
+ };
63
+ token: string;
64
+ };
65
+ export declare class FLAMEREST {
66
+ /**
67
+ * Адрес серва
68
+ */
69
+ SERVER: string;
70
+ /**
71
+ * Стандартное число запросов на страницу
72
+ */
73
+ perPageDefault: number;
74
+ /**
75
+ * Будет вызван, если любой из запросов вернут требование авторизоваться
76
+ */
77
+ unauthorized_callback: (() => void) | undefined;
78
+ /**
79
+ * Будет вызван, если сервер вернёт статус 503 (Service Unavailable / Maintenance)
80
+ * Может содержать сообщение об ошибке из JSON ответа
81
+ */
82
+ maintenance_callback: ((errorMessage?: string) => void) | undefined;
83
+ /**
84
+ * Токен приложения конкретного клиента для отправки пуш уведомлений именно ему
85
+ */
86
+ pushNotificationToken: string | null;
87
+ /**
88
+ * Версия api
89
+ */
90
+ version: string;
91
+ /**
92
+ * Версия кода клиента (отправляется в заголовке каждого запроса).
93
+ * Можно установить извне: REST.VERSION_CODE = "1.2.3"
94
+ */
95
+ VERSION_CODE: string;
96
+ /**
97
+ * Если авторизация по токену, то он сюда подставляется
98
+ */
99
+ isAuthByJWTQuery: boolean;
100
+ /**
101
+ * Режим авторизации: Bearer|Link
102
+ */
103
+ authMode: "Bearer" | "Link";
104
+ token: string | null;
105
+ /**
106
+ * Конструктор класса FLAMEREST
107
+ * @param {string} server_address Адрес сервера (опционально)
108
+ * @param {string} localhost_endpoint Альтернативный адрес для localhost (опционально)
109
+ * @param {Function} unauthorized_callback Колбек для обработки 401 ошибок (опционально)
110
+ * @param {string} version Версия API (по умолчанию 'v1')
111
+ * @param {Function} maintenance_callback Колбек для обработки 503 ошибок (опционально)
112
+ */
113
+ constructor(server_address?: string, localhost_endpoint?: string, unauthorized_callback?: () => void, version?: string, maintenance_callback?: (errorMessage?: string) => void);
114
+ /**
115
+ * Установка плагина для Vue
116
+ * @param Vue
117
+ * @param options
118
+ */
119
+ install(Vue: any, options: any): void;
120
+ /**
121
+ *
122
+ * @param {string} url Адрес
123
+ * @param {object|string|FormData} params Параметры, которые надо передать, могут быть в виде объекта или строки
124
+ * @param {string} type Тип
125
+ * @param {string} responseType Тип ответа: json или blob
126
+ * @param {boolean} isNeedToken нужен ли токен для запроса
127
+ * @param {Object} customHeaders объект с доп заголовками, которые надо включить в запрос
128
+ */
129
+ request(url: string, params: object | string | FormData, type?: 'GET' | 'POST' | 'PUT' | 'DELETE', responseType?: 'json' | 'blob', isNeedToken?: boolean, customHeaders?: Record<string, string>): Promise<BaseResponse<any> & Partial<Paginated>>;
130
+ /**
131
+ * Получить выборку из таблицы через REST
132
+ * @param {string} table
133
+ * @param {object | string | null} where Позволяет делать выборку из связанных таблиц, надо только их указать через название таблицы sites.id=5, и указать колонку в expand
134
+ * @param {object | Array<string> | null} extfields
135
+ * @param {object | Array<string> | string | null} fields
136
+ * @param {object | Array<string> | string | null} sortfields
137
+ * @param {number | undefined} page
138
+ * @param {number | undefined} perPage
139
+ * @param {boolean | undefined} RemoveDuplicates
140
+ * @param {any} titles Это чтобы мы могли контроллить какие названия полей мы будет загружать при экспорте, чтобы они были как в таблице
141
+ * @param {any} tree дерево
142
+ * @param {any} params Доп параметры для кастомизации запроса на беке
143
+ * @param {any} exportData имя файла для экспорта
144
+ * @return Promise<Rows<T>>
145
+ */
146
+ get<T>(table: string, where?: object | string | null, extfields?: object | Array<string> | null, fields?: object | Array<string> | string | null, sortfields?: object | Array<string> | string | null, page?: number, perPage?: number, RemoveDuplicates?: boolean, format?: any, titles?: any, tree?: any, params?: any, exportData?: any): Promise<Rows<T>>;
147
+ /**
148
+ * Получить все записи по запросу [постранично]
149
+ * @param {string} table
150
+ * @param {object} params
151
+ * @returns {Promise<Rows<T>>}
152
+ */
153
+ all<T>(table: string, params?: {
154
+ where?: object;
155
+ extfields?: object | Array<string>;
156
+ fields?: object | Array<string>;
157
+ sort?: Array<string>;
158
+ page?: number;
159
+ perPage?: number;
160
+ tree?: number;
161
+ params?: any;
162
+ export?: {
163
+ format?: 'xlsx' | 'csv';
164
+ titles?: Array<string>;
165
+ filename?: string;
166
+ };
167
+ }): Promise<Rows<T>>;
168
+ /**
169
+ * Получить одну запись по ID или по условию выборки [первая запись]
170
+ * @param {string} table
171
+ * @param {number|string|object} IDOrWhere
172
+ * @param {object|Array} extfields
173
+ * @param {object|Array} fields
174
+ * @param {string} primaryKeyName если указан ID, то указать название первичного ключа, если от id он отличается
175
+ */
176
+ one<T>(table: string, IDOrWhere: number | string | object, extfields?: object | Array<string> | null, fields?: object | Array<string> | null, primaryKeyName?: string): Promise<T | null>;
177
+ /**
178
+ * Создать новую запись
179
+ * @param {string} table
180
+ * @param {object} values
181
+ * @param {number|string|null} appendTo
182
+ * @param {number|string|null} insertAfter
183
+ * @param {boolean|null} insertFirst
184
+ */
185
+ create<T>(table: string, values: object, appendTo?: number | string | null, insertAfter?: number | string | null, insertFirst?: number | string | null): Promise<SavedObject<T>>;
186
+ /**
187
+ * Удалить запись
188
+ * @param {string} table
189
+ * @param {number|string} id
190
+ * @param {object|null} byFields Если указан, удаляет по этим параметрам
191
+ */
192
+ remove(table: string, id?: number | string, byFields?: object | null): Promise<boolean | any>;
193
+ /**
194
+ * Редактировать значения
195
+ * @param {string} table
196
+ * @param {number|string} ID
197
+ * @param {object} values
198
+ * @param {number|string|null} appendTo
199
+ * @param {number|string|null} insertAfter
200
+ * @param {boolean|null} insertFirst
201
+ */
202
+ edit<T>(table: string, ID: number | string, values: object, appendTo?: number | string | null, insertAfter?: number | string | null, insertFirst?: number | string | null): Promise<SavedObject<T>>;
203
+ /**
204
+ * Получить схемы всех таблиц
205
+ */
206
+ getCRUDInfo(): Promise<object>;
207
+ /**
208
+ * Авторизоваться
209
+ * @param {string|undefined} username
210
+ * @param {string|undefined} password
211
+ * @param {object|string|null} pushNotificationToken
212
+ */
213
+ auth(username?: string, password?: string, pushNotificationToken?: object | string | null): Promise<Authorized>;
214
+ /**
215
+ * Зарегистрироваться с этим логином и паролем
216
+ * @param {string|null} email
217
+ * @param {string|null} username
218
+ * @param {string} password
219
+ * @param {string|null} name
220
+ * @param {object|string|null} pushNotificationToken
221
+ * @param {any} data
222
+ */
223
+ signup(email: string | null, username: string | null, password: string, name?: string | null, pushNotificationToken?: object | string | null, data?: any): Promise<Authorized>;
224
+ /**
225
+ * Выйти из системы
226
+ */
227
+ logout(): Promise<object>;
228
+ /**
229
+ * Восстановление пароля
230
+ * Запрос на восстановление пароля
231
+ * @param {*} email
232
+ * @returns
233
+ */
234
+ ResetPasswordRequest(email: string): Promise<any>;
235
+ /**
236
+ * Восстановление пароля
237
+ * Проверка токена восстановления
238
+ * @param {*} token токен подтверждения
239
+ * @returns
240
+ */
241
+ ResetPasswordTokenCheck(token: string): Promise<any>;
242
+ /**
243
+ * Восстановление пароля
244
+ * Сохранение нового пароля
245
+ * @param {*} token
246
+ * @param {*} password
247
+ * @returns
248
+ */
249
+ ResetPasswordSaveNewPassword(token: string, password: string): Promise<any>;
250
+ /**
251
+ * Подготовить объект под загрузку: загрузить данные из элементов Input [type=file] / Clipboard / DataTransfer [Drag&Drop/Clipboard]
252
+ * @param {object} values
253
+ */
254
+ prepare(values: {
255
+ [key: string]: any;
256
+ }, asFormData?: boolean): Promise<any>;
257
+ /**
258
+ * Прочесть файл асинхронно
259
+ * @param {File} file
260
+ * @param {'data' | 'text'} readAs
261
+ * @returns {Promise<string>}
262
+ */
263
+ readFileAsync(file: File, readAs?: 'data' | 'text'): Promise<string | ArrayBuffer | null>;
264
+ /**
265
+ * Заполнить существующий объект пришедшими из БД данными
266
+ * сохраняя при этом оригинальные классы и функции
267
+ * @param {*} object
268
+ * @param {*} values
269
+ */
270
+ fillObject<T extends object>(object: T, values: any): T;
271
+ generateID(length: number): string;
272
+ /**
273
+ * Вычисляет на лету детерминированную строку, которая будет использоваться как часть ключа для подписи.
274
+ * Ключ генерируется на основе последовательности числовых преобразований, что делает его неочевидным
275
+ * при статическом анализе кода. Этот метод всегда возвращает один и тот же результат.
276
+ * @returns {string} Детерминированно сгенерированная строка.
277
+ */
278
+ getDeterministicKeyPart(): string;
279
+ /**
280
+ * Создаёт подпись для запроса на основе его параметров, используя лучшие практики.
281
+ * Собирает все GET и POST параметры, сортирует их и формирует каноническую строку для хеширования.
282
+ * @param url URL запроса, включая GET-параметры.
283
+ * @param params POST-параметры запроса (в виде объекта).
284
+ * @returns Promise<string> Строка подписи.
285
+ */
286
+ private _generateRequestSignature;
287
+ /**
288
+ *
289
+ * @param {string} data
290
+ * @param {string} key
291
+ * @returns
292
+ */
293
+ hmac_sha256(message: BodyInit | null | undefined, secret_key: string): Promise<string>;
294
+ }
295
+ /**
296
+ * Экземпляр-синглтон класса FLAMEREST.
297
+ * Используйте его для всех запросов в приложении.
298
+ * `import REST from './REST.ts';`
299
+ */
300
+ declare const REST: FLAMEREST;
301
+ export default REST;