summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gulpfile.ts10
-rw-r--r--package.json10
-rw-r--r--src/api/common/add-file-to-drive.ts3
-rw-r--r--src/api/endpoints/drive/files/find.ts2
-rw-r--r--src/api/endpoints/drive/files/update.ts4
-rw-r--r--src/api/serializers/drive-file.ts1
-rw-r--r--src/file/server.ts48
-rw-r--r--test/api.js28
-rw-r--r--tools/migration/change-gridfs-metadata-name-to-filename.js30
-rw-r--r--tools/migration/use-gridfs.js4
10 files changed, 79 insertions, 61 deletions
diff --git a/gulpfile.ts b/gulpfile.ts
index 448b6b7fef..93002cbf37 100644
--- a/gulpfile.ts
+++ b/gulpfile.ts
@@ -81,9 +81,19 @@ gulp.task('lint', () =>
.pipe(tslint.report())
);
+gulp.task('format', () =>
+gulp.src('./src/**/*.ts')
+ .pipe(tslint({
+ formatter: 'verbose',
+ fix: true
+ }))
+ .pipe(tslint.report())
+);
+
gulp.task('mocha', () =>
gulp.src([])
.pipe(mocha({
+ exit: true
//compilers: 'ts:ts-node/register'
} as any))
);
diff --git a/package.json b/package.json
index 0048e63ba0..21f2c57de2 100644
--- a/package.json
+++ b/package.json
@@ -18,7 +18,8 @@
"clean": "gulp clean",
"cleanall": "gulp cleanall",
"lint": "gulp lint",
- "test": "gulp test"
+ "test": "gulp test",
+ "format": "gulp format"
},
"devDependencies": {
"@types/bcryptjs": "2.4.1",
@@ -38,8 +39,6 @@
"@types/gulp-mocha": "0.0.30",
"@types/gulp-rename": "0.0.32",
"@types/gulp-replace": "0.0.30",
- "@types/gulp-tslint": "3.6.31",
- "@types/gulp-typescript": "2.13.0",
"@types/gulp-uglify": "3.0.3",
"@types/gulp-util": "3.0.33",
"@types/inquirer": "0.0.34",
@@ -60,7 +59,7 @@
"@types/riot": "3.6.1",
"@types/serve-favicon": "2.2.29",
"@types/uuid": "3.4.3",
- "@types/webpack": "3.0.13",
+ "@types/webpack": "3.8.0",
"@types/webpack-stream": "3.2.8",
"@types/websocket": "0.0.34",
"awesome-typescript-loader": "3.3.0",
@@ -88,7 +87,7 @@
"stylus-loader": "3.0.1",
"swagger-jsdoc": "1.9.7",
"tslint": "5.8.0",
- "uglify-es": "3.0.27",
+ "uglify-es": "3.1.8",
"uglifyjs-webpack-plugin": "1.0.1",
"webpack": "3.8.1"
},
@@ -104,7 +103,6 @@
"compression": "1.7.1",
"cors": "2.8.4",
"cropperjs": "1.1.3",
- "crypto": "1.0.1",
"debug": "3.1.0",
"deep-equal": "1.0.1",
"deepcopy": "0.6.3",
diff --git a/src/api/common/add-file-to-drive.ts b/src/api/common/add-file-to-drive.ts
index f9c22ccacd..e1baf08191 100644
--- a/src/api/common/add-file-to-drive.ts
+++ b/src/api/common/add-file-to-drive.ts
@@ -144,11 +144,10 @@ export default (
}
// Create DriveFile document
- const file = await addToGridFS(`${user._id}/${name}`, data, {
+ const file = await addToGridFS(name, data, {
user_id: user._id,
folder_id: folder !== null ? folder._id : null,
type: mime,
- name: name,
comment: comment,
properties: properties
});
diff --git a/src/api/endpoints/drive/files/find.ts b/src/api/endpoints/drive/files/find.ts
index 1c818131d7..a1cdf1643e 100644
--- a/src/api/endpoints/drive/files/find.ts
+++ b/src/api/endpoints/drive/files/find.ts
@@ -24,7 +24,7 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
// Issue query
const files = await DriveFile
.find({
- 'metadata.name': name,
+ filename: name,
'metadata.user_id': user._id,
'metadata.folder_id': folderId
});
diff --git a/src/api/endpoints/drive/files/update.ts b/src/api/endpoints/drive/files/update.ts
index d7b858c2ba..f265142c4d 100644
--- a/src/api/endpoints/drive/files/update.ts
+++ b/src/api/endpoints/drive/files/update.ts
@@ -34,7 +34,7 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
// Get 'name' parameter
const [name, nameErr] = $(params.name).optional.string().pipe(validateFileName).$;
if (nameErr) return rej('invalid name param');
- if (name) file.metadata.name = name;
+ if (name) file.filename = name;
// Get 'folder_id' parameter
const [folderId, folderIdErr] = $(params.folder_id).optional.nullable.id().$;
@@ -61,7 +61,7 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
await DriveFile.update(file._id, {
$set: {
- 'metadata.name': file.metadata.name,
+ filename: file.filename,
'metadata.folder_id': file.metadata.folder_id
}
});
diff --git a/src/api/serializers/drive-file.ts b/src/api/serializers/drive-file.ts
index 2af7db5726..57b74cd975 100644
--- a/src/api/serializers/drive-file.ts
+++ b/src/api/serializers/drive-file.ts
@@ -47,6 +47,7 @@ export default (
_target.id = _file._id;
_target.created_at = _file.uploadDate;
+ _target.name = _file.filename;
_target = Object.assign(_target, _file.metadata);
diff --git a/src/file/server.ts b/src/file/server.ts
index 375f29487d..39c2cdd2a1 100644
--- a/src/file/server.ts
+++ b/src/file/server.ts
@@ -86,11 +86,7 @@ function send(data: Buffer, type: string, req: express.Request, res: express.Res
}
}
-/**
- * Routing
- */
-
-app.get('/:id', async (req, res) => {
+async function sendFileById(req: express.Request, res: express.Response): Promise<void> {
// Validate id
if (!mongodb.ObjectID.isValid(req.params.id)) {
res.status(400).send('incorrect id');
@@ -100,37 +96,12 @@ app.get('/:id', async (req, res) => {
const fileId = new mongodb.ObjectID(req.params.id);
const file = await DriveFile.findOne({ _id: fileId });
- if (file == null) {
- res.status(404).sendFile(`${__dirname}/assets/dummy.png`);
+ // validate name
+ if (req.params.name !== undefined && req.params.name !== file.filename) {
+ res.status(404).send('there is no file has given name');
return;
}
- const bucket = await getGridFSBucket();
-
- const buffer = await ((id): Promise<Buffer> => new Promise((resolve, reject) => {
- const chunks = [];
- const readableStream = bucket.openDownloadStream(id);
- readableStream.on('data', chunk => {
- chunks.push(chunk);
- });
- readableStream.on('end', () => {
- resolve(Buffer.concat(chunks));
- });
- }))(fileId);
-
- send(buffer, file.metadata.type, req, res);
-});
-
-app.get('/:id/:name', async (req, res) => {
- // Validate id
- if (!mongodb.ObjectID.isValid(req.params.id)) {
- res.status(400).send('incorrect id');
- return;
- }
-
- const fileId = new mongodb.ObjectID(req.params.id);
- const file = await DriveFile.findOne({ _id: fileId });
-
if (file == null) {
res.status(404).sendFile(`${__dirname}/assets/dummy.png`);
return;
@@ -141,7 +112,7 @@ app.get('/:id/:name', async (req, res) => {
const buffer = await ((id): Promise<Buffer> => new Promise((resolve, reject) => {
const chunks = [];
const readableStream = bucket.openDownloadStream(id);
- readableStream.on('data', chunk => {
+ readableStream.on('data', chunk => {
chunks.push(chunk);
});
readableStream.on('end', () => {
@@ -150,6 +121,13 @@ app.get('/:id/:name', async (req, res) => {
}))(fileId);
send(buffer, file.metadata.type, req, res);
-});
+}
+
+/**
+ * Routing
+ */
+
+app.get('/:id', sendFileById);
+app.get('/:id/:name', sendFileById);
module.exports = app;
diff --git a/test/api.js b/test/api.js
index c0da9d6c5b..a2eaa4e62e 100644
--- a/test/api.js
+++ b/test/api.js
@@ -46,7 +46,8 @@ describe('API', () => {
beforeEach(() => Promise.all([
db.get('users').drop(),
db.get('posts').drop(),
- db.get('drive_files').drop(),
+ db.get('drive_files.files').drop(),
+ db.get('drive_files.chunks').drop(),
db.get('drive_folders').drop(),
db.get('apps').drop(),
db.get('access_tokens').drop(),
@@ -1131,8 +1132,8 @@ describe('API', () => {
});
});
-async function insertSakurako(opts) {
- return await db.get('users').insert(Object.assign({
+function insertSakurako(opts) {
+ return db.get('users').insert(Object.assign({
token: '!00000000000000000000000000000000',
username: 'sakurako',
username_lower: 'sakurako',
@@ -1141,8 +1142,8 @@ async function insertSakurako(opts) {
}, opts));
}
-async function insertHimawari(opts) {
- return await db.get('users').insert(Object.assign({
+function insertHimawari(opts) {
+ return db.get('users').insert(Object.assign({
token: '!00000000000000000000000000000001',
username: 'himawari',
username_lower: 'himawari',
@@ -1151,24 +1152,23 @@ async function insertHimawari(opts) {
}, opts));
}
-async function insertDriveFile(opts) {
- return await db.get('drive_files.files').insert({
+function insertDriveFile(opts) {
+ return db.get('drive_files.files').insert({
length: opts.datasize,
- metadata: Object.assign({
- name: 'strawberry-pasta.png'
- }, opts)
+ filename: 'strawberry-pasta.png',
+ metadata: opts
});
}
-async function insertDriveFolder(opts) {
- return await db.get('drive_folders').insert(Object.assign({
+function insertDriveFolder(opts) {
+ return db.get('drive_folders').insert(Object.assign({
name: 'my folder',
parent_id: null
}, opts));
}
-async function insertApp(opts) {
- return await db.get('apps').insert(Object.assign({
+function insertApp(opts) {
+ return db.get('apps').insert(Object.assign({
name: 'my app',
secret: 'mysecret'
}, opts));
diff --git a/tools/migration/change-gridfs-metadata-name-to-filename.js b/tools/migration/change-gridfs-metadata-name-to-filename.js
new file mode 100644
index 0000000000..0d9e977c6e
--- /dev/null
+++ b/tools/migration/change-gridfs-metadata-name-to-filename.js
@@ -0,0 +1,30 @@
+// for Node.js interpret
+/**
+ * change usage of GridFS filename
+ * see commit fb422b4d603c53a70712caba55b35a48a8c2e619
+ */
+
+const { default: DriveFile } = require('../../built/api/models/drive-file')
+
+async function applyNewChange (doc) {
+ const result = await DriveFile.update(doc._id, {
+ $set: {
+ filename: doc.metadata.name
+ },
+ $unset: {
+ 'metadata.name': ''
+ }
+ })
+ return result.ok === 1
+}
+
+async function main () {
+ const oldTypeDocs = await DriveFile.find({
+ 'metadata.name': {
+ $exists: true
+ }
+ })
+ return await Promise.all(oldTypeDocs.map(applyNewChange))
+}
+
+main().then(console.dir).catch(console.error)
diff --git a/tools/migration/use-gridfs.js b/tools/migration/use-gridfs.js
index d41514416c..148f9be261 100644
--- a/tools/migration/use-gridfs.js
+++ b/tools/migration/use-gridfs.js
@@ -21,15 +21,17 @@ const migrateToGridFS = async (doc) => {
const id = doc._id
const buffer = doc.data.buffer
const created_at = doc.created_at
+ const name = doc.name
delete doc._id
delete doc.created_at
delete doc.datasize
delete doc.hash
delete doc.data
+ delete doc.name
const bucket = await getGridFSBucket()
- const added = await writeToGridFS(bucket, buffer, id, `${id}/${doc.name}`, { metadata: doc })
+ const added = await writeToGridFS(bucket, buffer, id, name, { metadata: doc })
const result = await DriveFile.update(id, {
$set: {