0.0.4 • Published 5 months ago

@e22m4u/js-repository-rest-router v0.0.4

Weekly downloads
-
License
MIT
Repository
github
Last release
5 months ago

@e22m4u/js-repository-rest-router

Модуль экспортирует содержимое пакета @e22m4u/js-repository-data-schema и дополнительные декораторы REST-маршрутизатора, позволяющие использовать модели базы данных (TypeScript классы) для описания принимаемых и возвращаемых данных запроса.

REST-маршрутизатор @e22m4u/ts-rest-router
Определение модели @e22m4u/js-repository
Модель (TypeScript класс) @e22m4u/js-repository-decorators

Содержание

Установка

npm install @e22m4u/js-repository-rest-router

Поддержка декораторов

Для включения поддержки декораторов, добавьте указанные ниже опции в файл tsconfig.json вашего проекта.

{
  "emitDecoratorMetadata": true,
  "experimentalDecorators": true
}

Начальная настройка

Прежде чем использовать декораторы, требуется выполнить инъекцию схемы репозиториев Schema в глобальный экземпляр сервиса RepositoryDataSchema как это показано ниже.

import {Schema} from '@e22m4u/js-repository';
import {repositoryDataSchema} from '@e22m4u/js-repository-rest-router';

const schema = new Schema();
repositoryDataSchema.setService(Schema, schema);

В примерах декораторов используется модель City, определение данной модели находится ниже.

import {DataType} from '@e22m4u/js-repository';
import {model} from '@e22m4u/js-repository-decorators';
import {property} from '@e22m4u/js-repository-decorators';
import {getModelDefinitionFromClass} from '@e22m4u/js-repository-decorators';

// определение модели City с помощью декораторов
// (см. README.md пакета @e22m4u/js-repository-decorators)
@model()
class City {
  @property(DataType.STRING)
  name!: string;
  
  @property({
    type: DataType.ARRAY,
    itemType: DataType.NUMBER,
  })
  codes!: number[];
}

// регистрация модели City в схеме репозиториев
// (см. README.md пакета @e22m4u/js-repository-decorators)
schema.defineModel(getModelDefinitionFromClass(City));

Декораторы

Модуль экспортирует следующие декораторы:

@requestBodyWithModel

Декоратор-обертка для @requestBody принимает первым аргументом модель (класс), массив с единственной моделью (создает схему массива объектов указанной схемы), или фабрику возвращающую модель.

Определение:

/**
 * Схема тела объекта:
 *   @requestBodyWithModel(MyModel)
 *   @requestBodyWithModel(() => MyModel)
 *
 * Схема тела массива объектов:
 *   @requestBodyWithModel([MyModel])
 *   @requestBodyWithModel(() => [MyModel])
 *
 * @param model
 */
function requestBodyWithModel<T extends object>(
  model: DecoratorModelInput<T>
): ReturnType<typeof requestBody>

Пример:

import {requestBodyWithModel} from '@e22m4u/js-repository-rest-router';
// peerDependencies
import {postAction} from '@e22m4u/ts-rest-router';
import {restController} from '@e22m4u/ts-rest-router';

// определение контроллера CityController
// (см. README.md пакета @e22m4u/ts-rest-router)
@restController('cities')
class CityController {
  // объявление метода POST /cities
  // (использует базовый путь контроллера)
  @postAction()
  async create(
    // инъекция тела запроса указанной схемы,
    // данные будут проверены согласно модели
    @requestBodyWithModel(City) body: City,
  ) {
    // логика сохранения...
    return {status: 'success', received: body};
  }
}

@responseBodyWithModel

Декоратор-обертка для @responseBody принимает первым аргументом модель (класс), массив с единственной моделью (создает схему массива объектов указанной схемы), или фабрику возвращающую модель.

Определение:

/**
 * Схема тела объекта:
 *   @responseBodyWithModel(MyModel)
 *   @responseBodyWithModel(() => MyModel)
 *
 * Схема тела массива объектов:
 *   @responseBodyWithModel([MyModel])
 *   @responseBodyWithModel(() => [MyModel])
 *
 * @param model
 */
function responseBodyWithModel<T extends object>(
  model: DecoratorModelInput<T>
): ReturnType<typeof responseBody>

Пример:

import {responseBodyWithModel} from '@e22m4u/js-repository-rest-router';
// peerDependencies
import {postAction} from '@e22m4u/ts-rest-router';
import {restController} from '@e22m4u/ts-rest-router';

// определение контроллера CityController
// (см. README.md пакета @e22m4u/ts-rest-router)
@restController('cities')
class CityController {
  // объявление метода POST /cities
  // (использует базовый путь контроллера)
  @postAction()
  // определение схемы данных возвращаемого
  // ответа согласно указанной модели
  @responseBodyWithModel(City)
  async create() {
    return {name: 'Pattaya', codes: [38, 20150]};
  }
}

Тесты

npm run test

Лицензия

MIT