-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.coffee
160 lines (140 loc) · 4.11 KB
/
server.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
# Node standard libraries
crypto = require 'crypto'
sys = require 'sys'
url = require 'url'
path = require 'path'
fs = require 'fs'
# Third party
coffeekup = require 'coffeekup'
express = require 'express'
mongoose = require 'mongoose'
mongoStore = require 'connect-mongodb'
# App
Answer = require('./models').Answer
Flashcard = require('./models').Flashcard
User = require('./models').User
partials = require './templates/partials'
# Globals
HOST = 'localhost'
PORT = '8080'
SITE_ROOT = process.cwd() + '/'
server = express.createServer()
## Configure server and middleware options
server.configure ->
server.set 'views', __dirname + '/templates'
server.set 'partials', __dirname + '/templates'
server.register '.coffee', coffeekup
server.set 'view engine', 'coffee'
server.use express.logger()
# For parsing request bodies (form POSTs, etc.)
server.use express.bodyParser()
# These must come after bodyDecoder and before methodOverride
server.use express.cookieParser()
# Must come after bodyDecoder
server.use express.methodOverride()
# Static media directory
server.use express.static __dirname
server.use server.router
server.configure 'development', ->
# Show verbose page errors
server.use express.errorHandler
dumpExceptions: true
showStack: true
# Connect to database `test`
db_url = 'mongodb://localhost:27017/test'
# Use MongoDB as a session store
server.use express.session
key: 'a key',
secret: 'secrets are no fun!'
store: mongoStore
url: db_url
mongoose.connect db_url
server.configure 'production', ->
express.errorHandler()
## Helpers
loadUser = (req, res, next) ->
if req.session.user_id
User.findById req.session.user_id, (user) ->
if user
req.currentUser = user
next()
else
res.redirect '/sessions/new'
else
res.redirect '/sessions/new'
getOrCreateUser = (req, res, next) ->
User.findOne {}, (err, user) ->
if not user
user = new User
email: '[email protected]'
user.save()
user.createStacks user, (user) ->
req.currentUser = user
next()
else
req.currentUser = user
next()
## Routes
server.get '/', (req, res) ->
res.render 'layout',
context:
title: 'Home'
content: coffeekup.render partials.home
server.get '/about', (req, res) ->
res.render 'layout',
context:
title: 'About',
content: coffeekup.render partials.about
#server.get '/dashboard', loadUser, (req, res) ->
server.get '/flashcards', getOrCreateUser, (req, res) ->
user = req.currentUser
user.getCurrentFlashcard user, (card) ->
res.render 'layout',
context:
title: 'Flashcards',
content: coffeekup.render(
partials.flashcards,
context:
content: coffeekup.render(
partials.answer,
context:
card: card
)
)
server.get '/flashcards/rate', getOrCreateUser, (req, res) ->
res.send coffeekup.render partials.rate
server.post '/flashcards', getOrCreateUser, (req, res) ->
user = req.currentUser
user.getCurrentFlashcard user, (card) ->
if req.body.answer
# Create a new Answer
if not card.answers
card.answers = new Array()
answer = new Answer
answer: req.body.answer
rating: req.body.rating
card.answers.push answer
card.save()
res.send coffeekup.render partials.rate
else if req.body.rating
# Add a rating to the last submitted Answer
# Doesn't work due to atomic save issue with mongoose
num_answers = card.answers.length
card.answers[num_answers-1].rating = req.body.rating
card.save()
user.getNextFlashcard user, (card) ->
res.render 'layout',
context:
title: 'Flashcards',
content: coffeekup.render(
partials.flashcards,
context:
content: coffeekup.render(
partials.answer,
context:
card: card
)
)
## Start the server
server.listen PORT, HOST
sys.puts "Server running at #{HOST}:#{PORT}"