Waterline ORM adapter for ArangoDB.
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
lib
test
.brackets.json
.gitignore
LICENSE
README.md
gulpfile.js
package.json

README.md

image_squidhome@2x.png

sails-arangodb

Provides easy access to ArangoDB from Sails.js & Waterline.

Take a look at sails-arangodb-demo for more up-to-date examples.

This module is a Waterline/Sails adapter, an early implementation of a rapidly-developing, tool-agnostic data standard. Its goal is to provide a set of declarative interfaces, conventions, and best-practices for integrating with all sorts of data sources. Not just database s-- external APIs, proprietary web services, or even hardware.

Strict adherence to an adapter specification enables the (re)use of built-in generic test suites, standardized documentation, reasonable expectations around the API for your users, and overall, a more pleasant development experience for everyone.

This adapter has been developed pretty quickly and may contain bugs.

Installation

To install this adapter, run:

$ npm install sails-arangodb

Usage

This adapter exposes the following methods:

find()
create()
update()
destroy()
createGraph() # Create a Named Graph
neighbors() # Experimental, method signature is subject to change
createEdge() # Experimental, method signature is subject to change
deleteEdge() # Experimental, method signature is subject to change

Connection

Check out Connections in the Sails docs, or see the config/connections.js file in a new Sails project for information on setting up adapters.

in connection.js

localArangoDB: {
    adapter: 'sails-arangodb',

    host: 'localhost',
    port: 8529,

    user: 'root',
    password: 'CgdYW3zBLy5yCszR',

    database: '_system'

    collection: 'examplecollection'  // ArangoDB specific
}

Schema for Graphs

Defining a Named Graph in the Schema

/*jshint node: true, esversion: 6*/
'use strict';

const Waterline = require('waterline');

const UsersProfilesGraph = Waterline.Collection.extend({
  identity: 'users_profiles_graph',
  schema: true,
  connection: 'arangodb',

  attributes: {
    // this is a named graph
    $edgeDefinitions: [
      {
        collection: 'users_profiles',
        from: ['users_1'],
        to: ['profiles_1']
      }
    ]
  }
});
module.exports = UsersProfilesGraph;

If a model has an attribute called $edgeDefinitions then the model becomes a named graph. Any further attributes are ignored.

See tests for further examples.

Unit Testing

To run unit-tests every time you save a change to a file, simply:

$ gulp

One off run of sails-arangodb specific tests (same as above):

$ gulp test  # or mocha

(Important: you must create a test.json file for your local db instance first - see test/README.md)

To run the waterline adapter compliance tests:

$ gulp waterline

Generate api jsdocs:

$ gulp docs

(these are also generated in the default 'watch' mode above)


Older doc

Example model definitions

/**
 * User Model
 *
 * The User model represents the schema of authentication data
 */
module.exports = {

    // Enforce model schema in the case of schemaless databases
    schema: true,
    tableName: 'User',
    attributes: {
        id: {
            type: 'string',
            primaryKey: true,
            columnName: '_key'
        },
        username: {
            type: 'string',
            unique: true
        },
        email: {
            type: 'email',
            unique: true
        },
        profile: {
            collection: 'Profile',
            via: 'user',
            edge: 'userCommented'
        }
    }
};
// api/models/Profile.js
module.exports = {
    tableName: 'profile',
    attributes: {
        id: {
            type: 'string',
            primaryKey: true,
            columnName: '_key'
        },
        user: {
            model: "User",
            required: true
        },
        familyName: {
            type: 'string'
        },
        givenName: {
            type: 'string'
        },
        profilePic: {
            type: 'string'
        }
    }
    }

// api/models/User.js
module.exports = {
    tableName: 'user',
    attributes: {
        id: {
            type: 'string',
            primaryKey: true,
            columnName: '_key'
        },
        username: {
            type: 'string'
        },
        profile: {
            collection: 'profile',
            via: 'user',
            edge: 'profileOf'
        }
    }
};
;

License

MIT © 2016 Gabriel Letarte (gabriel-letarte) & [thanks to] Taneli Leppä (rosmo) & [thanks to] vjsrinath & [thanks to] balderdashy, Mike McNeil, Balderdash & contributors

This adapter has been developed using vjsrinath's sails-orientdb as a template.

Sails is free and open-source under the MIT License.