9 var fs = require('fs');
10 var Sequelize = require('sequelize');
11 var co = require('co');
12 var uuid = require('node-uuid');
24 * @returns {promise}<DBオブジェクトの関数群のオブジェクトをresolveする>
27 return new Promise(function(resolve) {
31 fileId: '1f83f620-c1ed-11e5-9657-7942989daa00', // rootのuuidは固定値
36 return Files.create(root);
40 sayHello: function() {
43 getDirectoryParentId: getDirectoryParentId,
44 getDirectoryId: getDirectoryId,
45 getDirectory: getDirectory,
47 notExistFile: notExistFile,
48 existDirectory: existDirectory,
49 notExistDirectory: notExistDirectory,
50 createFile: createFile,
51 removeFile: removeFile,
52 createDirectory: createDirectory,
56 removeDirectory: removeDirectory,
57 getFilename: getFilename,
59 moveDirectory: moveDirectory
68 * getDirectoryParentId
69 * ディレクトリのparentIdを取得する
71 * @returns {promise} ディレクトリが存在すればresolve(uuid), しなければreject
73 function getDirectoryParentId(name) {
74 return new Promise(function(resolve, reject) {
84 reject(new Error('"' + name + '" directory doesn\'t exist.'));
86 var map = r.map(function(c) { return c.dataValues.parentId });
98 * @returns {promise} ディレクトリが存在すればresolve(uuid), しなければreject
101 function getDirectoryId(name) {
102 return new Promise(function(resolve, reject) {
112 reject(new Error('"' + name + '" directory doesn\'t exist.'));
114 var map = r.map(function(c) { return c.dataValues.fileId });
125 * @returns {promise} ディレクトリが存在すればresolve(name), しなければreject
128 function getDirectory(name) {
129 return new Promise(function(resolve, reject) {
139 reject(new Error('"' + name + '" directory doesn\'t exist.'));
141 var map = r.map(function(c) { return c.dataValues });
150 * 同一ディレクトリに同名のファイルが存在することを確かめる
151 * @param {string} fileName
152 * @param {string} parentDirectory parentDirectoryの絶対パス
153 * @returns {promise} ファイルが存在すればresolve、存在しなければreject
155 function existFile(fileName, parentDirectory) {
156 return new Promise(function(resolve, reject) {
157 existDirectory(parentDirectory)
158 .catch(function(error) {
161 .then(function(fileId) {
169 return Files.findOne(q)
173 reject(new Error("\"" + fileName + "\" does not exist in " + '"' + parentDirectory + "\" directory."));
175 console.log(r.fileId);
185 * 同一ディレクトリに同名のファイルが存在していないことを確かめる
186 * @param {string}fileName
187 * @param {string}parentDirectory
188 * @returns {promise} ファイルが存在しなければresolve、存在すればreject
190 function notExistFile(fileName, parentDirectory) {
191 return new Promise(function(resolve, reject) {
192 existDirectory(parentDirectory)
193 .catch(function(error) {
196 .then(function(fileId) {
204 return Files.findOne(q)
210 reject(new Error("\"" + fileName + "\" has already existed in " + '"' + parentDirectory + "\" directory."));
219 * @param {string} directory
220 * @returns {promise} ディレクトリが存在すればresolve{fileId)、存在しなければreject
222 function existDirectory(directory) {
223 return new Promise(function(resolve, reject) {
225 if(directory === '/') {
226 resolve('1f83f620-c1ed-11e5-9657-7942989daa00');
228 arrayDirectory = directory.split('/');
229 arrayDirectory.shift(); // root
230 arrayDirectory.unshift('/');
233 var directoriesPromise = arrayDirectory.map(function(name) {
234 return getDirectory(name);
236 Promise.all(directoriesPromise)
238 var parentId = r[0][0].fileId;
240 for(var i=1;i<r.length;i++) {
241 index = r[i].map(function(c) { return c.parentId }).indexOf(parentId);
243 parentId = r[i][index].fileId;
245 reject(new Error('"' + directory + '" directory doesn\'t exist.'));
250 .catch(function(error) {
251 reject(new Error('"' + directory + '" directory doesn\'t exist.'));
258 * ディレクトリが存在しないことを確認する
259 * @param {string} directory
260 * @returns {promise} ディレクトリが存在しなければresolve、存在すればreject
262 function notExistDirectory(directory) {
263 return new Promise(function(resolve, reject) {
265 if(directory === '/') {
266 reject(new Error('"' + directory + '" directory exists.'));
268 arrayDirectory = directory.split('/');
269 arrayDirectory.shift(); // root
270 arrayDirectory.unshift('/');
273 var directoriesPromise = arrayDirectory.map(function(name) {
274 return getDirectory(name);
276 Promise.all(directoriesPromise)
278 var parentId = r[0][0].fileId;
280 for(var i=1;i<r.length;i++) {
281 index = r[i].map(function(c) { return c.parentId }).indexOf(parentId);
283 parentId = r[i][index].fileId;
288 reject(new Error('"' + directory + '" directory exists.'));
290 .catch(function(error) {
300 * @param parentDirectory
301 * @returns {promise}<sequelize.createの結果を格納したobject | Error>
303 function createFile(fileName,parentDirectory) {
304 return new Promise(function(resolve, reject) {
305 Promise.all([existDirectory(parentDirectory), notExistFile(fileName, parentDirectory) ])
306 .catch(function(error) {
317 return Files.create(q)
320 resolve(r.dataValues.fileId);
329 * @param {string} fileName
330 * @param {string} parentDirectory
331 * @returns {promise} ファイル削除に成功すればresolve、失敗すればreject
333 function removeFile(fileName, parentDirectory) {
334 return new Promise(function(resolve, reject) {
335 existFile(fileName, parentDirectory)
336 .catch(function(error) {
339 .then(function(fileId) {
345 return Files.destroy(q);
357 * @param parentDirectory
358 * @returns {promise}<sequelize.createの結果を格納したobject | Error>
360 function createDirectory(fileName,parentDirectory) {
361 return new Promise(function(resolve, reject) {
362 Promise.all([notExistFile(fileName, parentDirectory), existDirectory(parentDirectory)])
363 .catch(function(error) {
370 parentDirectory: parentDirectory,
373 return Files.create(q)
376 resolve(r.dataValues.fileId);
383 * test用にデータベースのレコードを追加する関数
390 parentId: '1f83f620-c1ed-11e5-9657-7942989daa00', // rootのuuid
393 return Files.create(q);
398 * test用にデータベースのレコードを追加する関数
406 parentId: '1f83f620-c1ed-11e5-9657-7942989daa00', // rootのuuid
409 return Files.create(q1)
418 return Files.create(q2);
424 parentId: '1f83f620-c1ed-11e5-9657-7942989daa00',
427 return Files.create(q3);
432 name: 'hogehoge.txt',
436 return Files.create(q4);
446 if(process.env['NODE_ENV'] === 'production') {
447 var dbPath = __dirname + '/../../user-specific-files/db/db.workspace';
448 dbOption.storage = dbPath;
450 // if doesn't exist workspace.db, create.
452 fs.accessSync(dbPath, fs.R_OK | fs.W_OK);
454 fs.writeFileSync(dbPath, '');
458 sequelize = new Sequelize('','','', dbOption);
460 var Files = sequelize.define('file', {
462 type: Sequelize.UUID,
467 type: Sequelize.STRING,
472 type: Sequelize.UUID,
477 type: Sequelize.ENUM(0,1),