Merge pull request #833 from ParsePlatform/flovilmart.S3Environment
Improves loading of Push Adapter, fix loading of S3Adapter
This commit is contained in:
14
README.md
14
README.md
@@ -135,6 +135,20 @@ PARSE_SERVER_MAX_UPLOAD_SIZE
|
|||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
##### Configuring S3 Adapter
|
||||||
|
|
||||||
|
You can use the following environment variable setup the S3 adapter
|
||||||
|
|
||||||
|
```js
|
||||||
|
S3_ACCESS_KEY
|
||||||
|
S3_SECRET_KEY
|
||||||
|
S3_BUCKET
|
||||||
|
S3_REGION
|
||||||
|
S3_BUCKET_PREFIX
|
||||||
|
S3_DIRECT_ACCESS
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
We really want Parse to be yours, to see it grow and thrive in the open source community. Please see the [Contributing to Parse Server guide](CONTRIBUTING.md).
|
We really want Parse to be yours, to see it grow and thrive in the open source community. Please see the [Contributing to Parse Server guide](CONTRIBUTING.md).
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
|
|
||||||
var loadAdapter = require("../src/Adapters/AdapterLoader").loadAdapter;
|
var loadAdapter = require("../src/Adapters/AdapterLoader").loadAdapter;
|
||||||
var FilesAdapter = require("../src/Adapters/Files/FilesAdapter").default;
|
var FilesAdapter = require("../src/Adapters/Files/FilesAdapter").default;
|
||||||
|
var ParsePushAdapter = require("../src/Adapters/Push/ParsePushAdapter");
|
||||||
|
var S3Adapter = require("../src/Adapters/Files/S3Adapter").default;
|
||||||
|
|
||||||
describe("AdapterLoader", ()=>{
|
describe("AdapterLoader", ()=>{
|
||||||
|
|
||||||
@@ -84,4 +86,27 @@ describe("AdapterLoader", ()=>{
|
|||||||
}).not.toThrow("foo is required for that adapter");
|
}).not.toThrow("foo is required for that adapter");
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("should load push adapter from options", (done) => {
|
||||||
|
var options = {
|
||||||
|
ios: {
|
||||||
|
bundleId: 'bundle.id'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect(() => {
|
||||||
|
var adapter = loadAdapter(undefined, ParsePushAdapter, options);
|
||||||
|
expect(adapter.constructor).toBe(ParsePushAdapter);
|
||||||
|
expect(adapter).not.toBe(undefined);
|
||||||
|
}).not.toThrow();
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should load S3Adapter from direct passing", (done) => {
|
||||||
|
var s3Adapter = new S3Adapter("key", "secret", "bucket")
|
||||||
|
expect(() => {
|
||||||
|
var adapter = loadAdapter(s3Adapter, FilesAdapter);
|
||||||
|
expect(adapter).toBe(s3Adapter);
|
||||||
|
}).not.toThrow();
|
||||||
|
done();
|
||||||
|
})
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -28,15 +28,8 @@ export function loadAdapter(adapter, defaultAdapter, options) {
|
|||||||
return loadAdapter(adapter.class, undefined, adapter.options);
|
return loadAdapter(adapter.class, undefined, adapter.options);
|
||||||
} else if (adapter.adapter) {
|
} else if (adapter.adapter) {
|
||||||
return loadAdapter(adapter.adapter, undefined, adapter.options);
|
return loadAdapter(adapter.adapter, undefined, adapter.options);
|
||||||
} else {
|
|
||||||
// Try to load the defaultAdapter with the options
|
|
||||||
// The default adapter should throw if the options are
|
|
||||||
// incompatible
|
|
||||||
try {
|
|
||||||
return loadAdapter(defaultAdapter, undefined, adapter);
|
|
||||||
} catch (e) {};
|
|
||||||
}
|
}
|
||||||
// return the adapter as is as it's unusable otherwise
|
// return the adapter as provided
|
||||||
return adapter;
|
return adapter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,19 +8,20 @@ import requiredParameter from '../../requiredParameter';
|
|||||||
|
|
||||||
const DEFAULT_S3_REGION = "us-east-1";
|
const DEFAULT_S3_REGION = "us-east-1";
|
||||||
|
|
||||||
function parseS3AdapterOptions(...options) {
|
function requiredOrFromEnvironment(env, name) {
|
||||||
if (options.length === 1 && typeof options[0] == "object") {
|
let environmentVariable = process.env[env];
|
||||||
return options;
|
if (!environmentVariable) {
|
||||||
|
requiredParameter(`S3Adapter requires an ${name}`);
|
||||||
}
|
}
|
||||||
|
return environmentVariable;
|
||||||
const additionalOptions = options[3] || {};
|
}
|
||||||
|
|
||||||
return {
|
function fromEnvironmentOrDefault(env, defaultValue) {
|
||||||
accessKey: options[0],
|
let environmentVariable = process.env[env];
|
||||||
secretKey: options[1],
|
if (environmentVariable) {
|
||||||
bucket: options[2],
|
return environmentVariable;
|
||||||
region: additionalOptions.region
|
|
||||||
}
|
}
|
||||||
|
return defaultValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class S3Adapter extends FilesAdapter {
|
export class S3Adapter extends FilesAdapter {
|
||||||
@@ -28,12 +29,12 @@ export class S3Adapter extends FilesAdapter {
|
|||||||
// Providing AWS access and secret keys is mandatory
|
// Providing AWS access and secret keys is mandatory
|
||||||
// Region and bucket will use sane defaults if omitted
|
// Region and bucket will use sane defaults if omitted
|
||||||
constructor(
|
constructor(
|
||||||
accessKey = requiredParameter('S3Adapter requires an accessKey'),
|
accessKey = requiredOrFromEnvironment('S3_ACCESS_KEY', 'accessKey'),
|
||||||
secretKey = requiredParameter('S3Adapter requires a secretKey'),
|
secretKey = requiredOrFromEnvironment('S3_SECRET_KEY', 'secretKey'),
|
||||||
bucket,
|
bucket = fromEnvironmentOrDefault('S3_BUCKET', undefined),
|
||||||
{ region = DEFAULT_S3_REGION,
|
{ region = fromEnvironmentOrDefault('S3_REGION', DEFAULT_S3_REGION),
|
||||||
bucketPrefix = '',
|
bucketPrefix = fromEnvironmentOrDefault('S3_BUCKET_PREFIX', ''),
|
||||||
directAccess = false } = {}) {
|
directAccess = fromEnvironmentOrDefault('S3_DIRECT_ACCESS', false) } = {}) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
this._region = region;
|
this._region = region;
|
||||||
|
|||||||
@@ -133,7 +133,8 @@ function ParseServer({
|
|||||||
const filesControllerAdapter = loadAdapter(filesAdapter, () => {
|
const filesControllerAdapter = loadAdapter(filesAdapter, () => {
|
||||||
return new GridStoreAdapter(databaseURI);
|
return new GridStoreAdapter(databaseURI);
|
||||||
});
|
});
|
||||||
const pushControllerAdapter = loadAdapter(push, ParsePushAdapter);
|
// Pass the push options too as it works with the default
|
||||||
|
const pushControllerAdapter = loadAdapter(push && push.adapter, ParsePushAdapter, push);
|
||||||
const loggerControllerAdapter = loadAdapter(loggerAdapter, FileLoggerAdapter);
|
const loggerControllerAdapter = loadAdapter(loggerAdapter, FileLoggerAdapter);
|
||||||
const emailControllerAdapter = loadAdapter(emailAdapter);
|
const emailControllerAdapter = loadAdapter(emailAdapter);
|
||||||
// We pass the options and the base class for the adatper,
|
// We pass the options and the base class for the adatper,
|
||||||
|
|||||||
Reference in New Issue
Block a user