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.
//
// Adapter classes must implement the following functions:
// * create(config, filename, data)
// * get(config, filename)
// * location(config, req, filename)
// * createFileAsync(config, filename, data)
// * getFileDataAsync(config, filename)
// * getFileLocation(config, request, filename)
//
// Default is GridStoreAdapter, which requires mongo
// and for the API server to be using the ExportAdapter
// database adapter.
var GridStoreAdapter = require('./GridStoreAdapter');
let adapter = null;
var adapter = GridStoreAdapter;
function setAdapter(filesAdapter) {
export function setAdapter(filesAdapter) {
adapter = filesAdapter;
}
function getAdapter() {
export function getAdapter() {
return adapter;
}
module.exports = {
getAdapter: getAdapter,
setAdapter: setAdapter
};
export class FilesAdapter {
createFileAsync(config, filename, data) { }
getFileDataAsync(config, filename) { }
getFileLocation(config, request, filename) { }
}

View File

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

View File

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

View File

@@ -5,7 +5,6 @@ var batch = require('./batch'),
cache = require('./cache'),
DatabaseAdapter = require('./DatabaseAdapter'),
express = require('express'),
FilesAdapter = require('./FilesAdapter'),
S3Adapter = require('./S3Adapter'),
middlewares = require('./middlewares'),
multer = require('multer'),
@@ -13,6 +12,9 @@ var batch = require('./batch'),
PromiseRouter = require('./PromiseRouter'),
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
addParseCloud();
@@ -47,7 +49,9 @@ function ParseServer(args) {
DatabaseAdapter.setAdapter(args.databaseAdapter);
}
if (args.filesAdapter) {
FilesAdapter.setAdapter(args.filesAdapter);
setFilesAdapter(args.filesAdapter);
} else {
setFilesAdapter(new GridStoreAdapter());
}
if (args.databaseURI) {
DatabaseAdapter.setAppDatabaseURI(args.appId, args.databaseURI);