Skip to content

Commit

Permalink
Merge pull request #19 from nikolauska/master
Browse files Browse the repository at this point in the history
Updates to plaintext export and implementing teamboard-img
  • Loading branch information
tanelih committed Jun 4, 2015
2 parents e3360fc + 124913a commit cca9f73
Show file tree
Hide file tree
Showing 5 changed files with 83 additions and 13 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@

.vagrant/
node_modules/

nohup.out
3 changes: 2 additions & 1 deletion config/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,6 @@ module.exports = {
token: {
secret: process.env.TOKEN_SECRET || 'secret'
},
port: process.env.PORT || 9002
port: process.env.PORT || 9002,
img: process.env.IMG_URL || 'http://localhost:9003/img'
}
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
"passport-local": "~1.0.0",
"promise": "~6.0.0",
"redis": "^0.12.1",
"request": "^2.39.0",
"request": "^2.55.0",
"socket.io-emitter": "~0.2.0"
},
"devDependencies": {
Expand Down
49 changes: 41 additions & 8 deletions routes/board.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ var _ = require('lodash');
var express = require('express');
var mongoose = require('mongoose');
var Promise = require('promise');
var request = require('request');

var utils = require('../utils');
var config = require('../config');
Expand All @@ -23,7 +24,6 @@ var exportAs = require('../utils/export');
Router.param('board_id', middleware.resolve.board);
Router.param('ticket_id', middleware.resolve.ticket);


Router.route('/boards')

/**
Expand Down Expand Up @@ -136,7 +136,7 @@ Router.route('/boards/:board_id')
* 'background': 'new-background'
* 'size': {
* 'width', 'height'
* }
* }bout.
* }
*
* returns:
Expand Down Expand Up @@ -221,13 +221,13 @@ Router.route('/boards/:board_id')
Router.route('/boards/:board_id/export')

/**
* Download the 'board' as a 'json'-file.
* Export board either json, csv, plaintext or image
*/
.get(middleware.authenticate('user', 'guest'))
.get(middleware.relation('user', 'guest'))
.get(function(req, res, next) {
var format = req.query.format ? req.query.format : 'json';

var boardQuery = Board.findById(req.resolved.board.id)
.populate({
'path': 'createdBy',
Expand All @@ -236,6 +236,7 @@ Router.route('/boards/:board_id/export')
.select('-_id -__v -accessCode').lean();

boardQuery.exec(function(err, board) {

if(err) {
return next(utils.error(500, err));
}
Expand All @@ -252,19 +253,52 @@ Router.route('/boards/:board_id/export')
return res.attachment('board.csv').send(200, exportAs.generateCSV(board, tickets));
}

// Format json to plaintext if requested
if(format == 'plaintext') {
return res.attachment('board.txt').send(200, exportAs.generatePlainText(board, tickets));
}

if(format == 'image') {
return exportAs.postImage(req, board, tickets, function(options) {
request.post(options).pipe(res);
});
}

var boardObject = board;
var boardObject = board;
boardObject.tickets = tickets;

return res.attachment('board.json').json(200, boardObject);
return res.attachment('board.json').json(200, boardObject);
});
});
});

Router.route('/boards/:board_id/export/image')
/**
* Export board image
*/
.get(middleware.authenticate('user', 'guest'))
.get(middleware.relation('user', 'guest'))
.get(function(req, res, next) {
var imagepath = 'image/board.png';
var jadePath = 'image/app.jade';
var options = {
tickets: board.tickets
};

// Replace app.jade and image folder to smarter name
var html = jade.renderFile(jadePath, options);

// Callback for webshot
function imageCallback(err) {
if(err) {
return next(utils.error(503, err))
}

return res.attachment(path);
}

// Handle errors and attacment returns on callback
return exportAs.generateImage(html, path, imageCallback);
});

Router.route('/boards/:board_id/tickets')

Expand Down Expand Up @@ -711,5 +745,4 @@ Router.route('/boards/:board_id/access/:code')
.json(200, guestPayload);
});


module.exports = Router;
41 changes: 38 additions & 3 deletions utils/export.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
'use strict';

var json2csv = require('nice-json2csv');
var fs = require('fs');
var utils = require('../utils');
var config = require('../config');

/**
* Checks if value is undefined and returns defValue. Othervise value is returned
Expand Down Expand Up @@ -52,8 +55,8 @@ function generatePlainText(board, tickets) {
tickets.map(function(t) {
return '\n' +
'------------------------------------------\n' +
'Ticket content: ' + contentEdit(undefCheck(t.content, '')) + '\n' +
'Ticket color: ' + hexToColor(t.color) + '\n' +
'Content: ' + contentEdit(undefCheck(t.content, 'empty')) + '\n\n' +
'Color: ' + hexToColor(t.color) + '\n' +
'------------------------------------------\n';
}).join('') + '\n' +
'=========================================';
Expand Down Expand Up @@ -90,7 +93,39 @@ function generateCSV(board, tickets) {
return csvBoard + '\n\n' + csvTickets;
}

/**
* Defines data and options posted to image service
* @param {object} board - Board object to be generated.
* @param {object} tickets - Tickets to be generated.
* @returns {string} callback to post method
*/

function postImage(req, board, tickets, callback) {
var postData = {
'id': req.resolved.board.id,
'background': board.background,
'customBackground': board.customBackground,
'size': {
'height': board.size.height,
'width': board.size.width
},
'tickets': tickets
};

var options = {
url: config.img + '/board',
method: 'POST',
form: postData,
headers: {
'Content-Type': 'application/json'
}
};

return callback(options);
};

module.exports = {
generatePlainText: generatePlainText,
generateCSV: generateCSV
generateCSV: generateCSV,
postImage: postImage
}

0 comments on commit cca9f73

Please sign in to comment.