# tower-adapter

> Datastore abstraction layer.

Latest version **0.1.0** (published 2013-06-24) · 0 weekly downloads

## Install

```sh
npm install tower-adapter
pnpm add tower-adapter
yarn add tower-adapter
bun add tower-adapter
```

## Health

**Score 10/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support; low quality score; pre 1.0.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 0.1.0 |
| Published | 2013-06-24 |
| First published | 2013-06-02 |
| Weekly downloads | 0 |
| TypeScript types | none |
| Module format | CommonJS |
| Dependencies | 6 |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Maintainers | viatropos |
| Keywords | orm, mvc, database, model |

## Links

- npm: https://www.npmjs.com/package/tower-adapter
- Repository: http://github.com/tower/adapter
- npm.io page: https://npm.io/package/tower-adapter

## Dependencies (6)

- [tower-load](https://npm.io/package/tower-load.md) ~0.1.0
- [tower-type](https://npm.io/package/tower-type.md) ~0.1.0
- [tower-query](https://npm.io/package/tower-query.md) ~0.1.0
- [tower-stream](https://npm.io/package/tower-stream.md) ~0.1.0
- [tower-emitter](https://npm.io/package/tower-emitter.md) ~0.1.0
- [tower-resource](https://npm.io/package/tower-resource.md) ~0.1.0

## Alternatives

- [mobx-react](https://npm.io/package/mobx-react.md) — 2.8M weekly downloads
- [rc-tree](https://npm.io/package/rc-tree.md) — 2.6M weekly downloads
- [@react-oauth/google](https://npm.io/package/@react-oauth/google.md) — 1.3M weekly downloads
- [@wagmi/connectors](https://npm.io/package/@wagmi/connectors.md) — 877.0K weekly downloads
- [vee-validate](https://npm.io/package/vee-validate.md) — 836.4K weekly downloads

## Recent versions

- 0.1.0 (latest) — 2013-06-24
- 0.1.0pre2 — 2013-06-24
- 0.1.0pre — 2013-06-02

## README

# Tower Adapter

Datastore abstraction layer.

To abstract out some database like Cassandra, a REST API like Facebook, or even something like plain web crawling, so that it can be queried like any other resource, just implement the `exec` method on a new adapter.

## Installation

node.js:

```
$ npm install tower-adapter
```

browser:

```
$ component install tower/adapter
```

## Examples

```js
var adapter = require('tower-adapter');
```

See one of these for a complete example:

- mongodb: https://github.com/tower/mongodb-adapter
- ec2: https://github.com/tower/ec2-adapter

Example custom REST adapter implementing the `exec` method:

```js
/**
 * Map of query actions to HTTP methods.
 */

var methods = {
  find: 'GET',
  create: 'POST',
  update: 'PUT',
  remove: 'DELETE'
};

adapter('rest').exec = function(query, fn){
  var name = query.selects[0].resource;
  var method = methods[query.type];
  var params = serializeParams(query);

  $.ajax({
    url: '/api/' + name,
    dataType: 'json',
    type: method,
    data: params,
    success: function(data){
      fn(null, data);
    },
    error: function(data){
      fn(data);
    }
  });
};

/**
 * Convert query constraints into query parameters.
 */

function serializeParams(query) {
  var constraints = query.constraints;
  var params = {};

  constraints.forEach(function(constraint){
    params[constraint.left.attr] = constraint.right.value;
  });

  return params;
}
```

Map REST API objects to resources:

```js
adapter('facebook')
  .model('user')
    .attr('name')
    .attr('firstName').from('first_name')
    .attr('middleName').from('middle_name')
    .attr('lastName').from('last_name')
    .attr('gender')
      .validate('in', [ 'female', 'male' ])
    .attr('link')
      .validate('isUrl')
    .attr('username');
```

Specify (optional) how to serialize data types from JavaScript to the database-/service-specific format:

```js
adapter('mongodb')
  .type('string', fn)
  .type('text', fn)
  .type('date', fn)
  .type('float', fn)
  .type('integer', fn)
  .type('number', fn)
  .type('boolean', fn)
  .type('bitmask', fn)
  .type('array', fn);
```

## License

MIT

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