var express = require('express');
var router = express.Router();

// npm i mongodb --save
const db = require('mongodb').MongoClient;

// mongodb://아이디:암호@서버주소:포트번호/db명
const dbUrl = require('../config/db').mongodbURL;  // db.js에 있는거 가져와서 씀

// get(조회), post(추가), put(수정), delete(삭제)

// localhost:3000/board/insert
// req(request)  들어오는 값의 정보 -> req.body
// res(response) 전달하는 값의 정보

router.post('/insert', async function(req, res, next) {
    try {
        console.log("----------------------");
        console.log(req.body);
        // { title: '제목', writer: '홍길동', content: 'aaa' }
        console.log("----------------------");

        // 접속 - DB선택 - 컬렉션 선택 - CRUD(추가, 수정, 삭제, 조회)
        // 1회만 함
        const dbConn = await db.connect(dbUrl);

        //DataBase에 전달된 자료를 1개 추가함

        // 글 번호 자동으로 {가져오기}, {수정하기}
        // _id가 SEQ_BOARD_NO인 것을 가져오고 seq값을 1 증가
        const coll  = dbConn.db("db210").collection("sequence");
        const result = await coll.findOneAndUpdate(
            { _id: 'SEQ_BOARD_NO' }, { $inc: { seq: 1 } }
        );

        // 글 번호
        console.log(result.value.seq);
        

        //2.  테이블 == 컬렉션
        const coll1  = dbConn.db("db210").collection("board");
        const result1 = await coll1.insertOne({
            _id    : Number(result.value.seq), // 글번호(PK)
            title  : req.body.title,           // 전송되는 제목
            content: req.body.content,         // 전송되는 내용
            writer : req.body.writer,          // 전송되는 작성자
            hit    : 1,                        // 조회수
            regdate: new Date()                // 현재시간
        });

        console.log(result1); // -> { acknowledged: true, insertedId: 10 }
        if( result1.insertedId > 0){
            return res.send({status:200});
        }
        return res.send({status:0});
    }

    catch(err) {
        console.error(err);
        return res.send({status:-1}); // 에러가 나면 888을 찍는다
    }
});

// 게시물 상세내용: http://localhost:3000/board/selectone
// req 전송되는 값: GET -> req.query
router.get('/selectone', async function(req, res, next) {
    try{
        const no = Number(req.query.no);
        console.log(no);
        // DB접속 -> DB선택 -> 컬렉션(board) -> 1개 가져오기
        const dbConn = await db.connect(dbUrl);
        const coll  = dbConn.db("db210").collection("board");
        const result = await coll.findOne({ _id: no });
        console.log(result);

        return res.send({status:200, result: result});
    }
    catch(err) {
        console.error(err);
        return res.send({status:-1, result: err}); // 에러가 나면 888을 찍는다
    }
});

// 게시물 목록: http://localhost:3000/board/select
router.get('/select', async function(req, res, next) {
    try{
        // 페이지 정보 전달
        const page = Number(req.query.page);
        // page = 1 -> skip(0), page = 2 -> skip(10) ... 
        // skip( (page - 1) * 10 )

        const dbConn = await db.connect(dbUrl);
        const coll  = dbConn.db("db210").collection("board");

        // 여러개 가져오기 find(), toArray() 변환
        const result = await coll.find({})
            .sort({_id:-1}) // 1: 오름차순, -1: 내림차순
            .skip((page-1)*10)        // 생략할 개수
            .limit(10)      // 10개만
            .toArray(); 
        console.log(result);

        // 페이지네이션에서 사용할 전체 게시물 수
        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}); // 에러가 나면 888을 찍는다
    }
});

// 조회수 증가: http://localhost:3000/board/updatehit
router.put('/updatehit', async function(req, res, next) {
    try{
        const no = Number(req.query.no);

        const dbConn = await db.connect(dbUrl);
        const coll   = dbConn.db("db210").collection("board");

        // 변경하기 updateOne({조건}, {변경할 내용})
        const result = await coll.updateOne(
            {_id: no}, 
            {$inc: {hit :1}}
        );

        console.log(result);
        if(result.modifiedCount === 1) {
            return res.send({status:200});
        }
        return res.send({status:200});
    }
    catch(err) {
        console.error(err);
        return res.send({status:-1, result: err}); // 에러가 나면 888을 찍는다
    }
});

// 게시물 삭제: http://localhost:3000/board/delete
router.delete('/delete', async function(req, res, next) {
    try{
        const no = Number(req.query.no);

        const dbConn = await db.connect(dbUrl);
        const coll   = dbConn.db("db210").collection("board");

        // 변경하기 updateOne({조건}, {변경할 내용})
        const result = await coll.deleteOne(
            {_id: no}, 
            // { $upset: {_id: no}}
        );

        console.log(result);
        if(result.deletedCount === '1') {
            return res.send({status:200});
        }
        return res.send({status:0});
    }
    catch(err) { // 정보가 틀린 경우. 물리적 오류. DB전원. 네트워크.
        console.error(err);
        return res.send({status:-1, result: err}); // 에러가 나면 -1 을 찍는다
    }
});

// 게시물 수정: http://localhost:3000/board/update
router.put('/update', async function(req, res, next) {
    // 제목, 내용만 수정 가능
    try{
        const no = Number(req.body.no);

        const dbConn = await db.connect(dbUrl);
        const coll   = dbConn.db("db210").collection("board");

        const title = req.body.title;
        const content = req.body.content;

        // 변경하기 updateOne({조건}, {변경할 내용})
        const result = await coll.updateOne(
            {_id: no},
            { $set:{title: title, content: content}}
        );
                
        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}); // 에러가 나면 -1을 찍는다
    }
});

// 이전글: http://localhost:3000/board/prevno
router.get('/prevno', async function(req, res, next) {
    try{
        const no = Number(req.query.cno);

        const dbConn = await db.connect(dbUrl);
        const coll   = dbConn.db("db210").collection("board");

        const result = await coll.find(
            { _id: { $lt: no } }, 
            { projection: { _id: 1 } } // 필요한 정보만 가져옴(cmd로)
            // {$lt: } = 미만, {$lte: } = 이하, {$gt: } = 초과, {$gte: } = 이상
        ).sort({_id: -1}).limit(1).toArray();

        console.log(result);
        if(result.length === 1){ // 
            return res.send({ status:200, no:result[0]._id });
        }
        return res.send({ status:200, no:0 });    
    }
    
    catch(err) {
        console.error(err);
        return res.send({status:-1, result: err}); // 에러가 나면 888을 찍는다
    }
});
// 다음글: http://localhost:3000/board/nextno
router.get('/nextno', async function(req, res, next) {
    try{
        const no = Number(req.query.cno);

        const dbConn = await db.connect(dbUrl);
        const coll   = dbConn.db("db210").collection("board");

        const result = await coll.find(
            {_id: {$gt: no}},
            { projection: { _id: 1 } } // 필요한 정보만 가져옴(cmd로)
        ).sort({_id: 1}).limit(1).toArray;

        console.log(result);
        if(result.length === 1){
            return res.send({ status:200, no:result[0]._id });
        }
        return res.send({ status:200, no:0 });    
    }
    
    catch(err) {
        console.error(err);
        return res.send({status:-1, result: err}); // 에러가 나면 888을 찍는다
    }
});
module.exports = router;

0개의 댓글