@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 +180 -9
- package/package.json +1 -1
- package/src/filter/filter-clause.d.ts +1 -3
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
|
-
Опционально устанавливаем
|
|
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
|
-
|
|
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
|
-
|
|
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
|
@@ -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
|
-
|
|
|
242
|
+
| IncludeClause[];
|
|
245
243
|
|
|
246
244
|
/**
|
|
247
245
|
* Nested include clause.
|