root / HServer / 00.Server / 00.Program / routers / contents.js @ 89
이력 | 보기 | 이력해설 | 다운로드 (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 |