denwa-nest-shared
v1.2.7
Published
Shared NestJS module for DTO validation, RBAC, TypeORM query building, and OpenAPI client
Readme
denwa-nest-shared
Общая shared-библиотека для микросервисов и приложений монорепозитория на базе NestJS, GraphQL, OpenAPI (Swagger) и TypeORM.
Возможности
- Единая валидация схем (
ApiValidationProperty): один декоратор объединяет Swagger (@ApiProperty), GraphQL (@Field) и валидациюclass-validator(@IsString,@Min,@IsOptionalи др.). - Контроль доступа к полям (
MutableBy,sanitizeDto): ограничение редактирования отдельных полей DTO на основе ролей пользователя. - Генератор запросов TypeORM (
createQueryData): построение параметров выборки с пагинацией, мультипоиском (ILike), фильтрацией и диапазонами (fromToFields). - Гарды и перехватчики ролей (
FieldsRolesInterceptor,@CheckFieldsRoles,@Roles,@Public): управление доступом на уровне резолверов и полей GraphQL. - OpenAPI Axios клиент (
OpenApiAxios): типобезопасный HTTP-клиент на базе схемы OpenAPI. - Утилиты: транслитерация (
translit,checkTranslit), форматирование телефонов (formatPhone), валидационный пайп (ValidationPipe), интеграция с OpenSearch (OpenSearchCore).
Установка
npm install denwa-nest-sharedPeer Dependencies
Убедитесь, что в вашем сервисе установлены необходимые peer-зависимости:
npm install @nestjs/common @nestjs/graphql @nestjs/swagger class-validator class-transformer graphql typeorm rxjsБыстрый старт
1. Определение DTO
import { InputType } from '@nestjs/graphql';
import { ApiValidationProperty, MutableBy } from 'denwa-nest-shared';
@InputType()
export class CreateProductDto {
@ApiValidationProperty({
type: 'string',
description: 'Название товара',
min: 2,
max: 255,
})
nameRU: string;
@ApiValidationProperty({
type: 'int',
min: 0,
isOptional: true,
})
@MutableBy(['super_admin', 'admin'])
priority?: number;
}2. Вложенные DTO
Для вложенных объектов передавайте класс DTO через objectType (или swaggerType — для обратной
совместимости, включая [SomeDto]). Тогда @Field, @ValidateNested и @Type проставляются
автоматически, а ошибочный IsString не эмитится.
import { InputType } from '@nestjs/graphql';
import { ApiValidationProperty } from 'denwa-nest-shared';
@InputType()
class ImageDto {
@ApiValidationProperty({ type: 'string', max: 256 })
tempName: string;
}
@InputType()
export class UpdateProductDto {
@ApiValidationProperty({
type: 'object',
objectType: ImageDto,
isArray: true,
isOptional: true,
})
images?: ImageDto[];
}3. Фильтрация и поиск с TypeORM
import { createQueryData, encodeCursor, decodeCursor } from 'denwa-nest-shared';
import { Repository } from 'typeorm';
async function getUsers(userRepository: Repository<User>, query: any) {
const queryData = createQueryData({
page: query.page ?? 1,
limit: query.limit ?? 20,
sortField: 'createdAt',
sortOrder: 'desc',
filterType: 'and',
filter: query.filter,
search: query.search,
searchFields: ['name', 'email'],
// ⚡ Опции для высоконагруженных таблиц (сотни тысяч / миллионы строк):
cursor: query.cursor, // base64url строка или { id, sortValue, sortValues, order, field }
sortFields: [ // произвольное число полей сортировки с разными направлениями
{ field: 'priority', order: 'desc' },
{ field: 'createdAt', order: 'asc' },
],
select: ['id'], // для двухшагового Deferred Join
extraRow: true, // take: limit + 1 (проверка следующей страницы без count(*))
maxPage: 100, // защита от глубокого OFFSET
});
return await userRepository.find(queryData);
}Сборка и тестирование
# Линтинг
npm run lint
# Форматирование
npm run format
# Тесты
npm test
# Сборка (ESM и CJS)
npm run buildЛицензия
ISC
