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) {
160 parentDirectory: parentDirectory,
167 reject(new Error("\"" + fileName + "\" does not exist in " + '"' + parentDirectory + "\" directory."));
178 * 同一ディレクトリに同名のファイルが存在していないことを確かめる
179 * @param {string}fileName
180 * @param {string}parentDirectory
181 * @returns {promise} ファイルが存在しなければresolve、存在すればreject
183 function notExistFile(fileName, parentDirectory) {
184 return new Promise(function(resolve, reject) {
188 parentDirectory: parentDirectory,
197 reject(new Error("\"" + fileName + "\" has already existed in " + '"' + parentDirectory + "\" directory."));
206 * @param {string} directory
207 * @returns {promise} ディレクトリが存在すればresolve、存在しなければreject
209 function existDirectory(directory) {
210 return new Promise(function(resolve, reject) {
211 var arrayDirectory = directory.split('/');
212 arrayDirectory.shift(); // root
213 arrayDirectory.unshift('/');
215 var directoriesPromise = arrayDirectory.map(function(name) {
216 return getDirectory(name);
218 Promise.all(directoriesPromise)
220 var parentId = r[0][0].fileId;
222 for(var i=1;i<r.length;i++) {
223 index = r[i].map(function(c) { return c.parentId }).indexOf(parentId);
225 parentId = r[i][index].fileId;
227 reject(new Error('"' + directory + '" directory doesn\'t exist.'));
232 .catch(function(error) {
233 reject(new Error('"' + directory + '" directory doesn\'t exist.'));
240 * ディレクトリが存在しないことを確認する
241 * @param {string} directory
242 * @returns {promise} ディレクトリが存在しなければresolve、存在すればreject
244 function notExistDirectory(directory) {
245 return new Promise(function(resolve, reject) {
257 reject(new Error('"' + directory + '" directory exists.'));
267 * @param parentDirectory
268 * @returns {promise}<sequelize.createの結果を格納したobject | Error>
270 function createFile(fileName,parentDirectory) {
271 return new Promise(function(resolve, reject) {
272 Promise.all([notExistFile(fileName, parentDirectory), existDirectory(parentDirectory)])
273 .catch(function(error) {
280 parentDirectory: parentDirectory,
283 return Files.create(q)
286 resolve(r.dataValues.fileId);
295 * @param {string} fileName
296 * @param {string} parentDirectory
297 * @returns {promise} ファイル削除に成功すればresolve、失敗すればreject
299 function removeFile(fileName, parentDirectory) {
300 return new Promise(function(resolve, reject) {
301 existFile(fileName, parentDirectory)
302 .catch(function(error) {
309 parentDirectory: parentDirectory
312 return Files.destroy(q);
324 * @param parentDirectory
325 * @returns {promise}<sequelize.createの結果を格納したobject | Error>
327 function createDirectory(fileName,parentDirectory) {
328 return new Promise(function(resolve, reject) {
329 Promise.all([notExistFile(fileName, parentDirectory), existDirectory(parentDirectory)])
330 .catch(function(error) {
337 parentDirectory: parentDirectory,
340 return Files.create(q)
343 resolve(r.dataValues.fileId);
350 * test用にデータベースのレコードを追加する関数
357 parentId: '1f83f620-c1ed-11e5-9657-7942989daa00', // rootのuuid
360 return Files.create(q);
365 * test用にデータベースのレコードを追加する関数
373 parentId: '1f83f620-c1ed-11e5-9657-7942989daa00', // rootのuuid
376 return Files.create(q1)
385 return Files.create(q2);
391 parentId: '1f83f620-c1ed-11e5-9657-7942989daa00',
394 return Files.create(q3);
404 if(process.env['NODE_ENV'] === 'production') {
405 var dbPath = __dirname + '/../../user-specific-files/db/db.workspace';
406 dbOption.storage = dbPath;
408 // if doesn't exist workspace.db, create.
410 fs.accessSync(dbPath, fs.R_OK | fs.W_OK);
412 fs.writeFileSync(dbPath, '');
416 sequelize = new Sequelize('','','', dbOption);
418 var Files = sequelize.define('file', {
420 type: Sequelize.UUID,
425 type: Sequelize.STRING,
430 type: Sequelize.UUID,
435 type: Sequelize.ENUM(0,1),