프로젝트

일반

사용자정보

통계
| 개정판:

root / HServer / 00.Server / 00.Program / routers / contents.js @ 136

이력 | 보기 | 이력해설 | 다운로드 (12.2 KB)

1
var express = require('express');
2
var static = require('serve-static');
3
var path = require('path');
4
var bodyParser = require('body-parser');
5
var cors = require('cors');
6
var multer = require('multer');
7

    
8
var rmdir = require('rmdir');
9

    
10
var fs = require('fs');
11
var multiparty = require('multiparty');
12
var mongoose = require('mongoose');
13
var dbCenter = require('../db_modules/dbCenter');
14
var mySocket = require('../socket.io_modules/mySocket');
15

    
16
var localPath = 'D:/00.FAMOZ/16.CMS/02.SVN/Repository/Horizon/HServer/00.Server/00.Program/uploads';
17

    
18
//#region [ database ]
19

    
20
var contentSchema = function(){
21
    name: String;    // 프로젝트 이름
22
    files: [];       // 파일들의 정보
23
    lastUpdateDate: Date;    // 마지막 업데이트 날짜
24
    updateFiles: [];
25
    deleteFiles: [];
26
};
27

    
28
//#endregion
29

    
30
//#region [ variable ]
31
var collectionName = 'contents';
32
//#endregion
33

    
34
//#region [ API ]
35

    
36
const router = express.Router();
37

    
38
// content 등록
39
router.post('/', function(req, res, next){
40
    console.log('[content] post');
41

    
42
    var form = new multiparty.Form();       // 멀티파티폼의 설정
43
    form.maxFields = 100000;
44

    
45
    var contentsName;    // 프로젝트의 이름을 저장해줄 변수
46
    
47
    // get field name & value
48
    form.on('field',function(name, value){
49
        console.log('normal field / name = '+name+' , value = '+ value);
50
        
51
        var parseData =  JSON.parse(value); // value 값을 파싱해준다.
52
        var saveData = new contentSchema;   // 저장할 데이터를 만든다.
53
        saveData.name = parseData.name;     // 프로젝트 이름 설정
54
        saveData.files = parseData.files;   // 파일들 설정
55
        saveData.lastUpdateDate = Date.now();   // 업데이트 시간 설정
56
        saveData.updateFiles = [];
57
        saveData.deleteFiles= [];
58

    
59
        contentsName = name; // 현재 프로젝트 네임을 설정해준다. 최상위 폴더가 된다.
60

    
61
        // 추가해준다. 무조건 첫번째 등록을 가정하고 중복 검사를 하지 않는다.
62
        dbCenter.add(collectionName, saveData, function(err){
63
            if(err){
64
                console.log('[content add] err : ' + err.toString());
65
                // res.send({'result':null});
66
                // res.end();
67
                return;
68
            } else {
69
                console.log('[content add] 성공');
70
                // res.send({'result':'ss'});
71
                // res.end();
72
            }
73
        });
74
    });
75

    
76
    // file upload handling
77
    form.on('part',function(part){
78
         var filename;
79
         var size;
80
         if (part.filename) {
81
               filename = part.filename;
82
               size = part.byteCount;
83
         }else{
84
               part.resume();
85
         }
86

    
87
         var filePath = part.name;
88

    
89
         //console.log('filename : ' + filename);
90
         //console.log('filepath : ' + filePath);
91

    
92
         var tmpPath = filePath.substring(0, filePath.length - filename.length);
93
         
94
         //console.log('tmppath : ' + tmpPath);
95

    
96
         var savePath = localPath + '/' + contentsName;
97

    
98
         if(!fs.existsSync(savePath))
99
         {
100
            fs.mkdirSync(savePath);
101
         }
102

    
103
         while(true){
104
            var firstIndex = filePath.indexOf('/');
105
            if( firstIndex == -1 ) break;
106
            
107
            //console.log('firstIndex : ' + firstIndex);
108
           
109
            var tmpString = tmpPath.substring(firstIndex + 1, filePath.length);
110
            
111
            //console.log('tmpString : ' + tmpString);
112

    
113
            var secondIndex = tmpString.indexOf('/');
114
            if(secondIndex == -1) break;
115
            
116
            var resultString = tmpPath.substring(firstIndex, secondIndex + 1);
117

    
118
            //console.log('result : ' + resultString);
119

    
120
            savePath = savePath + resultString;
121

    
122
            if(!fs.existsSync(savePath))
123
            {
124
               fs.mkdirSync(savePath);
125
            }
126

    
127
            tmpPath = tmpPath.substring(secondIndex + 1, tmpPath.length);
128

    
129
            //console.log('aaaaaa : ' + tmpPath);
130
         }
131

    
132

    
133
         //console.log("Write Streaming file :"+filename);
134
         var writeStream = fs.createWriteStream(savePath + '/' + filename);
135
         writeStream.filename = filename;
136
         part.pipe(writeStream);
137

    
138
         part.on('data',function(chunk){
139
               //console.log(filename+' read '+chunk.length + 'bytes');
140
         });
141

    
142

    
143
         part.on('end',function(){
144
               //console.log(filename+' Part read complete');
145
               writeStream.end();
146
         });
147
    });
148

    
149
    // all uploads are completed
150
    form.on('close',function(){
151

    
152
        res.status(200).send('Upload complete');
153
    });
154

    
155
    // track progress
156
    form.on('progress',function(byteRead,byteExpected){
157
         //console.log(' Reading total  '+byteRead+'/'+byteExpected);
158
    });
159

    
160
    form.parse(req);
161
});
162

    
163
// 전체 조회
164
router.get('/', function(req, res){
165
    console.log('[contents] 전체조회 호출'); 
166

    
167
    dbCenter.findAll(collectionName, function(err, docs){
168
        if(err){
169
            console.log('[contents][getAll] err : ' + err.toSring());
170
            res.send({'result':'fail'});
171
            res.end();
172
        } else {
173
            console.log('[contents][getAll] 전체 데이터 호출 성공');
174
            res.send(docs);
175
            res.end();
176
        }
177
    });
178
});
179

    
180
router.put('/:name', function(req, res){
181

    
182
});
183

    
184
// 수정
185
router.put('/:name/:isUpdateFile', function(req, res){
186
    console.log('[content] put/file ' + req.params.name);
187

    
188
    var form = new multiparty.Form();       // 멀티파티폼의 설정
189
    form.maxFields = 100000;
190

    
191
    var contentsName = req.params.name;    // 프로젝트의 이름을 저장해줄 변수
192

    
193
    var saveData = new contentSchema;   // 저장할 데이터를 만든다.
194

    
195
    var isFound = false;
196

    
197
    // 만약 projectName 으로 된 폴더가 있다면.
198
    if(fs.existsSync(localPath+ '/' + contentsName + '/')){
199
        console.log('폴더를 찾았습니다.');
200
        isFound = true;
201
    } else {
202
        console.log('폴더를 찾지 못했습니다.');
203
    }
204

    
205
    if(isFound){
206
        rmdir('uploads/' + contentsName, function(err, dirs, files){
207
            if(err){
208
                console.log(err);
209
            } else{
210
                console.log(' 폴더가 삭제되었습니다. ');
211
                form.parse(req);
212
            }
213
        });
214

    
215

    
216
        // fs.unlink(localPath+ '/' + contentsName + '/' + 'qwe/', (err) =>{
217
        //     if(err) {
218
        //         console.log('err : ' + err.toString());
219
        //         return;
220
        //     }
221
        //     console.log(contentsName + ' 폴더가 삭제되었습니다. ');
222
        //     return;
223
        //     form.parse(req);
224
        // });
225
    }
226

    
227
    // get field name & value
228
    form.on('field',function(name, value){
229
        console.log('normal field / name = '+name+' , value = '+value);
230
        
231
        var parseData =  JSON.parse(value); // value 값을 파싱해준다.
232
        
233
        saveData.name = parseData.name;     
234
        saveData.files = parseData.files;
235
        saveData.lastUpdateDate = Date.now();
236
        saveData.updateFiles = [];
237
        saveData.deleteFiles = [];
238
    });
239

    
240
    // file upload handling
241
    form.on('part',function(part){
242
         var filename;
243
         var size;
244
         if (part.filename) {
245
               filename = part.filename;
246
               size = part.byteCount;
247
         }else{
248
               part.resume();
249
         }
250

    
251
         var filePath = part.name;
252

    
253
         //console.log('filename : ' + filename);
254
         //console.log('filepath : ' + filePath);
255

    
256
         var tmpPath = filePath.substring(0, filePath.length - filename.length);
257
         
258
         //console.log('tmppath : ' + tmpPath);
259

    
260
         var savePath = localPath + '/' + contentsName;
261

    
262
         if(!fs.existsSync(savePath))
263
         {
264
            fs.mkdirSync(savePath);
265
         }
266

    
267
         while(true){
268
            var firstIndex = filePath.indexOf('/');
269
            if( firstIndex == -1 ) break;
270
            
271
            //console.log('firstIndex : ' + firstIndex);
272
           
273
            var tmpString = tmpPath.substring(firstIndex + 1, filePath.length);
274
            
275
            //console.log('tmpString : ' + tmpString);
276

    
277
            var secondIndex = tmpString.indexOf('/');
278
            if(secondIndex == -1) break;
279
            
280
            var resultString = tmpPath.substring(firstIndex, secondIndex + 1);
281

    
282
            //console.log('result : ' + resultString);
283

    
284
            savePath = savePath + resultString;
285

    
286
            if(!fs.existsSync(savePath))
287
            {
288
               fs.mkdirSync(savePath);
289
            }
290

    
291
            tmpPath = tmpPath.substring(secondIndex + 1, tmpPath.length);
292

    
293
            //console.log('aaaaaa : ' + tmpPath);
294
         }
295

    
296

    
297
         //console.log("Write Streaming file :"+filename);
298
         var writeStream = fs.createWriteStream(savePath + '/' + filename);
299
         writeStream.filename = filename;
300
         part.pipe(writeStream);
301

    
302
         part.on('data',function(chunk){
303
               //console.log(filename+' read '+chunk.length + 'bytes');
304
         });
305

    
306

    
307
         part.on('end',function(){
308
               //console.log(filename+' Part read complete');
309
               writeStream.end();
310
         });
311
    });
312

    
313
    // all uploads are completed
314
    form.on('close',function(){
315
        res.status(200).send('Upload complete');
316

    
317
        dbCenter.findContents(collectionName, req.params.name, function(err, result){
318
            if(err==null && result != null){
319
                console.log(result);
320
                ArrayClear(result.updateFiles);
321
                ArrayClear(result.deleteFiles);
322

    
323
                compareFiles(result, saveData); // 파일을 비교해서 업데이트 파일과 딜리트 파일을 찾아준다.
324

    
325
                dbCenter.modifiy(collectionName, result, saveData, function(err, result){
326
                    if(err){
327
                        console.log(err.toString());
328
                    } else {
329
                        if(result != null){
330
                            console.log('[contents] 수정 완료');
331
                            // 콘텐츠 수정 완료 후에는 에이전트에게 업데이트 된걸 비교해서 넣어줘야한다.
332
    
333
                            mySocket.modifyData(contentsName);   // 소켓으로 현재 프로젝트 이름을 가지고 있는 agent 들에게 업데이트 할 것이 있다고 알려준다.
334
                        }
335
                    }
336
                });
337
            }
338
        });
339
    });
340

    
341
    // track progress
342
    form.on('progress',function(byteRead,byteExpected){
343
         //console.log(' Reading total  '+byteRead+'/'+byteExpected);
344
    });
345
});
346

    
347

    
348
// 특정 정보로 조회
349
router.get('/:mac', function(req, res){
350
    console.log('[content] get/:mac'); 
351
});
352

    
353

    
354
// 삭제
355
router.delete('/:mac', function(req, res){
356
    console.log('[content delete/:mac');
357
});
358

    
359
// 파일 비교 모듈
360
var compareFiles = function(orgData, newData){
361
    var orgFiles = orgData.files;
362
    var newFiles = newData.files;
363

    
364
    console.log('orgfiles: ' + orgData);
365
    console.log('newFiles: ' + newFiles);
366

    
367
    // 오리지널 파일들 순환
368
    for(var i = 0; i < orgFiles.length; i++){
369

    
370
        var isDeleteFile = true;   // 지워야 할 파일인지 판별해주는 변수 | 새로운 파일들을 다 순환해도 같은 이름의 파일이 없으면 지워야 할 파일이 된다.
371
        
372
        // 새로운 파일들 순환
373
        for(var q = 0; q < newFiles.length; q++){
374
            if(orgFiles[i].name == newFiles[q].name){
375
                isDeleteFile = false;
376
                if(orgFiles[i].size != newFiles[q].size || orgFiles[i].lastModified != newFiles[q].lastModified){
377
                    newData.updateFiles.push(newFiles[q]);
378
                }
379
            }
380
        }
381

    
382
        if(isDeleteFile){
383
            newData.deleteFiles.push(orgFiles[i]);
384
        }
385
    }
386

    
387
};
388

    
389
var ArrayClear = function(array){
390
    console.log(array);
391
    for( var i = 0; i < array.length; i++){
392
        array.pop();
393
    }
394
}
395
//#endregion
396

    
397
exports.default = router;
398