|
@@ -35,7 +35,9 @@ flowchart LR
|
|
|
A[Datasource]-->B[Model]-->С[Repository];
|
|
A[Datasource]-->B[Model]-->С[Repository];
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-## Пример
|
|
|
|
|
|
|
+## Использование
|
|
|
|
|
+
|
|
|
|
|
+#### Точка входа
|
|
|
|
|
|
|
|
Определения источников и моделей хранятся в экземпляре класса `Schema`,
|
|
Определения источников и моделей хранятся в экземпляре класса `Schema`,
|
|
|
и первым шагом в проектировании системы будет создание данного экземпляра.
|
|
и первым шагом в проектировании системы будет создание данного экземпляра.
|
|
@@ -47,14 +49,16 @@ const schema = new Schema();
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
Интерфейс экземпляра `Schema` содержит три основных метода, два из которых
|
|
Интерфейс экземпляра `Schema` содержит три основных метода, два из которых
|
|
|
-позволяют определить источник и модель, а третий возвращает репозиторий по
|
|
|
|
|
-названию модели.
|
|
|
|
|
|
|
+позволяют определить источник данных и модель, а третий возвращает репозиторий
|
|
|
|
|
+по названию модели.
|
|
|
|
|
|
|
|
- `defineDatasource(datasourceDef: object): this`
|
|
- `defineDatasource(datasourceDef: object): this`
|
|
|
- `defineModel(modelDef: object): this`
|
|
- `defineModel(modelDef: object): this`
|
|
|
- `getRepository(modelName: string): Repository`
|
|
- `getRepository(modelName: string): Repository`
|
|
|
|
|
|
|
|
-Источник данных описывает способ подключения к базе, и используемый адаптер.
|
|
|
|
|
|
|
+#### Источник данных
|
|
|
|
|
+
|
|
|
|
|
+Источник описывает способ подключения к базе, и используемый адаптер.
|
|
|
Если адаптер имеет настройки, то они передаются в объекте определения
|
|
Если адаптер имеет настройки, то они передаются в объекте определения
|
|
|
источника методом `defineDatasource`, как это показано ниже.
|
|
источника методом `defineDatasource`, как это показано ниже.
|
|
|
|
|
|
|
@@ -80,9 +84,83 @@ schema.defineDatasource({
|
|
|
});
|
|
});
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-Когда источники определены, можно перейти на следующий слой абстракции,
|
|
|
|
|
-где описываются модели данных. Модель может определять как структуру
|
|
|
|
|
-какого-либо объекта, так и являться отражением реальной коллекции базы.
|
|
|
|
|
|
|
+#### Модель данных
|
|
|
|
|
+
|
|
|
|
|
+Когда источники данных определены, можно перейти на следующий уровень
|
|
|
|
|
+абстракции, где описываются модели данных. Модель может определять как
|
|
|
|
|
+структуру какого-либо объекта, так и являться отражением реальной
|
|
|
|
|
+коллекции базы.
|
|
|
|
|
+
|
|
|
|
|
+Представьте себе коллекцию торговых точек, у каждой из которых имеются
|
|
|
|
|
+координаты `lat` и `lng`. Мы могли бы заранее определить модель для
|
|
|
|
|
+объекта координат, и использовать его в других коллекциях.
|
|
|
|
|
+
|
|
|
|
|
+```js
|
|
|
|
|
+schema.defineModel({
|
|
|
|
|
+ name: 'latLng', // название новой модели
|
|
|
|
|
+ properties: { // поля модели
|
|
|
|
|
+ lat: DataType.NUMBER, // поле широты
|
|
|
|
|
+ lng: DataType.NUMBER, // поле долготы
|
|
|
|
|
+ },
|
|
|
|
|
+});
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+Модель `latLng` всего лишь описывает структуру объекта координат, тогда
|
|
|
|
|
+как торговая точка должна иметь реальную таблицу в базе. По аналогии с
|
|
|
|
|
+предыдущим примером, добавим модель `place`, но укажем не только название
|
|
|
|
|
+модели и ее поля, а еще и источник данных в параметре `datasource`
|
|
|
|
|
+
|
|
|
|
|
+```js
|
|
|
|
|
+schema.defineModel({
|
|
|
|
|
+ name: 'place',
|
|
|
|
|
+ datasource: 'myMemory', // выбранный источник данных
|
|
|
|
|
+ properties: {
|
|
|
|
|
+ name: DataType.STRING, // поле для названия торговой точки
|
|
|
|
|
+ location: { // поле объекта координат
|
|
|
|
|
+ type: DataType.OBJECT, // допускать только объекты
|
|
|
|
|
+ model: 'latLng', // определение структуры объекта
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+});
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+В примере выше мы использовали модель `latLng` как структуру допустимого
|
|
|
|
|
+значения поля `location`. Возможный документ данной коллекции может
|
|
|
|
|
+выглядеть так:
|
|
|
|
|
+
|
|
|
|
|
+```json
|
|
|
|
|
+{
|
|
|
|
|
+ "id": 1,
|
|
|
|
|
+ "name": "Burger King at Avenue Mall",
|
|
|
|
|
+ "location": {
|
|
|
|
|
+ "lat": 32.412891,
|
|
|
|
|
+ "lng": 34.7660061
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+Стоит обратить внимание, что мы могли бы не объявлять параметр `properties`,
|
|
|
|
|
+при этом теряя возможность проверки данных перед записью в базу.
|
|
|
|
|
+
|
|
|
|
|
+```js
|
|
|
|
|
+schema.defineModel({
|
|
|
|
|
+ name: 'place',
|
|
|
|
|
+ adapter: 'myMemory',
|
|
|
|
|
+ // параметр "properties" не указан
|
|
|
|
|
+});
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+#### Репозиторий
|
|
|
|
|
+
|
|
|
|
|
+В отличие от `latLng`, модель `place` имеет источник данных с названием
|
|
|
|
|
+`myMemory`, который был объявлен ранее. Наличие источника позволяет получить
|
|
|
|
|
+репозиторий для данной модели.
|
|
|
|
|
+
|
|
|
|
|
+```js
|
|
|
|
|
+const rep = schema.getRepository('place');
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+## Пример
|
|
|
|
|
|
|
|
Создаем модель `user`
|
|
Создаем модель `user`
|
|
|
|
|
|