This repository has been archived by the owner on Jun 20, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
3 changed files
with
95 additions
and
87 deletions.
There are no files selected for viewing
2 changes: 1 addition & 1 deletion
2
src/routes/users/id/storage/file_id.js → src/routes/users/id/storage/files/file_id.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
'use strict'; | ||
|
||
const ApiResult = require('../../../../../helpers/apiResult'); | ||
const getFileType = require('file-type'); | ||
const validator = require('validator'); | ||
|
||
const supportedMimeTypes = [ | ||
'image/jpeg', | ||
'image/png', | ||
'image/gif' | ||
]; | ||
|
||
// 新規作成 | ||
exports.post = async (request) => { | ||
const result = await request.checkRequestAsync({ | ||
body: [ | ||
{name: 'file', type: 'string'} | ||
], | ||
permissions: ['storageWrite'] | ||
}); | ||
|
||
if (result != null) { | ||
return result; | ||
} | ||
|
||
const file = request.body.file; | ||
|
||
if (!validator.isBase64(file)) { | ||
return new ApiResult(400, 'file is not base64 format'); | ||
} | ||
|
||
const fileDataBuffer = Buffer.from(file, 'base64'); | ||
|
||
// データ形式を取得 | ||
const fileType = getFileType(fileDataBuffer); | ||
|
||
// サポートされているデータ形式か | ||
if (fileType == null || !supportedMimeTypes.some(i => i == fileType.mime)) { | ||
return new ApiResult(400, 'file is not supported format'); | ||
} | ||
|
||
let storageFile; | ||
|
||
try { | ||
storageFile = await request.db.storageFiles.createAsync({ // TODO: move to document models | ||
creatorId: request.user.document._id, | ||
type: fileType.mime.split('/')[0], | ||
mimeType: fileType.mime, | ||
file: fileDataBuffer, | ||
accessRight: { | ||
level: 'public', // 'specific' 'private' | ||
// users: [] | ||
} | ||
}); | ||
} | ||
catch(err) { | ||
console.log(err.trace); | ||
} | ||
|
||
if (storageFile == null) { | ||
return new ApiResult(500, 'failed to create storage file'); | ||
} | ||
|
||
return new ApiResult(200, {storageFile: storageFile.serialize()}); | ||
}; | ||
|
||
// ファイル一覧取得 // TODO: フィルター指定 | ||
exports.get = async (request) => { | ||
const result = await request.checkRequestAsync({ | ||
query: [ | ||
], | ||
permissions: ['storageRead'] | ||
}); | ||
|
||
if (result != null) { | ||
return result; | ||
} | ||
|
||
let files; | ||
try { | ||
files = await request.db.storageFiles.findArrayAsync(request.user.document._id); | ||
} | ||
catch(err) { | ||
// noop | ||
} | ||
|
||
if (files == null || files.length == 0) { | ||
return new ApiResult(204); | ||
} | ||
|
||
return new ApiResult(200, {storageFiles: files.map(i => i.serialize())}); | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,92 +1,8 @@ | ||
'use strict'; | ||
|
||
const ApiResult = require('../../../../helpers/apiResult'); | ||
const getFileType = require('file-type'); | ||
const validator = require('validator'); | ||
|
||
const supportedMimeTypes = [ | ||
'image/jpeg', | ||
'image/png', | ||
'image/gif' | ||
]; | ||
|
||
// 新規作成 | ||
exports.post = async (request) => { | ||
const result = await request.checkRequestAsync({ | ||
body: [ | ||
{name: 'file', type: 'string'} | ||
], | ||
permissions: ['storageWrite'] | ||
}); | ||
|
||
if (result != null) { | ||
return result; | ||
} | ||
|
||
const file = request.body.file; | ||
|
||
if (!validator.isBase64(file)) { | ||
return new ApiResult(400, 'file is not base64 format'); | ||
} | ||
|
||
const fileDataBuffer = Buffer.from(file, 'base64'); | ||
|
||
// データ形式を取得 | ||
const fileType = getFileType(fileDataBuffer); | ||
|
||
// サポートされているデータ形式か | ||
if (fileType == null || !supportedMimeTypes.some(i => i == fileType.mime)) { | ||
return new ApiResult(400, 'file is not supported format'); | ||
} | ||
|
||
let storageFile; | ||
|
||
try { | ||
storageFile = await request.db.storageFiles.createAsync({ // TODO: move to document models | ||
creatorId: request.user.document._id, | ||
type: fileType.mime.split('/')[0], | ||
mimeType: fileType.mime, | ||
file: fileDataBuffer, | ||
accessRight: { | ||
level: 'public', // 'specific' 'private' | ||
// users: [] | ||
} | ||
}); | ||
} | ||
catch(err) { | ||
console.log(err.trace); | ||
} | ||
|
||
if (storageFile == null) { | ||
return new ApiResult(500, 'failed to create storage file'); | ||
} | ||
|
||
return new ApiResult(200, {storageFile: storageFile.serialize()}); | ||
}; | ||
|
||
// ファイル一覧取得 // TODO: フィルター指定 | ||
exports.get = async (request) => { | ||
const result = await request.checkRequestAsync({ | ||
query: [ | ||
], | ||
permissions: ['storageRead'] | ||
}); | ||
|
||
if (result != null) { | ||
return result; | ||
} | ||
|
||
let files; | ||
try { | ||
files = await request.db.storageFiles.findArrayAsync(request.user.document._id); | ||
} | ||
catch(err) { | ||
// noop | ||
} | ||
|
||
if (files == null || files.length == 0) { | ||
return new ApiResult(204); | ||
} | ||
|
||
return new ApiResult(200, {storageFiles: files.map(i => i.serialize())}); | ||
// TODO | ||
return new ApiResult(500, 'not implemented yet'); | ||
}; |
381ef9b
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
#81 (comment)
この点についての修正