fogine/couchbase-odm

View on GitHub
tutorials/8.1.0-to-2.0.md

Summary

Maintainability
Test Coverage
Upgrage to `v2` is recommended as it solidifies concepts introduced in `v1`.  
In terms of new features, it includes new [Model.exists](https://fogine.github.io/couchbase-odm/Model.html#exists), [Instance.populate](https://fogine.github.io/couchbase-odm/Instance.html#populate) , [Mode.buildRefDocKey](https://fogine.github.io/couchbase-odm/Model.html#buildRefDocKey) methods or new `EMBEDDED` Model association relation type. Numerous new options to already existing methods have been added.  
Also note that in the time of `v2` release, `v2` includes numerous bugfixes which have not been backported to `v1`.  
For full list of changes, please see the [CHANGELOG](https://github.com/fogine/couchbase-odm/blob/master/CHANGELOG.md)  

The following is brief list of breaking changes:  


Model's `get` methods:
-----------------------
Behavior of `Model.getById` & `Model.getBy[RefDocIndex]` methods has been changed so that in case of storage key not found error, they return fulfilled promise with `null` value instead of rejected promise with a `StorageError`.
Additional `Model.getByIdOrFail` & `Model.getBy[RefDocIndex]OrFail` methods has been added. These methods will return rejected promise with a `StorageError` when storage key not found error occurs.

Behavior of the [Model.getMulti](https://fogine.github.io/couchbase-odm/Model.html#getMulti) method has been changed in terms of what it fulfills with. Also the method returns always resolved promise. Prior `v2`, the method may return rejected promise with `StorageMultiError`.


`RefDoc` index names:
----------------------

See the following example:  

````javascript

    var User = couchbase.define('User', {
        type: DataTypes.HASH_TABLE,
        schema: {
            username: {
                type: DataTypes.STRING
            }
        }
    }, {
        indexes: {
            refDocs: {
                /**
                 * You are no longer supposed to define refDoc indexes with hardcoded `getBy` method name prefix
                 * Prior `v2` the index definition would look like:
                 *     getByUsername: {keys: ['username']}
                 * Since `v2` "getBy" method prefix is added automatically to method name
                 * and so the index definition becomes:
                 */
                username: {keys: ['username']}
            }
        }
    })
````

`Model.buildKey` method signature:
------------------------------------
The method signature has been changed so that current (`v1`):

```javascript

var key = Model.buildKey('uniqueid', true);
```

becomes (`v2`):

```javascript

var key = Model.buildKey('uniqueid', {parse: true});
```

`Model.build` method behavior:
------------------------------

Defined Model's schema default values are always applied to builded model instance.
Prior `v2`, default values are applied only when `sanitize` boolean option is set (defaults to `false`)

Also, since `v2`, the method does not clone data values passed to it.

`ModelInstance.update` && `ModelInstance.destroy` behavior:
-----------------------------------------------------------
Since `v2`, by default, the methods will return rejected promise with an `InstanceError` when you make an attemt to update/destroy a model instance object with no `cas` value set (this can be overcame by the `force` option)

`ModelInstance.cloneData`
--------------------------
The method has been made part of private API and so it's no longer accessible throught `cloneData` method name

Hooks
-------
support for callback based hook listeners has been removed. All async hook listeners are expected to return a Promise