From e597f0c9054243a1be11d121442700002f0e4a12 Mon Sep 17 00:00:00 2001 From: Afoo Chang Date: Sun, 26 Jul 2015 22:24:07 +0800 Subject: [PATCH 01/16] websocket w/ cluster, #20 --- bin/www | 49 +++++++++++++++++++++++++++++++++++++++++++------ package.json | 1 + 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/bin/www b/bin/www index 8ba0b77..7afc0a8 100755 --- a/bin/www +++ b/bin/www @@ -9,26 +9,39 @@ var debug = require('debug')('myapp:server'); var http = require('http'); var cluster = require('cluster'); var cpuCount = require('os').cpus().length; +var WebSocketServer = require('websocket').server; /** * Get port from environment and store in Express. */ +/** + * Create HTTP server in worker process. + */ var port = normalizePort(process.env.PORT || '3000'); +var server = http.createServer(app); + +/* + * WebSocket Section + */ +var wsServer = new WebSocketServer({ + httpServer: server, + autoAcceptConnections: false +}); + +// create WebSocket connections array +app.clients = []; if (cluster.isMaster) { console.log('CPUs: ' + cpuCount); // Create a worker for each CPU for (var i = 0; i < cpuCount ; i++) { - cluster.fork({PORT: port + i}); + cluster.fork({ + PORT: port + i + }); } } else { - /** - * Create HTTP server in worker process. - */ - var port = process.env.PORT; - var server = http.createServer(app); console.log('HTTP server listening on port ' + port + ' at worker ' + cluster.worker.id); @@ -39,9 +52,33 @@ if (cluster.isMaster) { server.listen(port); server.on('error', onError); server.on('listening', onListening); + + wsServer.on('request', onWsRequest); } +function onWsConnMessage(message) { + if (message.type == 'utf8') { + console.log('Received message: ' + message.utf8Data); + } else if (message.type == 'binary') { + console.log('Received binary data.'); + } +} + +function onWsConnClose(reasonCode, description) { + console.log(' Peer disconnected with reason: ' + reasonCode); +} + +function onWsRequest(request) { + var connection = request.accept('echo-protocol', request.origin); + console.log("WebSocket connection accepted."); + + app.clients.push(connection); + + connection.on('message', onWsConnMessage); + connection.on('close', onWsConnClose); +} + /** * Normalize a port into a number, string, or false. */ diff --git a/package.json b/package.json index 56697db..1add124 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "passport": "^0.2.2", "passport-facebook": "^2.0.0", "serve-favicon": "~2.2.1", + "websocket": "^1.0.21", "winston": "^1.0.1" } } From db9245ddf58080349b12e997f1f08a00a85f4fc6 Mon Sep 17 00:00:00 2001 From: Afoo Chang Date: Mon, 27 Jul 2015 23:22:20 +0800 Subject: [PATCH 02/16] send by websocket, #20 --- app.js | 3 ++ routes/chat.js | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 routes/chat.js diff --git a/app.js b/app.js index 8b08fce..0155e42 100644 --- a/app.js +++ b/app.js @@ -14,6 +14,7 @@ var passport = require('passport') var routes = require('./routes/index'); var users = require('./routes/users'); +var chat = require('./routes/chat'); var posts = require('./routes/posts'); var account = require('./routes/account'); @@ -120,10 +121,12 @@ passport.use(new FacebookStrategy({ app.use(cors()); app.use('/', routes); +app.use('/', chat); app.use('/', posts); app.use('/users', users); app.use('/account', account); + app.get('/login/facebook', passport.authenticate('facebook')); diff --git a/routes/chat.js b/routes/chat.js new file mode 100644 index 0000000..36c79fe --- /dev/null +++ b/routes/chat.js @@ -0,0 +1,89 @@ +var express = require('express'); +var router = express.Router(); +var events = require('events'); +var winston = require('winston'); + +/* +router.get('/start', function(req, res, next) { + var workflow = new events.EventEmitter(); + + workflow.outcome = { + success: false, + errfor: {} + }; + + workflow.on('validation', function() { + console.log('va'); + + workflow.emit('start'); + }); + + workflow.on('start', function() { + console.log('start'); + + this.render('chat', function(err, html){ + if(err) workflow.outcome.errfor = err; + + console.log('render'); + }); + + workflow.outcome.success = true; + workflow.emit('response'); + }); + + workflow.on('response', function() { + console.log('response'); + + res.send(workflow.outcome); + }); + + workflow.emit('validation'); +}); +*/ + + +router.post('/send/:message', function(req, res, next) { + var workflow = new events.EventEmitter(); + var clients = req.app.clients; + var msg = req.params.message; + console.log(msg); + + workflow.outcome = { + success: false, + errfor: {}, + data: [] + }; + + workflow.on('validation', function() { + if(typeof msg === 'string') { + console.log('message is a string'); + return workflow.emit('boardcast'); + } + + workflow.outcome.errfor = 'message is not a string'; + workflow.emit('response'); + }); + + workflow.on('boardcast', function() { + console.log('ready to boardcast "' + msg + ' "'); + + workflow.outcome.success = true; + workflow.outcome.data.push(msg); + + clients.forEach(function(client) { + client.sendUTF(JSON.stringify(workflow.outcome.data)); + }); + + workflow.emit('response'); + }); + + workflow.on('response', function() { + console.log(workflow.outcome); + res.send(workflow.outcome); + }); + + workflow.emit('validation'); +}); + + +module.exports = router; From efe0753e78f4c741e51f4921fd26251f4ea91d75 Mon Sep 17 00:00:00 2001 From: Afoo Chang Date: Tue, 28 Jul 2015 23:21:52 +0800 Subject: [PATCH 03/16] fix websocket and add start page, #20 --- routes/chat.js | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/routes/chat.js b/routes/chat.js index 36c79fe..cd4015f 100644 --- a/routes/chat.js +++ b/routes/chat.js @@ -3,55 +3,46 @@ var router = express.Router(); var events = require('events'); var winston = require('winston'); -/* +var history = []; + router.get('/start', function(req, res, next) { var workflow = new events.EventEmitter(); workflow.outcome = { success: false, - errfor: {} + errfor: {}, + message: {} }; - workflow.on('validation', function() { - console.log('va'); - - workflow.emit('start'); - }); - workflow.on('start', function() { console.log('start'); - this.render('chat', function(err, html){ - if(err) workflow.outcome.errfor = err; - - console.log('render'); - }); - workflow.outcome.success = true; + workflow.outcome.message.data = history; workflow.emit('response'); }); workflow.on('response', function() { console.log('response'); - res.send(workflow.outcome); + res.send(workflow.outcome.message); }); - workflow.emit('validation'); + workflow.emit('start'); }); -*/ router.post('/send/:message', function(req, res, next) { var workflow = new events.EventEmitter(); var clients = req.app.clients; var msg = req.params.message; - console.log(msg); + var obj = {}; + var milliseconds = new Date().getTime(); workflow.outcome = { success: false, errfor: {}, - data: [] + message: {} }; workflow.on('validation', function() { @@ -68,10 +59,14 @@ router.post('/send/:message', function(req, res, next) { console.log('ready to boardcast "' + msg + ' "'); workflow.outcome.success = true; - workflow.outcome.data.push(msg); + obj.message = msg; + obj.timestamp = milliseconds; + history.push(obj); + workflow.outcome.message.type = 'message'; + workflow.outcome.message.data = history; clients.forEach(function(client) { - client.sendUTF(JSON.stringify(workflow.outcome.data)); + client.sendUTF(JSON.stringify(workflow.outcome.message)); }); workflow.emit('response'); From 61284d0f6bffc2f6a0f88d1bdb208562e94b30f6 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Sat, 1 Aug 2015 12:37:15 +0000 Subject: [PATCH 04/16] fix api domain name --- package.json | 15 ++++++++++++++- public/booklog/javascripts/app.js | 2 +- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 1add124..f55bfcc 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,19 @@ "passport-facebook": "^2.0.0", "serve-favicon": "~2.2.1", "websocket": "^1.0.21", - "winston": "^1.0.1" + "winston": "^1.0.1", + "nginx": "0.0.0", + "forever": "~0.15.1" + }, + "description": "ERROR: No README data found!", + "main": "app.js", + "repository": { + "type": "git", + "url": "https://github.com/afooo/booklog3-1.git" + }, + "author": "", + "license": "BSD-2-Clause", + "bugs": { + "url": "https://github.com/afooo/booklog3-1/issues" } } diff --git a/public/booklog/javascripts/app.js b/public/booklog/javascripts/app.js index 1b6b8a8..c308981 100644 --- a/public/booklog/javascripts/app.js +++ b/public/booklog/javascripts/app.js @@ -9,7 +9,7 @@ var app = app || {}; **/ app.Message = Backbone.Model.extend({ url: function() { - return 'http://test.booklog.io:3000/1/post' + return 'http://alwaysladylove.com/1/post' + ( this.id === null ? '' : '/' + this.id ); }, id: null, From 491cf4857991d33b376b0c9eba9c7ee124496c70 Mon Sep 17 00:00:00 2001 From: Afoo Chang Date: Sun, 2 Aug 2015 14:38:23 +0800 Subject: [PATCH 05/16] fix package.json --- app.js | 2 +- package.json | 16 ---------------- routes/posts.js | 1 + 3 files changed, 2 insertions(+), 17 deletions(-) diff --git a/app.js b/app.js index f4feaf5..b094e7e 100644 --- a/app.js +++ b/app.js @@ -37,7 +37,7 @@ winston.add(winston.transports.File, { level: 'info' }); -mongoose.connect('mongodb://booklog3:123456@ds053130.mongolab.com:53130/booklog3'); +mongoose.connect('mongodb://booklog3:123456@ds047622.mongolab.com:47622/booklog3'); mongoose.connection.on('error', function() { winston.log('error', 'MongoDB: error'); }); diff --git a/package.json b/package.json index 27929c7..9bc4907 100644 --- a/package.json +++ b/package.json @@ -18,25 +18,9 @@ "passport": "^0.2.2", "passport-facebook": "^2.0.0", "serve-favicon": "~2.2.1", -<<<<<<< HEAD "websocket": "^1.0.21", "winston": "^1.0.1", "nginx": "0.0.0", "forever": "~0.15.1" - }, - "description": "ERROR: No README data found!", - "main": "app.js", - "repository": { - "type": "git", - "url": "https://github.com/afooo/booklog3-1.git" - }, - "author": "", - "license": "BSD-2-Clause", - "bugs": { - "url": "https://github.com/afooo/booklog3-1/issues" -======= - "winston": "^1.0.1", - "websocket": "~1.0.21" ->>>>>>> upstream/master } } diff --git a/routes/posts.js b/routes/posts.js index e0540f9..95a87fa 100644 --- a/routes/posts.js +++ b/routes/posts.js @@ -2,6 +2,7 @@ var express = require('express'); var router = express.Router(); var events = require('events'); var winston = require('winston'); +var cors = require('cors'); winston.add(winston.transports.File, { name: 'booklog3-1', From 715273046503490574ad44ae7f5dbde7e3d506dc Mon Sep 17 00:00:00 2001 From: Afoo Chang Date: Sun, 2 Aug 2015 15:02:52 +0800 Subject: [PATCH 06/16] fix merge --- bin/www | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/bin/www b/bin/www index 0f3a555..f3c5908 100755 --- a/bin/www +++ b/bin/www @@ -53,9 +53,8 @@ if (cluster.isMaster) { server.on('error', onError); server.on('listening', onListening); -<<<<<<< HEAD wsServer.on('request', onWsRequest); -======= + /* * WebSocket Section */ @@ -90,7 +89,6 @@ if (cluster.isMaster) { } wsServer.on('request', onWsRequest); ->>>>>>> upstream/master } From 35d83cf59bdf065bbbf3e9a7d134d279c3bade61 Mon Sep 17 00:00:00 2001 From: Afoo Chang Date: Sun, 2 Aug 2015 15:34:52 +0800 Subject: [PATCH 07/16] merge fix --- app.js | 7 +-- public/javascripts/app.js | 2 +- routes/chat.js | 127 -------------------------------------- 3 files changed, 3 insertions(+), 133 deletions(-) delete mode 100644 routes/chat.js diff --git a/app.js b/app.js index b094e7e..d38c72e 100644 --- a/app.js +++ b/app.js @@ -17,9 +17,7 @@ var passport = require('passport') var routes = require('./routes/index'); var chats = require('./routes/chats'); var users = require('./routes/users'); -var chat = require('./routes/chat'); var posts = require('./routes/posts'); -var chat = require('./routes/chat'); var account = require('./routes/account'); var app = express(); @@ -95,8 +93,8 @@ passport.deserializeUser(function(obj, done) { }); passport.use(new FacebookStrategy({ - clientID: '1559480364270197', - clientSecret: '4d5d1e9389c179142348cbb7044bdab1', + clientID: '410866279063864', + clientSecret: '3887b8914b81d0e778d3b9af10775fb6', callbackURL: "/auth/facebook/callback" }, function(accessToken, refreshToken, profile, done) { @@ -125,7 +123,6 @@ passport.use(new FacebookStrategy({ app.use(cors()); app.use('/', routes); -app.use('/', chat); app.use('/', posts); app.use('/', chats); app.use('/users', users); diff --git a/public/javascripts/app.js b/public/javascripts/app.js index b0c9d9c..372ffbc 100644 --- a/public/javascripts/app.js +++ b/public/javascripts/app.js @@ -9,7 +9,7 @@ var app = app || {}; **/ app.Message = Backbone.Model.extend({ url: function() { - return 'http://launchergap.org/1/post' + return 'http://localhost:3000/1/post' + ( this.id === null ? '' : '/' + this.id ); }, id: null, diff --git a/routes/chat.js b/routes/chat.js deleted file mode 100644 index 8a01489..0000000 --- a/routes/chat.js +++ /dev/null @@ -1,127 +0,0 @@ -var express = require('express'); -var router = express.Router(); -var events = require('events'); -<<<<<<< HEAD -var winston = require('winston'); - -var history = []; - -router.get('/start', function(req, res, next) { - var workflow = new events.EventEmitter(); - - workflow.outcome = { - success: false, - errfor: {}, - message: {} - }; - - workflow.on('start', function() { - console.log('start'); - - workflow.outcome.success = true; - workflow.outcome.message.data = history; - workflow.emit('response'); - }); - - workflow.on('response', function() { - console.log('response'); - - res.send(workflow.outcome.message); - }); - - workflow.emit('start'); -}); - - -router.post('/send/:message', function(req, res, next) { - var workflow = new events.EventEmitter(); - var clients = req.app.clients; - var msg = req.params.message; - var obj = {}; - var milliseconds = new Date().getTime(); - - workflow.outcome = { - success: false, - errfor: {}, - message: {} - }; - - workflow.on('validation', function() { - if(typeof msg === 'string') { - console.log('message is a string'); - return workflow.emit('boardcast'); - } - - workflow.outcome.errfor = 'message is not a string'; - workflow.emit('response'); - }); - - workflow.on('boardcast', function() { - console.log('ready to boardcast "' + msg + ' "'); - - workflow.outcome.success = true; - obj.message = msg; - obj.timestamp = milliseconds; - history.push(obj); - workflow.outcome.message.type = 'message'; - workflow.outcome.message.data = history; - - clients.forEach(function(client) { - client.sendUTF(JSON.stringify(workflow.outcome.message)); - }); - -======= - -var history = []; - -router.post('/send/:message', function(req, res, next) { - var workflow = new events.EventEmitter(); - var clients = req.app.clients; - - workflow.outcome = { - success: false, - errfor: {} - }; - - workflow.on('validation', function() { - history.push({ - message: req.params.message, - timestamp: new Date().getTime() - }); - workflow.emit('broadcast'); - }); - - workflow.on('broadcast', function() { - for (i = 0; i < clients.length; i++) { - var client = clients[i]; - var data = { - type: 'message', - data: history - }; - - console.log(data); - client.sendUTF(JSON.stringify(data)); - }; - - workflow.outcome.success = true; ->>>>>>> upstream/master - workflow.emit('response'); - }); - - workflow.on('response', function() { -<<<<<<< HEAD - console.log(workflow.outcome); - res.send(workflow.outcome); -======= - res.send(workflow.outcome); ->>>>>>> upstream/master - }); - - workflow.emit('validation'); -}); - -<<<<<<< HEAD - -======= ->>>>>>> upstream/master -module.exports = router; From 93d9160114a30d2492a6ce656bd49577839328b4 Mon Sep 17 00:00:00 2001 From: Afoo Chang Date: Sun, 2 Aug 2015 15:41:47 +0800 Subject: [PATCH 08/16] fix backbone url --- public/javascripts/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/javascripts/app.js b/public/javascripts/app.js index 372ffbc..c308981 100644 --- a/public/javascripts/app.js +++ b/public/javascripts/app.js @@ -9,7 +9,7 @@ var app = app || {}; **/ app.Message = Backbone.Model.extend({ url: function() { - return 'http://localhost:3000/1/post' + return 'http://alwaysladylove.com/1/post' + ( this.id === null ? '' : '/' + this.id ); }, id: null, From abef4021f2a7d7b14be3822c4f017be9b0d4c9cc Mon Sep 17 00:00:00 2001 From: Afoo Chang Date: Sun, 2 Aug 2015 16:30:50 +0800 Subject: [PATCH 09/16] fix fb auth --- app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app.js b/app.js index d38c72e..14ea277 100644 --- a/app.js +++ b/app.js @@ -133,10 +133,10 @@ app.get('/login/facebook', passport.authenticate('facebook')); app.get('/auth/facebook/callback', - passport.authenticate('facebook', { failureRedirect: '/login/fail' }), + passport.authenticate('facebook', { failureRedirect: '/login' }), function(req, res) { // Successful authentication, redirect home. - res.redirect('/'); + res.redirect('http://alwaysladylove.com/'); }); // catch 404 and forward to error handler From 3b3f6a9c4a5e58c911de8487c4f747e6992844f3 Mon Sep 17 00:00:00 2001 From: Afoo Chang Date: Sun, 2 Aug 2015 21:17:56 +0800 Subject: [PATCH 10/16] fix fb auth --- app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app.js b/app.js index 14ea277..c894dc0 100644 --- a/app.js +++ b/app.js @@ -95,7 +95,7 @@ passport.deserializeUser(function(obj, done) { passport.use(new FacebookStrategy({ clientID: '410866279063864', clientSecret: '3887b8914b81d0e778d3b9af10775fb6', - callbackURL: "/auth/facebook/callback" + callbackURL: "http://alwaysladylove.com/auth/facebook/callback" }, function(accessToken, refreshToken, profile, done) { app.db.model.User.findOne({"facebook._json.id": profile._json.id}, function(err, user) { @@ -136,7 +136,7 @@ app.get('/auth/facebook/callback', passport.authenticate('facebook', { failureRedirect: '/login' }), function(req, res) { // Successful authentication, redirect home. - res.redirect('http://alwaysladylove.com/'); + res.redirect('/'); }); // catch 404 and forward to error handler From f48bbc9c4b540891c6fb56686c4acd41c666f6a8 Mon Sep 17 00:00:00 2001 From: Afoo Chang Date: Mon, 3 Aug 2015 22:54:01 +0800 Subject: [PATCH 11/16] add articles created time, #34 --- app.js | 3 ++- public/index.html | 2 ++ public/javascripts/app.js | 3 ++- routes/posts.js | 1 + 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/app.js b/app.js index c894dc0..6ad815b 100644 --- a/app.js +++ b/app.js @@ -95,7 +95,8 @@ passport.deserializeUser(function(obj, done) { passport.use(new FacebookStrategy({ clientID: '410866279063864', clientSecret: '3887b8914b81d0e778d3b9af10775fb6', - callbackURL: "http://alwaysladylove.com/auth/facebook/callback" +// callbackURL: "http://alwaysladylove.com/auth/facebook/callback" + callbackURL: "/auth/facebook/callback" }, function(accessToken, refreshToken, profile, done) { app.db.model.User.findOne({"facebook._json.id": profile._json.id}, function(err, user) { diff --git a/public/index.html b/public/index.html index c781d66..80fd352 100644 --- a/public/index.html +++ b/public/index.html @@ -24,6 +24,7 @@

<%= post.title %>

+
<%= post.timeCreated %>
<% }); %> @@ -32,6 +33,7 @@

<%= post.title %>

diff --git a/public/javascripts/app.js b/public/javascripts/app.js index c308981..6656ca0 100644 --- a/public/javascripts/app.js +++ b/public/javascripts/app.js @@ -9,7 +9,8 @@ var app = app || {}; **/ app.Message = Backbone.Model.extend({ url: function() { - return 'http://alwaysladylove.com/1/post' +// return 'http://alwaysladylove.com/1/post' + return 'http://localhost:3000/1/post' + ( this.id === null ? '' : '/' + this.id ); }, id: null, diff --git a/routes/posts.js b/routes/posts.js index 95a87fa..f1f5316 100644 --- a/routes/posts.js +++ b/routes/posts.js @@ -111,6 +111,7 @@ router.delete('/1/post/:id', function(req, res, next) { router.put('/1/post/:id', function(req, res, next) { var fieldsToSet = { title: req.query.title, + time: req.query.timeCreated, content: req.query.content }; From b33526de58604fe9e420b9d0c01c0b85c49e396c Mon Sep 17 00:00:00 2001 From: Afoo Chang Date: Wed, 5 Aug 2015 00:02:02 +0800 Subject: [PATCH 12/16] add login page, #33 --- app.js | 12 ++---------- routes/login.js | 22 ++++++++++++++++++++++ views/login.jade | 12 ++++++++++++ 3 files changed, 36 insertions(+), 10 deletions(-) create mode 100644 routes/login.js create mode 100644 views/login.jade diff --git a/app.js b/app.js index 6ad815b..016d7b7 100644 --- a/app.js +++ b/app.js @@ -15,6 +15,7 @@ var passport = require('passport') , FacebookStrategy = require('passport-facebook').Strategy; var routes = require('./routes/index'); +var login = require('./routes/login'); var chats = require('./routes/chats'); var users = require('./routes/users'); var posts = require('./routes/posts'); @@ -124,22 +125,13 @@ passport.use(new FacebookStrategy({ app.use(cors()); app.use('/', routes); +app.use('/', login); app.use('/', posts); app.use('/', chats); app.use('/users', users); app.use('/account', account); -app.get('/login/facebook', - passport.authenticate('facebook')); - -app.get('/auth/facebook/callback', - passport.authenticate('facebook', { failureRedirect: '/login' }), - function(req, res) { - // Successful authentication, redirect home. - res.redirect('/'); - }); - // catch 404 and forward to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); diff --git a/routes/login.js b/routes/login.js new file mode 100644 index 0000000..f737a73 --- /dev/null +++ b/routes/login.js @@ -0,0 +1,22 @@ +var express = require('express'); +var router = express.Router(); +var passport = require('passport'); + + +/* FB auth */ + +router.get('/login/facebook', + passport.authenticate('facebook')); + +router.get('/auth/facebook/callback', + passport.authenticate('facebook', { failureRedirect: '/login' }), + function(req, res) { + // Successful authentication, redirect home. + res.redirect('/'); + }); + +router.get('/login', function(req, res, next){ + res.render('login', { title: 'Login', message: 'Welcome to here!'}); +}); + +module.exports = router; diff --git a/views/login.jade b/views/login.jade new file mode 100644 index 0000000..93b2fdf --- /dev/null +++ b/views/login.jade @@ -0,0 +1,12 @@ +extends layout + +block content + h1= title + h4 choose your account + div.row + a(href='http://localhost:3000/login/facebook') + img(src='https://cdn0.iconfinder.com/data/icons/yooicons_set01_socialbookmarks/128/social_facebook_box_blue.png') + a(href='') + img(src='https://cdn0.iconfinder.com/data/icons/yooicons_set01_socialbookmarks/128/social_twitter_box_white.png') + a(href='') + img(src='https://cdn0.iconfinder.com/data/icons/yooicons_set01_socialbookmarks/128/social_google_box.png') From 0278d8f1ffdf6965f688c7451fe2cc85cdc4554e Mon Sep 17 00:00:00 2001 From: Afoo Chang Date: Thu, 6 Aug 2015 21:24:22 +0800 Subject: [PATCH 13/16] fix url routing --- app.js | 4 ++-- public/javascripts/app.js | 4 ++-- views/login.jade | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app.js b/app.js index 016d7b7..27df541 100644 --- a/app.js +++ b/app.js @@ -96,8 +96,8 @@ passport.deserializeUser(function(obj, done) { passport.use(new FacebookStrategy({ clientID: '410866279063864', clientSecret: '3887b8914b81d0e778d3b9af10775fb6', -// callbackURL: "http://alwaysladylove.com/auth/facebook/callback" - callbackURL: "/auth/facebook/callback" + callbackURL: "http://alwaysladylove.com/auth/facebook/callback" +// callbackURL: "/auth/facebook/callback" }, function(accessToken, refreshToken, profile, done) { app.db.model.User.findOne({"facebook._json.id": profile._json.id}, function(err, user) { diff --git a/public/javascripts/app.js b/public/javascripts/app.js index 6656ca0..fc75872 100644 --- a/public/javascripts/app.js +++ b/public/javascripts/app.js @@ -9,8 +9,8 @@ var app = app || {}; **/ app.Message = Backbone.Model.extend({ url: function() { -// return 'http://alwaysladylove.com/1/post' - return 'http://localhost:3000/1/post' + return 'http://alwaysladylove.com/1/post' +// return 'http://localhost:3000/1/post' + ( this.id === null ? '' : '/' + this.id ); }, id: null, diff --git a/views/login.jade b/views/login.jade index 93b2fdf..3d9efda 100644 --- a/views/login.jade +++ b/views/login.jade @@ -4,7 +4,7 @@ block content h1= title h4 choose your account div.row - a(href='http://localhost:3000/login/facebook') + a(href='http://alwaysladylove.com/login/facebook') img(src='https://cdn0.iconfinder.com/data/icons/yooicons_set01_socialbookmarks/128/social_facebook_box_blue.png') a(href='') img(src='https://cdn0.iconfinder.com/data/icons/yooicons_set01_socialbookmarks/128/social_twitter_box_white.png') From 03f8a845646dbea377f10b82677a06f1997e01c7 Mon Sep 17 00:00:00 2001 From: Afoo Chang Date: Thu, 6 Aug 2015 21:48:25 +0800 Subject: [PATCH 14/16] fix --- public/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/index.html b/public/index.html index 80fd352..a86d815 100644 --- a/public/index.html +++ b/public/index.html @@ -71,7 +71,7 @@

<%= content %>

-

Jollen's 最新文章 +

afoo's 最新文章 Showcase Your Work

From e83fa3726027a5264c29d835c6e72a4743ec0080 Mon Sep 17 00:00:00 2001 From: Afoo Chang Date: Tue, 25 Aug 2015 20:49:14 +0800 Subject: [PATCH 15/16] add login hyperlink and modal, #36 --- app.js | 5 ++- public/booklog/index.html | 14 ++++++++ public/booklog/javascripts/app.js | 8 +++++ public/index.html | 57 +++++++++++++++++++++++++++++-- public/javascripts/app.js | 21 ++++++++++-- routes/login.js | 3 +- routes/posts.js | 13 ++++--- views/login.jade | 24 ++++++++----- 8 files changed, 122 insertions(+), 23 deletions(-) diff --git a/app.js b/app.js index 27df541..ad37987 100644 --- a/app.js +++ b/app.js @@ -96,8 +96,8 @@ passport.deserializeUser(function(obj, done) { passport.use(new FacebookStrategy({ clientID: '410866279063864', clientSecret: '3887b8914b81d0e778d3b9af10775fb6', - callbackURL: "http://alwaysladylove.com/auth/facebook/callback" -// callbackURL: "/auth/facebook/callback" +// callbackURL: "http://alwaysladylove.com/auth/facebook/callback" + callbackURL: "/auth/facebook/callback" }, function(accessToken, refreshToken, profile, done) { app.db.model.User.findOne({"facebook._json.id": profile._json.id}, function(err, user) { @@ -114,7 +114,6 @@ passport.use(new FacebookStrategy({ user = doc; } - console.log(user); return done(null, user); // verify callback }); diff --git a/public/booklog/index.html b/public/booklog/index.html index c781d66..2c48ab2 100644 --- a/public/booklog/index.html +++ b/public/booklog/index.html @@ -36,6 +36,20 @@

<%= content %>

+ + +
+ + + +
+
diff --git a/public/javascripts/app.js b/public/javascripts/app.js index fc75872..735fc64 100644 --- a/public/javascripts/app.js +++ b/public/javascripts/app.js @@ -9,8 +9,8 @@ var app = app || {}; **/ app.Message = Backbone.Model.extend({ url: function() { - return 'http://alwaysladylove.com/1/post' -// return 'http://localhost:3000/1/post' +// return 'http://alwaysladylove.com/1/post' + return 'http://localhost:3000/1/post' + ( this.id === null ? '' : '/' + this.id ); }, id: null, @@ -23,6 +23,7 @@ app.Message = Backbone.Model.extend({ } }); + /** * VIEWS **/ @@ -34,6 +35,7 @@ app.ContentView = Backbone.View.extend({ // constructor initialize: function() { this.model = new app.Message(); + this.model.bind('sync', this.render, this); this.model.bind('change', this.render, this); this.template = _.template($('#post-list').html()); @@ -78,7 +80,22 @@ app.FormView = Backbone.View.extend({ } }); +app.LoginView = Backbone.View.extend({ + el: 'body', + events: { + 'click #op-modal': 'modal' + }, + render: function(){ + this.$('#myModal').modal(); + }, + modal: function(e){ + this.render(); + } +}); + + $(document).ready(function(){ app.contentView = new app.ContentView(); app.formView = new app.FormView(); + app.loginView = new app.LoginView(); }); diff --git a/routes/login.js b/routes/login.js index f737a73..c22d1cc 100644 --- a/routes/login.js +++ b/routes/login.js @@ -16,7 +16,8 @@ router.get('/auth/facebook/callback', }); router.get('/login', function(req, res, next){ - res.render('login', { title: 'Login', message: 'Welcome to here!'}); + res.render('login', { title: 'Login', message: 'choose one you love!'}); }); + module.exports = router; diff --git a/routes/posts.js b/routes/posts.js index f1f5316..c7e0e9f 100644 --- a/routes/posts.js +++ b/routes/posts.js @@ -14,8 +14,11 @@ winston.add(winston.transports.File, { function ensureAuthenticate(req, res, next) { if (req.isAuthenticated()) { winston.log('info', req.user.displayName); - return next(); } - res.redirect('/login/facebook'); + return next(); + } + + console.log('im not login'); + res.redirect('/login'); } router.get('/1/post', function(req, res, next) { @@ -49,13 +52,14 @@ router.get('/1/post', function(req, res, next) { workflow.emit('validation'); }); -router.get('/1/post/:id', function(req, res, next) { +router.get('/1/post/:id', ensureAuthenticate, function(req, res, next) { + console.log('roger'); req.app.db.model.Post.findById(req.params.id, function(err, posts) { res.json(posts); }); }); -router.post('/1/post', function(req, res, next) { +router.post('/1/post', ensureAuthenticate, function(req, res, next) { var workflow = new events.EventEmitter(); var Post = req.app.db.model.Post; @@ -111,7 +115,6 @@ router.delete('/1/post/:id', function(req, res, next) { router.put('/1/post/:id', function(req, res, next) { var fieldsToSet = { title: req.query.title, - time: req.query.timeCreated, content: req.query.content }; diff --git a/views/login.jade b/views/login.jade index 3d9efda..59dec1c 100644 --- a/views/login.jade +++ b/views/login.jade @@ -1,12 +1,18 @@ extends layout block content - h1= title - h4 choose your account - div.row - a(href='http://alwaysladylove.com/login/facebook') - img(src='https://cdn0.iconfinder.com/data/icons/yooicons_set01_socialbookmarks/128/social_facebook_box_blue.png') - a(href='') - img(src='https://cdn0.iconfinder.com/data/icons/yooicons_set01_socialbookmarks/128/social_twitter_box_white.png') - a(href='') - img(src='https://cdn0.iconfinder.com/data/icons/yooicons_set01_socialbookmarks/128/social_google_box.png') + h1= title + h4= message + div.row + a(href='http://localhost:3000/login/facebook') + img(src='https://cdn0.iconfinder.com/data/icons/yooicons_set01_socialbookmarks/128/social_facebook_box_blue.png') + a(href='') + img(src='https://cdn0.iconfinder.com/data/icons/yooicons_set01_socialbookmarks/128/social_twitter_box_white.png') + a(href='') + img(src='https://cdn0.iconfinder.com/data/icons/yooicons_set01_socialbookmarks/128/social_google_box.png') + + script(src='javascripts/jquery.min.js') + script(src='javascripts/bootstrap.min.js') + script(src='vendor/underscore/underscore-min.js') + script(src='vendor/backbone/backbone-min.js') + script(src='javascripts/app.js') From 6ccd621678b4e1864a88c0b551b1b0e440689f8a Mon Sep 17 00:00:00 2001 From: Afoo Chang Date: Mon, 21 Sep 2015 22:36:30 +0800 Subject: [PATCH 16/16] adjust delete button, #37 --- app.js | 16 +++++++++-- public/index.html | 3 ++ public/javascripts/app.js | 20 +++++++++++-- public/tolearn.js | 59 +++++++++++++++++++++++++++++++++++++++ routes/learn.js | 33 ++++++++++++++++++++++ routes/posts.js | 43 +++++++++++++++++++++++----- views/learn.jade | 47 +++++++++++++++++++++++++++++++ views/login.jade | 2 +- 8 files changed, 209 insertions(+), 14 deletions(-) create mode 100644 public/tolearn.js create mode 100644 routes/learn.js create mode 100644 views/learn.jade diff --git a/app.js b/app.js index ad37987..06ad078 100644 --- a/app.js +++ b/app.js @@ -20,6 +20,7 @@ var chats = require('./routes/chats'); var users = require('./routes/users'); var posts = require('./routes/posts'); var account = require('./routes/account'); +var learn = require('./routes/learn'); var app = express(); @@ -45,8 +46,8 @@ mongoose.connection.on('open', function() { }); var postSchema = new mongoose.Schema({ - title : { type: String }, - content : { type: String }, + title: { type: String }, + content: { type: String }, userId: { type: mongoose.Schema.Types.ObjectId, ref: 'user' }, timeCreated: { type: Date, default: Date.now } }); @@ -59,13 +60,21 @@ var userSchema = new mongoose.Schema({ facebook: { type: Object, select: false } }); +var lessonSchema = new mongoose.Schema({ + lessonName: { type: String, unique: true }, + lessonLearn: { type: String, unique: true }, + timeCreated: { type: Date, default: Date.now } +}); + var Post = mongoose.model('post', postSchema); var User = mongoose.model('user', userSchema); +var Learn = mongoose.model('learn', lessonSchema); app.db = { model: { Post: Post, User: User, + Learn: Learn } }; @@ -129,6 +138,7 @@ app.use('/', posts); app.use('/', chats); app.use('/users', users); app.use('/account', account); +app.use('/learn', learn); // catch 404 and forward to error handler @@ -170,4 +180,4 @@ app.use(function(err, req, res, next) { }); -module.exports = app; +module.exports = app; \ No newline at end of file diff --git a/public/index.html b/public/index.html index 9d084cd..04d30db 100644 --- a/public/index.html +++ b/public/index.html @@ -36,6 +36,9 @@

<%= title %>

<%= timeCreated %>

<%= content %>

+
+ +