Introduce processor
This commit is contained in:
		
							
								
								
									
										51
									
								
								src/server/api/endpoints/drive/files/create.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								src/server/api/endpoints/drive/files/create.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| /** | ||||
|  * Module dependencies | ||||
|  */ | ||||
| import $ from 'cafy'; | ||||
| import { validateFileName, pack } from '../../../models/drive-file'; | ||||
| import create from '../../../common/drive/add-file'; | ||||
|  | ||||
| /** | ||||
|  * Create a file | ||||
|  * | ||||
|  * @param {any} file | ||||
|  * @param {any} params | ||||
|  * @param {any} user | ||||
|  * @return {Promise<any>} | ||||
|  */ | ||||
| module.exports = async (file, params, user): Promise<any> => { | ||||
| 	if (file == null) { | ||||
| 		throw 'file is required'; | ||||
| 	} | ||||
|  | ||||
| 	// Get 'name' parameter | ||||
| 	let name = file.originalname; | ||||
| 	if (name !== undefined && name !== null) { | ||||
| 		name = name.trim(); | ||||
| 		if (name.length === 0) { | ||||
| 			name = null; | ||||
| 		} else if (name === 'blob') { | ||||
| 			name = null; | ||||
| 		} else if (!validateFileName(name)) { | ||||
| 			throw 'invalid name'; | ||||
| 		} | ||||
| 	} else { | ||||
| 		name = null; | ||||
| 	} | ||||
|  | ||||
| 	// Get 'folder_id' parameter | ||||
| 	const [folderId = null, folderIdErr] = $(params.folder_id).optional.nullable.id().$; | ||||
| 	if (folderIdErr) throw 'invalid folder_id param'; | ||||
|  | ||||
| 	try { | ||||
| 		// Create file | ||||
| 		const driveFile = await create(user, file.path, name, null, folderId); | ||||
|  | ||||
| 		// Serialize | ||||
| 		return pack(driveFile); | ||||
| 	} catch (e) { | ||||
| 		console.error(e); | ||||
|  | ||||
| 		throw e; | ||||
| 	} | ||||
| }; | ||||
							
								
								
									
										34
									
								
								src/server/api/endpoints/drive/files/find.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								src/server/api/endpoints/drive/files/find.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| /** | ||||
|  * Module dependencies | ||||
|  */ | ||||
| import $ from 'cafy'; | ||||
| import DriveFile, { pack } from '../../../models/drive-file'; | ||||
|  | ||||
| /** | ||||
|  * Find a file(s) | ||||
|  * | ||||
|  * @param {any} params | ||||
|  * @param {any} user | ||||
|  * @return {Promise<any>} | ||||
|  */ | ||||
| module.exports = (params, user) => new Promise(async (res, rej) => { | ||||
| 	// Get 'name' parameter | ||||
| 	const [name, nameErr] = $(params.name).string().$; | ||||
| 	if (nameErr) return rej('invalid name param'); | ||||
|  | ||||
| 	// Get 'folder_id' parameter | ||||
| 	const [folderId = null, folderIdErr] = $(params.folder_id).optional.nullable.id().$; | ||||
| 	if (folderIdErr) return rej('invalid folder_id param'); | ||||
|  | ||||
| 	// Issue query | ||||
| 	const files = await DriveFile | ||||
| 		.find({ | ||||
| 			filename: name, | ||||
| 			'metadata.user_id': user._id, | ||||
| 			'metadata.folder_id': folderId | ||||
| 		}); | ||||
|  | ||||
| 	// Serialize | ||||
| 	res(await Promise.all(files.map(async file => | ||||
| 		await pack(file)))); | ||||
| }); | ||||
							
								
								
									
										36
									
								
								src/server/api/endpoints/drive/files/show.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								src/server/api/endpoints/drive/files/show.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | ||||
| /** | ||||
|  * Module dependencies | ||||
|  */ | ||||
| import $ from 'cafy'; | ||||
| import DriveFile, { pack } from '../../../models/drive-file'; | ||||
|  | ||||
| /** | ||||
|  * Show a file | ||||
|  * | ||||
|  * @param {any} params | ||||
|  * @param {any} user | ||||
|  * @return {Promise<any>} | ||||
|  */ | ||||
| module.exports = async (params, user) => { | ||||
| 	// Get 'file_id' parameter | ||||
| 	const [fileId, fileIdErr] = $(params.file_id).id().$; | ||||
| 	if (fileIdErr) throw 'invalid file_id param'; | ||||
|  | ||||
| 	// Fetch file | ||||
| 	const file = await DriveFile | ||||
| 		.findOne({ | ||||
| 			_id: fileId, | ||||
| 			'metadata.user_id': user._id | ||||
| 		}); | ||||
|  | ||||
| 	if (file === null) { | ||||
| 		throw 'file-not-found'; | ||||
| 	} | ||||
|  | ||||
| 	// Serialize | ||||
| 	const _file = await pack(file, { | ||||
| 		detail: true | ||||
| 	}); | ||||
|  | ||||
| 	return _file; | ||||
| }; | ||||
							
								
								
									
										75
									
								
								src/server/api/endpoints/drive/files/update.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								src/server/api/endpoints/drive/files/update.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,75 @@ | ||||
| /** | ||||
|  * Module dependencies | ||||
|  */ | ||||
| import $ from 'cafy'; | ||||
| import DriveFolder from '../../../models/drive-folder'; | ||||
| import DriveFile, { validateFileName, pack } from '../../../models/drive-file'; | ||||
| import { publishDriveStream } from '../../../event'; | ||||
|  | ||||
| /** | ||||
|  * Update a file | ||||
|  * | ||||
|  * @param {any} params | ||||
|  * @param {any} user | ||||
|  * @return {Promise<any>} | ||||
|  */ | ||||
| module.exports = (params, user) => new Promise(async (res, rej) => { | ||||
| 	// Get 'file_id' parameter | ||||
| 	const [fileId, fileIdErr] = $(params.file_id).id().$; | ||||
| 	if (fileIdErr) return rej('invalid file_id param'); | ||||
|  | ||||
| 	// Fetch file | ||||
| 	const file = await DriveFile | ||||
| 		.findOne({ | ||||
| 			_id: fileId, | ||||
| 			'metadata.user_id': user._id | ||||
| 		}); | ||||
|  | ||||
| 	if (file === null) { | ||||
| 		return rej('file-not-found'); | ||||
| 	} | ||||
|  | ||||
| 	// Get 'name' parameter | ||||
| 	const [name, nameErr] = $(params.name).optional.string().pipe(validateFileName).$; | ||||
| 	if (nameErr) return rej('invalid name param'); | ||||
| 	if (name) file.filename = name; | ||||
|  | ||||
| 	// Get 'folder_id' parameter | ||||
| 	const [folderId, folderIdErr] = $(params.folder_id).optional.nullable.id().$; | ||||
| 	if (folderIdErr) return rej('invalid folder_id param'); | ||||
|  | ||||
| 	if (folderId !== undefined) { | ||||
| 		if (folderId === null) { | ||||
| 			file.metadata.folder_id = null; | ||||
| 		} else { | ||||
| 			// Fetch folder | ||||
| 			const folder = await DriveFolder | ||||
| 				.findOne({ | ||||
| 					_id: folderId, | ||||
| 					user_id: user._id | ||||
| 				}); | ||||
|  | ||||
| 			if (folder === null) { | ||||
| 				return rej('folder-not-found'); | ||||
| 			} | ||||
|  | ||||
| 			file.metadata.folder_id = folder._id; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	await DriveFile.update(file._id, { | ||||
| 		$set: { | ||||
| 			filename: file.filename, | ||||
| 			'metadata.folder_id': file.metadata.folder_id | ||||
| 		} | ||||
| 	}); | ||||
|  | ||||
| 	// Serialize | ||||
| 	const fileObj = await pack(file); | ||||
|  | ||||
| 	// Response | ||||
| 	res(fileObj); | ||||
|  | ||||
| 	// Publish file_updated event | ||||
| 	publishDriveStream(user._id, 'file_updated', fileObj); | ||||
| }); | ||||
							
								
								
									
										26
									
								
								src/server/api/endpoints/drive/files/upload_from_url.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								src/server/api/endpoints/drive/files/upload_from_url.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| /** | ||||
|  * Module dependencies | ||||
|  */ | ||||
| import $ from 'cafy'; | ||||
| import { pack } from '../../../models/drive-file'; | ||||
| import uploadFromUrl from '../../../common/drive/upload_from_url'; | ||||
|  | ||||
| /** | ||||
|  * Create a file from a URL | ||||
|  * | ||||
|  * @param {any} params | ||||
|  * @param {any} user | ||||
|  * @return {Promise<any>} | ||||
|  */ | ||||
| module.exports = async (params, user): Promise<any> => { | ||||
| 	// Get 'url' parameter | ||||
| 	// TODO: Validate this url | ||||
| 	const [url, urlErr] = $(params.url).string().$; | ||||
| 	if (urlErr) throw 'invalid url param'; | ||||
|  | ||||
| 	// Get 'folder_id' parameter | ||||
| 	const [folderId = null, folderIdErr] = $(params.folder_id).optional.nullable.id().$; | ||||
| 	if (folderIdErr) throw 'invalid folder_id param'; | ||||
|  | ||||
| 	return pack(await uploadFromUrl(url, user, folderId)); | ||||
| }; | ||||
		Reference in New Issue
	
	Block a user
	 Akihiko Odaki
					Akihiko Odaki