Skip to content

Commit

Permalink
add different download modes and prep app for deployment
Browse files Browse the repository at this point in the history
  • Loading branch information
benkaiser committed Nov 28, 2016
1 parent ed85a07 commit c57f320
Show file tree
Hide file tree
Showing 9 changed files with 187 additions and 104 deletions.
17 changes: 14 additions & 3 deletions controllers/index.js
Expand Up @@ -3,6 +3,12 @@ var router = express.Router();

var Facebook = require('../services/facebook');

var FileTypes = {
'txt': require('../wrappers/text'),
'csv': require('../wrappers/csv'),
'json': require('../wrappers/json'),
};

function redirectIfNoCredentials(req, res, next) {
if (req.session.email && req.session.password) {
next();
Expand All @@ -26,22 +32,27 @@ router.get('/conversations', redirectIfNoCredentials, (req, res) => {
.then((fb) => {
fb.getConversations((conversations) => {
console.log(conversations);
res.render('conversations', { conversations: conversations });
res.render('conversations', {
conversations: conversations,
methods: FileTypes
});
});
})
.catch((err) => res.send(err));
});

router.get('/conversations/:thread.:method', (req, res) => {
let thread = req.params.thread;
let method = req.params.method;
Facebook.login(req.session.email, req.session.password)
.then((fb) => {
fb.getConversation(thread, (conversations) => {
res.writeHead(200, {
'Content-Type': 'application/force-download',
'Content-disposition':`attachment; filename=${thread}.json`
'Content-disposition':`attachment; filename=${thread}.${method}`
});
res.end(JSON.stringify(conversations, null, 2));
let dataWrapper = new FileTypes[method](conversations);
res.end(dataWrapper.convert());
});
})
.catch((err) => res.send(err));
Expand Down
1 change: 1 addition & 0 deletions docker-compose.yml
Expand Up @@ -8,6 +8,7 @@ web:
PORT: 3000
ENV: development
APP_URL: 'http://localhost:3000'
REDIS_URL: 'redis://redis:6379'
links:
- redis
ports:
Expand Down
2 changes: 1 addition & 1 deletion index.js
Expand Up @@ -17,7 +17,7 @@ app.use(session({
saveUninitialized: true,
secret: 'facebook-chat-downloader-secret',
store: new RedisStore({
host: 'redis'
url: process.env.REDIS_URL
})
}));
app.use(require('./controllers'));
Expand Down
1 change: 1 addition & 0 deletions package.json
Expand Up @@ -18,6 +18,7 @@
"facebook-chat-api": "^1.2.0",
"geohash-coordinates": "^1.1.6",
"geolib": "^2.0.21",
"json2csv": "^3.7.2",
"moment": "^2.15.2",
"mongoose": "^4.6.5",
"nodemailer": "^2.6.4",
Expand Down
5 changes: 3 additions & 2 deletions views/conversations.pug
Expand Up @@ -15,5 +15,6 @@ block content
.panel-body
span.snippet #{conversation.snippet}
.list-group
a(href='/conversations/' + conversation.threadID + '.json')
button.list-group-item(type="button") Download JSON
each method, type in methods
a(href='/conversations/' + conversation.threadID + '.' + type)
button.list-group-item(type="button") Download #{method.description}
24 changes: 24 additions & 0 deletions wrappers/csv.js
@@ -0,0 +1,24 @@
let json2csv = require('json2csv');

class CsvWrapper {
constructor(raw) {
this.conversations = raw;
}

convert() {
try {
return json2csv({
data: this.conversations,
fields: ['senderName', 'body', 'timestampDatetime', 'timestamp'],
fieldNames: ['sender', 'body', 'timestamp', 'timestamp (unix)'],
defaultValue: '',
});
} catch(err) {
console.error(err);
}
}
}

CsvWrapper.description = 'CSV (excel)';

module.exports = CsvWrapper;
13 changes: 13 additions & 0 deletions wrappers/json.js
@@ -0,0 +1,13 @@
class JsonWrapper {
constructor(raw) {
this.conversations = raw;
}

convert() {
return JSON.stringify(this.conversations, null, 2);
}
}

JsonWrapper.description = 'JSON';

module.exports = JsonWrapper;
18 changes: 18 additions & 0 deletions wrappers/text.js
@@ -0,0 +1,18 @@
class TextWrapper {
constructor(raw) {
this.conversations = raw;
}

convert() {
return this.conversations.map(this.convertMessage).join('\n');
}

convertMessage(msg) {
let body = msg.body || '';
return `${msg.senderName} [${msg.timestampDatetime}]: ${body}`;
}
}

TextWrapper.description = 'TXT (plain text file)';

module.exports = TextWrapper;

0 comments on commit c57f320

Please sign in to comment.