# sendit-mongoose-repository

> A mongoose Repository based

Latest version **2.0.12** (published 2024-12-20) · MIT license · 0 weekly downloads

## Install

```sh
npm install sendit-mongoose-repository
pnpm add sendit-mongoose-repository
yarn add sendit-mongoose-repository
bun add sendit-mongoose-repository
```

## Health

**Score 35/100 (D)** — status: maintenance-mode.

Positive: has types; no vulnerabilities; high quality score.

Warnings: low downloads; no esm support.

Negative: stale; low maintenance score.

## Facts

| | |
|---|---|
| Version | 2.0.12 |
| Published | 2024-12-20 |
| First published | 2018-09-28 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | CommonJS |
| Dependencies | 7 |
| Unpacked size | 161.3 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 7 |
| Maintainers | bossbossk20, doctoraod, jokergn, boshido, kazekun, dream07312, true-e-logisctics-admin, nv4re, yanaice |
| Keywords | mongoose, repo, repository, mongoose-repository |

## Links

- npm: https://www.npmjs.com/package/sendit-mongoose-repository
- Repository: https://github.com/sendit-asia/mongoose-repository
- Homepage: https://github.com/sendit-asia/mongoose-repository#readme
- Issues: https://github.com/sendit-asia/mongoose-repository/issues
- npm.io page: https://npm.io/package/sendit-mongoose-repository

## Dependencies (7)

- [rascal](https://npm.io/package/rascal.md) ^20.1.0
- [amqplib](https://npm.io/package/amqplib.md) ^0.10.4
- [install](https://npm.io/package/install.md) ^0.12.2
- [mongoose-delete](https://npm.io/package/mongoose-delete.md) ^1.0.2
- [mongoose-history](https://npm.io/package/mongoose-history.md) ^0.8.0
- [mongoose-paginate-v2](https://npm.io/package/mongoose-paginate-v2.md) ^1.8.5
- [mongoose-aggregate-paginate-v2](https://npm.io/package/mongoose-aggregate-paginate-v2.md) ^1.1.2

## Alternatives

- [angular-pipes](https://npm.io/package/angular-pipes.md) — 5.6K weekly downloads
- [@ng-web-apis/midi](https://npm.io/package/@ng-web-apis/midi.md) — 2.6K weekly downloads
- [happn-3](https://npm.io/package/happn-3.md) — 1.6K weekly downloads
- [@opensip-cli/lang-go](https://npm.io/package/@opensip-cli/lang-go.md) — 1.2K weekly downloads
- [mongoose-typescript](https://npm.io/package/mongoose-typescript.md) — 85 weekly downloads

## Recent versions

- 2.0.12 (latest) — 2024-12-20
- 2.0.11 — 2024-12-20
- 2.0.10 — 2024-12-20
- 2.0.9 — 2024-10-10
- 2.0.8 — 2024-10-10
- 2.0.7 — 2024-10-03
- 2.0.6 — 2022-03-08
- 2.0.5 — 2021-06-18
- 2.0.4 — 2020-08-04
- 2.0.3 — 2020-07-30
- 2.0.2 — 2020-07-24
- 2.0.1 — 2020-07-24
- 2.0.0 — 2020-04-08
- 1.1.12 — 2020-01-28
- 1.1.11 — 2020-01-21
- … 24 more at https://npm.io/package/sendit-mongoose-repository/versions

## 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~~  <b><span style="color:red">Deprecated version 1.1.10 change use mongoose provide timestamps</span></b>
- 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
```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"
  ]
  ```

---
_Source: https://npm.io/package/sendit-mongoose-repository · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
