var express = require('express');
var router = express.Router();
// npm i mongodb --save
const db = require('mongodb').MongoClient;
// config/db.js 파일의 내용 가져오기
const DBURL = require('../config/db').mongodbURL; // db.js에 있는거 가져와서 씀
const DBNAME = require('../config/db').mongodbDB;
// npm i multer --save
const multer = require('multer');
// 메모리에 보관(데이터베이스에 보관)
const upload = multer({ storage:multer.memoryStorage() });
// 물품등록: http://localhost:3000/item/insert
// 이미지1, 물품코드(X), 물품명, 물품내용, 물품가격, 재고수량, 등록일
router.post('/insert' , upload.single("file"), async function(req, res, next) {
try{
console.log(req);
const dbConn = await db.connect(DBURL);
//DataBase에 전달된 자료를 1개 추가함
// 글 번호 자동으로 {가져오기}, {수정하기}
// _id가 SEQ_ITEM_NO인 것을 가져오고 seq값을 1 증가
const coll = dbConn.db(DBNAME).collection("sequence");
const result = await coll.findOneAndUpdate(
{ _id: 'SEQ_ITEM_NO' }, { $inc: { seq: 1 } }
);
// console.log(reusult.value.seq);
const obj = {
_id: result.value.seq, // 물품번호
name: req.body.name, // 물품명
content: req.body.content, // 물품내용
price: req.body.price, // 가격
quantity: req.body.quantity, // 수량
filename: req.file.originalname, // 파일명
filetype: req.file.mimetype,
filedata: req.file.buffer,
filesize: req.file.size,
regdate: new Date()
}
const coll1 = dbConn.db(DBNAME).collection("item");
const result1 = await coll1.insertOne(obj);
if( result1.insertedId > 0){
return res.send({status:200});
}
return res.send({status:0});
}
catch(err) {
console.error(err);
return res.send({status:-1, result: err}); // 에러가 나면 -1을 찍는다
}
});
// 이미지(1개): http://localhost:3000/item/image?no=2
router.get('/image' , async function(req, res, next) {
try {
const no = Number(req.query.no);
const dbConn = await db.connect(DBURL);
const coll = dbConn.db(DBNAME).collection("item");
const result = await coll.findOne(
{ _id: no },
{ projection: { filedata:1, filetype:1 } }
);
console.log(result);
res.contentType(result.filetype); // json -> image/jpeg
return res.send(result.filedata.buffer);
}
catch(err) {
console.error(err);
return res.send({status:-1, result: err}); // 에러가 나면 -1을 찍는다
}
});
// 물품목록: http://localhost:3000/item/select
router.get('/select' , async function(req, res, next) {
try{
// 페이지 정보 전달
const page = Number(req.query.page);
const dbConn = await db.connect(DBURL);
const coll = dbConn.db(DBNAME).collection("item");
// 여러개 가져오기 find(), toArray() 변환
// 물품코드, 물품명, 가격, 수량, 등록일
const result = await coll.find(
{ },
{ projection: {_id:1, name:1, price:1, quantity:1, regdate:1 } }
)
.sort({_id:-1}) // 1: 오름차순, -1: 내림차순
.skip((page-1)*10) // 생략할 개수
.limit(10) // 10개만
.toArray();
// 페이지네이션에서 사용할 전체 게시물 수
const total = await coll.countDocuments({});
return res.send({status:200, result: result, total:total});
}
catch(err) {
console.error(err);
return res.send({status:-1, result: err});
}
});
// 물품1개조회(이미지포함): http://localhost:3000/item/selectone?code=10001
router.get('/selectone', async function(req, res, next) {
try {
const code = Number(req.query.code);
const dbConn = await db.connect(DBURL);
const coll = dbConn.db(DBNAME).collection("item");
const result = await coll.findOne(
{ _id: code }, // 조건
{ projection: { filename: 0, filedata: 0, filesize: 0, filetype: 0 } } // 필요한 항목만
);
console.log(result);
// 이미지 URL 정보 포함
result['image'] = '/item/image?no=' + code +
'&dt=' + new Date().getTime(); // 이미지 수정 바뀌게 하기 위한 트릭(현재날짜 추가)
return res.send({ status: 200, result: result });
}
catch(err) {
console.error(err);
return res.send({ status:-1, result: err });
}
});
// 물품삭제: http://localhost:3000/item/delete?code=10027
router.delete('/delete', async function(req, res, next) {
try {
const code = Number(req.query.code);
const dbConn = await db.connect(DBURL);
const coll = dbConn.db(DBNAME).collection("item");
const result = await coll.deleteOne({ _id: code });
if(result.deletedCount === 1) {
return res.send({status:200});
}
return res.send({status:0});
}
catch(err) {
console.error(err);
return res.send({ status:-1, result: err });
}
});
// 물품수정: http://localhost:3000/item/update?code=10027
// query와 body 혼용. code는 params로, file과 관련된 것은 Body-file로
router.put('/update', upload.single("file"), async function(req, res, next) {
try {
const code = Number(req.query.code);
console.log(code);
// 사진을 첨부했을때는 파일정보가 뜸, 첨부 안했을 때는 undefined 뜸
// 그래서 사진 첨부 여부를 if문 undefined로 구분
// 물품명, 물품내용, 물품가격, 재고수량, 이미지
// const = 상수. 변경될 수 없음, let, var = 변수. 변화 가능
let obj = { // 이미지를 첨부하지 않을 경우 변경할 항목
name: req.body.name,
content: req.body.content,
price: req.body.price,
quantity: req.body.quantity
}
if(typeof req.file !== 'undefined') { // 첨부했을 때
obj['filename'] = req.file.originalname,
obj.filetype = req.file.mimetype,
obj.filedata = req.file.buffer,
obj.filesize = req.file.size
}
const dbConn = await db.connect(DBURL);
const coll = dbConn.db(DBNAME).collection("item");
const result = await coll.updateOne(
{_id : code },
{ $set: obj }
);
console.log(result);
if(result.modifiedCount === 1) {
return res.send({status:200});
}
return res.send({status:0});
}
catch(err) {
console.error(err);
return res.send({ status:-1, result: err });
}
});
// 물품일괄등록: http://localhost:3000/item/insertbatch?
router.post('/insertbatch', upload.array("file"), async function(req, res, next) {
// 복수니까 single이 아니라 array
try {
const dbConn = await db.connect(DBURL);
const coll = dbConn.db(DBNAME).collection("sequence");
const count = req.body.name.length;
let arr = []; // [ {obj}, {obj} ... ]
for( let i=0; i < count; i++ ) {
const result = await coll.findOneAndUpdate(
{ _id: 'SEQ_ITEM_NO' }, { $inc: { seq: 1 } }
);
let obj = {
_id : result.value.seq,
name : req.body.name[i],
content : req.body.content[i],
price : req.body.price[i],
quantity: req.body.quantity[i],
filename: req.files[i].originalname,
filetype: req.files[i].mimetype,
filedata: req.files[i].buffer,
filesize: req.files[i].size,
regdate : new Date(),
}
arr.push(obj); // array에 obj를 넣음
};
const coll1 = dbConn.db(DBNAME).collection("item");
const result1 = await coll1.insertMany(arr); // [ {}, {} ]
console.log(result1);
if( result1.insertedCount === count ) {
return res.send({ status: 200 });
}
console.log(req);
console.log(req.files);
// file => 1개일 때. 이미지를 넣었을 때 2개일 때는 file은 files로 들어온다.
// 이미지를 넣지 않으면 들어오긴 들어오지만 []로 비어 들어온다
console.log(req.body); // 물품명, 내용, 가격, 수량. 배열로 들어온다
return res.send({ status: 0 });
}
catch(err) {
console.error(err);
return res.send({ status: -1, result: err })
}
});
// 물품일괄삭제: http://localhost:3000/item/deletebatch?
router.delete('/deletebatch', upload.array("file"), async function(req, res, next) {
try {
// console.log(req.body); => [ { code: 10040 }, { code: 10041 }, { code: 10042 } ] <- 이렇게 오는데, 이게
// { _id: { $in: [1, 2, 3] } 이렇게 와야함
// 한 개를 주더라도 배열 방식으로 줘야함. 안그러면 오류
// req.body => {code: [10040, 10041, 10042] }
console.log(req.body);
let arr = [];
for(let i=0; i < req.body.length; i++) { // 0 1 2}
arr.push(req.body[i].code);
}
const dbConn = await db.connect(DBURL);
const coll = dbConn.db(DBNAME).collection("item");
const result = await coll.deleteMany(
{ _id: { $in: arr }
});
console.log(result);
if(result.deletedCount === req.body.length) {
return res.send({ status: 200 });
}
return res.send({ status: 0 });
}
catch(err) {
console.error(err);
return res.send({ status: -1, result: err })
}
});
// 물품일괄수정: http://localhost:3000/item/updatebatch
router.put('/updatebatch', upload.array("file"), async function(req, res, next) {
try {
const count = req.body.name.length;
const dbConn = await db.connect(DBURL);
const coll = dbConn.db(DBNAME).collection("item");
let cnt = 0; // 변경 후의 라인의 숫자 누적
for(let i=0; i < count; i++) { // 0 1
let obj = {
name : req.body.name[i],
content : req.body.content[i],
price : req.body.price[i],
quantity: req.body.quantity[i],
};
// req.files => [{ }, { }]
if(typeof req.files[i] !== 'undefined') {
obj['filename'] = req.files[i].originalname;
obj['filetype'] = req.files[i].mimetype;
obj['filedata'] = req.files[i].buffer;
obj['filesize'] = req.files[i].size;
}
const result = await coll.updateOne(
{ _id : Number(req.body.code[i]) },
{ $set: obj }
)
console.log(result);
cnt += result.modifiedCount; // cnt에 누적
}
if(cnt === count) {
return res.send({ status: 200 });
}
return res.send({ status: 0 });
}
catch(err) {
console.error(err);
return res.send({status:-1, result: err}); // 에러가 나면 -1을 찍는다
}
});
// 체크항목 조회: http://localhost:3000/item/selectcheck
// {"chks":[10037, 10038, 10039]} => req.body.chks[0]
// [{"chks": 10037}, {"chks": 10038}, {"chks": 10039}] => req.body[0].chks
router.post('/selectcheck', async function(req, res, next) {
try {
const chks = req.body.chks; // [10037, 10038, 10039]
console.log(chks);
const dbConn = await db.connect(DBURL);
const coll = dbConn.db(DBNAME).collection("item");
// find({ 조건 }). find({ _id: 10037 }) = find{ _id: $eq{ 10039 } }<- 37번만 가져와라.
// find({ $or: [{ _id: 10037}, { _id: 10038 }]}) <- 37 or 38
// find({ $and: [{ _id: 10037 }, { name: 'aaa' }] }) <- 10037이고 aaa인것만 가져와라
// find({ _id: { $ne: 10039 } }) << 39번만 제외하고
// find({ _id: { $in: [10037, 10038, 10039] } }) <- IN
const result = await coll.find(
{ _id: { $in: chks } },
{ projection: { filedata: 0, filename: 0, filesize: 0, filetype: 0 } })
.sort({ _id: -1 }).toArray();
// for(let i = 0; i < result.length; i++) {
// result[i]['image'] = '/item/image?no=' + result[i]._id; // 번호가 필요한 반복문.
// }
for(let tmp of result) {
tmp['image'] = '/item/image?no=' + tmp._id; // 이미지가 없어서 이미지 코드를 넣음. 번호가 필요 없는 반복
}
console.log(result); // key가 7개인 object로 변경
return res.send({ status: 200, result: result });
}
catch {
console.log(err);
return res.send({ status: -1, result: err});
}
});
module.exports = router;