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