OSDN Git Service

develop and test (not)existFile(), (not)existDirectory(),
[eos/zephyr.git] / server / class / DB.js
1 /**
2  * DBを操作するクラス
3  *
4  * @returns {object}
5  */
6 function DB() {
7     'use strict';
8
9     var fs = require('fs');
10     var Sequelize = require('sequelize');
11     var co = require('co');
12     var uuid = require('node-uuid');
13
14     var sequelize;
15     var test = 'hello';
16
17     var dbOption = {
18         dialect: 'sqlite'
19     };
20
21     /**
22      * sync
23      *
24      * @returns {promise}<DBオブジェクトの関数群のオブジェクトをresolveする>
25      */
26     function sync() {
27         return new Promise(function(resolve) {
28             Files.sync()
29             .then(function() {
30                 var root = {
31                     fileId: uuid.v1(),
32                     name: '/',
33                     parentDirectory: '',
34                     fileType: 0
35                 };
36                 return Files.create(root);
37             })
38             .then(function() {
39                 var c = {
40                     sayHello: function() {
41                         return test;
42                     },
43                     existFile: existFile,
44                     notExistFile: notExistFile,
45                     existDirectory: existDirectory,
46                     notExistDirectory: notExistDirectory,
47                     createFile: createFile,
48                     test1: test1,
49                     removeFile: removeFile
50                     /*
51                        createDirectory: createDirectory,
52                        removeDirectory: removeDirectory,
53                        getFilename: getFilename,
54                        moveFile: moveFile,
55                        moveDirectory: moveDirectory
56                        */
57                 };
58                 resolve(c);
59             });
60         });
61     }
62
63     /**
64      * createFile
65      *
66      * @param fileName 
67      * @param parentDirectory
68      * @returns {promise}<sequelize.createの結果を格納したobject | Error>
69      */
70     function createFile(fileName,parentDirectory) {
71         return new Promise(function(resolve, reject) {
72             Promise.all([notExistFile(fileName, parentDirectory), existDirectory(parentDirectory)])
73             .catch(function(error) {
74                 reject(error);
75             })
76             .then(function() {
77                 var q = {
78                     fileId: uuid.v1(),
79                     name: fileName,
80                     parentDirectory: parentDirectory,
81                     fileType: 1 
82                 }
83                 return Files.create(q)
84             })
85             .then(function(r) {
86                 resolve(r.dataValues.fileId);
87             });
88         });
89     }
90
91
92     /**
93      * existFile
94      * 同一ディレクトリに同名のファイルが存在することを確かめる
95      * @param {string}fileName
96      * @param {string}parentDirectory
97      * @returns {promise} ファイルが存在すればresolve、存在しなければreject
98      */
99     function existFile(fileName, parentDirectory) {
100         return new Promise(function(resolve, reject) {
101             var q = {
102                 where: {
103                     name: fileName,
104                     parentDirectory: parentDirectory,
105                     fileType: 1 
106                 }
107             };
108             Files.findOne(q)
109             .then(function(r) {
110                 console.log(r);
111                 if(r === null) {
112                     reject(new Error("\"" + fileName + "\" does not exist in " + '"' + parentDirectory + "\" directory."));
113                 } else {
114                     resolve();
115                 }
116             });
117         });
118     }
119
120
121     /**
122      * notExistFile
123      * 同一ディレクトリに同名のファイルが存在していないことを確かめる
124      * @param {string}fileName
125      * @param {string}parentDirectory
126      * @returns {promise} ファイルが存在しなければresolve、存在すればreject
127      */
128     function notExistFile(fileName, parentDirectory) {
129         return new Promise(function(resolve, reject) {
130             var q = {
131                 where: {
132                     name: fileName,
133                     parentDirectory: parentDirectory,
134                     fileType: 1 
135                 }
136             };
137             Files.findOne(q)
138             .then(function(r) {
139                 if(r === null) {
140                     resolve();
141                 } else {
142                     reject(new Error("\"" + fileName + "\" has already existed in " + '"' + parentDirectory + "\" directory."));
143                 }
144             });
145         });
146     }
147
148     /**
149      * existDirectory
150      * ディレクトリが存在することを確認する
151      * @param {string} directory
152      * @returns {promise} ディレクトリが存在すればresolve、存在しなければreject
153      */
154     function existDirectory(directory) {
155         return new Promise(function(resolve, reject) {
156             var q = {
157                 where: {
158                     name: directory,
159                     fileType: 0 
160                 }
161             };
162             Files.findOne(q)
163             .then(function(r) {
164                 if(r === null) {
165                     reject(new Error('"' + directory + '" directory doesn\'t exist.'));
166                 } else {
167                     resolve();
168                 }
169             });
170         });
171     }
172
173
174     /**
175      * notExistDirectory
176      * ディレクトリが存在しないことを確認する
177      * @param {string} directory
178      * @returns {promise} ディレクトリが存在しなければresolve、存在すればreject
179      */
180     function notExistDirectory(directory) {
181         return new Promise(function(resolve, reject) {
182             var q = {
183                 where: {
184                     name: directory,
185                     fileType: 0 
186                 }
187             };
188             Files.findOne(q)
189             .then(function(r) {
190                 if(r === null) {
191                     resolve();
192                 } else {
193                     reject(new Error('"' + directory + '" directory exists.'));
194                 }
195             });
196         });
197     }
198
199
200     /**
201      * removeFile
202      * ファイルを削除する
203      * @param {string} fileName
204      * @param {string} parentDirectory
205      * @returns {promise} ファイル削除に成功すればresolve、失敗すればreject
206      */
207     function removeFile(fileName, parentDirectory) {
208        return new Promise(function(resolve, reject) {
209            var q = {
210                where: {
211                    name: fileName,
212                    parentDirectory: parentDirectory
213                }
214            };
215
216            Files.destroy(q)
217            .then(function() {
218                resolve();
219            });
220        });
221     }
222
223     /**
224      * test1
225      * test用にデータベースのレコードを追加する関数
226      * @returns {promise}
227      */
228     function test1() {
229         var q = {
230             fileId: uuid.v1(),
231             name: 'hoge.txt',
232             parentDirectory: '/',
233             fileType: 1 
234         };
235         return Files.create(q);
236     }
237
238     /**
239      * 
240      * @constructor
241      * @returns {promise}
242      */
243     if(process.env['NODE_ENV'] === 'production') {
244         var dbPath = __dirname + '/../../user-specific-files/db/db.workspace';
245         dbOption.storage = dbPath;
246
247         // if doesn't exist workspace.db, create.
248         try {
249             fs.accessSync(dbPath, fs.R_OK | fs.W_OK);
250         } catch(e) {
251             fs.writeFileSync(dbPath, '');
252         }
253     }
254
255     sequelize = new Sequelize('','','', dbOption);
256
257     var Files = sequelize.define('file', {
258         fileId: {
259             type: Sequelize.UUID,
260             field: 'file_id',
261             primaryKey: true
262         },
263         name: {
264             type: Sequelize.STRING,
265             field: 'name',
266             allowNull: false
267         },
268         parentDirectory: {
269             type: Sequelize.STRING,
270             field: 'parent_directory',
271             allowNull: false
272         },
273         fileType: {
274             type: Sequelize.ENUM(0,1),
275             field: 'file_type',
276             allowNull: false
277         }
278     });
279
280     return sync();
281 }
282
283 module.exports = DB;