## Facebook nodejs
A simple module for querying Facebook graph api and fql

## Usage example
	// run first: npm install express fbgraphapi body-parser cookie-parser express-session
	const express = require('express');
	const fbgraph = require('fbgraphapi');
	const bodyParser = require('body-parser');
	const cookieParser = require('cookie-parser');
	const session = require('express-session');

	const app = express();
	// parse application/x-www-form-urlencoded
	app.use(bodyParser.urlencoded({ extended: false }));
	app.use(cookieParser())
	app.use(session({
	  secret: 'keyboard cat',
	  resave: false,
	  saveUninitialized: true,
	  cookie: { secure: false }
	}))

	app.use(fbgraph.auth( {
			appId : "...",
			appSecret : "...",
			redirectUri : "http://0.0.0.0:3000/",
			apiVersion: "v2.9",
			skipUrlPatterns: ["/favicon.ico"]
		}));

	app.get('/login', function(req, res) {
		console.log('Start login');
		fbgraph.redirectLoginForm(req, res);
	});

	app.get('/', function(req, res) {
		if (!req.hasOwnProperty('facebook')) {
			console.log('You are not logged in');
			return res.redirect('/login');
		}
		/* See http://developers.facebook.com/docs/reference/api/ for more */
		req.facebook.graph('/me', function(err, me) {
		    console.log(me);
		});

		req.facebook.graph('/me?fields=id,name', function(err, me) {
		    console.log(me);
		});

		req.facebook.me(function(err, me) {
		    console.log(me);
		});

		// /me/likes
		req.facebook.my.likes(function(err, likes) {
		    console.log(likes);
		});

		res.end("Check console output");
	});

	app.listen(3000);



Or if have a valid access token for instance from javascript fb connect
	
	var fb = new fbgraph.Facebook(accessToken, 'v2.2');
	fb.me(function(err, me) {
		console.log(me);
	});

Or do stuff on behalf of the app or user with granted permissions
	
	var fb = new fbgraph.Facebook(fbgraph.getAppId() + '|' + fbgraph.getAppSecret());
	fb.post('/{user-id}/feed', {message: 'Hello world'},function(err, res) {
		console.log(err, res);
	});

## Facebook API reference
Visit the links bellow for API documentation of Facebook API
https://developers.facebook.com/docs/graph-api/using-graph-api

## Methods
### auth(config)
config is an object with those properties
* `appId` Facebook application Id
* `appSecret` Secret hash key generated by Facebook
* `redirectUri` The url to redirect to when user logged in.
* `apiVersion` Which api version to use, example v2.2
* `scope` Permissions/scope that your application asks for, optional and default empty.
* `skipUrlPatterns` Array of patterns which to not apply authentication on. They can be regexp or string. If string a regexp will be created with wildcard appending at the end. If you want an exact url make sure specify regexp.

### authenticate(req, res, next)
This method is returned when calling auth() above. When loggin is successfull it will assign a Facebook instance to req (see example above).

### redirectLoginForm(req, res)
This method will redirect user to Facebook login form.

### destroySession(req, res, clearCookie)
This method is for logging out user or for any reason want to clear user's logged-in info

### getAppId()
return app id, set via auth()

### getAppSecret()
return app secret, set via auth()

## Classes
### Facebook(accessToken, apiVersion)
* `accessToken` Valid access token from Facebook (oauth_token).
* `apiVersion` Which api version to use
* `.graph(path, callback)` Main method for making call to Facebook API. Path can contain only /me/likes or with params like /me/likes?limit=3
* `.post(path, params, callback) or post(path, callback)` Publishing to Facebook, see https://developers.facebook.com/docs/graph-api/using-graph-api/v2.0#publishing for detail. Path can contain post data such as /123/feed?message=hello
* `.update(path, params, callback) or update(path, callback)` Updating a post on Facebook, see https://developers.facebook.com/docs/graph-api/using-graph-api/v2.0#updating for defail. Path can contain post data such as /123_123456789?message=edited
* `.delete(path, callback)` Deleting a post on Facebook, see https://developers.facebook.com/docs/graph-api/using-graph-api/v2.0#deleting for defail
* `.fql(query, callback)` Specific method for making fql query to Facebook API
* `.search(params, callback)` params is an object which properties are any param based on this https://developers.facebook.com/docs/graph-api/using-graph-api#search
* `.me(callback, fields)` Specific method to get info of the logged user, same as /me when using graph-method. Fields is comma-separated for instance fields=id,name
* `.my` Instance of My class

Usage: if have a valid accessToken for instance from js login
	
	var fb = new Facebook(accessToken, 'v2.2');
	fb.me(function(err, me) {
		console.log(me);
	});
	

### My(facebook)
This class uses internally to create object my (property in Facebook). This object wrap the me-object. Each connection type is a method. This means that you can make a call like
	
	req.facebook.my.friends(function(err, friends) {
		console.log(friends)
	});
	
	// OR for checkins
	req.facebook.my.checkins(function(err, checkins) {
		console.log(checkins)
	});

Supported connection types are:

* `friends`
* `feed`
* `likes`
* `movies`
* `music`
* `books`
* `albums`
* `notes`
* `permissions`
* `photos`
* `videos`
* `events`
* `groups`
* `checkins`
* `locations`

If you can not find a connection that Facebook has but not here you can use connection-method
	
	req.facebook.my.connection('{connection type}', function(err, result) {
		console.log(result)
	});

