Настраиваемая система управления данными
Посмотри contributing.md для вклада в разработку системы.
Посмотри frontend.md. Здесь расположена информация о /dev роутах
Установите зависимости и запустите проект после конфигурирования необходимых файлов.
npm install
npm run start:newВ дальнейшем, если модели данных не были изменены, то для запуска нужна команда:
npm startПри изменении моделей необходимо сделать новый билд приложения через команду:
npm run start:newПримечение: запуск start:new делает новый билд приложения и удаляет старую базу данных! Поэтому, для стандатного запуска приложения нужно запускать start.
Папка для конфигурирования приложения имеет название "src".
Она состоит из:
- папки "Models" - в ней хранятся файлы с классами описывающими модели данных;
- файл "Scope" - где, в перечислении, находятся названия классов моделей.
Создайте свою модель в папке "Models".
Предположим, что мы конфигурируем приложение под нужды учёта книг для Библиотеки:
@ModelConfig()
class Book extends Model {
@Field({ type: FieldType.STRING })
name: string | undefined;
@Field({ type: FieldType.STRING })
ISBN: string | undefined;
}
Класс создаваемой модели наследуется от класса в ./packages/models/Model.ts
| Декоратор | Парметры | Описание |
|---|---|---|
@ModelConfig |
modelName |
Объявление модели данных |
@Field |
type, required, unique, defaultValue |
Объявление простого поля модели |
Создайте ещё одну модель в папке "Models".
Это может быть модель отделения библиотеки, которое представляет какую-то группу книг одной направленности:
@ModelConfig()
export class Group extends Model {
@Field({ type: FieldType.STRING })
name: string | undefined;
@HasMany({ model: Scope.Book })
books: string | undefined;
}
В данном случае, мы хотим чтобы одно отделение библиотеки содержало множество книг. Поэтому, нам подходит связь "один ко многим".
| Декоратор | Парметры | Описание |
|---|---|---|
@HasOne |
model |
Объявление связи один к одному |
@HasMany |
model |
Объявление связи один ко многим |
Смысл записи для конкретного примера: группа (class Group) имеет много (@HasMany) книг (model: Scope.Book). Аналогичная логика и для декоратора @HasOne.
В объект параметра декоратора отношения передаётся не класс, а его название из перечисления Scope. Его также необходимо объявить (пример):
export enum Scope {
Book,
Group,
}
Здесь должны быть названия всех объявленных в папке src/Models моделей.
Для описания операций над той или иной моделью можно использовать декоратор @RoutesConfig.
В аргументы декоратор принимает массив функций из папки decorators/routes:
GET_ALL- получить все записиGET_ONE- получить конкретную запись по idCREATE- создать записьUPDATE- обновить запись по idDELETE- удалить запись по id
В функции CREATE и UPDATE можно передать параметры с необходимыми полями для запроса. Это может быть полезно, например, если нужно разшить изменение лишь некоторых полей в запросе UPDATE.
Примечание: В дженерик декоратора стоит передать класс модели, для которой мы этот самый декоратор используем. Это определит тип передаваемых функций и их переменных.
Предположим, нужно ограничить запросы с сущностью Book до запросов на получение и изменение:
@ModelConfig()
@RoutesConfig<Book>([GET_ALL(), GET_ONE(), UPDATE(["title"])])
class Book extends Model {
@Field({ type: FieldType.STRING })
title: string | undefined;
@HasOne({ model: Scope.Author })
author: string | undefined;
}
Передали в аргументы декоратора @RoutesConfig массив функций определённых типов запросов. Также, ограничили запрос на изменение данных в модели "Book".
В итоге, для примера сущности "Book" будут доступны следующие запросы:
GET_ALL- получить все записи "Book"GET_ONE- получить конкретную запись "Book" по idUPDATE- обновить запись "Book" по id (доступно для изменения только полеtitle)
Приложение конфигурируется и запускается через функцию AppConfigurator.
AppConfigurator([Book, Group, Author], {
serverPort: process.env.SERVER_PORT as any,
database: {
dialect: "postgres",
host: process.env.DB_HOST as any,
port: process.env.DB_PORT as any,
username: process.env.DB_USER as any,
password: process.env.DB_PASS as any,
database: process.env.DB_NAME as any,
},
});
Передаются следующие параметры:
- массив классов моделей
- конфигурационный объект
Чтобы запустить проект, создайте файл .env в корне проекта
DB_USER - имя пользователя БД
DB_PASS - пароль БД
DB_HOST - хост БД
DB_PORT - порт БД
DB_NAME - имя БД
SERVER_PORT - порт для разворачивания сервера
Документация размащается по адресу /api-docs.
Node, Express, Sequileze, Swagger-UI