-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.coffee
215 lines (179 loc) · 9.06 KB
/
app.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
express = require 'express'
express-namespace = require 'express-namespace'
stylus = require 'stylus'
RedisStore = require('connect-redis')(express)
MemoryStore = require('connect').session.MemoryStore
seq = new (require('sequelize'))('blog', 'root', '', {host: 'localhost', port: '3306'})
# ============Module
UserProvider = new (require('models/UserProvider'))(seq)
ArticleProvider = new (require('models/ArticleProvider'))(seq)
CommentProvider = new (require('models/CommentProvider'))(seq)
# ============Models
article = new (require('models/dummy/Article'))
# ============Export Server
app = module.exports = express.createServer()
# ============Configuration
app.configure ()->
app.set 'views', __dirname + '/views'
app.set 'view engine', 'jade'
app.use express.bodyParser()
app.use express.methodOverride()
app.use express.cookieParser()
#app.use express.session({secret: 'crazy lay', store: new MemoryStore({reapInterval: 60000 * 10})})
app.use express.session({secret: 'crazy lay', store: new RedisStore()})
app.use app.router
app.use express-namespace
app.use express.static(__dirname + '/public')
app.dynamicHelpers {messages: require('express-messages')}
app.configure 'development', ()->
app.use express.errorHandler({ dumpExceptions: true, showStack: true })
app.use express.logger(':remote-addr - - [:date] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent"')
app.configure 'production', ()->
app.use express.errorHandler()
buildUser = (isAuth, email, name, id)->
if isAuth then {email: email, name: name, id: id} else null
ITEM_PER_PAGE = 10
ARTICLE_ATTR = ['title', 'body', 'id', 'createdAt', 'updatedAt', 'userId', 'commentTimes', 'readTimes']
COMMENT_ATTR = ['id', 'body', 'createdAt', 'updatedAt', 'articleId']
filtCircularObject = (objects, keys)->
ret = []
obj = {}
for object in objects
for key in keys
obj[key] = object[key]
ret.push obj
obj = {}
return ret
# ============Routers
# basic pages
app.get '/bio', (req, res)->
res.render 'bio', {title: 'Biography', user: buildUser(req.session.isAuth, req.session.user_email, req.session.user_name, req.session.user_id)}
# with namespace
app.namespace '/', ()->
app.get '/', (req, res)->
# init req.session.user to null anyway
if not req.session || not req.session.isAuth
req.session.isAuth = false
req.session.user_email = null
req.session.user_name = null
req.session.user_id = null
ArticleProvider.findArticlesBriefAllByPage 0, ITEM_PER_PAGE, (error, as)->
filteredArticles = filtCircularObject as, ARTICLE_ATTR
console.log filteredArticles
ArticleProvider.countAll (error, c)->
res.render 'index', {title: 'welcome', user: buildUser(req.session.isAuth, req.session.user_email, req.session.user_name, req.session.user_id), articles: filteredArticles, next_page: 2, total_page: parseInt(c/10+1)}
app.get '/p/:page', (req, res)->
# get particular page
ArticleProvider.findArticlesBriefAllByPage 10*(parseInt(req.params.page)-1), ITEM_PER_PAGE, (error, articles)->
filteredArticles = filtCircularObject articles, ARTICLE_ATTR
if article && articles.length != 0
res.json({articles: filteredArticles, next_page: parseInt(req.params.page)+1})
else
res.json({articles: null, next_page: req.params.page})
app.namespace '/user', ()->
app.get '/', (req, res)->
res.render 'user', {title: 'welcome', user: buildUser(req.session.isAuth, req.session.user_email, req.session.user_name, req.session.user_id)}
app.post '/login', (req, res)->
UserProvider.authenticate req.body.email, req.body.password, (error, u)->
if error
req.flash 'error', error
else if u
# set session
req.session.isAuth = true
req.session.user_email = u.email
req.session.user_name = u.name
req.session.user_id = u.id
console.log req.session
#res.render 'user', {title: 'welcome', user: req.session.user}
res.redirect req.body.current_url
app.get '/logout', (req, res)->
# clear session
req.session.isAuth = false
res.redirect '/'
app.post '/register', (req, res)->
register_params_validate req, res, (ret)->
if ret
res.render 'index_reg', {title: 'welcome', user: null}
else
UserProvider.findUserByEmail req.body.email, (error, u)->
if u
req.flash 'error', 'Email Aready Taken'
res.render 'index_reg', {title: 'welcome', user: null}
else
UserProvider.addUser req.body.email, req.body.password, req.body.name, (error, u)->
if error
req.flash 'error', error
res.render 'index_reg', {title: 'welcome', user: null}
else if u
req.session.user = u
res.render 'user', {title: 'welcome', user: req.session.user}
app.get 'register_redirect', (req, res)->
# session keeping
if req.session and req.session.user
res.render 'user', {title: 'welcome', user: req.session.user}
else
req.session.user = null
res.render 'index_reg', {title: 'welcome registeration'}
app.namespace '/blog', ()->
app.get '/search/:query/p/:page', (req, res)->
ArticleProvider.findArticleByTitlePage req.params.query, 10*(parseInt(req.params.page)-1), ITEM_PER_PAGE, (error, articles)->
if articles && articles.length !=0
filteredArticles = filtCircularObject articles, ARTICLE_ATTR
res.json({articles: filteredArticles, next_page: parseInt(req.params.page)+1})
else
res.json({articles: null, next_page: req.params.page})
app.post '/search', (req, res)->
ArticleProvider.findArticleByTitlePage req.body.query, 10*(parseInt(req.body.page)-1), ITEM_PER_PAGE, (error, articles)->
ArticleProvider.countAllByTitle req.body.query, (error, c)->
res.render 'blog/search', {title: 'search', query: req.body.query, articles: articles, next_page: parseInt(req.body.page)+1, total_page: parseInt(c/10+1), user: buildUser(req.session.isAuth, req.session.user_email, req.session.user_name, req.session.user_id)}
app.get '/', (req, res)->
console.log req.session
ArticleProvider.findArticlesBriefByUserId '7', (error, articles)->
if articles
res.render 'blog', {title: 'personal list', articles: articles, user: buildUser(req.session.isAuth, req.session.user_email, req.session.user_name, req.session.user_id)}
app.get '/edit/:id', (req, res)->
ArticleProvider.findArticleById req.params.id, (error, article)->
res.render 'blog/edit', {title: 'Edit Blog', article: article, user: buildUser(req.session.isAuth, req.session.user_email, req.session.user_name, req.session.user_id)}
app.post '/edit/:id', (req, res)->
ArticleProvider.updateArticle req.params.id, req.body.blog_title, req.body.blog_body, (error, article)->
res.redirect '/blog/' + req.params.id
app.get '/new', (req, res)->
res.render 'blog/new', {title: 'Add New Blog', user: buildUser(req.session.isAuth, req.session.user_email, req.session.user_name, req.session.user_id)}
app.post '/new', (req, res)->
ArticleProvider.addArticle req.body.blog_title, req.body.blog_body, '12', (error, article)->
if error
req.flash 'error', error
res.redirect '/blog/new'
else
req.flash 'info', req.body.title + ' saved successfully'
res.redirect '/blog/'+ article.id
app.get '/:id', (req, res)->
ArticleProvider.findArticleById req.params.id, (error, article)->
CommentProvider.findCommentsByArticleId 0, 10, article.id, (error, comments)->
CommentProvider.countAllByArticleId req.params.id, (error, c)->
res.render 'blog/single', {title: 'Single Blog', article: article, comments: comments, next_page: 2, total_page: parseInt(c/10+1), user: buildUser(req.session.isAuth, req.session.user_email, req.session.user_name, req.session.user_id)}
app.namespace '/comment', ()->
app.get '/:aid/p/:page', (req, res)->
CommentProvider.findCommentsByArticleId 10*(parseInt(req.params.page)-1), ITEM_PER_PAGE, req.params.aid, (error, comments)->
if comments.length != 0
filteredComments = filtCircularObject comments, COMMENT_ATTR
res.json {comments: filteredComments, next_page: parseInt(req.params.page)+1}
else
res.json {comments: null, next_page: req.params.page}
app.post '/:aid', (req, res)->
CommentProvider.addComment req.body.comment_body, req.params.aid, (error, comment)->
if error
req.flash 'error', error
else
req.flash 'info', 'Comment Added'
res.redirect '/blog/' + req.params.aid
app.namespace '/category', ()->
app.get '/:ctype/:time', (req, res)->
ArticleProvider.findArticleByTime req.params.time, (error, articles)->
if articles && articles.length != 0
filteredArticles = filtCircularObject articles, ['id', 'createdAt', 'title']
res.json {articles: filteredArticles}
else
res.json {articles: null}
app.listen 3000
console.log "Express server listening on port %d in %s mode", app.address().port, app.settings.env