updated app

This commit is contained in:
2012-05-30 23:00:06 -04:00
parent 6a753904b7
commit da6ad88d48
5545 changed files with 1101709 additions and 60 deletions

View File

@@ -0,0 +1,105 @@
parseUrl = require('url').parse
{get, view, ready} = app = require('derby').createApp module
fillDimension = (max, side, otherSide) ->
return if side >= otherSide
max
else
side * max / otherSide
photoDimension = (obj, source, size = 's', type) ->
if source is 'flickr'
if type is 'width'
side = obj.o_width
otherSide = obj.o_height
else
side = obj.o_height
otherSide = obj.o_width
if size is 's'
return 75
if size is 'm'
return fillDimension 240, side, otherSide
return
photoDimensionFn = (type) ->
return (obj, source, size, scale = 1) ->
return unless obj
return Math.round photoDimension(obj, source, size, type) * scale
photoSrc = (obj, source, size = 's') ->
return unless obj
if source is 'flickr'
return "http://farm#{obj.farm}.staticflickr.com/" +
"#{obj.server}/#{obj.id}_#{obj.secret}_#{size}.jpg"
return
view.fn 'photoWidth', photoDimensionFn 'width'
view.fn 'photoHeight', photoDimensionFn 'height'
view.fn 'photoSrc', photoSrc
preCache = (obj, source, callback) ->
src = photoSrc obj, source, 'm'
img = document.createElement 'img'
img.style.display = 'none'
img.src = src
cancelled = false
callback.cancel = -> cancelled = true
finish = ->
document.body.removeChild img
callback() unless cancelled
count = 2
wait = -> --count || finish()
img.onload = wait
setTimeout wait, 50
document.body.appendChild img
get '/:source/:type/:id/:image?', (page, model, params, next) ->
{source, type, id, image, query} = params
{search} = parseUrl params.url
next() unless source is 'flickr'
pageIndex = if query.page then query.page - 1 else 0
model.fetch "#{source}.#{type}.id_#{id}.photos.pages.#{pageIndex}", (err, photos) ->
model.ref '_pages', photos.parent()
model.ref '_page', '_pages', '_selectedPage'
model.set '_toggle', 0
model.set '_fade0', 1
model.set '_fade1', 0
model.ref '_image0', '_page', '_selected0'
model.ref '_image1', '_page', '_selected1'
model.set '_selectedPage', pageIndex
model.set '_selected0', image
page.render {source, search}
lastLoad = null
get from: '/:source/:type/:id/:image?', to: '/:source/:type/:id/:image?',
(model, params, next) ->
{source, type, id, image, query} = params
next() unless source is 'flickr'
pageIndex = if query.page then query.page - 1 else 0
model.set '_selectedPage', pageIndex
lastLoad.cancel() if lastLoad
lastLoad = ->
lastLoad = null
toggleValue = +!model.get('_toggle')
model.set '_toggle', toggleValue
model.set '_selected' + toggleValue, image
model.set '_fade' + toggleValue, 1
preCache model.get('_page.' + image), source, lastLoad
ready (model) ->
app.select = (e, el) ->
model.set '_fade' + model.get('_toggle'), 0
url = model.at(el).leaf() + window.location.search
view.history.push url
model.set '_showReconnect', true
app.connect = ->
model.set '_showReconnect', false
setTimeout (-> model.set '_showReconnect', true), 1000
model.socket.socket.connect()
app.reload = -> window.location.reload()

View File

@@ -0,0 +1,61 @@
request = require 'request'
FLICKR_API = 'http://api.flickr.com/services/rest/'
exports.setup = (store, options) ->
flickr = new Flickr options
# Prefacing the ids with 'id_' is needed, since photosets
# start with a number, and paths must only start with a
# letter or underscore, like JS variable names
store.route 'get', 'flickr.user.id_*.photos.pages.*', (username, page, done) ->
flickr.userPublicPhotos username, page, done
store.route 'get', 'flickr.photoset.id_*.photos.pages.*', (id, page, done) ->
flickr.setPhotos id, page, done
Flickr = (options) ->
@key = options.key
@userIds = {}
return
Flickr:: =
get: (qs, callback) ->
qs.format = 'json'
qs.api_key = @key
qs.per_page = 20
qs.extras = 'o_dims'
request {url: FLICKR_API, qs}, (err, res, body) ->
return callback err if err
unless (match = /jsonFlickrApi\((.*)\)/.exec body) && (body = match[1])
return callback new Erorr 'Unknown Flickr response'
data = JSON.parse body
unless data.stat == 'ok'
return callback new Error data.message
callback null, data
userId: (username, callback) ->
if id = @userIds[username]
return callback null, id
qs = {method: 'flickr.people.findByUsername', username}
@get qs, (err, body) =>
return callback err if err
id = @userIds[username] = body.user.id
callback null, id
userPublicPhotos: (username, page, callback) ->
@userId username, (err, user_id) =>
return callback err if err
qs = {method: 'flickr.people.getPublicPhotos', user_id, page: +page + 1}
@get qs, (err, body) ->
return callback err if err
callback null, body.photos.photo, -1
setPhotos: (photoset_id, page, callback) ->
qs = {method: 'flickr.photosets.getPhotos', photoset_id, page: +page + 1}
@get qs, (err, body) ->
return callback err if err
callback null, body.photoset.photo, -1

View File

@@ -0,0 +1,53 @@
http = require 'http'
path = require 'path'
express = require 'express'
gzippo = require 'gzippo'
derby = require 'derby'
app = require '../app'
flickr = require './flickr'
serverError = require './serverError'
## SERVER CONFIGURATION ##
ONE_YEAR = 1000 * 60 * 60 * 24 * 365
root = path.dirname path.dirname __dirname
publicPath = path.join root, 'public'
(expressApp = express())
.use(express.favicon())
# Gzip static files and serve from memory
.use(gzippo.staticGzip publicPath, maxAge: ONE_YEAR)
# Gzip dynamically rendered content
.use(express.compress())
# Uncomment to add form data parsing support
# .use(express.bodyParser())
# .use(express.methodOverride())
# Uncomment and supply secret to add Derby session handling
# Derby session middleware creates req.model and subscribes to _session
# .use(express.cookieParser 'secret_sauce')
# .use(express.session cookie: {maxAge: ONE_YEAR})
# .use(app.session())
# The router method creates an express middleware from the app's routes
.use(app.router())
.use(expressApp.router)
.use(serverError root)
module.exports = server = http.createServer expressApp
## SERVER ONLY ROUTES ##
expressApp.all '*', (req) ->
throw "404: #{req.url}"
## STORE SETUP ##
store = app.createStore listen: server
flickr.setup store, key: '86958e03c183fcb1b7fddfeb19f3a423'

View File

@@ -0,0 +1,18 @@
derby = require 'derby'
{isProduction} = derby.util
module.exports = (root) ->
staticPages = derby.createStatic root
return (err, req, res, next) ->
return next() unless err?
console.log(if err.stack then err.stack else err)
## Customize error handling here ##
message = err.message || err.toString()
status = parseInt message
if status is 404
staticPages.render '404', res, {url: req.url}, 404
else
res.send if 400 <= status < 600 then status else 500