1 | _ = require 'underscore'
|
2 | fs = require 'fs'
|
3 | express = require 'express'
|
4 | Backbone = require 'backbone'
|
5 | sharify = require 'sharify'
|
6 | backboneSuperSync = require 'backbone-super-sync'
|
7 | bodyParser = require 'body-parser'
|
8 | cookieParser = require 'cookie-parser'
|
9 | session = require 'cookie-session'
|
10 | path = require "path"
|
11 | logger = require 'morgan'
|
12 | artsyXapp = require 'artsy-xapp'
|
13 | artsyPassport = require '../'
|
14 | config = require '../config.coffee'
|
15 |
|
16 |
|
17 | class CurrentUser extends Backbone.Model
|
18 | url: -> "#{config.ARTSY_URL}/api/v1/me"
|
19 | sync: (method, model, options = {}) ->
|
20 | options.headers ?= {}
|
21 | options.headers['X-Access-Token'] = @get 'accessToken'
|
22 | super
|
23 | unlink: (options) ->
|
24 | auth = new Backbone.Model id: 'foo'
|
25 | auth.url = "#{config.ARTSY_URL}/api/v1/me/authentications/#{options.provider}"
|
26 | auth.destroy
|
27 | headers: 'X-Access-Token': @get 'accessToken'
|
28 | error: options.error
|
29 | success: => @fetch options
|
30 |
|
31 | sharify.data = config
|
32 |
|
33 | setup = (app) ->
|
34 |
|
35 | app.use sharify
|
36 |
|
37 | Backbone.sync = backboneSuperSync
|
38 |
|
39 | app.set 'views', __dirname
|
40 | app.set 'view engine', 'jade'
|
41 |
|
42 | app.use bodyParser.json()
|
43 | app.use bodyParser.urlencoded(extended: true)
|
44 | app.use cookieParser()
|
45 | app.use session
|
46 | secret: 'super-secret'
|
47 | key: 'artsy-passport'
|
48 | app.use logger('dev')
|
49 |
|
50 | app.use express.static __dirname + '/public'
|
51 |
|
52 |
|
53 | app.use artsyPassport _.extend config,
|
54 | CurrentUser: CurrentUser
|
55 | { loginPagePath, signupPagePath, settingsPagePath,
|
56 | afterSignupPagePath, twitterLastStepPath, logoutPath } = artsyPassport.options
|
57 |
|
58 |
|
59 | app.get '(/|/log_in|/sign_up|/user/edit)', (req, res) ->
|
60 | if req.user? then res.render 'loggedin' else res.render 'login'
|
61 | app.get afterSignupPagePath, (req, res) ->
|
62 | res.render 'personalize'
|
63 | app.get twitterLastStepPath, (req, res) ->
|
64 | res.render 'onelaststep'
|
65 |
|
66 |
|
67 |
|
68 | app.get '/deleteaccount', (req, res, next) ->
|
69 | return next() unless req.user?
|
70 | req.user.destroy
|
71 | error: (m, e) -> next e
|
72 | success: -> res.redirect logoutPath
|
73 | app.get '/unlink/:provider', (req, res, next) ->
|
74 | req.user.unlink
|
75 | provider: req.params.provider
|
76 | error: (m, e) -> next e
|
77 | success: (user, r) ->
|
78 | req.login user, (err) ->
|
79 | return next err if err
|
80 | res.redirect settingsPagePath
|
81 | app.post '/reset', (req, res, next) ->
|
82 | reset = new Backbone.Model
|
83 | reset.url = "#{config.ARTSY_URL}/api/v1/users/send_reset_password_instructions"
|
84 | reset.save { email: req.body.email },
|
85 | headers: 'X-Xapp-Token': artsyXapp.token
|
86 | error: (m, e) -> next e
|
87 | success: (m, r) -> res.redirect '/newpassword'
|
88 | app.get '/newpassword', (req, res, next) ->
|
89 | res.render 'newpassword'
|
90 | app.post '/newpassword', (req, res, next) ->
|
91 | reset = new Backbone.Model id: 'foo'
|
92 | reset.url = "#{config.ARTSY_URL}/api/v1/users/reset_password"
|
93 | reset.save req.body,
|
94 | headers: 'X-Xapp-Token': artsyXapp.token
|
95 | error: (m, e) -> next e
|
96 | success: (m, r) -> res.redirect loginPagePath
|
97 | app.get '/nocsrf', (req, res) ->
|
98 | res.render 'nocsrf'
|
99 |
|
100 |
|
101 | app.use (err, req, res, next) ->
|
102 | console.warn err.stack
|
103 | res.render 'error', err: err?.response?.body?.error or err.stack
|
104 |
|
105 |
|
106 | return unless module is require.main
|
107 | artsyXapp.on('error', (e) -> console.warn(e); process.exit(1)).init
|
108 | url: config.ARTSY_URL
|
109 | id: config.ARTSY_ID
|
110 | secret: config.ARTSY_SECRET
|
111 | , ->
|
112 | app.listen 4000, -> console.log "Example listening on #{4000}"
|
113 |
|
114 | app = module.exports = express()
|
115 | setup app
|