@e22m4u/js-repository 0.0.38 → 0.0.39

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
@@ -2,26 +2,45 @@
2
2
 
3
3
  Абстракция для работы с базами данных для Node.js
4
4
 
5
- | адаптер | описание |
6
- |---------|-------------------------------------------------------------------------------------------------------------------------------------------------|
7
- | memory | виртуальная база в памяти процесса (для разработки и тестирования) |
8
- | mongodb | MongoDB - система управления NoSQL базами данных (*[требует установки](https://www.npmjs.com/package/@e22m4u/js-repository-mongodb-adapter))* |
9
-
10
5
  ## Установка
11
6
 
12
7
  ```bash
13
8
  npm install @e22m4u/js-repository
14
9
  ```
15
10
 
16
- Опционально устанавливаем адаптер, например [mongodb](https://www.npmjs.com/package/@e22m4u/js-repository-mongodb-adapter)
11
+ Опционально устанавливаем адаптер. Например, если используемой базой
12
+ является *MongoDB*, то для подключения потребуется добавить
13
+ [адаптер mongodb](https://www.npmjs.com/package/@e22m4u/js-repository-mongodb-adapter)
14
+ как отдельную зависимость.
17
15
 
18
16
  ```bash
19
17
  npm install @e22m4u/js-repository-mongodb-adapter
20
18
  ```
21
19
 
22
- ## Пример
20
+ Список доступных адаптеров:
21
+
22
+ | адаптер | описание |
23
+ |-----------|-------------------------------------------------------------------------------------------------------------------------------------------------|
24
+ | `memory` | виртуальная база в памяти процесса (для разработки и тестирования) |
25
+ | `mongodb` | MongoDB - система управления NoSQL базами (*[требует установки](https://www.npmjs.com/package/@e22m4u/js-repository-mongodb-adapter))* |
26
+
27
+ ## Концепция
28
+
29
+ Модуль позволяет спроектировать систему связанных данных, доступ к которым
30
+ осуществляется посредством репозиториев. Каждый репозиторий имеет собственную
31
+ модель, которая описывает структуру определенной коллекции в базе,
32
+ а так же определяет связи к другим коллекциям.
23
33
 
24
- Создаем экземпляр класса `Schema`
34
+ ```mermaid
35
+ flowchart LR
36
+
37
+ A[Datasource]-->B[Model]-->С[Repository];
38
+ ```
39
+
40
+ ## Использование
41
+
42
+ Определения источников и моделей хранятся в экземпляре класса `Schema`,
43
+ и первым шагом будет создание данного экземпляра.
25
44
 
26
45
  ```js
27
46
  import {Schema} from '@e22m4u/js-repository';
@@ -29,7 +48,38 @@ import {Schema} from '@e22m4u/js-repository';
29
48
  const schema = new Schema();
30
49
  ```
31
50
 
32
- Создаем источник данных `myMemory`
51
+ Интерфейс `Schema` содержит три основных метода:
52
+
53
+ - `defineDatasource(datasourceDef: object): this` - добавить источник
54
+ - `defineModel(modelDef: object): this` - добавить модель
55
+ - `getRepository(modelName: string): Repository` - получить репозиторий
56
+
57
+ #### Источник данных
58
+
59
+ Источник описывает способ подключения к базе и используемый адаптер.
60
+ Если адаптер имеет настройки, то они передаются вместе с объектом
61
+ определения источника методом `defineDatasource`, как это показано
62
+ ниже.
63
+
64
+ ```js
65
+ schema.defineDatasource({
66
+ name: 'myMongo', // название нового источника
67
+ adapter: 'mongodb', // название выбранного адаптера
68
+ // настройки адаптера mongodb
69
+ host: '127.0.0.1',
70
+ port: 27017,
71
+ database: 'data'
72
+ });
73
+ ```
74
+
75
+ Параметры источника:
76
+
77
+ - `name: string` уникальное название
78
+ - `adapter: string` выбранный адаптер
79
+
80
+ При желании можно использовать встроенный адаптер `memory`, который хранит
81
+ данные в памяти процесса. У него нет специальных настроек, и он отлично
82
+ подходит для тестов и прототипирования.
33
83
 
34
84
  ```js
35
85
  schema.defineDatasource({
@@ -38,6 +88,127 @@ schema.defineDatasource({
38
88
  });
39
89
  ```
40
90
 
91
+ #### Модель данных
92
+
93
+ Когда источники определены, можно перейти к описанию моделей данных.
94
+ Модель может определять как структуру какого-либо объекта,
95
+ так и являться отражением реальной коллекции базы.
96
+
97
+ Представьте себе коллекцию торговых точек, у каждой из которых имеются
98
+ координаты `lat` и `lng`. Мы можем заранее определить модель для
99
+ объекта координат методом `defineModel` и использовать ее в других
100
+ коллекциях.
101
+
102
+ ```js
103
+ schema.defineModel({
104
+ name: 'latLng', // название новой модели
105
+ properties: { // поля модели
106
+ lat: DataType.NUMBER, // поле широты
107
+ lng: DataType.NUMBER, // поле долготы
108
+ },
109
+ });
110
+ ```
111
+
112
+ Параметры модели:
113
+
114
+ - `name: string` уникальное название (обязательно)
115
+ - `datasource: string` выбранный источник данных
116
+ - `properties: object` определения полей модели
117
+ - `relations: object` определения связей модели
118
+
119
+ Параметр `properties` принимает объект, ключи которого являются именами
120
+ полей, а значением тип поля или объект с дополнительными параметрами.
121
+
122
+ ```js
123
+ schema.defineModel({
124
+ name: 'latLng',
125
+ properties: {
126
+ lat: DataType.NUMBER, // краткое определение поля "lat"
127
+ lng: { // определение поля "lng" с параметром "required"
128
+ type: DataType.NUMBER,
129
+ required: true, // исключает null и undefined
130
+ },
131
+ },
132
+ });
133
+ ```
134
+
135
+ Типы данных:
136
+
137
+ - `DataType.ANY`
138
+ - `DataType.STRING`
139
+ - `DataType.NUMBER`
140
+ - `DataType.BOOLEAN`
141
+ - `DataType.ARRAY`
142
+ - `DataType.OBJECT`
143
+
144
+ Модель `latLng` всего лишь описывает структуру объекта координат, тогда
145
+ как торговая точка должна иметь реальную таблицу в базе. По аналогии с
146
+ предыдущим примером, добавим модель `place`, но дополнительно укажем
147
+ источник данных в параметре `datasource`
148
+
149
+ ```js
150
+ schema.defineModel({
151
+ name: 'place',
152
+ datasource: 'myMemory', // выбранный источник данных
153
+ properties: {
154
+ name: DataType.STRING, // поле для названия торговой точки
155
+ location: { // поле объекта координат
156
+ type: DataType.OBJECT, // допускать только объекты
157
+ model: 'latLng', // определение структуры объекта
158
+ },
159
+ },
160
+ });
161
+ ```
162
+
163
+ В примере выше мы использовали модель `latLng` как структуру допустимого
164
+ значения поля `location`. Возможный документ данной коллекции может
165
+ выглядеть так:
166
+
167
+ ```json
168
+ {
169
+ "id": 1,
170
+ "name": "Burger King at Avenue Mall",
171
+ "location": {
172
+ "lat": 32.412891,
173
+ "lng": 34.7660061
174
+ }
175
+ }
176
+ ```
177
+
178
+ Стоит обратить внимание, что мы могли бы не объявлять параметр `properties`,
179
+ при этом теряя возможность проверки данных перед записью в базу.
180
+
181
+ ```js
182
+ schema.defineModel({
183
+ name: 'place',
184
+ adapter: 'myMemory',
185
+ // параметр "properties" не указан
186
+ });
187
+ ```
188
+
189
+ Параметры поля:
190
+
191
+ - `type: string` тип допустимого значения (обязательно)
192
+ - `itemType: string` тип элемента массива (для `type: 'array'`)
193
+ - `model: string` модель объекта (для `type: 'object'`)
194
+ - `primaryKey: boolean` объявить поле первичным ключом
195
+ - `columnName: string` переопределение названия колонки
196
+ - `columnType: string` тип колонки (определяется адаптером)
197
+ - `required: boolean` объявить поле обязательным
198
+ - `default: any` значение по умолчанию
199
+
200
+ #### Репозиторий
201
+
202
+ В отличие от `latLng`, модель `place` имеет источник данных с названием
203
+ `myMemory`, который был объявлен ранее. Наличие источника позволяет получить
204
+ репозиторий по названию модели.
205
+
206
+ ```js
207
+ const rep = schema.getRepository('place');
208
+ ```
209
+
210
+ ## Пример
211
+
41
212
  Создаем модель `user`
42
213
 
43
214
  ```js
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@e22m4u/js-repository",
3
- "version": "0.0.38",
3
+ "version": "0.0.39",
4
4
  "description": "Абстракция для работы с базами данных для Node.js",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
@@ -237,11 +237,9 @@ export type NormalizedFieldsClause = string[];
237
237
  */
238
238
  export declare type IncludeClause =
239
239
  | string
240
- | string[]
241
240
  | NestedIncludeClause
242
- | NestedIncludeClause[]
243
241
  | NormalizedIncludeClause
244
- | NormalizedIncludeClause[];
242
+ | IncludeClause[];
245
243
 
246
244
  /**
247
245
  * Nested include clause.