Merge pull request #315 from ParsePlatform/nlutsenko.es6.adapters
Refactor FilesAdapter to ES6 style.
This commit is contained in:
@@ -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) { }
|
||||||
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
};
|
|
||||||
|
|||||||
12
src/files.js
12
src/files.js
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user