zimme/meteor-collection-behaviours

View on GitHub
README.md

Summary

Maintainability
Test Coverage
[![Gitter]](https://gitter.im/zimme/meteor-collection-behaviours)
[![Code Climate]](https://codeclimate.com/github/zimme/meteor-collection-behaviours)
[![License]](https://github.com/zimme/meteor-collection-timestampable/blob/master/LICENSE.md)

# Behaviours for collections

Define and attach behaviours to collections.

## Installation

```sh
meteor add zimme:collection-behaviours
```

## Available behaviours

The behaviours are split into separate packages, which depend on this package.

* `zimme:collection-softremovable`

  This behaviour adds `.softRemove()` and `.restore()` to collections, which
  make it possible to mark documents as removed. It also tracks the time and
  user for the last soft remove and restore.

  https://atmospherejs.com/zimme/collection-softremovable


* `zimme:collection-timestampable`

  This behaviour timestamps documents on insert and update. It also tracks the
  user who made the last insert or update.

  https://atmospherejs.com/zimme/collection-timestampable

## Usage

### Define a behaviour

```js
CollectionBehaviours.define('behaviourName', function(options) {
  var collection = this.collection;

  // Setup some default options for the behaviour
  var defaultOptions = {
    exampleOption: "I'm a default value"
  };

  // Make the behaviour configurable both globally and locally and uses the
  // defaults if not configured.
  options = _.defaults(options, this.options, defaultOptions);

  // Behaviour logic goes here
});
```

### Attach behaviours

```js
// Attach a behavour using the collection identifier
Meteor.users.attachBehaviour('timestampable');

// Attach a behaviour to a colleciton using CollectionBehaviours
CollectionBehaviours.attach(Meteor.users, 'timestampable');

// Attach multiple behaviours to a collection with default options
CollectionBehaviours.attach(Meteor.users, ['timestampable', 'softremovable']);

// Attach multiple behaviours to a collcetion with custom options
CollectionBehaviours.attach(Meteor.users, {
  timestampable: {
    createdAt: 'insertedAt',
  },
  softremovable: {
    removedBy: 'deletedBy',
  },
});

// Attach a behaviour to multiple collections
CollectionBehaviours.attach([Meteor.users, Posts], 'timestampable');

// Attach multiple behaviours to multiple collections
CollectionBehaviours.attach(
  [Meteor.users, Posts],
  ['timestampable', 'softremovable']
);
```

### Configuration

```js
// Configure behaviour globally i.e. set you own defaults
CollectionBehaviours.configure('behaviourName', {
  exampleOption: "I'm a global value"
});

// Attach behaviour with custom options
Meteor.users.attachBehaviour('behaviourName', {
  exampleOption: "I'm a local value"
});

// Attach behaviour with custom options, using CollectionBehaviours
CollectionBehaviours.attach(Meteor.users, 'behaviourName', {
  exampleOption: "I'm a local value"
});
```

## API

### CollectionBehaviours.define

Used to defined a new behaviour or overwrite an already defined behaviour.

```js
CollectionBehaviours.define('behaviourName', behaviourFunciton, options);
```

* `'behaviourName'`: Required. The name of the behaviour.
* `behaviourFunction`: Required. A `Function` that takes `options` as an
  argument. This function is the behaviour.
* `options`: Optional. `Object` with the options for the behaviour.

#### Options

* `replace`: Optional. Set to `true` to replace a previously defined behaviour.

### CollectionBehaviours.configure

Used to confgure behaviours globally.

```js
// Configure single behaviour
ColectionBehaviours.configure('behavioursName', options);

// Configure multiple behaviours
CollectionBehaviours.configure({
  timestampable: {
    createdAt: 'insertedAt',
    updatedBy: 'modifiedBy'
  },
  softremovable: {
    removed: 'deleted'
  }
});
```

* `'behaviourName'`: Required.  
  If set to a `String`, 'behaviourName', will configure the named behaviour.  
  If set to an `Object`, where the keys are named behaviours and the values are  
  the options for the behaviours, will configure those named behaviours.

* `options`: Optional if `behaviourName` is an `Object`.  
  See specific behaviour for available options.

### <CollectionIdentifier>.attachBehaviour

Used to attach behaviour(s) to the collection.

```js
Meteor.users.attachBehaviour(behaviourNameOrFunction, options);
```

* `behaviourNameOrFunction`: Required.  
  If set to a `String`, `'behaviourName'`, will attach the named behaviour.  
  If set to a `Function`, will attach that function as an anonymous behaviour.  
  If set to an `Array` of `String`/`Function`, will attach those named or  
  anonymous behaviours.  
  If set to an `Object`, where the keys are named behaviours and the values are  
  the behaviours' options, will attach those named behaviours with the provided  
  options.
* `options`: Optional. See specific behaviour for available options.

### CollectionBehaviours.attach

Used to attach behaviour(s) to collection(s).

```js
CollectionBehaviours.attach(ColletionIdentifier, behaviourNameOrFunction, options);
```

* `CollectionIdentifier`: Required. The collection or `Array` of collections  
  you want to attach the behaviour(s) to.
* `behaviourNameOrFunction`: Required.  
  If set to a `String`, `'behaviourName'`, will attach the named behaviour.  
  If set to a `Function`, will attach that function as an anonymous behaviour.  
  If set to an `Array` of `String`/`Function`, will attach those named or  
  anonymous behaviours.  
  If set to an `Object`, where the keys are named behaviours and the values are  
  the behaviours' options, will attach those named behaviours with the provided  
  options.
* `options`: Optional. See specific behaviour for available options.

## Notes

* `CollectionBehaviours.config` is an alias for `CollectionBehaviours.configure`
* The inspiration for this package came from
[`sewdn:collection-behaviours`][sewdn]

[Atmosphere]: https://atmospherejs.com
[Code Climate]: https://img.shields.io/codeclimate/github/zimme/meteor-collection-behaviours.svg
[Gitter]: https://img.shields.io/badge/gitter-join_chat-brightgreen.svg
[License]: https://img.shields.io/badge/license-MIT-blue.svg
[sewdn]: https://github.com/Sewdn/meteor-collection-behaviours