A mongoose Repository based
npm install sendit-mongoose-repository
npm install sendit-mongoose-repository --save
`$3
`
npm version x.y.z
git push --follow-tags
`Create repo Example
bar.repository.js file
`javascript
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
`javascript
.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
`javascript
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
`javascript
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)`javascript
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
`javascript
await BarRepository.create({ name: 'default' })
`Update
`javascript
await BarRepository.update({ name: 'default' }, { foos: [12, 69] })
`Delete
`javascript
await BarRepository.delete({ name: 'default' })
`Aggregate
`javascript
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
`javascript
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
`bash
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
`bash
# 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
`bash
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
`bash
# 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
`javascript
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
`javascript
connections: [
"amqp://guest:guest@example1.com:5672/v1?heartbeat=10",
"amqp://guest:guest@example2.com:5672/v1?heartbeat=10",
"amqp://guest:guest@example3.com:5672/v1?heartbeat=10"
]
``