8 var fs = require('fs');
9 var Sequelize = require('sequelize');
10 var co = require('co');
11 var uuid = require('node-uuid');
15 var Files; // Model object of sequelize
19 sayHello: function() {
22 getDirectoryParentId: getDirectoryParentId,
23 getDirectoryId: getDirectoryId,
24 getDirectory: getDirectory,
26 notExistFile: notExistFile,
27 existDirectory: existDirectory,
28 notExistDirectory: notExistDirectory,
29 createFile: createFile,
30 removeFile: removeFile,
31 createDirectory: createDirectory,
36 removeDirectory: removeDirectory,
37 getFilename: getFilename,
39 moveDirectory: moveDirectory
50 * productionモード時は、db.workspaceを永続化させる
51 * DEBUGモードの時は、db.debugを実行毎に作成する。
52 * DEBUGモードの時は、sync()の中で、/レコードがFilesテーブルに追加される。
53 * モードの切り替えは環境変数NODE_ENVで行っている。
54 * zephyr serveコマンドが実行されるとNODE_ENV = 'production'
55 * zephyr debugコマンドが実行されるとNODE_ENV = 'debug'
57 * それぞれの設定は$ZEOHYR_HOME/cli/zephyr-serve, $ZEPHYR_HOME/zephyre_debugを参照
66 if(process.env['NODE_ENV'] === 'production') {
67 dbPath = __dirname + '/../../user-specific-files/db/db.workspace';
68 // if doesn't exist workspace.db, create.
70 fs.accessSync(dbPath, fs.R_OK | fs.W_OK);
72 fs.writeFileSync(dbPath, '');
74 dbOption.storage = dbPath;
76 } else if(process.env['NODE_ENV'] === 'debug') {
77 dbPath = __dirname + '/../../user-specific-files/db/db.debug';
79 fs.accessSync(dbPath, fs.R_OK | fs.W_OK);
80 fs.unlinkSync(dbPath);
84 fs.writeFileSync(dbPath, '');
85 dbOption.storage = dbPath;
88 sequelize = new Sequelize('','','', dbOption);
90 Files = sequelize.define('file', {
97 type: Sequelize.STRING,
102 type: Sequelize.UUID,
107 type: Sequelize.ENUM(0,1),
113 var force = process.env.NODE_ENV !== 'production';
114 return Files.sync({force: force})
124 * @returns {promise}<DBオブジェクトの関数群のオブジェクトをresolveする>
126 function insertRoot() {
127 return new Promise(function(resolve, reject) {
137 fileId: '1f83f620-c1ed-11e5-9657-7942989daa00', // rootのuuidは固定値
142 return Files.create(root);
152 * getDirectoryParentId
153 * ディレクトリのparentIdを取得する
155 * @returns {promise} ディレクトリが存在すればresolve(uuid), しなければreject
157 function getDirectoryParentId(name) {
158 return new Promise(function(resolve, reject) {
168 reject(new Error('"' + name + '" directory doesn\'t exist.'));
170 var map = r.map(function(c) { return c.dataValues.parentId });
182 * @returns {promise} ディレクトリが存在すればresolve(uuid), しなければreject
185 function getDirectoryId(name) {
186 return new Promise(function(resolve, reject) {
196 reject(new Error('"' + name + '" directory doesn\'t exist.'));
198 var map = r.map(function(c) { return c.dataValues.fileId });
209 * @returns {promise} ディレクトリが存在すればresolve(name), しなければreject
212 function getDirectory(name) {
213 return new Promise(function(resolve, reject) {
223 reject(new Error('"' + name + '" directory doesn\'t exist.'));
225 var map = r.map(function(c) { return c.dataValues });
234 * 同一ディレクトリに同名のファイルが存在することを確かめる
235 * @param {string} fileName
236 * @param {string} parentDirectory parentDirectoryの絶対パス
237 * @returns {promise} ファイルが存在すればresolve、存在しなければreject
239 function existFile(fileName, parentDirectory) {
240 return new Promise(function(resolve, reject) {
241 existDirectory(parentDirectory)
242 .catch(function(error) {
245 .then(function(fileId) {
252 return Files.findOne(q)
256 reject(new Error("\"" + fileName + "\" does not exist in " + '"' + parentDirectory + "\" directory."));
267 * 同一ディレクトリに同名のファイルが存在していないことを確かめる
268 * @param {string}fileName
269 * @param {string}parentDirectory
270 * @returns {promise} ファイルが存在しなければresolve、存在すればreject
272 function notExistFile(fileName, parentDirectory) {
273 return new Promise(function(resolve, reject) {
274 existDirectory(parentDirectory)
275 .catch(function(error) {
278 .then(function(fileId) {
285 return Files.findOne(q)
291 reject(new Error("\"" + fileName + "\" has already existed in " + '"' + parentDirectory + "\" directory."));
300 * @param {string} directory
301 * @returns {promise} ディレクトリが存在すればresolve{fileId)、存在しなければreject
303 function existDirectory(directory) {
304 return new Promise(function(resolve, reject) {
306 reject(new Error('parameter "directory" is undefined'));
310 var root = directory.substr(0,1);
313 reject(new Error('directory name should start "/" so that it is absolute path including root.'));
316 if(directory === '/') {
317 resolve('1f83f620-c1ed-11e5-9657-7942989daa00'); // rootのuuid
319 arrayDirectory = directory.split('/');
320 arrayDirectory.shift(); // root
321 arrayDirectory.unshift('/');
324 var directoriesPromise = arrayDirectory.map(function(name) {
325 return getDirectory(name);
328 Promise.all(directoriesPromise)
330 var parentId = r[0][0].fileId;
332 for(var i=1;i<r.length;i++) {
333 index = r[i].map(function(c) { return c.parentId }).indexOf(parentId);
335 parentId = r[i][index].fileId;
337 reject(new Error('"' + directory + '" directory doesn\'t exist.'));
342 .catch(function(error) {
343 reject(new Error('"' + directory + '" directory doesn\'t exist.'));
350 * ディレクトリが存在しないことを確認する
351 * @param {string} directory
352 * @returns {promise} ディレクトリが存在しなければresolve、存在すればreject
354 function notExistDirectory(directory) {
355 return new Promise(function(resolve, reject) {
361 var root = directory.substr(0,1);
367 if(directory === '/') {
368 reject(new Error('"' + directory + '" directory exists.'));
370 arrayDirectory = directory.split('/');
371 arrayDirectory.shift(); // root
372 arrayDirectory.unshift('/');
375 var directoriesPromise = arrayDirectory.map(function(name) {
376 return getDirectory(name);
378 Promise.all(directoriesPromise)
380 var parentId = r[0][0].fileId;
382 for(var i=1;i<r.length;i++) {
383 index = r[i].map(function(c) { return c.parentId }).indexOf(parentId);
385 parentId = r[i][index].fileId;
390 reject(new Error('"' + directory + '" directory exists.'));
392 .catch(function(error) {
402 * @param parentDirectory
403 * @returns {promise}<sequelize.createの結果を格納したobject | Error>
405 function createFile(fileName,parentDirectory) {
406 return new Promise(function(resolve, reject) {
408 reject(new Error('filename is required.'));
410 Promise.all([existDirectory(parentDirectory), notExistFile(fileName, parentDirectory) ])
411 .catch(function(error) {
422 return Files.create(q)
425 resolve(r.dataValues.fileId);
434 * @param {string} fileName
435 * @param {string} parentDirectory
436 * @returns {promise} ファイル削除に成功すればresolve、失敗すればreject
438 function removeFile(fileName, parentDirectory) {
439 return new Promise(function(resolve, reject) {
440 existFile(fileName, parentDirectory)
441 .catch(function(error) {
444 .then(function(fileId) {
450 return Files.destroy(q);
462 * @returns {promise} ディレクトリの作成に成功すればresolve、失敗すればreject
464 function createDirectory(directory) {
465 return new Promise(function(resolve, reject) {
467 reject(new Error('directory name should start "/" so that it is absolute path including root.'));
470 var leaf = directory.split('/').pop();
471 var parentDirectory = directory.replace('/'+leaf, '');
472 if(!parentDirectory) {
473 parentDirectory = '/';
475 Promise.all([existDirectory(parentDirectory), notExistDirectory(directory), notExistFile(leaf, parentDirectory)])
476 .catch(function(error) {
487 return Files.create(q)
490 resolve(r.dataValues.fileId);
500 * @returns {promise} ディレクトリの削除に成功すればresolve、失敗すればreject
502 function removeDirectory(directory) {
503 return new Promise(function(resolve, reject) {
504 var leaf = directory.split('/').pop();
505 var parentDirectory = directory.replace('/'+leaf, '');
506 if(!parentDirectory) {
507 parentDirectory = '/';
509 Promise.all([existDirectory(parentDirectory), notExistDirectory(directory), notExistFile(leaf, parentDirectory)])
510 .catch(function(error) {
521 return Files.create(q)
524 resolve(r.dataValues.fileId);
531 * test用にデータベースのレコードを追加する関数
538 parentId: '1f83f620-c1ed-11e5-9657-7942989daa00', // rootのuuid
541 return Files.create(q);
546 * test用にデータベースのレコードを追加する関数
554 parentId: '1f83f620-c1ed-11e5-9657-7942989daa00', // rootのuuid
555 fileType: 0 //directory
557 return Files.create(q1)
566 return Files.create(q2);
572 parentId: '1f83f620-c1ed-11e5-9657-7942989daa00', //rootのuuid
575 return Files.create(q3);
580 name: 'hogehoge.txt',
584 return Files.create(q4);
588 function testRest() {
590 fileId: 'dca94750-c44f-11e5-88c4-f31cdfe97f4f',
591 name: 'debugRest.mrc',
592 parentId: '1f83f620-c1ed-11e5-9657-7942989daa00', //rootのuuid
595 return Files.create(q);
598 module.exports = { instance: instance };