This commit is contained in:
syuilo 2018-04-10 02:34:47 +09:00
parent 19edff6054
commit b7359694ab

View File

@ -10,12 +10,12 @@ import * as debug from 'debug';
import fileType = require('file-type'); import fileType = require('file-type');
import prominence = require('prominence'); import prominence = require('prominence');
import DriveFile, { IMetadata, getGridFSBucket } from '../../models/drive-file'; import DriveFile, { IMetadata, getGridFSBucket, IDriveFile } from '../../models/drive-file';
import DriveFolder from '../../models/drive-folder'; import DriveFolder from '../../models/drive-folder';
import { pack } from '../../models/drive-file'; import { pack } from '../../models/drive-file';
import event, { publishDriveStream } from '../../publishers/stream'; import event, { publishDriveStream } from '../../publishers/stream';
import getAcct from '../../acct/render'; import getAcct from '../../acct/render';
import config from '../../config'; import { IUser } from '../../models/user';
const gm = _gm.subClass({ const gm = _gm.subClass({
imageMagick: true imageMagick: true
@ -34,20 +34,20 @@ const addToGridFS = (name: string, readable: stream.Readable, type: string, meta
getGridFSBucket() getGridFSBucket()
.then(bucket => new Promise((resolve, reject) => { .then(bucket => new Promise((resolve, reject) => {
const writeStream = bucket.openUploadStream(name, { contentType: type, metadata }); const writeStream = bucket.openUploadStream(name, { contentType: type, metadata });
writeStream.once('finish', (doc) => { resolve(doc); }); writeStream.once('finish', resolve);
writeStream.on('error', reject); writeStream.on('error', reject);
readable.pipe(writeStream); readable.pipe(writeStream);
})); }));
const addFile = async ( const addFile = async (
user: any, user: IUser,
path: string, path: string,
name: string = null, name: string = null,
comment: string = null, comment: string = null,
folderId: mongodb.ObjectID = null, folderId: mongodb.ObjectID = null,
force: boolean = false, force: boolean = false,
uri: string = null uri: string = null
) => { ): Promise<IDriveFile> => {
log(`registering ${name} (user: ${getAcct(user)}, path: ${path})`); log(`registering ${name} (user: ${getAcct(user)}, path: ${path})`);
// Calculate hash, get content type and get file size // Calculate hash, get content type and get file size
@ -251,13 +251,13 @@ const addFile = async (
* @return Object that represents added file * @return Object that represents added file
*/ */
export default (user: any, file: string | stream.Readable, ...args) => new Promise<any>((resolve, reject) => { export default (user: any, file: string | stream.Readable, ...args) => new Promise<any>((resolve, reject) => {
const isStream = typeof file === 'object' && typeof file.read === 'function';
// Get file path // Get file path
new Promise((res: (v: [string, boolean]) => void, rej) => { new Promise<string>((res, rej) => {
if (typeof file === 'string') { if (typeof file === 'string') {
res([file, false]); res(file);
return; } else if (isStream) {
}
if (typeof file === 'object' && typeof file.read === 'function') {
tmpFile() tmpFile()
.then(path => { .then(path => {
const readable: stream.Readable = file; const readable: stream.Readable = file;
@ -265,22 +265,23 @@ export default (user: any, file: string | stream.Readable, ...args) => new Promi
readable readable
.on('error', rej) .on('error', rej)
.on('end', () => { .on('end', () => {
res([path, true]); res(path);
}) })
.pipe(writable) .pipe(writable)
.on('error', rej); .on('error', rej);
}) })
.catch(rej); .catch(rej);
} else {
rej(new Error('un-compatible file.'));
} }
rej(new Error('un-compatible file.'));
}) })
.then(([path, shouldCleanup]): Promise<any> => new Promise((res, rej) => { .then(path => new Promise<IDriveFile>((res, rej) => {
addFile(user, path, ...args) addFile(user, path, ...args)
.then(file => { .then(file => {
res(file); res(file);
if (shouldCleanup) { if (isStream) {
fs.unlink(path, (e) => { fs.unlink(path, e => {
if (e) log(e.stack); if (e) console.error(e.stack);
}); });
} }
}) })
@ -288,26 +289,13 @@ export default (user: any, file: string | stream.Readable, ...args) => new Promi
})) }))
.then(file => { .then(file => {
log(`drive file has been created ${file._id}`); log(`drive file has been created ${file._id}`);
resolve(file); resolve(file);
pack(file).then(serializedFile => { pack(file).then(packedFile => {
// Publish drive_file_created event // Publish drive_file_created event
event(user._id, 'drive_file_created', serializedFile); event(user._id, 'drive_file_created', packedFile);
publishDriveStream(user._id, 'file_created', serializedFile); publishDriveStream(user._id, 'file_created', packedFile);
// Register to search database
if (config.elasticsearch.enable) {
const es = require('../db/elasticsearch');
es.index({
index: 'misskey',
type: 'drive_file',
id: file._id.toString(),
body: {
name: file.name,
userId: user._id.toString()
}
});
}
}); });
}) })
.catch(reject); .catch(reject);