Rename "roles" to "units". Put units in their own folders.

This commit is contained in:
Simo Kinnunen
2014-08-26 14:34:34 +09:00
parent 7d9d64ddcb
commit 3a9b193f68
63 changed files with 105 additions and 105 deletions

View File

@@ -0,0 +1,54 @@
var http = require('http')
var url = require('url')
var express = require('express')
var httpProxy = require('http-proxy')
var logger = require('../../../../util/logger')
var download = require('../../../../util/download')
var manifest = require('./task/manifest')
module.exports = function(options) {
var log = logger.createLogger('storage:plugins:apk')
, app = express()
, server = http.createServer(app)
, proxy = httpProxy.createProxyServer()
proxy.on('error', function(err) {
log.error('Proxy had an error', err.stack)
})
app.set('strict routing', true)
app.set('case sensitive routing', true)
app.set('trust proxy', true)
app.get('/api/v1/s/apk/:id/*/manifest', function(req, res) {
download(url.resolve(options.storageUrl, req.url), {
dir: options.cacheDir
})
.then(manifest)
.then(function(data) {
res.status(200)
.json({
success: true
, manifest: data
})
})
.catch(function(err) {
log.error('Unable to read manifest of "%s"', req.params.id, err.stack)
res.status(500)
.json({
success: false
})
})
})
app.get('/api/v1/s/apk/:id/*', function(req, res) {
proxy.web(req, res, {
target: options.storageUrl
})
})
server.listen(options.port)
log.info('Listening on port %d', options.port)
}

View File

@@ -0,0 +1,19 @@
var Promise = require('bluebird')
var ApkReader = require('adbkit-apkreader')
module.exports = function(file) {
var resolver = Promise.defer()
process.nextTick(function() {
try {
var reader = ApkReader.readFile(file.path)
var manifest = reader.readManifestSync()
resolver.resolve(manifest)
}
catch (err) {
resolver.reject(err)
}
})
return resolver.promise
}

View File

@@ -0,0 +1,52 @@
var http = require('http')
var express = require('express')
var logger = require('../../../../util/logger')
var requtil = require('../../../../util/requtil')
var parseCrop = require('./param/crop')
var parseGravity = require('./param/gravity')
var get = require('./task/get')
var transform = require('./task/transform')
module.exports = function(options) {
var log = logger.createLogger('storage:plugins:image')
, app = express()
, server = http.createServer(app)
app.set('strict routing', true)
app.set('case sensitive routing', true)
app.set('trust proxy', true)
app.get(
'/api/v1/s/image/:id/*'
, requtil.limit(options.concurrency, function(req, res) {
return get(req.url, options)
.then(function(stream) {
return transform(stream, {
crop: parseCrop(req.query.crop)
, gravity: parseGravity(req.query.gravity)
})
})
.then(function(out) {
res.status(200)
out.pipe(res)
})
.catch(function(err) {
log.error(
'Unable to transform resource "%s"'
, req.params.id
, err.stack
)
res.status(500)
.json({
success: false
})
})
})
)
server.listen(options.port)
log.info('Listening on port %d', options.port)
}

View File

@@ -0,0 +1,14 @@
var RE_CROP = /^([0-9]*)x([0-9]*)$/
module.exports = function(raw) {
var parsed
if (raw && (parsed = RE_CROP.exec(raw))) {
return {
width: +parsed[1] || 0
, height: +parsed[2] || 0
}
}
return null
}

View File

@@ -0,0 +1,21 @@
var GRAVITY = {
northwest: 'NorthWest'
, north: 'North'
, northeast: 'NorthEast'
, west: 'West'
, center: 'Center'
, east: 'East'
, southwest: 'SouthWest'
, south: 'South'
, southeast: 'SouthEast'
}
module.exports = function(raw) {
var parsed
if (raw && (parsed = GRAVITY[raw])) {
return parsed
}
return null
}

View File

@@ -0,0 +1,20 @@
var util = require('util')
var http = require('http')
var url = require('url')
var Promise = require('bluebird')
module.exports = function(path, options) {
return new Promise(function(resolve, reject) {
http.get(url.resolve(options.storageUrl, path))
.on('response', function(res) {
if (res.statusCode !== 200) {
reject(new Error(util.format('HTTP %d', res.statusCode)))
}
else {
resolve(res)
}
})
.on('error', reject)
})
}

View File

@@ -0,0 +1,26 @@
var gm = require('gm')
var Promise = require('bluebird')
module.exports = function(stream, options) {
return new Promise(function(resolve, reject) {
var transform = gm(stream)
if (options.gravity) {
transform.gravity(options.gravity)
}
if (options.crop) {
transform.geometry(options.crop.width, options.crop.height, '^')
transform.crop(options.crop.width, options.crop.height, 0, 0)
}
transform.stream(function(err, stdout) {
if (err) {
reject(err)
}
else {
resolve(stdout)
}
})
})
}

149
lib/units/storage/temp.js Normal file
View File

@@ -0,0 +1,149 @@
var http = require('http')
var util = require('util')
var path = require('path')
var express = require('express')
var validator = require('express-validator')
var bodyParser = require('body-parser')
var formidable = require('formidable')
var Promise = require('bluebird')
var logger = require('../../util/logger')
var Storage = require('../../util/storage')
var requtil = require('../../util/requtil')
var download = require('../../util/download')
module.exports = function(options) {
var log = logger.createLogger('storage:temp')
, app = express()
, server = http.createServer(app)
, storage = new Storage()
app.set('strict routing', true)
app.set('case sensitive routing', true)
app.set('trust proxy', true)
app.use(bodyParser.json())
app.use(validator())
storage.on('timeout', function(id) {
log.info('Cleaning up inactive resource "%s"', id)
})
app.post('/api/v1/s/:type/download', function(req, res) {
requtil.validate(req, function() {
req.checkBody('url').notEmpty()
})
.then(function() {
return download(req.body.url, {
dir: options.cacheDir
})
})
.then(function(file) {
return {
id: storage.store(file)
, name: file.name
}
})
.then(function(file) {
res.status(201)
.json({
success: true
, resource: {
date: new Date()
, type: req.params.type
, id: file.id
, name: file.name
, href: util.format(
'/api/v1/s/%s/%s%s'
, req.params.type
, file.id
, file.name
? util.format('/%s', path.basename(file.name))
: ''
)
}
})
})
.catch(requtil.ValidationError, function(err) {
res.status(400)
.json({
success: false
, error: 'ValidationError'
, validationErrors: err.errors
})
})
.catch(function(err) {
log.error('Error storing resource', err.stack)
res.status(500)
.json({
success: false
, error: 'ServerError'
})
})
})
app.post('/api/v1/s/:type', function(req, res) {
var form = new formidable.IncomingForm()
Promise.promisify(form.parse, form)(req)
.spread(function(fields, files) {
return Object.keys(files).map(function(field) {
var file = files[field]
log.info('Uploaded "%s" to "%s"', file.name, file.path)
return {
field: field
, id: storage.store(file)
, name: file.name
}
})
})
.then(function(storedFiles) {
res.status(201)
.json({
success: true
, resources: (function() {
var mapped = Object.create(null)
storedFiles.forEach(function(file) {
mapped[file.field] = {
date: new Date()
, type: req.params.type
, id: file.id
, name: file.name
, href: util.format(
'/api/v1/s/%s/%s%s'
, req.params.type
, file.id
, file.name
? util.format('/%s', path.basename(file.name))
: ''
)
}
})
return mapped
})()
})
})
.catch(function(err) {
log.error('Error storing resource', err.stack)
res.status(500)
.json({
success: false
, error: 'ServerError'
})
})
})
app.get('/api/v1/s/:type/:id/*', function(req, res) {
var file = storage.retrieve(req.params.id)
if (file) {
res.set('Content-Type', file.type)
res.sendFile(file.path)
}
else {
res.send(404)
}
})
server.listen(options.port)
log.info('Listening on port %d', options.port)
}