Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/topfullstack/nestjs-mongoose-crud
Nest.js crud module for mongoose models without `nestjsx/crud`
https://github.com/topfullstack/nestjs-mongoose-crud
crud mongoose nestjs restful-api typegoose
Last synced: 9 days ago
JSON representation
Nest.js crud module for mongoose models without `nestjsx/crud`
- Host: GitHub
- URL: https://github.com/topfullstack/nestjs-mongoose-crud
- Owner: topfullstack
- Created: 2019-10-08T10:07:13.000Z (about 5 years ago)
- Default Branch: master
- Last Pushed: 2023-01-11T22:45:11.000Z (almost 2 years ago)
- Last Synced: 2024-10-16T15:23:54.540Z (23 days ago)
- Topics: crud, mongoose, nestjs, restful-api, typegoose
- Language: TypeScript
- Homepage:
- Size: 669 KB
- Stars: 262
- Watchers: 8
- Forks: 37
- Open Issues: 21
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# NestJs + Mongoose CRUD
Nest.js crud module for mongoose models **without** `@nestjsx/crud`
## Important
- NestJs 6.x ----> nestjs-mongoose-crud v1.x
- NestJs 7.x ----> nestjs-mongoose-crud v2.x
- fix #7> Nest.js + Typegoose 中文视频教程请移步哔哩哔哩: [全栈之巅](https://space.bilibili.com/341919508)
## Usage
1. Install and setup [nestjs-typegoose](https://github.com/kpfromer/nestjs-typegoose#basic-usage) or [nestjs-mongoose](https://docs.nestjs.com/techniques/mongodb)
1. Install
```shell
yarn add nestjs-mongoose-crud
# or
npm i nestjs-mongoose-crud
```
1. Import model to module:
```ts
import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { TypegooseModule } from 'nestjs-typegoose';
import { User } from './user.model';@Module({
imports: [
TypegooseModule.forFeature([User])
],
controllers: [UsersController]
})
export class UsersModule {}
```
1. Add `@Crud()` decorator and inject imported model to `model` property.
```ts
import { Controller } from '@nestjs/common';
import { Crud } from 'nestjs-mongoose-crud'
import { User } from './user.model';
import { InjectModel } from 'nestjs-typegoose';
import { ModelType } from '@typegoose/typegoose/lib/types';@Crud({
model: User
})
@Controller('users')
export class UsersController {
constructor(@InjectModel(User) public model: ModelType) {}
}
```1. Test your CRUD APIs: http://localhost:3000/users
## APIs
e.g. `@Crud()` for `UsersController`
|METHOD|PATH|DESC|
|--|--|--|
|GET|/users|Get all users|
|GET|/users/:id|Get a user|
|POST|/users|Create a user|
|PUT|/users/:id|update a user|
|DELETE|/users/:id|Delete a user|> You can find all routes and DTOs by setup [swagger](https://docs.nestjs.com/recipes/swagger)
## Query
Use a JSON (in string) `query` parameter to find records:[/users?query={"where":{"username":"user1","age":{"$gt":18}},"sort":"-_id","limit":10,"page":2,"populate":"friends"}]()
## Interfaces
```ts
export interface PaginateKeys {
data?: string
total?: string
lastPage?: string
currentPage?: string
}export interface CrudRoute {
decorators?: MethodDecorator[]
}
export interface CrudRouteWithDto extends CrudRoute {
dto?: any
transform?: (data: any) => any
}
export interface CrudRouteForFind extends CrudRoute {
paginate?: PaginateKeys | false
limit?: number
populate?: string | any
sort?: string | any
where?: any
}
export interface CrudRouteForFindOne extends CrudRoute {
populate?: string | any
where?: any
select?: any
}export interface CrudRoutes {
grid?: false,
form?: false,
find?: CrudRouteForFind | false,
findOne?: CrudRouteForFindOne | false,
create?: CrudRouteWithDto | false,
update?: CrudRouteWithDto | false,
delete?: CrudRoute | false,}
export interface CrudOptions {
routes?: CrudRoutes
}
export interface OptionItem {
text: string
value: string
}
export interface Field {
label?: string
icon?: string
type?: 'hide' | 'text' | 'input' | 'autocomplete' | 'textarea' | 'number' | 'checkbox' | 'checkbox-button' | 'radio' | 'date' | 'dates' | 'week' | 'month' | 'year' | 'daterange' | 'time' | 'datetime' | 'datetimerange' | 'switch' | 'yesno' | 'slider' | 'password' | 'color' | 'select' | 'cascader' | 'transfer' | 'rate' | 'tag' | 'image' | 'button' | 'json-editor' | 'upload-file' | 'image-uploader' | 'tree-select' | 'video-uploader' | 'quill-editor' | 'markdown-editor' | 'bmap' | 'codemirror' | 'gallery'
listable?: boolean
editable?: boolean
attrs?: any
layout?: number
tip?: string
options?: OptionItem[]
class?: string | string[]
style?: any
width?: string | number
[key: string]: any
column?: Field[]
}export interface Fields {
[key: string]: Field
}export interface AvueCrudOption {
addBtn?: boolean
addRowBtn?: boolean
align?: string
border?: boolean
calcHeight?: number
cancelBtnTitle?: string
columnBtn?: boolean
dataType?: string
cellBtn?: boolean
dateBtn?: boolean
cancelBtn?: boolean
dateDefault?: boolean
dicData?: any
dicMethod?: string
dicQuery?: any
dicUrl?: string
delBtn?: boolean
defaultSort?: any
dialogFullscreen?: boolean
dialogEscape?: boolean
dialogClickModal?: boolean
dialogCloseBtn?: boolean
dialogModal?: boolean
dialogTop?: string | number
dialogType?: string
dialogWidth?: string | number
dialogHeight?: string | number
defaultExpandAll?: boolean
expandRowKeys?: string[]
editBtn?: boolean
emptyText?: string
expand?: boolean
expandWidth?: number
expandFixed?: boolean
excelBtn?: boolean
filterBtn?: boolean
formWidth?: string | number
height?: number
header?: boolean
index?: boolean
indexLabel?: string
indexWidth?: number
indexFixed?: boolean
rowKey?: string
indeterminate?: boolean
labelWidth?: number
maxHeight?: number
menu?: boolean
menuWidth?: number
menuXsWidth?: number
menuAlign?: string
menuType?: string
menuBtnTitle?: string
pageSize?: string
pageSizes?: number[]
printBtn?: boolean
refreshBtn?: boolean
saveBtn?: boolean
updateBtn?: boolean
cancalBtn?: boolean
saveBtnTitle?: string
selection?: boolean
selectionWidth?: number
selectionFixed?: boolean
searchBtn?: boolean
selectable?: boolean
reserveSelection?: true
selectClearBtn?: boolean
showHeader?: boolean
showSummary?: boolean
size?: string
sumColumnList?: string[]
stripe?: boolean
tip?: string
tipPlacement?: string
title?: string
checkStrictly?: boolean
updateBtnTitle?: string
viewBtn?: boolean
width?: number
column?: Field[]
group?: Field[]
}export interface AvueCrudConfig {
option?: AvueCrudOption
[key: string]: any
}export interface CrudOptionsWithModel extends CrudOptions {
name?: string | string[],
model: any
fields?: Fields
config?: ((instance?: any) => AvueCrudConfig | Promise) | AvueCrudConfig
}```