{"_id":"@aaroncadillac/crudify-mongo","_rev":"11-36ba7a0aee950b602b36de5e4e513a1d","name":"@aaroncadillac/crudify-mongo","dist-tags":{"latest":"1.8.2"},"versions":{"1.2.0":{"name":"@aaroncadillac/crudify-mongo","version":"1.2.0","author":{"name":"aaroncadillac"},"license":"MPL-2.0","_id":"@aaroncadillac/crudify-mongo@1.2.0","maintainers":[{"name":"aaroncadillac","email":"aaron.hmaya@gmail.com"}],"homepage":"https://github.com/aaroncadillac/crudify-mongo#readme","bugs":{"url":"https://github.com/aaroncadillac/crudify-mongo/issues"},"dist":{"shasum":"d91fd10819848152a40a8cab3e2f0baee72ed095","tarball":"https://registry.npmjs.org/@aaroncadillac/crudify-mongo/-/crudify-mongo-1.2.0.tgz","fileCount":14,"integrity":"sha512-2PdclAHCXBjQSwnYrywK1SUgDPsfpx4Hzmw9zI9M7lY+3hkjghJEzM5TdGBZVtZlaq/JhdstlqZuizea3mT0OA==","signatures":[{"sig":"MEUCIEs7qk+YYKtFnbAtK3Q4rS685QnX91tL8S+mHAH8Rf3JAiEAjmGETkaJGU/ADelmQnLLiRQFDdw3UaW0c9Z7wcPERRA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31216},"main":"crudify.js","type":"module","gitHead":"fe4124d23c56a167386528434343f4946a3c780c","private":false,"scripts":{"test":"yarn node --experimental-vm-modules $(yarn bin jest)"},"_npmUser":{"name":"aaroncadillac","email":"aaron.hmaya@gmail.com"},"repository":{"url":"git+ssh://git@github.com/aaroncadillac/crudify-mongo.git","type":"git"},"_npmVersion":"10.7.0","description":"An automatic CRUD generator for fastify","directories":{},"_nodeVersion":"20.15.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","fastify":"^4.28.1","mongoose":"^8.5.1","supertest":"^7.0.0","@shelf/jest-mongodb":"^4.3.2","mongoose-paginate-v2":"^1.8.2"},"_npmOperationalInternal":{"tmp":"tmp/crudify-mongo_1.2.0_1721767026037_0.17690640581898176","host":"s3://npm-registry-packages"}},"1.4.0":{"name":"@aaroncadillac/crudify-mongo","version":"1.4.0","author":{"name":"aaroncadillac"},"license":"MPL-2.0","_id":"@aaroncadillac/crudify-mongo@1.4.0","maintainers":[{"name":"aaroncadillac","email":"aaron.hmaya@gmail.com"}],"homepage":"https://github.com/aaroncadillac/crudify-mongo#readme","bugs":{"url":"https://github.com/aaroncadillac/crudify-mongo/issues"},"dist":{"shasum":"c4859b3da6675804ecf8be6a6a95c9a31fa9b988","tarball":"https://registry.npmjs.org/@aaroncadillac/crudify-mongo/-/crudify-mongo-1.4.0.tgz","fileCount":14,"integrity":"sha512-SNdtEM7KAXoCdVn5gUuaybgviKSpwphDw40IZHRmJBLQf6ESj+92CJ15g/89EqvL+EnFbS2nzzmmVU/zJRmUqg==","signatures":[{"sig":"MEQCIEqqT82idnG9Wt0bNcws2gO3bkiwxr4cWNB+WxKgoTJRAiAwofLYk3WsCmErbNN1mCVaKhhHufoPx35CgC+Q0rPyvg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31225},"main":"crudify.js","type":"module","gitHead":"44bf5605b9984984bbce5764cb545f47205ff2d5","private":false,"scripts":{"test":"yarn node --experimental-vm-modules $(yarn bin jest)"},"_npmUser":{"name":"aaroncadillac","email":"aaron.hmaya@gmail.com"},"repository":{"url":"git+ssh://git@github.com/aaroncadillac/crudify-mongo.git","type":"git"},"_npmVersion":"10.8.2","description":"An automatic CRUD generator for fastify","directories":{},"_nodeVersion":"20.17.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","fastify":"^4.28.1","mongoose":"^8.5.1","supertest":"^7.0.0","@shelf/jest-mongodb":"^4.3.2","mongoose-paginate-v2":"^1.8.2"},"_npmOperationalInternal":{"tmp":"tmp/crudify-mongo_1.4.0_1725013399687_0.07687421776748504","host":"s3://npm-registry-packages"}},"1.6.0":{"name":"@aaroncadillac/crudify-mongo","version":"1.6.0","author":{"name":"aaroncadillac"},"license":"MPL-2.0","_id":"@aaroncadillac/crudify-mongo@1.6.0","maintainers":[{"name":"aaroncadillac","email":"aaron.hmaya@gmail.com"}],"homepage":"https://github.com/aaroncadillac/crudify-mongo#readme","bugs":{"url":"https://github.com/aaroncadillac/crudify-mongo/issues"},"dist":{"shasum":"d67d897700eee0b58b7216cdead83f6b96753b4c","tarball":"https://registry.npmjs.org/@aaroncadillac/crudify-mongo/-/crudify-mongo-1.6.0.tgz","fileCount":14,"integrity":"sha512-Gd59Fy/gjeKzqy4hgECsQCQ2TVrJEUwOKW88piNvl3V2pjKYgJCeK5H+gSQReqL4hvcOemu6C6Fk+NwA5b0VaA==","signatures":[{"sig":"MEQCIDOUamgCAbw//I687uFtFNhD75M1Xdv4yTGd+hghHCyqAiArRd80KUmZWZNjDXT80lS3tR0VBJHcufOKRG/Ke6ao7w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":36033},"main":"crudify.js","type":"module","gitHead":"ef70b9c0770e655768318d48b60307299221b203","private":false,"scripts":{"test":"yarn node --experimental-vm-modules $(yarn bin jest)"},"_npmUser":{"name":"aaroncadillac","email":"aaron.hmaya@gmail.com"},"repository":{"url":"git+ssh://git@github.com/aaroncadillac/crudify-mongo.git","type":"git"},"_npmVersion":"10.8.2","description":"An automatic CRUD generator for fastify","directories":{},"_nodeVersion":"20.19.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","fastify":"^4.28.1","mongoose":"^8.5.1","supertest":"^7.0.0","@shelf/jest-mongodb":"^4.3.2","mongoose-paginate-v2":"^1.8.2"},"_npmOperationalInternal":{"tmp":"tmp/crudify-mongo_1.6.0_1747136928958_0.9106751484342903","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"@aaroncadillac/crudify-mongo","version":"1.7.0","author":{"name":"aaroncadillac"},"license":"MPL-2.0","_id":"@aaroncadillac/crudify-mongo@1.7.0","maintainers":[{"name":"aaroncadillac","email":"aaron.hmaya@gmail.com"}],"homepage":"https://github.com/aaroncadillac/crudify-mongo#readme","bugs":{"url":"https://github.com/aaroncadillac/crudify-mongo/issues"},"dist":{"shasum":"668dac35d1cb5ea474c94bc21b961dc25a455bbf","tarball":"https://registry.npmjs.org/@aaroncadillac/crudify-mongo/-/crudify-mongo-1.7.0.tgz","fileCount":14,"integrity":"sha512-+rgMFUYfJrKiQ+LAhJ/5emgAjf8gewNKy3ljVTPk8t0vY8H/1NIEfz9h2f0s7yn5WAUk5EJ9ZSfxy3NAoHtGlA==","signatures":[{"sig":"MEQCIEET9TQRzarg3IWdzz4PrAgN239741tXiO+W7YOwiIzNAiBhK6WlIZ1VdrHp3Apukst32FUC8x8w/lY0MmaFZzA6eA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":36022},"main":"crudify.js","type":"module","gitHead":"22bb768ca6648db440af64bcdd05246494c48d8a","private":false,"scripts":{"test":"yarn node --experimental-vm-modules $(yarn bin jest)"},"_npmUser":{"name":"aaroncadillac","email":"aaron.hmaya@gmail.com"},"repository":{"url":"git+ssh://git@github.com/aaroncadillac/crudify-mongo.git","type":"git"},"_npmVersion":"10.8.2","description":"An automatic CRUD generator for fastify","directories":{},"_nodeVersion":"20.19.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","fastify":"^4.28.1","mongoose":"^8.5.1","supertest":"^7.0.0","@shelf/jest-mongodb":"^4.3.2","mongoose-paginate-v2":"^1.8.2"},"_npmOperationalInternal":{"tmp":"tmp/crudify-mongo_1.7.0_1747253995046_0.9353755805992978","host":"s3://npm-registry-packages-npm-production"}},"1.7.1":{"name":"@aaroncadillac/crudify-mongo","version":"1.7.1","author":{"name":"aaroncadillac"},"license":"MPL-2.0","_id":"@aaroncadillac/crudify-mongo@1.7.1","maintainers":[{"name":"aaroncadillac","email":"aaron.hmaya@gmail.com"}],"homepage":"https://github.com/aaroncadillac/crudify-mongo#readme","bugs":{"url":"https://github.com/aaroncadillac/crudify-mongo/issues"},"dist":{"shasum":"e383c979435517ed3a6b91c7b54c2804b34f5ac4","tarball":"https://registry.npmjs.org/@aaroncadillac/crudify-mongo/-/crudify-mongo-1.7.1.tgz","fileCount":14,"integrity":"sha512-35CKxex53QdguclNsd8CN+/tlproZd7mnh3zXv3fPKZXSj6fqzwK2e8MKMcheql2lcqczt1VuIhaegtS/D816A==","signatures":[{"sig":"MEUCIQDf08hEcWbe2v0qCOIrmJhVorKwQ89d1nkfsKKjoSOj1wIgTN0PrdOjS3plOY0rhjQV7BOpgnrrjknEzrfJcLPk0rc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":36227},"main":"crudify.js","type":"module","gitHead":"51cbc601c55ae1ef41aca5370e31cf3cd268c6d7","private":false,"scripts":{"test":"yarn node --experimental-vm-modules $(yarn bin jest)"},"_npmUser":{"name":"aaroncadillac","email":"aaron.hmaya@gmail.com"},"repository":{"url":"git+ssh://git@github.com/aaroncadillac/crudify-mongo.git","type":"git"},"_npmVersion":"10.8.2","description":"An automatic CRUD generator for fastify","directories":{},"_nodeVersion":"20.19.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","fastify":"^4.28.1","mongoose":"^8.5.1","supertest":"^7.0.0","@shelf/jest-mongodb":"^4.3.2","mongoose-paginate-v2":"^1.8.2"},"_npmOperationalInternal":{"tmp":"tmp/crudify-mongo_1.7.1_1747254319079_0.5669018534132013","host":"s3://npm-registry-packages-npm-production"}},"1.8.0":{"name":"@aaroncadillac/crudify-mongo","version":"1.8.0","author":{"name":"aaroncadillac"},"license":"MPL-2.0","_id":"@aaroncadillac/crudify-mongo@1.8.0","maintainers":[{"name":"aaroncadillac","email":"aaron.hmaya@gmail.com"}],"homepage":"https://github.com/aaroncadillac/crudify-mongo#readme","bugs":{"url":"https://github.com/aaroncadillac/crudify-mongo/issues"},"dist":{"shasum":"6cafd8334622627ea61ee4ffec0228fc76eb132e","tarball":"https://registry.npmjs.org/@aaroncadillac/crudify-mongo/-/crudify-mongo-1.8.0.tgz","fileCount":14,"integrity":"sha512-CGdvwu2qe1gjMFEdVvUKKxgGm6VYCfdxB12sslBhkXHlbraN3qbmhsUNvAwgrbu8OxrksgvQPPE/Hs2Q7wq9jw==","signatures":[{"sig":"MEQCIFmF9/7T1eBHMmQstiLv51YA7+4AD2uodN2LGQAhBBL8AiA/Ct11a8kRPLi9+lTStNVZpQNMGZwM134+s6y8OmZIbQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":37146},"main":"crudify.js","type":"module","gitHead":"ed01687533d0f5895b2a2109223d5446e8abfe2b","private":false,"scripts":{"test":"yarn node --experimental-vm-modules $(yarn bin jest)"},"_npmUser":{"name":"aaroncadillac","email":"aaron.hmaya@gmail.com"},"repository":{"url":"git+ssh://git@github.com/aaroncadillac/crudify-mongo.git","type":"git"},"_npmVersion":"10.8.2","description":"An automatic CRUD generator for fastify","directories":{},"_nodeVersion":"20.19.4","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","fastify":"^4.28.1","mongoose":"^8.5.1","supertest":"^7.0.0","@shelf/jest-mongodb":"^4.3.2","mongoose-paginate-v2":"^1.8.2"},"_npmOperationalInternal":{"tmp":"tmp/crudify-mongo_1.8.0_1754470521267_0.4033165927787836","host":"s3://npm-registry-packages-npm-production"}},"1.8.2":{"name":"@aaroncadillac/crudify-mongo","version":"1.8.2","description":"An automatic CRUD generator for fastify","main":"crudify.js","repository":{"type":"git","url":"git+ssh://git@github.com/aaroncadillac/crudify-mongo.git"},"author":{"name":"aaroncadillac"},"scripts":{"test":"yarn node --experimental-vm-modules $(yarn bin jest)"},"license":"MPL-2.0","type":"module","private":false,"publishConfig":{"access":"public"},"devDependencies":{"@shelf/jest-mongodb":"^4.3.2","fastify":"^4.28.1","jest":"^29.7.0","mongoose":"^8.5.1","mongoose-paginate-v2":"^1.8.2","supertest":"^7.0.0"},"_id":"@aaroncadillac/crudify-mongo@1.8.2","gitHead":"917486ae606d6764a82b24ad7cb5552fec594937","bugs":{"url":"https://github.com/aaroncadillac/crudify-mongo/issues"},"homepage":"https://github.com/aaroncadillac/crudify-mongo#readme","_nodeVersion":"20.19.4","_npmVersion":"10.8.2","dist":{"integrity":"sha512-aZXBTZa4UJO1ohBeKPLW7E+YCVzajOCN9+eeK7Bc6zMKK0qxziz5p7bYxMTt5T0Yoy8kg/p6BWEDlA9/gruyMA==","shasum":"c999c1d19021c35b58d2fc8a3a37eac8898d38dd","tarball":"https://registry.npmjs.org/@aaroncadillac/crudify-mongo/-/crudify-mongo-1.8.2.tgz","fileCount":14,"unpackedSize":37583,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHMc2EaSagYM+fj8e4LtywVw71t7ko57REj1et9KRY14AiEA7K/UYGOYxs2PVxy1K1vYW1CxwJpHP9jIMVdbv+G20Y4="}]},"_npmUser":{"name":"aaroncadillac","email":"aaron.hmaya@gmail.com"},"directories":{},"maintainers":[{"name":"aaroncadillac","email":"aaron.hmaya@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/crudify-mongo_1.8.2_1755050276108_0.862289357258369"},"_hasShrinkwrap":false}},"time":{"created":"2024-07-23T20:37:05.955Z","modified":"2025-08-13T01:57:56.478Z","1.2.0":"2024-07-23T20:37:06.249Z","1.4.0":"2024-08-30T10:23:19.838Z","1.6.0":"2025-05-13T11:48:49.178Z","1.7.0":"2025-05-14T20:19:55.250Z","1.7.1":"2025-05-14T20:25:19.239Z","1.8.0":"2025-08-06T08:55:21.443Z","1.8.1":"2025-08-12T22:53:35.895Z","1.9.0":"2025-08-13T01:52:40.532Z","1.8.2":"2025-08-13T01:57:56.287Z"},"bugs":{"url":"https://github.com/aaroncadillac/crudify-mongo/issues"},"author":{"name":"aaroncadillac"},"license":"MPL-2.0","homepage":"https://github.com/aaroncadillac/crudify-mongo#readme","repository":{"type":"git","url":"git+ssh://git@github.com/aaroncadillac/crudify-mongo.git"},"description":"An automatic CRUD generator for fastify","maintainers":[{"name":"aaroncadillac","email":"aaron.hmaya@gmail.com"}],"readme":"# Crudify Mongo\n\n[![License: MPL-2.0](https://img.shields.io/badge/License-MPL--2.0-blue.svg)](https://opensource.org/licenses/MPL-2.0)\n![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/aaroncadillac/crudify-mongo/test.yml)\n![NPM Version](https://img.shields.io/npm/v/%40aaroncadillac%2Fcrudify-mongo)\n\n\nAn automatic CRUD generator for [fastify](https://fastify.dev) and MongoDB, using [mongoose](https://mongoosejs.com),a nd adding basic features like pagination, filtering, and sorting.\n\n## Table of contents\n\n- [Features](#features)\n    - [Automatic CRUD generation](#automatic-crud-generation)\n    - [Custom routes](#custom-routes)\n- [Getting started](#getting-started)\n  - [Installation](#installation)\n  - [Usage](#usage)\n- [Aknowledgements](#aknowledgements)\n- [License](#license)\n\n## Pre-requisites\n\n- [Fastify](https://fastify.dev) v4 or higher\n- [Mongoose](https://mongoosejs.com) v8 or higher\n- [mongoose-paginate-v2](https://www.npmjs.com/package/mongoose-paginate-v2) v1.8 or higher\n  \n## Features\n\n### Automatic CRUD generation\n\nYou can automatically enjoy the following CRUD operations:\n\n| Route | Description | Additional built-in benefits |How to use|\n|-------|-------------|----|---|\n| `GET /` | Get all documents | `Pagination` `Filtering` `Sorting` |query parameters: `filters` and `options` for more details see [mongoose-paginate-v2 documentation](https://github.com/aravindnc/mongoose-paginate-v2#readme) |\n| `GET /:id` | Get a document by id | `Not-Found validation`|Activated by default|\n| `POST /` | Create a document | `Schema validation`|Activated by default|\n| `PUT /:id` | Update a document by id | `Not-Found validation` `Schema validation`|Activated by default|\n| `DELETE /:id` | Delete a document by id | `Not-Found validation` |Activated by default|\n\n### Custom routes\n\nYou can add custom routes to the CRUD, to increase the functionality of your API, you only need to pass the route configuration to the plugin.\n\n```js\nconst routes = ( fastify, opts, done ) => {\n  fastify.register(Crudify, {\n    url: '/users',\n    Model: UserModel,\n    additionalRoutes: [\n      {\n        method: 'GET',\n        url: '/:id/light-details',\n        handler: LightDetailsUserHandler\n      },\n      ...\n    ]\n  })\n```\n\n### Swagger auto-documentation (WIP)\n\n> If you need to integrate Swagger auto-documentation, is necessary to export and process mongoose model to define schemas into `openapi.json`, this module is under development.\n\nYou can add Swagger auto-documentation to your API, using the [`@fastify/swagger`](https://github.com/fastify/fastify-swagger) and [`@fastify/swagger-ui`](https://github.com/fastify/fastify-swagger-ui) plugins.\n\nOnce you have those plugins installed, you can use the following code to add Swagger auto-documentation to your API:\n\n```js\n// server.js\n\nimport 'dotenv/config';\nimport Fastify from 'fastify'\nimport { dbConnection } from './db-connection.js';\nimport { routes } from './routes.js';\nimport * as Swagger  from '@fastify/swagger'\nimport * as SwaggerUI from '@fastify/swagger-ui'\n\nconst fastify = Fastify({\n  logger: true\n})\n\nfastify.register(await dbConnection)\nprocess.env.NODE_ENV == 'development' && fastify.register(Swagger) && await fastify.register(SwaggerUI, {\n  routePrefix: '/docs',\n  uiConfig: {\n    docExpansion: 'list',\n    deepLinking: true\n  },\n  uiHooks: {\n    onRequest: function (request, reply, next) { next() },\n    preHandler: function (request, reply, next) { next() }\n  },\n  staticCSP: true,\n  transformStaticCSP: (header) => header,\n  transformSpecification: (swaggerObject, request, reply) => { return swaggerObject },\n  transformSpecificationClone: true\n})\n\nfastify.register(routes)\n\nfastify.listen({ port: process.env.PORT || 3000, host: process.env.HOST || 'localhost' }, function (err, address) {\n  if (err) {\n    fastify.log.error(err)\n    process.exit(1)\n  }\n})\n```\n\nAs you can see in the code above, you only need to import the `@fastify/swagger` and `@fastify/swagger-ui` plugins, and then use the `fastify.register` method to register the plugins., you even can customize your swagger documentation path and enable documentation only in development environment (recommended).\n\n### Body and Response schema auto generation\n\nTo help you to use Swagger `crudify-mongo 1.5.0+` supports `body` and `response` schema auto generation, this feature is enable by default and you only need to install [`mongoose-schema-jsonschema`](https://github.com/DScheglov/mongoose-schema-jsonschema) to use it, this dependency helps you to use your mongoose model schema as a json schema compatible with fastify specification based on [AJV schema validation](https://ajv.js.org).\n\nHere an example\n\n```js\n// models/user.js\n\nimport mongoose from 'mongoose';\nimport paginate from 'mongoose-paginate-v2'; // Required for pagination\nimport extendMongoose from 'mongoose-schema-jsonschema'; // Required for body and response schema auto generation\n\nextendMongoose(mongoose);\n\nconst Schema = mongoose.Schema;\n\nconst userSchema = new Schema({\n  name: {\n    type: String,\n    required: true,\n  },\n  age: {\n    type: Number,\n    required: true,\n  },\n  email: {\n    type: String,\n    required: true,\n  },\n}, {\n  timestamps: true,\n});\n\nuserSchema.plugin(paginate);\n\nconst UserSchema = userSchema.jsonSchema();\nconst UserModel = mongoose.model('Users', userSchema);\n\nexport {\n  UserModel,\n  UserSchema\n}\n```\n\nThen you need to add on the `JSONSchema` property of your fastify routes\n\n```js\n// routes.js\nimport { Crudify } from '@aaroncadillac/crudify-mongo';\nimport { UserModel, UserSchema } from './models/user.js';\n\nconst routes = ( fastify, opts, done ) => {\n  fastify.register(Crudify, {\n    url: '/users',\n    Model: UserModel\n    JSONSchema: UserSchema\n  })\n}\n```\n\n## Getting started\n\n### Installation\n\n```bash\nyarn add @aaroncadillac/crudify-mongo\n```\n\n### Usage\n\nFirst, you need to create a mongoose model, and use the `mongoose-paginate-v2` plugin to enable pagination.\n\n```js\n// models/user.js\n\nimport mongoose from 'mongoose';\nimport paginate from 'mongoose-paginate-v2'; // Required for pagination\n\nconst Schema = mongoose.Schema;\n\nconst userSchema = new Schema({\n  name: {\n    type: String,\n    required: true,\n  },\n  age: {\n    type: Number,\n    required: true,\n  },\n  email: {\n    type: String,\n    required: true,\n  },\n}, {\n  timestamps: true,\n});\n\nuserSchema.plugin(paginate);\n\nconst UserModel = mongoose.model('Users', userSchema);\n\nexport {\n  UserModel\n}\n```\n\nThen, I suggest to separate DB connection into a module, and connect to the database, this will be an async fastify plugin.\n\n```js\n// db-connection.js\n\nimport mongoose from 'mongoose';\n\nconst dbConnection = async ( fastify ) => {\n  try {\n    await mongoose.connect(`${process.env.MONGODB_URL}/${process.env.MONGO_DATABASE}${process.env.MONGO_OPTIONS && `?${process.env.MONGO_OPTIONS}`}`);\n    fastify.log.info('Connected to database');\n  }\n  catch (error) {\n    fastify.log.error('Error connecting to database');\n  }\n}\n\nexport {\n  dbConnection\n}\n```\n\nThen, you can create the server file, and register the CRUD plugin.\n\n```js\n// server.js\n\nimport fastify from 'fastify';\nimport Crudify from 'crudify-mongo';\nimport { dbConnection } from './db-connection';\nimport { UserModel } from './models/user';\n\nconst fastify = Fastify({\n  logger: true\n})\n\nconst routes = ( fastify, opts, done ) => {\n  fastify.register(Crudify, {\n    url: '/users',\n    Model: UserModel\n  })\n}\n\nfastify.register(await dbConnection)\nfastify.register(routes)\n\n\nfastify.listen({ port: process.env.PORT || 3000, host: process.env.HOST || 'localhost' }, function (err, address) {\n  if (err) {\n    fastify.log.error(err)\n    process.exit(1)\n  }\n})\n```\n\nSimple as that, you have a CRUD for the `User` model and could be accessed through the `/users` route.\n\n## Aknowledgements\n\nThis plugin is inspired by [fastify-mongoose-crud](https://github.com/paranoiasystem/fastify-autocrud)\n\n## License\n\n[Mozilla Public License 2.0](/LICENSE)\n\n","readmeFilename":"README.md"}