diff options
| -rw-r--r-- | gulpfile.ts | 10 | ||||
| -rw-r--r-- | package.json | 10 | ||||
| -rw-r--r-- | src/api/common/add-file-to-drive.ts | 3 | ||||
| -rw-r--r-- | src/api/endpoints/drive/files/find.ts | 2 | ||||
| -rw-r--r-- | src/api/endpoints/drive/files/update.ts | 4 | ||||
| -rw-r--r-- | src/api/serializers/drive-file.ts | 1 | ||||
| -rw-r--r-- | src/file/server.ts | 48 | ||||
| -rw-r--r-- | test/api.js | 28 | ||||
| -rw-r--r-- | tools/migration/change-gridfs-metadata-name-to-filename.js | 30 | ||||
| -rw-r--r-- | tools/migration/use-gridfs.js | 4 |
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: { |