# loopback-storage-service

LoopBack storage service provides Node.js and REST APIs to manage binary contents
using pluggable storage providers, such as local file systems, Amazon S3, or
Rackspace cloud files. We use [pkgcloud](https://github.com/pkgcloud/pkgcloud) to support the cloud based
storage services including:

- Amazon
- Rackspace
- Openstack
- Azure

The binary artifacts are organized with containers and files. A container is the
collection of files. Each file will belong to a container.

## Define a model with the loopback-storage-service connector

LoopBack exposes the APIs using a model that is attached to a data source configured
with the loopback-storage-service connector.

    var ds = loopback.createDataSource({
        connector: require('loopback-storage-service'),
        provider: 'filesystem',
        root: path.join(__dirname, 'storage')
    });

    var container = ds.createModel('container');

The following methods are mixed into the model class:

- getContainers(cb): List all containers
- createContainer(options, cb): Create a new container
- destroyContainer(container, cb): Destroy an existing container
- getContainer(container, cb): Look up a container by name

- uploadStream(container, file, options, cb): Get the stream for uploading
- downloadStream(container, file, options, cb): Get the stream for downloading

- getFiles(container, download, cb): List all files within the given container
- getFile(container, file, cb): Look up a file by name within the given container
- removeFile(container, file, cb): Remove a file by name  within the given container

- upload(req, res, cb): Handle the file upload at the server side
- download(container, file, res, cb): Handle the file download at the server side

## Configure the storage providers

Each storage provider takes different settings; these details about each specific
provider can be found below:

* Local File System


    {
        provider: 'filesystem',
        root: '/tmp/storage'
    }

* Amazon


    {
        provider: 'amazon',
        key: '...',
        keyId: '...'
    }

* Rackspace


    {
        provider: 'rackspace',
        username: '...',
        apiKey: '...'
    }

* OpenStack


    {
        provider: 'openstack',
        username: 'your-user-name',
        password: 'your-password',
        authUrl: 'https://your-identity-service'
    }

* Azure


    {
        provider: 'azure',
        storageAccount: "test-storage-account",         // Name of your storage account
        storageAccessKey: "test-storage-access-key" // Access key for storage account
    }


## REST APIs

- GET /api/containers

List all containers

- GET /api/containers/:container

Get information about a container by name

- POST /api/containers

Create a new container

- DELETE /api/containers/:container

Delete an existing container by name

- GET /api/containers/:container/files

List all files within a given container by name

- GET /api/containers/:container/files/:file

Get information for a file within a given container by name

- DELETE /api/containers/:container/files/:file

Delete a file within a given container by name

- POST /api/containers/:container/upload

Upload one or more files into the given container by name. The request body should
use [multipart/form-data](https://www.ietf.org/rfc/rfc2388.txt) which the file input
type for HTML uses.

- GET /api/containers/:container/download/:file

Download a file within a given container by name