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;

0개의 댓글