sendit-mongoose-repository
v2.0.12
Published
A mongoose Repository based
Downloads
101
Readme
Mongoose-Repository
A mongoose Repository based Include Plugin:
- mongoose
- mongoose-delete (default options: { deletedAt: true, indexFields: true, overrideMethods: true })
- mongoose-history
- mongoose-paginate
- ~~mongoose-timestamp~~ Deprecated version 1.1.10 change use mongoose provide timestamps
- mongoose-aggregate-paginate
- rascal
install
npm install sendit-mongoose-repository --save
publish (maintainer permission required)
npm version x.y.z
git push --follow-tags
Create repo Example
bar.repository.js file
import mongoose from 'mongoose'
import RepositoryBuilder from 'sendit-mongoose-repository'
const schemaDefinition = {
name: {
type: String,
require: true
},
foos: {
type: [Number],
require: true
},
company: { type: Mongoose.Schema.Types.ObjectId, ref: 'Company' },
}
export const builder = RepositoryBuilder('Bar', schemaDefinition)
export default builder.Repository
// builder provides:
// {
// Model,
// Schema,
// Repository,
// schemaDefinition
// }
BaseRepostory provides functions
.findOne(query: any, options: any)
.find(query: any = {}, options: any = {})
.create(data: any)
.update(query: any, data: any)
.upsert(query: any, data: any)
(default options: {upsert: true, new: true})
.delete(data: any)
.aggregate(data: any)
.aggregatePaginate(query: any, options)
Usage Example
Find one
import BarRepository from './bar.repository.js'
export default async function list() {
var filter = {
name: 'default'
}
var options = {
populate: 'company' //optional
}
return BarRepository.findOne(filter, options)
}
Find all
import BarRepository from './bar.repository.js'
export default async function list() {
var filter = {
name: 'default'
}
var options = {
populate: 'company' //optional
}
return BarRepository.find(filter, options)
}
Find with Paginate (required options.limit and options.page)
var filter = {
name: 'default'
}
var options = {
limit: 10, // required
page: 1, // required, start 1
sort: {name: -1}, // optional, default: {_id: 1}, (ex. sort descending name)
populate: 'company', // optional
select: '-_id -__v -password' // optional omit _id, __v, password
}
return BarRepository.find(filter, options)
Create
await BarRepository.create({ name: 'default' })
Update
await BarRepository.update({ name: 'default' }, { foos: [12, 69] })
Delete
await BarRepository.delete({ name: 'default' })
Aggregate
import BarRepository from './bar.repository.js'
export default async function list() {
var filter = {
name: 'default'
}
var options = {
populate: 'company' //optional
}
return BarRepository.find(filter, options)
}
Aggregate Paginate
var aggregateQuery = [
{ $match : { name: 'default' } },
{ $project: { foos: 1 } }
]
var options = {
limit: 10, // required
page: 1, // required, start 1
sort: {name: -1}
}
return BarRepository.aggregatePaginate(filter, options)
AMQP Feature
The feature will connect to a message broker (RabbitMQ) using AMQP Protocol. When you enable this feature, it will create queues automatically from the base repository from your custom
🔥 Version 2.x.x 🔥
From version 2.x.x onward, `We deprecated the configuration environment of MONGOOSE_AMQP_PORT`. We would like to change how to connect to RabbitMQ to increase the flexibility of cluster connection, `In addition, initialize function is also deprecated`
In Additional
Configuration Environment
MONGOOSE_ENABLE_AMQP=true # default false, If you want to enable setting to true MONGOOSE_AMQP_URI=amqp://localhost:5672//staging?heartbeat=5,amqp://localhost:5673//staging?heartbeat=5,amqp:// localhost:5674//staging?heartbeat=5 MONGOOSE_AMQP_USERNAME=admin MONGOOSE_AMQP_PASSWORD=admin MONGOOSE_AMQP_SERVICE=users-management-api # Application Name MONGOOSE_AMQP_MODEL=user,address,cars # Name of Schema Model on Base Repository MONGOOSE_AMQP_EXCHANGE=elasticsearch.caller # Name of Exchange on RabbitMQ
Generate Pattern Queue Name
Deprecated environment NODE_ENV
By we use virtual hosts of RabbitMQ In case separate NODE_ENV# Pattern SERVICE_NAME.create.MODEL_NAME SERVICE_NAME.update.MODEL_NAME SERVICE_NAME.delete.MODEL_NAME # Example user-management-api.create.user user-management-api.update.user user-management-api.delete.user
⛔️ Version 1.x.x ⛔️
Old Version not support new cluster
Configuration Environment
MONGOOSE_ENABLE_AMQP=true # default false, If you want to enable setting to true MONGOOSE_AMQP_URI=127.0.0.1 MONGOOSE_AMQP_USERNAME=admin MONGOOSE_AMQP_PASSWORD=admin MONGOOSE_AMQP_SERVICE=users-management-api # Application Name MONGOOSE_AMQP_PORT=5672 MONGOOSE_AMQP_MODEL=user,address,cars # Name of Schema Model on Base Repository MONGOOSE_AMQP_EXCHANGE=elasticsearch.caller # Name of Exchange on RabbitMQ MONGOOSE_AMQP_TTL=50000000000000000 # x-message-ttl or Time-To-Live and Expiration
Generate Pattern Queue Name
# Pattern ENV.SERVICE_NAME.create.MODEL_NAME ENV.SERVICE_NAME.update.MODEL_NAME ENV.SERVICE_NAME.delete.MODEL_NAME # Example staging.user-management-api.create.user staging.user-management-api.update.user staging.user-management-api.delete.user
Initialize Connection with RabbitMQ
import { init } from 'sendit-mongoose-repository' init({ exchange: 'exchange-name', models: ['model'], ttl: 50000000000000, //millisecond service: 'serviceName', vhosts: 'local', connection: { slashes: true, protocol: 'amqp', hostname: '127.0.0.1', user: 'guest', password: 'guest', vhost: `//local`, port: 5672, options: { heartbeat: 5, }, socketOptions: { timeout: 1000, }, }, })
Example For cluster connections
connections: [ "amqp://guest:[email protected]:5672/v1?heartbeat=10", "amqp://guest:[email protected]:5672/v1?heartbeat=10", "amqp://guest:[email protected]:5672/v1?heartbeat=10" ]