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 +25 -0
- package/REST.d.ts +301 -0
- package/REST.js +810 -0
- package/REST.ts +162 -17
- package/package.json +8 -6
- package/tsconfig.json +0 -1
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;
|