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