@e22m4u/js-repository 0.7.0 → 0.8.0
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/.mocharc.json +2 -3
- package/README.md +123 -164
- package/dist/cjs/index.cjs +8 -114
- package/eslint.config.js +29 -58
- package/jsconfig.json +7 -0
- package/package.json +11 -19
- package/src/adapter/adapter-loader.js +3 -4
- package/src/adapter/adapter.js +8 -5
- package/src/adapter/adapter.spec.js +10 -9
- package/src/adapter/builtin/memory-adapter.js +8 -7
- package/src/adapter/builtin/memory-adapter.spec.js +5 -2
- package/src/adapter/decorator/default-values-decorator.spec.js +1 -2
- package/src/database-schema.js +1 -2
- package/src/{database-schema.spec.ts → database-schema.spec.js} +5 -17
- package/src/definition/model/index.js +0 -1
- package/src/definition/model/model-definition-utils.js +1 -2
- package/src/definition/model/model-definition-utils.spec.js +5 -2
- package/src/definition/model/properties/index.js +0 -1
- package/src/definition/model/relations/index.js +0 -1
- package/src/definition/model/relations/relations-definition-validator.js +4 -5
- package/src/filter/include-clause-tool.js +8 -6
- package/src/index.js +0 -1
- package/src/relations/belongs-to-resolver.js +1 -2
- package/src/relations/belongs-to-resolver.spec.js +6 -3
- package/src/relations/has-many-resolver.js +1 -2
- package/src/relations/has-many-resolver.spec.js +6 -3
- package/src/relations/has-one-resolver.js +1 -2
- package/src/relations/has-one-resolver.spec.js +6 -3
- package/src/relations/references-many-resolver.js +1 -2
- package/src/relations/references-many-resolver.spec.js +6 -3
- package/src/repository/repository.js +1 -2
- package/src/utils/is-plain-object.js +4 -4
- package/src/adapter/adapter-loader.d.ts +0 -16
- package/src/adapter/adapter-registry.d.ts +0 -14
- package/src/adapter/adapter.d.ts +0 -153
- package/src/adapter/builtin/memory-adapter.d.ts +0 -148
- package/src/adapter/decorator/data-sanitizing-decorator.d.ts +0 -14
- package/src/adapter/decorator/default-values-decorator.d.ts +0 -14
- package/src/adapter/decorator/fields-filtering-decorator.d.ts +0 -14
- package/src/adapter/decorator/inclusion-decorator.d.ts +0 -14
- package/src/adapter/decorator/index.d.ts +0 -5
- package/src/adapter/decorator/property-uniqueness-decorator.d.ts +0 -14
- package/src/adapter/index.d.ts +0 -3
- package/src/database-schema.d.ts +0 -37
- package/src/definition/datasource/datasource-definition-validator.d.ts +0 -14
- package/src/definition/datasource/datasource-definition.d.ts +0 -8
- package/src/definition/datasource/index.d.ts +0 -2
- package/src/definition/definition-registry.d.ts +0 -50
- package/src/definition/index.d.ts +0 -3
- package/src/definition/model/index.d.ts +0 -6
- package/src/definition/model/model-data-sanitizer.d.ts +0 -15
- package/src/definition/model/model-definition-utils.d.ts +0 -180
- package/src/definition/model/model-definition-validator.d.ts +0 -14
- package/src/definition/model/model-definition.d.ts +0 -28
- package/src/definition/model/model-definition.js +0 -1
- package/src/definition/model/properties/data-type.d.ts +0 -16
- package/src/definition/model/properties/index.d.ts +0 -6
- package/src/definition/model/properties/primary-keys-definition-validator.d.ts +0 -15
- package/src/definition/model/properties/properties-definition-validator.d.ts +0 -15
- package/src/definition/model/properties/property-definition.d.ts +0 -23
- package/src/definition/model/properties/property-definition.js +0 -1
- package/src/definition/model/properties/property-uniqueness-validator.d.ts +0 -31
- package/src/definition/model/properties/property-uniqueness.d.ts +0 -14
- package/src/definition/model/relations/index.d.ts +0 -3
- package/src/definition/model/relations/relation-definition.d.ts +0 -236
- package/src/definition/model/relations/relation-definition.js +0 -1
- package/src/definition/model/relations/relation-type.d.ts +0 -14
- package/src/definition/model/relations/relations-definition-validator.d.ts +0 -15
- package/src/errors/index.d.ts +0 -3
- package/src/errors/invalid-argument-error.d.ts +0 -6
- package/src/errors/invalid-operator-value-error.d.ts +0 -13
- package/src/errors/not-implemented-error.d.ts +0 -6
- package/src/filter/fields-clause-tool.d.ts +0 -38
- package/src/filter/filter-clause.d.ts +0 -348
- package/src/filter/include-clause-tool.d.ts +0 -55
- package/src/filter/index.d.ts +0 -7
- package/src/filter/operator-clause-tool.d.ts +0 -224
- package/src/filter/order-clause-tool.d.ts +0 -32
- package/src/filter/slice-clause-tool.d.ts +0 -30
- package/src/filter/where-clause-tool.d.ts +0 -23
- package/src/index.d.ts +0 -9
- package/src/relations/belongs-to-resolver.d.ts +0 -46
- package/src/relations/has-many-resolver.d.ts +0 -67
- package/src/relations/has-one-resolver.d.ts +0 -67
- package/src/relations/index.d.ts +0 -4
- package/src/relations/references-many-resolver.d.ts +0 -27
- package/src/repository/index.d.ts +0 -2
- package/src/repository/repository-registry.d.ts +0 -29
- package/src/repository/repository.d.ts +0 -183
- package/src/types.d.ts +0 -43
- package/src/types.js +0 -1
- package/src/utils/capitalize.d.ts +0 -6
- package/src/utils/clone-deep.d.ts +0 -6
- package/src/utils/exclude-object-keys.d.ts +0 -10
- package/src/utils/get-value-by-path.d.ts +0 -12
- package/src/utils/index.d.ts +0 -12
- package/src/utils/is-deep-equal.d.ts +0 -10
- package/src/utils/is-plain-object.d.ts +0 -6
- package/src/utils/is-promise.d.ts +0 -10
- package/src/utils/like-to-regexp.d.ts +0 -14
- package/src/utils/model-name-to-model-key.d.ts +0 -6
- package/src/utils/select-object-keys.d.ts +0 -10
- package/src/utils/singularize.d.ts +0 -6
- package/src/utils/string-to-regexp.d.ts +0 -10
- package/tsconfig.json +0 -11
package/.mocharc.json
CHANGED
package/README.md
CHANGED
|
@@ -40,7 +40,6 @@
|
|
|
40
40
|
- [Has One (полиморфная)](#has-one-полиморфная-версия)
|
|
41
41
|
- [Has Many (полиморфная)](#has-many-полиморфная-версия)
|
|
42
42
|
- [Расширение](#расширение)
|
|
43
|
-
- [TypeScript](#typescript)
|
|
44
43
|
- [Тесты](#тесты)
|
|
45
44
|
- [Лицензия](#лицензия)
|
|
46
45
|
|
|
@@ -82,10 +81,10 @@ const {DatabaseSchema} = require('@e22m4u/js-repository');
|
|
|
82
81
|
Кроме того, *модель* может определять классические связи «один к одному»,
|
|
83
82
|
«один ко многим» и другие типы отношений между моделями.
|
|
84
83
|
|
|
85
|
-
Непосредственно чтение и запись данных
|
|
84
|
+
Непосредственно чтение и запись данных производятся с помощью *репозитория*,
|
|
86
85
|
который есть у каждой модели с объявленным *источником данных*. Репозиторий
|
|
87
86
|
может фильтровать запрашиваемые документы, выполнять валидацию свойств
|
|
88
|
-
согласно определению
|
|
87
|
+
согласно определению модели и встраивать связанные данные в результат
|
|
89
88
|
выборки.
|
|
90
89
|
|
|
91
90
|
- *Источник данных* - определяет способ подключения к базе
|
|
@@ -257,17 +256,36 @@ console.log(cityWithCountry);
|
|
|
257
256
|
|
|
258
257
|
## Схема
|
|
259
258
|
|
|
260
|
-
Экземпляр класса `DatabaseSchema` хранит определения источников данных
|
|
259
|
+
Экземпляр класса `DatabaseSchema` хранит определения источников данных
|
|
260
|
+
и моделей.
|
|
261
261
|
|
|
262
262
|
**Методы**
|
|
263
263
|
|
|
264
|
-
|
|
265
|
-
- `defineModel(modelDef: object): this` - добавить модель
|
|
266
|
-
- `getRepository(modelName: string): Repository` - получить репозиторий
|
|
264
|
+
Добавить источник
|
|
267
265
|
|
|
268
|
-
|
|
266
|
+
- `defineDatasource(datasourceDef)`
|
|
267
|
+
- `datasourceDef: object`: определение источника;
|
|
268
|
+
- результат: `this`;
|
|
269
|
+
|
|
270
|
+
Добавить модель:
|
|
271
|
+
|
|
272
|
+
- `defineModel(modelDef)`
|
|
273
|
+
- `modelDef: object`: определение модели;
|
|
274
|
+
- результат: `this`;
|
|
275
|
+
|
|
276
|
+
Получить репозиторий
|
|
277
|
+
|
|
278
|
+
- `getRepository(modelName)`
|
|
279
|
+
- `modelName: string` имя модели;
|
|
280
|
+
- результат: `Repository`;
|
|
281
|
+
|
|
282
|
+
**Пример**
|
|
269
283
|
|
|
270
|
-
|
|
284
|
+
Ниже приводится пошаговый пример настройки модели `product` и получения
|
|
285
|
+
экземпляра репозитория, с помощью которого можно управлять данными этой
|
|
286
|
+
коллекции.
|
|
287
|
+
|
|
288
|
+
1\. Импорт класса и создание экземпляра схемы.
|
|
271
289
|
|
|
272
290
|
```js
|
|
273
291
|
import {DatabaseSchema} from '@e22m4u/js-repository';
|
|
@@ -275,7 +293,7 @@ import {DatabaseSchema} from '@e22m4u/js-repository';
|
|
|
275
293
|
const dbs = new DatabaseSchema();
|
|
276
294
|
```
|
|
277
295
|
|
|
278
|
-
Определение нового источника.
|
|
296
|
+
2\. Определение нового источника.
|
|
279
297
|
|
|
280
298
|
```js
|
|
281
299
|
dbs.defineDatasource({
|
|
@@ -284,7 +302,7 @@ dbs.defineDatasource({
|
|
|
284
302
|
});
|
|
285
303
|
```
|
|
286
304
|
|
|
287
|
-
Определение новой модели.
|
|
305
|
+
3\. Определение новой модели.
|
|
288
306
|
|
|
289
307
|
```js
|
|
290
308
|
dbs.defineModel({
|
|
@@ -297,7 +315,7 @@ dbs.defineModel({
|
|
|
297
315
|
});
|
|
298
316
|
```
|
|
299
317
|
|
|
300
|
-
Получение репозитория по названию модели.
|
|
318
|
+
4\. Получение репозитория по названию модели.
|
|
301
319
|
|
|
302
320
|
```js
|
|
303
321
|
const productRep = dbs.getRepository('product');
|
|
@@ -370,7 +388,7 @@ dbs.defineModel({
|
|
|
370
388
|
## Свойства
|
|
371
389
|
|
|
372
390
|
Параметр `properties` находится в определении модели и принимает объект, ключи
|
|
373
|
-
которого являются свойствами этой модели, а
|
|
391
|
+
которого являются свойствами этой модели, а значениями тип свойства или объект
|
|
374
392
|
с дополнительными параметрами.
|
|
375
393
|
|
|
376
394
|
**Тип данных**
|
|
@@ -396,15 +414,16 @@ dbs.defineModel({
|
|
|
396
414
|
|
|
397
415
|
**Параметр `unique`**
|
|
398
416
|
|
|
399
|
-
Если значением параметра `unique` является `true` или `'strict'`,
|
|
400
|
-
строгая проверка на уникальность. В этом режиме
|
|
401
|
-
так же подлежат проверке,
|
|
402
|
-
|
|
417
|
+
Если значением параметра `unique` является `true` или `'strict'`,
|
|
418
|
+
то выполняется строгая проверка на уникальность. В этом режиме
|
|
419
|
+
[пустые значения](#Пустые-значения) так же подлежат проверке,
|
|
420
|
+
где `null` и `undefined` также считаются значениями, которые
|
|
421
|
+
должны быть уникальными.
|
|
403
422
|
|
|
404
|
-
Режим `'sparse'` проверяет только значения с полезной нагрузкой,
|
|
405
|
-
[пустые значения](#Пустые-значения), список которых отличается
|
|
406
|
-
от типа свойства. Например, для типа `string`
|
|
407
|
-
`null` и `''` (пустая строка).
|
|
423
|
+
Режим `'sparse'` проверяет только значения с полезной нагрузкой,
|
|
424
|
+
исключая [пустые значения](#Пустые-значения), список которых отличается
|
|
425
|
+
в зависимости от типа свойства. Например, для типа `string` пустыми
|
|
426
|
+
значениями будут `undefined`, `null` и `''` (пустая строка).
|
|
408
427
|
|
|
409
428
|
- `unique: true | 'strict'` строгая проверка на уникальность
|
|
410
429
|
- `unique: 'sparse'` исключить из проверки [пустые значения](#Пустые-значения)
|
|
@@ -503,26 +522,15 @@ dbs.defineModel({
|
|
|
503
522
|
**EmptyValuesService**
|
|
504
523
|
|
|
505
524
|
Для переопределения пустых значений необходимо получить экземпляр класса
|
|
506
|
-
`EmptyValuesService` из контейнера схемы и вызвать
|
|
507
|
-
тип данных и массив новых значений.
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
* для определенного типа данных.
|
|
516
|
-
*
|
|
517
|
-
* @param dataType Тип данных.
|
|
518
|
-
* @param emptyValues Массив новых пустых значений.
|
|
519
|
-
*/
|
|
520
|
-
setEmptyValuesOf(
|
|
521
|
-
dataType: DataType,
|
|
522
|
-
emptyValues: unknown[],
|
|
523
|
-
): this;
|
|
524
|
-
}
|
|
525
|
-
```
|
|
525
|
+
`EmptyValuesService` из контейнера схемы и вызвать метод `setEmptyValuesOf`,
|
|
526
|
+
который принимает тип данных и массив новых значений.
|
|
527
|
+
|
|
528
|
+
Сигнатура:
|
|
529
|
+
|
|
530
|
+
- `setEmptyValuesOf(dataType, emptyValues)`
|
|
531
|
+
- `dataType: DataType`: строковый литерал типа;
|
|
532
|
+
- `emptyValues: *[]`: массив новых значений;
|
|
533
|
+
- результат: `this`;
|
|
526
534
|
|
|
527
535
|
**Пример**
|
|
528
536
|
|
|
@@ -555,24 +563,24 @@ emptyValuesService.setEmptyValuesOf(DataType.NUMBER, [undefined, null]);
|
|
|
555
563
|
|
|
556
564
|
**Методы**
|
|
557
565
|
|
|
558
|
-
- [`create(data, filter
|
|
559
|
-
- [`replaceById(id, data, filter
|
|
560
|
-
- [`replaceOrCreate(data, filter
|
|
561
|
-
- [`patchById(id, data, filter
|
|
562
|
-
- [`patch(data, where
|
|
563
|
-
- [`find(filter
|
|
564
|
-
- [`findOne(filter
|
|
565
|
-
- [`findById(id, filter
|
|
566
|
-
- [`delete(where
|
|
566
|
+
- [`create(data, [filter])`](#repositorycreate) создать новый документ;
|
|
567
|
+
- [`replaceById(id, data, [filter])`](#repositoryreplacebyid) заменить документ полностью;
|
|
568
|
+
- [`replaceOrCreate(data, [filter])`](#repositoryreplaceorcreate) заменить или создать новый;
|
|
569
|
+
- [`patchById(id, data, [filter])`](#repositorypatchbyid) обновить документ частично;
|
|
570
|
+
- [`patch(data, [where])`](#repositorypatch) обновить все документы или по условию;
|
|
571
|
+
- [`find([filter])`](#repositoryfind) найти все документы или по условию;
|
|
572
|
+
- [`findOne([filter])`](#repositoryfindone) найти первый документ или по условию;
|
|
573
|
+
- [`findById(id, [filter])`](#repositoryfindbyid) найти документ по идентификатору;
|
|
574
|
+
- [`delete([where])`](#repositorydelete) удалить все документы или по условию;
|
|
567
575
|
- [`deleteById(id)`](#repositorydeletebyid) удалить документ по идентификатору;
|
|
568
576
|
- [`exists(id)`](#repositoryexists) проверить существование по идентификатору;
|
|
569
|
-
- [`count(where
|
|
577
|
+
- [`count([where])`](#repositorycount) подсчет всех документов или по условию;
|
|
570
578
|
|
|
571
579
|
**Аргументы**
|
|
572
580
|
|
|
573
581
|
- `id: number|string` идентификатор (первичный ключ)
|
|
574
582
|
- `data: object` данные документа (используется при записи)
|
|
575
|
-
- `where: object` условия
|
|
583
|
+
- `where: object` условия выборки (см. [`where`](#where))
|
|
576
584
|
- `filter: object` параметры выборки (см. [Фильтрация](#Фильтрация))
|
|
577
585
|
|
|
578
586
|
**Получение репозитория**
|
|
@@ -612,12 +620,10 @@ const modelRep = dbs.getRepository('myModel');
|
|
|
612
620
|
|
|
613
621
|
Сигнатура:
|
|
614
622
|
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
): Promise<FlatData>;
|
|
620
|
-
```
|
|
623
|
+
- `create(data, [filter])`
|
|
624
|
+
- `data: object`: данные нового документа;
|
|
625
|
+
- `filter?: object`: настройки выборки (см. [Фильтрация](#фильтрация));
|
|
626
|
+
- результат: `Promise<object>`;
|
|
621
627
|
|
|
622
628
|
**Примеры**
|
|
623
629
|
|
|
@@ -678,13 +684,11 @@ console.log(product);
|
|
|
678
684
|
|
|
679
685
|
Сигнатура:
|
|
680
686
|
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
): Promise<FlatData>;
|
|
687
|
-
```
|
|
687
|
+
- `replaceById(id, data, [filter])`
|
|
688
|
+
- `id: number|string`: идентификатор документа;
|
|
689
|
+
- `data: object`: новые данные;
|
|
690
|
+
- `filter?: object`: настройки выборки (см. [Фильтрация](#фильтрация));
|
|
691
|
+
- результат: `Promise<object>`;
|
|
688
692
|
|
|
689
693
|
**Примеры**
|
|
690
694
|
|
|
@@ -720,12 +724,10 @@ console.log(updatedProduct);
|
|
|
720
724
|
|
|
721
725
|
Сигнатура:
|
|
722
726
|
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
): Promise<FlatData>;
|
|
728
|
-
```
|
|
727
|
+
- `replaceOrCreate(data, [filter])`
|
|
728
|
+
- `data: object`: данные документа;
|
|
729
|
+
- `filter?: object`: настройки выборки (см. [Фильтрация](#фильтрация));
|
|
730
|
+
- результат: `Promise<object>`;
|
|
729
731
|
|
|
730
732
|
**Примеры**
|
|
731
733
|
|
|
@@ -768,13 +770,11 @@ console.log(updatedProduct);
|
|
|
768
770
|
|
|
769
771
|
Сигнатура:
|
|
770
772
|
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
): Promise<FlatData>;
|
|
777
|
-
```
|
|
773
|
+
- `patchById(id, data, [filter])`
|
|
774
|
+
- `id: number|string`: идентификатор обновляемого документа;
|
|
775
|
+
- `data: object`: новые данные;
|
|
776
|
+
- `filter?: object`: настройки выборки (см. [Фильтрация](#фильтрация));
|
|
777
|
+
- результат: `Promise<object>`;
|
|
778
778
|
|
|
779
779
|
**Примеры**
|
|
780
780
|
|
|
@@ -808,12 +808,10 @@ console.log(updatedProduct);
|
|
|
808
808
|
|
|
809
809
|
Сигнатура:
|
|
810
810
|
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
): Promise<number>;
|
|
816
|
-
```
|
|
811
|
+
- `patch(data, [where])`
|
|
812
|
+
- `data: object`: новые данные;
|
|
813
|
+
- `where?: object`: условия выборки (см. [`where`](#where));
|
|
814
|
+
- результат: `Promise<number>`;
|
|
817
815
|
|
|
818
816
|
**Примеры**
|
|
819
817
|
|
|
@@ -843,9 +841,9 @@ const totalCount = await productRep.patch({
|
|
|
843
841
|
|
|
844
842
|
Сигнатура:
|
|
845
843
|
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
844
|
+
- `find([filter])`
|
|
845
|
+
- `filter?: object`: настройки выборки (см. [Фильтрация](#фильтрация));
|
|
846
|
+
- результат: `Promise<object[]>`;
|
|
849
847
|
|
|
850
848
|
**Примеры**
|
|
851
849
|
|
|
@@ -879,11 +877,9 @@ const latestProducts = await productRep.find({
|
|
|
879
877
|
|
|
880
878
|
Сигнатура:
|
|
881
879
|
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
): Promise<FlatData | undefined>;
|
|
886
|
-
```
|
|
880
|
+
- `findOne([filter])`
|
|
881
|
+
- `filter?: object`: настройки выборки (см. [Фильтрация](#фильтрация));
|
|
882
|
+
- результат: `Promise<object|undefined>`;
|
|
887
883
|
|
|
888
884
|
**Примеры**
|
|
889
885
|
|
|
@@ -914,12 +910,10 @@ if (!product) {
|
|
|
914
910
|
|
|
915
911
|
Сигнатура:
|
|
916
912
|
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
): Promise<FlatData>;
|
|
922
|
-
```
|
|
913
|
+
- `findById(id, [filter])`
|
|
914
|
+
- `id: number|string`: идентификатор документа;
|
|
915
|
+
- `filter?: object`: настройки выборки (см. [Фильтрация](#фильтрация));
|
|
916
|
+
- результат: `Promise<object|undefined>`;
|
|
923
917
|
|
|
924
918
|
**Примеры**
|
|
925
919
|
|
|
@@ -950,9 +944,9 @@ const product = await productRep.findById(1, {
|
|
|
950
944
|
|
|
951
945
|
Сигнатура:
|
|
952
946
|
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
947
|
+
- `delete([where])`
|
|
948
|
+
- `where?: object`: условия выборки (см. [`where`](#where));
|
|
949
|
+
- результат: `Promise<number>`;
|
|
956
950
|
|
|
957
951
|
**Примеры**
|
|
958
952
|
|
|
@@ -977,9 +971,15 @@ const totalCount = await productRep.delete();
|
|
|
977
971
|
|
|
978
972
|
Сигнатура:
|
|
979
973
|
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
974
|
+
- `deleteById(id)`
|
|
975
|
+
- `id: number|string`: идентификатор документа;
|
|
976
|
+
- результат: `Promise<boolean>`;
|
|
977
|
+
|
|
978
|
+
Результат:
|
|
979
|
+
|
|
980
|
+
- `Promise<boolean>`: логическое значение;
|
|
981
|
+
- `true`: документ был найден и удален;
|
|
982
|
+
- `false`: документ не найден;
|
|
983
983
|
|
|
984
984
|
**Примеры**
|
|
985
985
|
|
|
@@ -1001,9 +1001,15 @@ if (wasDeleted) {
|
|
|
1001
1001
|
|
|
1002
1002
|
Сигнатура:
|
|
1003
1003
|
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1004
|
+
- `exists(id)`
|
|
1005
|
+
- `id: number|string`: идентификатор документа;
|
|
1006
|
+
- результат: `Promise<boolean>`;
|
|
1007
|
+
|
|
1008
|
+
Результат:
|
|
1009
|
+
|
|
1010
|
+
- `Promise<boolean>`: логическое значение;
|
|
1011
|
+
- `true`: документ с таким идентификатором найден;
|
|
1012
|
+
- `false`: идентификатор не найден;
|
|
1007
1013
|
|
|
1008
1014
|
**Примеры**
|
|
1009
1015
|
|
|
@@ -1023,9 +1029,9 @@ if (productExists) {
|
|
|
1023
1029
|
|
|
1024
1030
|
Сигнатура:
|
|
1025
1031
|
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1032
|
+
- `count([where])`
|
|
1033
|
+
- `where?: object`: условия выборки (см. [`where`](#where));
|
|
1034
|
+
- результат: `Promise<number>`;
|
|
1029
1035
|
|
|
1030
1036
|
**Примеры**
|
|
1031
1037
|
|
|
@@ -1045,10 +1051,10 @@ const totalCount = await productRep.count();
|
|
|
1045
1051
|
|
|
1046
1052
|
## Фильтрация
|
|
1047
1053
|
|
|
1048
|
-
Некоторые методы репозитория принимают объект
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1054
|
+
Некоторые методы репозитория принимают объект настроек возвращаемого
|
|
1055
|
+
результата. Максимально широкий набор таких настроек имеет первый
|
|
1056
|
+
параметр метода `find`, где ожидается объект, содержащий набор
|
|
1057
|
+
опций указанных ниже.
|
|
1052
1058
|
|
|
1053
1059
|
- `where: object` условия фильтрации по свойствам документа;
|
|
1054
1060
|
- `order: string|string[]` сортировка по указанным свойствам;
|
|
@@ -1917,7 +1923,7 @@ dbs.defineModel({
|
|
|
1917
1923
|
|
|
1918
1924
|
#### Has One (полиморфная версия)
|
|
1919
1925
|
|
|
1920
|
-
Обратная сторона
|
|
1926
|
+
Обратная сторона полиморфной связи `belongsTo` по принципу *"один к одному"*.
|
|
1921
1927
|
|
|
1922
1928
|
```
|
|
1923
1929
|
Текущая (company) <───────┐ Целевая (license)
|
|
@@ -1984,7 +1990,7 @@ dbs.defineModel({
|
|
|
1984
1990
|
|
|
1985
1991
|
#### Has Many (полиморфная версия)
|
|
1986
1992
|
|
|
1987
|
-
Обратная сторона
|
|
1993
|
+
Обратная сторона полиморфной связи `belongsTo` по принципу *"один ко многим"*.
|
|
1988
1994
|
|
|
1989
1995
|
```
|
|
1990
1996
|
Текущая (letter) <─────────┐ Целевая (file)
|
|
@@ -2097,56 +2103,9 @@ const rep = dbs.getRepository('model');
|
|
|
2097
2103
|
console.log(rep instanceof MyRepository); // true
|
|
2098
2104
|
```
|
|
2099
2105
|
|
|
2100
|
-
*i. Так как экземпляры репозитория
|
|
2106
|
+
*i. Так как экземпляры репозитория кэшируются, то замену конструктора
|
|
2101
2107
|
следует выполнять до обращения к методу `getRepository`.*
|
|
2102
2108
|
|
|
2103
|
-
## TypeScript
|
|
2104
|
-
|
|
2105
|
-
Получение типизированного репозитория с указанием интерфейса модели.
|
|
2106
|
-
|
|
2107
|
-
```ts
|
|
2108
|
-
import {DataType} from '@e22m4u/js-repository';
|
|
2109
|
-
import {RelationType} from '@e22m4u/js-repository';
|
|
2110
|
-
import {DatabaseSchema} from '@e22m4u/js-repository';
|
|
2111
|
-
|
|
2112
|
-
// const dbs = new DatabaseSchema();
|
|
2113
|
-
// dbs.defineDatasource ...
|
|
2114
|
-
|
|
2115
|
-
// определение модели "city"
|
|
2116
|
-
dbs.defineModel({
|
|
2117
|
-
name: 'city',
|
|
2118
|
-
datasource: 'myDatasource',
|
|
2119
|
-
properties: {
|
|
2120
|
-
name: DataType.STRING,
|
|
2121
|
-
timeZone: DataType.STRING,
|
|
2122
|
-
},
|
|
2123
|
-
});
|
|
2124
|
-
|
|
2125
|
-
// определение интерфейса "city"
|
|
2126
|
-
interface City {
|
|
2127
|
-
id: number;
|
|
2128
|
-
name?: string;
|
|
2129
|
-
timeZone?: string;
|
|
2130
|
-
}
|
|
2131
|
-
|
|
2132
|
-
// при получении репозитория нужной модели
|
|
2133
|
-
// можно указать тип документов
|
|
2134
|
-
const cityRep = dbs.getRepository<City>('city');
|
|
2135
|
-
|
|
2136
|
-
// теперь, методы репозитория возвращают
|
|
2137
|
-
// тип City вместо Record<string, unknown>
|
|
2138
|
-
const city: City = await cityRep.create({
|
|
2139
|
-
name: 'Moscow',
|
|
2140
|
-
timeZone: 'Europe/Moscow',
|
|
2141
|
-
});
|
|
2142
|
-
```
|
|
2143
|
-
|
|
2144
|
-
Для определения моделей с помощью TypeScript классов,
|
|
2145
|
-
рекомендуется использовать специальную версию данного модуля
|
|
2146
|
-
[@e22m4u/ts-repository](https://www.npmjs.com/package/@e22m4u/ts-repository),
|
|
2147
|
-
поставляемую с набором TypeScript декораторов и дополнительных
|
|
2148
|
-
инструментов для работы в TypeScript окружении.
|
|
2149
|
-
|
|
2150
2109
|
## Тесты
|
|
2151
2110
|
|
|
2152
2111
|
```bash
|