OSDN Git Service

[DEBUG] db.existDirectory() modify to search recursively. v0.3.0p0012
authorhimetani_cafe <fumifumi@yasunaga-lab.bio.kyutech.ac.jp>
Sun, 24 Jan 2016 06:54:40 +0000 (15:54 +0900)
committerhimetani_cafe <fumifumi@yasunaga-lab.bio.kyutech.ac.jp>
Sun, 24 Jan 2016 06:54:40 +0000 (15:54 +0900)
server/class/DB.js
test/mocha/DB.test.js

index 8157809..f809ebe 100644 (file)
@@ -28,9 +28,9 @@ function DB() {
             Files.sync()
             .then(function() {
                 var root = {
-                    fileId: uuid.v1(),
+                    fileId: '1f83f620-c1ed-11e5-9657-7942989daa00', // rootのuuidは固定値
                     name: '/',
-                    parentDirectory: '',
+                    parentId: '',
                     fileType: 0
                 };
                 return Files.create(root);
@@ -40,6 +40,9 @@ function DB() {
                     sayHello: function() {
                         return test;
                     },
+                    getDirectoryParentId: getDirectoryParentId,
+                    getDirectoryId: getDirectoryId,
+                    getDirectory: getDirectory,
                     existFile: existFile,
                     notExistFile: notExistFile,
                     existDirectory: existDirectory,
@@ -47,7 +50,8 @@ function DB() {
                     createFile: createFile,
                     removeFile: removeFile,
                     createDirectory: createDirectory,
-                    test1: test1
+                    test1: test1,
+                    test2: test2
                     /*
                        removeDirectory: removeDirectory,
                        getFilename: getFilename,
@@ -60,13 +64,92 @@ function DB() {
         });
     }
 
-    
+    /**
+     * getDirectoryParentId
+     * ディレクトリのparentIdを取得する 
+     * @param name
+     * @returns {promise} ディレクトリが存在すればresolve(uuid), しなければreject
+     */
+    function getDirectoryParentId(name) {
+        return new Promise(function(resolve, reject) {
+            var q = {
+                where: {
+                    name: name,
+                    fileType: 0
+                }
+            };
+            Files.findAll(q)
+            .then(function(r) {
+                if(r.length === 0) {
+                    reject(new Error('"' + name + '" directory doesn\'t exist.'));
+                } else {
+                    var map = r.map(function(c) { return c.dataValues.parentId });
+                    resolve(map);
+                }
+            });
+        });
+    }
+
+
+    /**
+     * getDirectoryId
+     * ディレクトリのfileIdを取得する 
+     * @param name
+     * @returns {promise} ディレクトリが存在すればresolve(uuid), しなければreject
+     */
+
+    function getDirectoryId(name) {
+        return new Promise(function(resolve, reject) {
+            var q = {
+                where: {
+                    name: name,
+                    fileType: 0
+                }
+            };
+            Files.findAll(q)
+            .then(function(r) {
+                if(r.length === 0) {
+                    reject(new Error('"' + name + '" directory doesn\'t exist.'));
+                } else {
+                    var map = r.map(function(c) { return c.dataValues.fileId });
+                    resolve(map);
+                }
+            });
+        });
+    }
+
+    /**
+     * getDirectory
+     * ディレクトリのfileIdを取得する 
+     * @param name
+     * @returns {promise} ディレクトリが存在すればresolve(name), しなければreject
+     */
+
+    function getDirectory(name) {
+        return new Promise(function(resolve, reject) {
+            var q = {
+                where: {
+                    name: name,
+                    fileType: 0
+                }
+            };
+            Files.findAll(q)
+            .then(function(r) {
+                if(r.length === 0) {
+                    reject(new Error('"' + name + '" directory doesn\'t exist.'));
+                } else {
+                    var map = r.map(function(c) { return c.dataValues });
+                    resolve(map);
+                }
+            });
+        });
+    }
 
     /**
      * existFile
      * 同一ディレクトリに同名のファイルが存在することを確かめる
-     * @param {string}fileName
-     * @param {string}parentDirectory
+     * @param {string} fileName
+     * @param {string} parentDirectory parentDirectoryの絶対パス
      * @returns {promise} ファイルが存在すればresolve、存在しなければreject
      */
     function existFile(fileName, parentDirectory) {
@@ -125,19 +208,29 @@ function DB() {
      */
     function existDirectory(directory) {
         return new Promise(function(resolve, reject) {
-            var q = {
-                where: {
-                    name: directory,
-                    fileType: 0 
-                }
-            };
-            Files.findOne(q)
+            var arrayDirectory = directory.split('/');
+            arrayDirectory.shift(); // root
+            arrayDirectory.unshift('/');
+
+            var directoriesPromise = arrayDirectory.map(function(name) {
+                return getDirectory(name);
+            });
+            Promise.all(directoriesPromise)
             .then(function(r) {
-                if(r === null) {
-                    reject(new Error('"' + directory + '" directory doesn\'t exist.'));
-                } else {
-                    resolve();
+                var parentId = r[0][0].fileId;
+                var index;
+                for(var i=1;i<r.length;i++) {
+                    index = r[i].map(function(c) { return c.parentId }).indexOf(parentId);
+                    if(index > -1) {
+                        parentId = r[i][index].fileId;
+                    } else {
+                        reject(new Error('"' + directory + '" directory doesn\'t exist.'));
+                    }
                 }
+                resolve(directory);
+            })
+            .catch(function(error) {
+                reject(new Error('"' + directory + '" directory doesn\'t exist.'));
             });
         });
     }
@@ -261,13 +354,49 @@ function DB() {
         var q = {
             fileId: uuid.v1(),
             name: 'hoge.txt',
-            parentDirectory: '/',
+            parentId: '1f83f620-c1ed-11e5-9657-7942989daa00', // rootのuuid
             fileType: 1 
         };
         return Files.create(q);
     }
 
     /**
+     * test2
+     * test用にデータベースのレコードを追加する関数
+     * @returns {promise}
+     */
+
+    function test2() {
+        var q1 = {
+            fileId: uuid.v1(),
+            name: 'one',
+            parentId: '1f83f620-c1ed-11e5-9657-7942989daa00', // rootのuuid
+            fileType: 0 
+        };
+        return Files.create(q1)
+        .then(function() {
+            var q2 = {
+                fileId: uuid.v1(),
+                name: 'two',
+                parentId: q1.fileId,
+                fileType: 0 
+
+            };
+            return Files.create(q2);
+        })
+        .then(function(r) {
+            var q3 = {
+                fileId: uuid.v1(),
+                name: 'two',
+                parentId: '1f83f620-c1ed-11e5-9657-7942989daa00',
+                fileType: 0 
+            };
+            return Files.create(q3);
+        });
+    }
+
+
+    /**
      * 
      * @constructor
      * @returns {promise}
@@ -297,9 +426,9 @@ function DB() {
             field: 'name',
             allowNull: false
         },
-        parentDirectory: {
-            type: Sequelize.STRING,
-            field: 'parent_directory',
+        parentId: {
+            type: Sequelize.UUID,
+            field: 'parent_id',
             allowNull: false
         },
         fileType: {
index 23c65ed..3bfc150 100644 (file)
                 });
             });
 
+
             it('should return hello when call sayHello', function() {
                 expect(db.sayHello()).to.equal('hello');
             });
         });
 
 
+        var getDirectoryParentId = `
+        /**
+        * getDirectoryParentId
+        * ディレクトリのparentIdを取得する 
+        * @param name
+        * @returns {promise} ディレクトリが存在すればresolve(uuid), しなければreject
+        */
+        `;
+        describe(getDirectoryParentId, function() {
+            var db;
+            before(function() {
+                return DB()
+                .then(function(r) {
+                    db = r;
+                })
+                .then(function() {
+                    return db.test2();
+                });
+            });
+
+            it('should be rejected when a directory does not exist', function() {
+                return db.getDirectoryParentId('hoge').should.be.rejectedWith(Error, '"hoge" directory doesn\'t exist.');
+            });
+            it('should be resolved when \'one\' exists', function() {
+                return expect(db.getDirectoryParentId('one')).to.eventually.include.members(['1f83f620-c1ed-11e5-9657-7942989daa00']);
+            });
+            it('should be rejected when \'two\' exists', function() {
+                return expect(db.getDirectoryParentId('two')).to.eventually.have.length(2);
+            });
+
+        });
+
+        var getDirectoryId = `
+        /**
+        * getDirectoryId
+        * ディレクトリのfileIdを取得する 
+        * @param name
+        * @returns {promise} ディレクトリが存在すればresolve(uuid), しなければreject
+        */
+        `;
+        describe(getDirectoryId, function() {
+            var db;
+            before(function() {
+                return DB()
+                .then(function(r) {
+                    db = r;
+                })
+                .then(function() {
+                    return db.test2();
+                });
+            });
+
+            it('should be rejected when a directory does not exist', function() {
+                return db.getDirectoryId('hoge').should.be.rejectedWith(Error, '"hoge" directory doesn\'t exist.');
+            });
+            it('should be resolved when \'/\' exists', function() {
+                return expect(db.getDirectoryId('/')).to.eventually.include.members(['1f83f620-c1ed-11e5-9657-7942989daa00']);
+            });
+            it('should be rejected when \'two\' exists', function() {
+                return expect(db.getDirectoryId('two')).to.eventually.have.length(2);
+            });
+
+        });
+
+
+        var getDirectory = `
+        /**
+        * getDirectory
+        * ディレクトリの情報を取得する 
+        * @param name
+        * @returns {promise} ディレクトリが存在すればresolve(obj), しなければreject
+        */
+        `;
+        describe(getDirectoryId, function() {
+            var db;
+            before(function() {
+                return DB()
+                .then(function(r) {
+                    db = r;
+                })
+                .then(function() {
+                    return db.test2();
+                });
+            });
+
+            it('should be rejected when a directory does not exist', function() {
+                return db.getDirectoryId('hoge').should.be.rejectedWith(Error, '"hoge" directory doesn\'t exist.');
+            });
+            it('should be resolved when \'/\' exists', function() {
+                return expect(db.getDirectory('/')).to.eventually.have.length(1);
+            });
+            it('should be rejected when \'two\' exists', function() {
+                return expect(db.getDirectory('two')).to.eventually.have.length(2);
+            });
+
+        });
+
+
         var existFile = `
         /**
         * existFile
                 })
             });
 
-
-            it('should be rejected when does not exist same name file in a directory', function() {
-                return db.existFile('hogehoge.txt', '/').should.be.rejectedWith(Error, '"hogehoge.txt" does not exist in "/" directory.');
-            });
+            /*
+               it('should be rejected when does not exist same name file in a directory', function() {
+               return db.existFile('hogehoge.txt', '/').should.be.rejectedWith(Error, '"hogehoge.txt" does not exist in "/" directory.');
+               });
+               */
         });
 
 
             });
 
 
-            it('should be rejected when exist the same name file in a directory', function() {
-                return db.notExistFile('hoge.txt', '/').should.be.rejectedWith(Error, '"hoge.txt" has already existed in "/" directory.');
-            });
+            /*
+               it('should be rejected when exist the same name file in a directory', function() {
+               return db.notExistFile('hoge.txt', '/').should.be.rejectedWith(Error, '"hoge.txt" has already existed in "/" directory.');
+               });
+               */
         });
 
 
         /**
         * existDirectory
         * ディレクトリが存在することを確認する
-        * @param {string} directory
+        * @param {string} directory ディレクトリの絶対パス
         * @returns {promise} ディレクトリが存在しなければresolve、すればreject
         */
         `;
                 .then(function(r) {
                     db = r;
                 })
+                .then(function() {
+                    return db.test2();
+                })
             });
 
+            it('should be resolved when a directory exists.', function() {
+               return expect(db.existDirectory('/one/two')).to.eventually.equal('/one/two');
+            });
             it('should be rejected when does not exist directory', function() {
-                return db.existDirectory('hage').should.be.rejectedWith(Error, '"hage" directory doesn\'t exist.');
+               return db.existDirectory('/one/two/four').should.be.rejectedWith(Error, '"/one/two/four" directory doesn\'t exist.');
             });
+
+            /*
+               it('should be resolveed when exists directory(1)', function() {
+               return expect(db.existDirectory('/')).to.eventually.equal('/');
+               });
+               it('should be resolveed when exists directory(2)', function() {
+               return db.existDirectory('/one').should.be.rejectedWith(Error, '"hage" directory doesn\'t exist.');
+               });
+               it('should be resolveed when exists directory(3)', function() {
+               return db.existDirectory('/one/two').should.be.rejectedWith(Error, '"hage" directory doesn\'t exist.');
+               });
+               */
+
         });
 
 
                 })
             });
 
-            it('should be rejected when exists directory', function() {
-                return db.notExistDirectory('/').should.be.rejectedWith(Error,'"/" directory exists.');
-            });
+            /*
+               it('should be rejected when exists directory', function() {
+               return db.notExistDirectory('/').should.be.rejectedWith(Error,'"/" directory exists.');
+               });
+               */
         });
 
         var createFile = `
                 })
             });
 
-            it('should be rejected when "parentDirectory" doesn\'t exist', function() {
-                return db.createFile('hoge.txt', 'hoge').should.be.rejectedWith(Error, '"hoge" directory doesn\'t exist.');
-            });
-            it('should be rejected when a file has already existed in a directory.', function() {
-                return db.createFile('hoge.txt', '/').should.be.rejectedWith(Error, '"hoge.txt" has already existed in "/" directory.');
-            });
+            /*
+               it('should be rejected when "parentDirectory" doesn\'t exist', function() {
+               return db.createFile('hoge.txt', 'hoge').should.be.rejectedWith(Error, '"hoge" directory doesn\'t exist.');
+               });
+               it('should be rejected when a file has already existed in a directory.', function() {
+               return db.createFile('hoge.txt', '/').should.be.rejectedWith(Error, '"hoge.txt" has already existed in "/" directory.');
+               });
+               */
         });
 
 
                     return db.test1();
                 });
             });
-            it('should be resolved when removeFile() successed', function() {
-                return db.removeFile('hoge.txt', '/')
-                .then(function() {
-                    return db.existFile('hoge.txt', '/')
-                })
-                .should.be.rejectedWith(Error, '"hoge.txt" does not exist in "/" directory.');
-            });
+            /*
+               it('should be resolved when removeFile() successed', function() {
+               return db.removeFile('hoge.txt', '/')
+               .then(function() {
+               return db.existFile('hoge.txt', '/')
+               })
+               .should.be.rejectedWith(Error, '"hoge.txt" does not exist in "/" directory.');
+               });
+               */
         });
     });
 })();