@prabink/nestjsx-typeorm-curd
v1.1.0
Published
Nest CRUD for RESTful APIs
Maintainers
Readme
Typeorm Curd Generator
This code represent how to use Typeorm Curd Generator
Installation
npm i @prabink/nestjsx-typeorm-curdAlso install the following to work with this packages if not installed
npm i @nestjs/typeorm typeorm @nestjs/swaggerUsage/Examples
Service Using (TypeOrmCurdService)
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { TypeOrmCurdService } from '@Pathto_typeorm-curd/typeorm-curd.service';
import { Repository } from 'typeorm';
import { User } from '../entities/user.entity';
@Injectable()
export class UserService extends TypeOrmCurdService<User> {
constructor(
@InjectRepository(User)
public readonly usersRepository: Repository<User>,
) {
super(usersRepository);
}
}Controller Using (TypeOrmCurdControllerFactory(options?: TypeOrmCurdFactoryOptions))
import { Controller } from '@nestjs/common';
import { ApiTags } from '@nestjs/swagger';
import { TypeOrmCurdControllerFactory } from 'src/shared/classes/typeorm-curd/typeorm-curd.factory';
import { CreateUserDto } from '../dto/create-user.dto';
import { UpdateUserDto } from '../dto/update-user.dto';
import { User } from '../entities/user.entity';
import { UserService } from '../services/user.service';
@ApiTags('User Controller')
@Controller('users')
export class UserController extends TypeOrmCurdControllerFactory<User>({
modal: {
type: User,
},
routes: {
findAll: {
decorators: [],
},
create: {
dto: CreateUserDto,
},
update: {
dto: UpdateUserDto,
},
},
query: {
join: [{ field: 'avatar' }, { field: 'role' }],
},
}) {
constructor(public readonly userService: UserService) {
super(userService);
}
}TypeOrmCurdFactoryOptions
modal
{
modal: {
type: any,
},
}| Parameter | Type | Required |
| :-------- | :---- | :------- |
| type | any | true |
Example:
{
modal: {
type: User,
},
}routes
{
routes?: {
findAll?: {
interceptors?: any[];
decorators?: (PropertyDecorator | MethodDecorator)[];
};
count?: {
interceptors?: any[];
decorators?: (PropertyDecorator | MethodDecorator)[];
};
findById?: {
interceptors?: any[];
decorators?: (PropertyDecorator | MethodDecorator)[];
};
create?: {
interceptors?: any[];
decorators?: (PropertyDecorator | MethodDecorator)[];
dto:any
};
update?: {
interceptors?: any[];
decorators?: (PropertyDecorator | MethodDecorator)[];
dto:any
};
delete?: {
interceptors?: any[];
decorators?: (PropertyDecorator | MethodDecorator)[];
};
};
}| Parameter | Type | Required |
| :-------- | :------- | :------- |
| findAll | object | false |
Example:
routes: {
findAll: {
interceptors: [],
decorators: [],
},
}| Parameter | Type | Required |
| :-------- | :------- | :------- |
| count | object | false |
Example:
routes: {
count: {
interceptors: [],
decorators: [],
},
}| Parameter | Type | Required |
| :--------- | :------- | :------- |
| findById | object | false |
Example:
routes: {
findById: {
interceptors: [],
decorators: [],
},
}| Parameter | Type | Required |
| :-------- | :------- | :------- |
| create | object | false |
Example:
routes: {
create: {
interceptors: [],
decorators: [],
dto: CreateUserDto
},
}| Parameter | Type | Required |
| :-------- | :------- | :------- |
| update | object | false |
Example:
routes: {
update: {
interceptors: [],
decorators: [],
dto: UpdateUserDto
},
}| Parameter | Type | Required |
| :-------- | :------- | :------- |
| delete | object | false |
Example:
routes: {
delete: {
interceptors: [],
decorators: []
},
}query
{
query: {
fields: QueryFields;
filter: QueryFilter[];
or: QueryFilter[];
join: QueryJoin[];
sort: QuerySort[];
pagination: boolean;
limit: number;
offset: number;
page: number;
cache: boolean;
includeDeleted: boolean;
},
}| Parameter | Type | Required |
| :--------------- | :---------------------------------------------------------------------------------- | :------- |
| fields | Array | false |
| filter | Array<{field:string, operator:QueryCondOperator, value?:any}> | false |
| or | Array<{field:string, operator:QueryCondOperator, value?:any}> | false |
| join | Array<{field:string, select?:Array}> | false |
| sort | Array<{field:string, order?:QuerySortOperator}> | false |
| pagination | boolean | false |
| limit | number | false |
| offset | number | false |
| page | number | false |
| cache | boolean | false |
| includeDeleted | boolean | false |
Reference Type
QuerySortOperator
| Value | Description |
| :----- | :------------------------------------------------------------------------------------- |
| ASC | Ascending means smallest to largest, 0 to 9, and/or A to Z |
| DESC | Ascending means a series of data is arranged from high to low or largest to smallest |
QueryCondOperator
filter conditions
$eq(=, equal)$ne(!=, not equal)$gt(>, greater than)$lt(<, lower that)$gte(>=, greater than or equal)$lte(<=, lower than or equal)$starts(LIKE val%, starts with)$ends(LIKE %val, ends with)$cont(LIKE %val%, contains)$excl(NOT LIKE %val%, not contains)$in(IN, in range, accepts multiple values)$notin(NOT IN, not in range, accepts multiple values)$isnull(IS NULL, is NULL, doesn't accept value)$notnull(IS NOT NULL, not NULL, doesn't accept value)$between(BETWEEN, between, accepts two values)$eqL(LOWER(field) =, equal)$neL(LOWER(field) !=, not equal)$startsL(LIKE|ILIKE val%)$endsL(LIKE|ILIKE %val, ends with)$contL(LIKE|ILIKE %val%, contains)$exclL(NOT LIKE|ILIKE %val%, not contains)$inL(LOWER(field) IN, in range, accepts multiple values)$notinL(LOWER(field) NOT IN, not in range, accepts multiple values)
Frontend usage
From frontend you can pass the query params as follows
Without using qs package
| Parameter | Usage |
| :--------------- | :--------------------------------------------------------------------- |
| fields | ?fields[0]=A&fields[1]=B |
| filter | ?filter[0][field]=userName&filter[0][operator]=$eq&filter[0][value]=AB |
| or | ?or[0][field]=userName&or[0][operator]=$eq&or[0][value]=AB |
| join | ?join[0][field]=role // Use?join[0][field]=* for all |
| sort | ?sort[0][field]=role&sort[0][order]=DESC |
| limit | ?limit=50 |
| offset | ?offset=0 |
| pagination | ?pagination=true |
| page | ?page=1 |
| cache | ?cache=false |
| includeDeleted | ?includeDeleted=false |
With using qs package
const qs = require('qs');
const query = qs.stringify(
{
fields: ['id', 'userName', 'email'], // Use [] for all
filter: [{ field: 'userName', operator: '$eq', value: 'AB' }],
or: [{ field: 'userName', operator: '$eq', value: 'AB' }],
join: [{ field: 'role' }, { field: 'avatar' }], // Use ['*'] for all
sort: [{ field: 'userName', order: 'DESC' }],
limit: 50,
offset: 0,
pagination: true,
page: 1,
cache: false,
includeDeleted: false,
},
{
encodeValuesOnly: true, // prettify URL
},
);
await request('/api/users?{query}');Authors
Tech Stack
Server: Node, Postgress, NestJs, Typescript
