@prabink/nestjsx-typeorm-curd
v1.1.0
Published
Nest CRUD for RESTful APIs
Downloads
6
Maintainers
Readme
Typeorm Curd Generator
This code represent how to use Typeorm Curd Generator
Installation
npm i @prabink/nestjsx-typeorm-curd
Also install the following to work with this packages if not installed
npm i @nestjs/typeorm typeorm @nestjs/swagger
Usage/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