Zimbra-Community/js-zimbra

View on GitHub
README.md

Summary

Maintainability
Test Coverage
# js-zimbra [![Build Status](https://travis-ci.org/Zimbra-Community/js-zimbra.svg?branch=master)](https://travis-ci.org/Zimbra-Community/js-zimbra) [![Code Climate](https://codeclimate.com/github/Zimbra-Community/js-zimbra/badges/gpa.svg)](https://codeclimate.com/github/Zimbra-Community/js-zimbra) [![Test Coverage](https://codeclimate.com/github/Zimbra-Community/js-zimbra/badges/coverage.svg)](https://codeclimate.com/github/Zimbra-Community/js-zimbra/coverage)
Javascript library to easily access Zimbra's SOAP API. Handles authentication
 using password auth or preauth keys, request sending, response interpreting 
 and batch processing.
 
This is basically a JS-port of the [Python-Zimbra library](https://github.com/Zimbra-Community/python-zimbra), 
but does a few things differently.

The main difference is, that only JSON-based requests are supported, no XML. 
The whole library is asynchronous and based on callbacks.

For details, please see the [official API documentation](http://zimbra-community.github.io/js-zimbra/).

## Getting Started
Install the module with: `npm install js-zimbra`

Afterwards you can use the library by requiring it:

    var jszimbra = require('js-zimbra');
    
## Authentication handling

To authenticate against a Zimbra server, use the "auth" method of the 
communication API like this:

```javascript
var jszimbra = require('js-zimbra');

// Initialize the communication object with the SOAP-API URL

var comm = new jszimbra.Communication({
    url: "https://your-zimbra-server/service/soap"
    });
    
// Authenticate
    
comm.auth({
    "username": "zimbrauser",
    "secret": "fowunfguipht542uip5nupfnru2ütu3ü2brtufwe"
}, function (err) {

    if (err) {
    
        // An error occured authenticating!
    
    }
    
    // Now, carry on creating requests and sending them
};
```

In this example, a Preauthkey was used. If you'd like to use a password 
instead, you can do this by setting the option "isPassword" in the options 
object passed to the auth-method to true:

```javascript
comm.auth({
    "username": "zimbrauser",
    "secret": "verysecretpassword",
    "isPassword": true
},(...)
```

If you're authenticating against the Zimbra Admin backend, you have to set 
the option "isAdmin" to true. Currently, Zimbra only supports password-based 
authentication for the administration backend, so the option "secret" has to be 
the password of an administrator. "isAdmin" implies "isPassword", 
so you don't have to set that as well.

## Request/Response handling

Like in the python version of this library, requests are built inside a 
"request handler". You can get one by using the "getRequest"-method of the 
communications api.

Afterwards, you can add one or multiple (see BatchRequest-handling) requests.
 Finally, supply the built-up request handler to the "send"-method of the 
 communications api and you'll retrieve a "response handler".
 
This handler has a "get"-method that returns the Zimbra response for your 
request as a plain javascript object.

Here's an example for the workflow:

```javascript
var jszimbra = require('js-zimbra');

// Initialize the communication object with the SOAP-API URL

var comm = new jszimbra.Communication({
    url: "https://your-zimbra-server/service/soap"
    });
    
// Authenticate
    
comm.auth({
    "username": "zimbrauser",
    "secret": "fowunfguipht542uip5nupfnru2ütu3ü2brtufwe"
}, function (err) {

    if (err) {
    
        // An error occured authenticating!
    
    }
    
    comm.getRequest({}, function (err, req) {
    
        if (err) {
        
            // Can't create a new request
        
        }
        
        req.addRequest({
            name: "GetAccountInfoRequest",
            namespace: "zimbraAccount",
            params: {
                "account": {
                    "by": "name",
                    "_content": "dennis.ploeger@getit.de"
                }
            }, function (err) {
            
            if (err) {
            
                // Can not add request to the request handler
            
            }
            
            comm.send(req, function (err, response) {
            
                if (err) {
                
                    // Can not send request
                
                }
                
                // response holds our response
                
                console.log(response.get().GetAccountInfoResponse);
            
            });
            
        });
    
    });

});
```

## Batch Requests

js-zimbra also supports batch requests. This has to be enabled in the 
getRequest-method by setting the option "isBatch" to true. Afterwards, 
subsequent calls to request#addRequest will add requests to this batch and 
return the request id to the callback.
 
```javascript
var comm = new jszimbra.Communication({
    url: "https://your-zimbra-server/service/soap"
});

comm.auth({
    "username": "zimbrauser",
    "secret": "fowunfguipht542uip5nupfnru2ütu3ü2brtufwe"
}}, function (err) {

        comm.getRequest({
            isBatch: true
        }, function (err, req) {

            req.addRequest({
                name: "GetAccountInfoRequest",
                namespace: "zimbraAccount",
                params: {
                    "account": {
                        "by": "name",
                        "_content": "zimbraid"
                    }
                }
            }, function (err, reqid) {
            
                // reqid holds the id of the added request and can be used to
                // identify the request in the response

                req.addRequest({
                    name: "GetAccountInfoRequest",
                    namespace: "zimbraAccount",
                    params: {
                        "account": {
                            "by": "name",
                            "_content": "zimbraid"
                        }
                    }
                }, function (err, reqid) {

                    comm.send(req, function (err, response) {
                    
                        // Shows an array with two members

                        console.log(response.GetAccountInfoRequest);                        

                    });

                });

            });

        });

        done();

    }
);
```

## Logging

js-zimbra uses the excellent [Winston](https://github.com/winstonjs/winston) 
framework for logging. To make it easier to configure js-zimbra-specific 
logging, we use our own logger called "js-zimbra".

You can configure the logger by issuing something like the following commands
 *before* requiring the js-zimbra library:
 
```javascript
// Set js-zimbra's maximum log level to "error" to mostly silence it.

var winston = require('winston');

winston.loggers.add("js-zimbra", {console: {level: "error"}});
```

## Contributing
In lieu of a formal styleguide, take care to maintain the existing coding style. 
Add unit tests for any new or changed functionality. Lint and test your code 
using

    grunt

You may also (and are suggested to) check the code coverage of your new or 
changed code by running

    grunt coverage

## License
Copyright (c) 2015 Dennis Ploeger  
Licensed under the MIT license.