2016-02-29 21:00:04 -08:00
|
|
|
/**
|
|
|
|
|
GridStoreAdapter
|
|
|
|
|
Stores files in Mongo using GridStore
|
|
|
|
|
Requires the database adapter to be based on mongoclient
|
2016-01-28 10:58:12 -08:00
|
|
|
|
2016-02-29 21:00:04 -08:00
|
|
|
@flow weak
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
import { MongoClient, GridStore, Db} from 'mongodb';
|
2016-04-13 16:45:07 -07:00
|
|
|
import { FilesAdapter } from './FilesAdapter';
|
2016-08-12 13:25:24 -04:00
|
|
|
import defaults from '../../defaults';
|
2016-01-28 10:58:12 -08:00
|
|
|
|
2016-02-09 19:52:25 -08:00
|
|
|
export class GridStoreAdapter extends FilesAdapter {
|
2016-02-29 21:00:04 -08:00
|
|
|
_databaseURI: string;
|
|
|
|
|
_connectionPromise: Promise<Db>;
|
|
|
|
|
|
2016-08-12 13:25:24 -04:00
|
|
|
constructor(mongoDatabaseURI = defaults.DefaultMongoURI) {
|
2016-02-29 21:00:04 -08:00
|
|
|
super();
|
|
|
|
|
this._databaseURI = mongoDatabaseURI;
|
|
|
|
|
this._connect();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_connect() {
|
|
|
|
|
if (!this._connectionPromise) {
|
|
|
|
|
this._connectionPromise = MongoClient.connect(this._databaseURI);
|
|
|
|
|
}
|
|
|
|
|
return this._connectionPromise;
|
|
|
|
|
}
|
|
|
|
|
|
2016-02-08 22:51:58 -08:00
|
|
|
// For a given config object, filename, and data, store a file
|
|
|
|
|
// Returns a promise
|
2016-03-23 23:29:16 -04:00
|
|
|
createFile(filename: string, data, contentType) {
|
2016-02-29 21:00:04 -08:00
|
|
|
return this._connect().then(database => {
|
|
|
|
|
let gridStore = new GridStore(database, filename, 'w');
|
2016-02-08 22:51:58 -08:00
|
|
|
return gridStore.open();
|
2016-02-29 21:00:04 -08:00
|
|
|
}).then(gridStore => {
|
2016-02-08 22:51:58 -08:00
|
|
|
return gridStore.write(data);
|
2016-02-29 21:00:04 -08:00
|
|
|
}).then(gridStore => {
|
2016-02-08 22:51:58 -08:00
|
|
|
return gridStore.close();
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-23 23:29:16 -04:00
|
|
|
deleteFile(filename: string) {
|
2016-02-29 21:00:04 -08:00
|
|
|
return this._connect().then(database => {
|
2016-06-27 06:40:43 +02:00
|
|
|
let gridStore = new GridStore(database, filename, 'r');
|
2016-02-10 18:42:21 -05:00
|
|
|
return gridStore.open();
|
|
|
|
|
}).then((gridStore) => {
|
|
|
|
|
return gridStore.unlink();
|
|
|
|
|
}).then((gridStore) => {
|
|
|
|
|
return gridStore.close();
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-23 23:29:16 -04:00
|
|
|
getFileData(filename: string) {
|
2016-02-29 21:00:04 -08:00
|
|
|
return this._connect().then(database => {
|
|
|
|
|
return GridStore.exist(database, filename)
|
|
|
|
|
.then(() => {
|
|
|
|
|
let gridStore = new GridStore(database, filename, 'r');
|
|
|
|
|
return gridStore.open();
|
|
|
|
|
});
|
|
|
|
|
}).then(gridStore => {
|
2016-02-08 22:51:58 -08:00
|
|
|
return gridStore.read();
|
|
|
|
|
});
|
|
|
|
|
}
|
2016-01-28 10:58:12 -08:00
|
|
|
|
2016-02-09 19:31:23 -08:00
|
|
|
getFileLocation(config, filename) {
|
|
|
|
|
return (config.mount + '/files/' + config.applicationId + '/' + encodeURIComponent(filename));
|
2016-02-08 22:51:58 -08:00
|
|
|
}
|
2016-08-12 21:58:18 +02:00
|
|
|
|
|
|
|
|
getFileStream(filename: string) {
|
|
|
|
|
return this._connect().then(database => {
|
|
|
|
|
return GridStore.exist(database, filename).then(() => {
|
|
|
|
|
let gridStore = new GridStore(database, filename, 'r');
|
|
|
|
|
return gridStore.open();
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
}
|
2016-01-31 22:27:33 -08:00
|
|
|
}
|
|
|
|
|
|
2016-02-08 22:51:58 -08:00
|
|
|
export default GridStoreAdapter;
|