Merge pull request #315 from ParsePlatform/nlutsenko.es6.adapters

Refactor FilesAdapter to ES6 style.
This commit is contained in:
Nikita Lutsenko
2016-02-09 12:41:41 -08:00
4 changed files with 57 additions and 57 deletions

View File

@@ -3,27 +3,28 @@
// Allows you to change the file storage mechanism. // Allows you to change the file storage mechanism.
// //
// Adapter classes must implement the following functions: // Adapter classes must implement the following functions:
// * create(config, filename, data) // * createFileAsync(config, filename, data)
// * get(config, filename) // * getFileDataAsync(config, filename)
// * location(config, req, filename) // * getFileLocation(config, request, filename)
// //
// Default is GridStoreAdapter, which requires mongo // Default is GridStoreAdapter, which requires mongo
// and for the API server to be using the ExportAdapter // and for the API server to be using the ExportAdapter
// database adapter. // database adapter.
var GridStoreAdapter = require('./GridStoreAdapter'); let adapter = null;
var adapter = GridStoreAdapter; export function setAdapter(filesAdapter) {
function setAdapter(filesAdapter) {
adapter = filesAdapter; adapter = filesAdapter;
} }
function getAdapter() { export function getAdapter() {
return adapter; return adapter;
} }
module.exports = { export class FilesAdapter {
getAdapter: getAdapter, createFileAsync(config, filename, data) { }
setAdapter: setAdapter
}; getFileDataAsync(config, filename) { }
getFileLocation(config, request, filename) { }
}

View File

@@ -3,46 +3,41 @@
// Stores files in Mongo using GridStore // Stores files in Mongo using GridStore
// Requires the database adapter to be based on mongoclient // Requires the database adapter to be based on mongoclient
var GridStore = require('mongodb').GridStore; import { GridStore } from 'mongodb';
var path = require('path');
// For a given config object, filename, and data, store a file import * as Path from 'path';
// Returns a promise import { FilesAdapter } from './FilesAdapter';
function create(config, filename, data) {
return config.database.connect().then(() => {
var gridStore = new GridStore(config.database.db, filename, 'w');
return gridStore.open();
}).then((gridStore) => {
return gridStore.write(data);
}).then((gridStore) => {
return gridStore.close();
});
}
// Search for and return a file if found by filename class GridStoreAdapter extends FilesAdapter {
// Resolves a promise that succeeds with the buffer result // For a given config object, filename, and data, store a file
// from GridStore // Returns a promise
function get(config, filename) { createFileAsync(config, filename, data) {
return config.database.connect().then(() => { return config.database.connect().then(() => {
return GridStore.exist(config.database.db, filename); let gridStore = new GridStore(config.database.db, filename, 'w');
}).then(() => { return gridStore.open();
var gridStore = new GridStore(config.database.db, filename, 'r'); }).then((gridStore) => {
return gridStore.open(); return gridStore.write(data);
}).then((gridStore) => { }).then((gridStore) => {
return gridStore.read(); return gridStore.close();
}); });
} }
// Generates and returns the location of a file stored in GridStore for the getFileDataAsync(config, filename) {
// given request and filename return config.database.connect().then(() => {
function location(config, req, filename) { return GridStore.exist(config.database.db, filename);
return (req.protocol + '://' + req.get('host') + }).then(() => {
path.dirname(req.originalUrl) + '/' + req.config.applicationId + let gridStore = new GridStore(config.database.db, filename, 'r');
return gridStore.open();
}).then((gridStore) => {
return gridStore.read();
});
}
getFileLocation(config, request, filename) {
return (request.protocol + '://' + request.get('host') +
Path.dirname(request.originalUrl) + '/' + config.applicationId +
'/' + encodeURIComponent(filename)); '/' + encodeURIComponent(filename));
}
} }
module.exports = { export default GridStoreAdapter;
create: create,
get: get,
location: location
};

View File

@@ -3,12 +3,13 @@
var bodyParser = require('body-parser'), var bodyParser = require('body-parser'),
Config = require('./Config'), Config = require('./Config'),
express = require('express'), express = require('express'),
FilesAdapter = require('./FilesAdapter'),
middlewares = require('./middlewares.js'), middlewares = require('./middlewares.js'),
mime = require('mime'), mime = require('mime'),
Parse = require('parse/node').Parse, Parse = require('parse/node').Parse,
rack = require('hat').rack(); rack = require('hat').rack();
import { getAdapter as getFilesAdapter } from './FilesAdapter';
var router = express.Router(); var router = express.Router();
var processCreate = function(req, res, next) { var processCreate = function(req, res, next) {
@@ -40,13 +41,13 @@ var processCreate = function(req, res, next) {
} }
var filename = rack() + '_' + req.params.filename + extension; var filename = rack() + '_' + req.params.filename + extension;
FilesAdapter.getAdapter().create(req.config, filename, req.body) getFilesAdapter().createFileAsync(req.config, filename, req.body).then(() => {
.then(() => {
res.status(201); res.status(201);
var location = FilesAdapter.getAdapter().location(req.config, req, filename); var location = getFilesAdapter().getFileLocation(req.config, req, filename);
res.set('Location', location); res.set('Location', location);
res.json({ url: location, name: filename }); res.json({ url: location, name: filename });
}).catch((error) => { }).catch((error) => {
console.log(error);
next(new Parse.Error(Parse.Error.FILE_SAVE_ERROR, next(new Parse.Error(Parse.Error.FILE_SAVE_ERROR,
'Could not store file.')); 'Could not store file.'));
}); });
@@ -54,8 +55,7 @@ var processCreate = function(req, res, next) {
var processGet = function(req, res) { var processGet = function(req, res) {
var config = new Config(req.params.appId); var config = new Config(req.params.appId);
FilesAdapter.getAdapter().get(config, req.params.filename) getFilesAdapter().getFileDataAsync(config, req.params.filename).then((data) => {
.then((data) => {
res.status(200); res.status(200);
var contentType = mime.lookup(req.params.filename); var contentType = mime.lookup(req.params.filename);
res.set('Content-type', contentType); res.set('Content-type', contentType);

View File

@@ -5,7 +5,6 @@ var batch = require('./batch'),
cache = require('./cache'), cache = require('./cache'),
DatabaseAdapter = require('./DatabaseAdapter'), DatabaseAdapter = require('./DatabaseAdapter'),
express = require('express'), express = require('express'),
FilesAdapter = require('./FilesAdapter'),
S3Adapter = require('./S3Adapter'), S3Adapter = require('./S3Adapter'),
middlewares = require('./middlewares'), middlewares = require('./middlewares'),
multer = require('multer'), multer = require('multer'),
@@ -13,6 +12,9 @@ var batch = require('./batch'),
PromiseRouter = require('./PromiseRouter'), PromiseRouter = require('./PromiseRouter'),
httpRequest = require('./httpRequest'); httpRequest = require('./httpRequest');
import { setAdapter as setFilesAdapter } from './FilesAdapter';
import { default as GridStoreAdapter } from './GridStoreAdapter';
// Mutate the Parse object to add the Cloud Code handlers // Mutate the Parse object to add the Cloud Code handlers
addParseCloud(); addParseCloud();
@@ -47,7 +49,9 @@ function ParseServer(args) {
DatabaseAdapter.setAdapter(args.databaseAdapter); DatabaseAdapter.setAdapter(args.databaseAdapter);
} }
if (args.filesAdapter) { if (args.filesAdapter) {
FilesAdapter.setAdapter(args.filesAdapter); setFilesAdapter(args.filesAdapter);
} else {
setFilesAdapter(new GridStoreAdapter());
} }
if (args.databaseURI) { if (args.databaseURI) {
DatabaseAdapter.setAppDatabaseURI(args.appId, args.databaseURI); DatabaseAdapter.setAppDatabaseURI(args.appId, args.databaseURI);