Improves Controller and Adapter relationship
- Controllers that have adapters are AdaptableControllers - AdaptableController is responsible to instantiate the proper adapter if needed (string, function or BaseAdapter) - BaseAdapter is the base class for adapters, allows skipping when passed directly to the controller
This commit is contained in:
63
src/Controllers/AdaptableController.js
Normal file
63
src/Controllers/AdaptableController.js
Normal file
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
AdaptableController.js
|
||||
|
||||
AdaptableController is the base class for all controllers
|
||||
that support adapter,
|
||||
The super class takes care of creating the right instance for the adapter
|
||||
based on the parameters passed
|
||||
|
||||
*/
|
||||
|
||||
export class AdaptableController {
|
||||
/**
|
||||
* Check whether the api call has master key or not.
|
||||
* @param {options} the adapter options
|
||||
* @param {defaultAdapter} the default adapter class or object to use
|
||||
* @discussion
|
||||
* Supported options types:
|
||||
* - string: the options will be loaded with required, when loaded, if default
|
||||
* is set on the returned object, we'll use that one to support modules
|
||||
* - object: a plain javascript object (options.constructor === Object), if options.adapter is set, we'll try to load it with the same mechanics
|
||||
* - function: we'll create a new instance from that function, and pass the options object
|
||||
*/
|
||||
constructor(options, defaultAdapter) {
|
||||
|
||||
// Use the default by default
|
||||
let adapter;
|
||||
|
||||
// We have options and options have adapter key
|
||||
if (options) {
|
||||
// Pass an adapter as a module name, a function or an instance
|
||||
if (typeof options == "string" || typeof options == "function" || options.constructor != Object) {
|
||||
adapter = options;
|
||||
}
|
||||
if (options.adapter) {
|
||||
adapter = options.adapter;
|
||||
}
|
||||
}
|
||||
|
||||
if (!adapter) {
|
||||
adapter = defaultAdapter;
|
||||
}
|
||||
|
||||
// This is a string, require the module
|
||||
if (typeof adapter === "string") {
|
||||
adapter = require(adapter);
|
||||
// If it's define as a module, get the default
|
||||
if (adapter.default) {
|
||||
adapter = adapter.default;
|
||||
}
|
||||
}
|
||||
// From there it's either a function or an object
|
||||
// if it's an function, instanciate and pass the options
|
||||
if (typeof adapter === "function") {
|
||||
var Adapter = adapter;
|
||||
adapter = new Adapter(options);
|
||||
}
|
||||
|
||||
this.adapter = adapter;
|
||||
this.options = options;
|
||||
}
|
||||
}
|
||||
|
||||
export default AdaptableController;
|
||||
@@ -1,20 +1,18 @@
|
||||
// FilesController.js
|
||||
import { Parse } from 'parse/node';
|
||||
import { randomHexString } from '../cryptoUtils';
|
||||
import AdaptableController from './AdaptableController';
|
||||
|
||||
export class FilesController {
|
||||
constructor(filesAdapter) {
|
||||
this._filesAdapter = filesAdapter;
|
||||
}
|
||||
export class FilesController extends AdaptableController {
|
||||
|
||||
getFileData(config, filename) {
|
||||
return this._filesAdapter.getFileData(config, filename);
|
||||
return this.adapter.getFileData(config, filename);
|
||||
}
|
||||
|
||||
createFile(config, filename, data) {
|
||||
filename = randomHexString(32) + '_' + filename;
|
||||
var location = this._filesAdapter.getFileLocation(config, filename);
|
||||
return this._filesAdapter.createFile(config, filename, data).then(() => {
|
||||
var location = this.adapter.getFileLocation(config, filename);
|
||||
return this.adapter.createFile(config, filename, data).then(() => {
|
||||
return Promise.resolve({
|
||||
url: location,
|
||||
name: filename
|
||||
@@ -23,7 +21,7 @@ export class FilesController {
|
||||
}
|
||||
|
||||
deleteFile(config, filename) {
|
||||
return this._filesAdapter.deleteFile(config, filename);
|
||||
return this.adapter.deleteFile(config, filename);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -49,7 +47,7 @@ export class FilesController {
|
||||
if (filename.indexOf('tfss-') === 0) {
|
||||
fileObject['url'] = 'http://files.parsetfss.com/' + config.fileKey + '/' + encodeURIComponent(filename);
|
||||
} else {
|
||||
fileObject['url'] = this._filesAdapter.getFileLocation(config, filename);
|
||||
fileObject['url'] = this.adapter.getFileLocation(config, filename);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { Parse } from 'parse/node';
|
||||
import PromiseRouter from '../PromiseRouter';
|
||||
import AdaptableController from './AdaptableController';
|
||||
|
||||
const Promise = Parse.Promise;
|
||||
const MILLISECONDS_IN_A_DAY = 24 * 60 * 60 * 1000;
|
||||
@@ -14,11 +15,7 @@ export const LogOrder = {
|
||||
ASCENDING: 'asc'
|
||||
}
|
||||
|
||||
export class LoggerController {
|
||||
|
||||
constructor(loggerAdapter, loggerOptions) {
|
||||
this._loggerAdapter = loggerAdapter;
|
||||
}
|
||||
export class LoggerController extends AdaptableController {
|
||||
|
||||
// check that date input is valid
|
||||
static validDateTime(date) {
|
||||
@@ -59,7 +56,7 @@ export class LoggerController {
|
||||
// order (optional) Direction of results returned, either “asc” or “desc”. Defaults to “desc”.
|
||||
// size (optional) Number of rows returned by search. Defaults to 10
|
||||
getLogs(options= {}) {
|
||||
if (!this._loggerAdapter) {
|
||||
if (!this.adapter) {
|
||||
throw new Parse.Error(Parse.Error.PUSH_MISCONFIGURED,
|
||||
'Logger adapter is not availabe');
|
||||
}
|
||||
@@ -68,7 +65,7 @@ export class LoggerController {
|
||||
|
||||
options = LoggerController.parseOptions(options);
|
||||
|
||||
this._loggerAdapter.query(options, (result) => {
|
||||
this.adapter.query(options, (result) => {
|
||||
promise.resolve(result);
|
||||
});
|
||||
return promise;
|
||||
|
||||
@@ -1,12 +1,9 @@
|
||||
import { Parse } from 'parse/node';
|
||||
import PromiseRouter from '../PromiseRouter';
|
||||
import rest from '../rest';
|
||||
import AdaptableController from './AdaptableController';
|
||||
|
||||
export class PushController {
|
||||
|
||||
constructor(pushAdapter) {
|
||||
this._pushAdapter = pushAdapter;
|
||||
};
|
||||
export class PushController extends AdaptableController {
|
||||
|
||||
/**
|
||||
* Check whether the deviceType parameter in qury condition is valid or not.
|
||||
@@ -42,13 +39,12 @@ export class PushController {
|
||||
}
|
||||
|
||||
sendPush(body = {}, where = {}, config, auth) {
|
||||
var pushAdapter = this._pushAdapter;
|
||||
var pushAdapter = this.adapter;
|
||||
if (!pushAdapter) {
|
||||
throw new Parse.Error(Parse.Error.PUSH_MISCONFIGURED,
|
||||
'Push adapter is not available');
|
||||
}
|
||||
PushController.validateMasterKey(auth);
|
||||
|
||||
PushController.validatePushType(where, pushAdapter.getValidPushTypes());
|
||||
// Replace the expiration_time with a valid Unix epoch milliseconds time
|
||||
body['expiration_time'] = PushController.getExpirationTime(body);
|
||||
|
||||
Reference in New Issue
Block a user