자바스크립트/Node JS

[Node JS] 기본 CRUD

KIMJAVAN 2024. 3. 21. 09:55
728x90
const router = require('express').Router()
const controller = loadModule('basic', 'controller');

router.post('/post', controller.submitPost); //게시글 쓰기
router.get('/postlist', controller.getPosts); // 게시글 목록을 불러오기
router.get('/post/:idx', controller.getPostById); //게시글 상세 불러오기
router.put('/post', controller.updatePost) //게시글 수정하기
router.put('/postdelete', controller.deletePost) //게시글 삭제하기

module.exports = router

routes.js

 

const basicModel = loadModule('basic', 'model')
const basicController = {};
const path = require('path');

// 게시글 쓰기
basicController.submitPost = async (req, res) => {
    try {
        const {writer, title, content} = req.body;

        if (!writer || !title || !content) {
            return res.status(400).json({ error: "글 작성에 필요한 값을 보내주세요." });
        }

        const post = await basicModel.submitPost(writer, title, content);

        if (!post) {
            return res.status(503).json({ error: "post 등록 실패" });
        }

        return res.status(200).json(post);
    } catch (error) {
        console.error("Error adding post:", error);
        return res.status(500).json({ error: "post 추가 실패" });
    }
};
//게시글 목록을 불러오기
basicController.getPosts = async (req, res) => {
    try {
        const posts = await basicModel.getPosts();

        console.log('posts')
        console.log(posts)
        if (posts === null) {
            return res.status(503).json({ message: "게시글 불러오기 도중 오류 발생" });
        }

        return res.status(200).json(posts);
    } catch (error) {
        console.error("Error fetching posts:", error);
        return res.status(500).json({ error: "Failed to fetch posts" });
    }
};

//게시글 상세 불러오기
basicController.getPostById = async (req, res) => {
    try {
        const postIdx = req.params.idx;

        if (!postIdx) {
            return res.status(400).send("조회할 게시글의 idx값이 없습니다.");
        }

        const post = await basicModel.getPostById(postIdx);
        
        if (!post) {
            return res.status(503).send("Post not found");
        } 
        return res.status(200).json(post);
                 
    } catch (error) {
        console.error("Error fetching post:", error);
        return res.status(500).json({ error: "Failed to fetch post" });
    }
};

//게시글 수정하기
basicController.updatePost = async(req, res) => {
    try {
        const postData = req.body;

        //idx가 실존하는지 || 게시글의 status 상태가 Y인지 검증 -------------------
        const postExist = await basicModel.getPostById(postData.idx);

        if(!postExist) {
            return res.status(503).json({ error: "수정할 게시글을 찾을 수 없습니다." })
        }

        // 카테고리 수정 -------------------------------------------------------
        const updatedPost = await basicModel.updatePost(postData);

        if (!updatedPost) {
            return res.status(503).json({ error: "게시글 수정하기 실패" });
        }

        console.log(`${updatedPost.idx}의 정보 수정 성공`)

        return res.status(200).json(updatedPost);
    } catch (error) {
        console.error("Error updating post:", error);
        return res.status(500).json({ error: "Failed to update post" });
    }
};

//게시글 삭제하기
basicController.deletePost = async(req, res) => {
    try {
        const deleteIdxsList = req.body.idxs;

        if (deleteIdxsList.length === 0) {
            return res.status(400).json({error: '삭제할 카테고리 아이템이 없습니다.'});
        }

        // deleteIdsList 배열에 있는 각 faq_id를 사용하여 해당 행의 faq_status를 "취소"로 업데이트합니다.
        for (const idx of deleteIdxsList) {
            const deletedResult = await basicModel.deletePost(idx);

            if(!deletedResult){
                return res.status(503).json({ error: `${idx}번 째 게시글 삭제 실패` });
            }
        }

        return res.status(200).json({ message: '게시글이 성공적으로 삭제되었습니다.' });
    } catch (error) {
        console.error("Error deleting post:", error);
        return res.status(500).json({ error: "Failed to delete post" });
    }
};

// ... 다른 컨트롤러 함수들 ...

module.exports = basicController;

controller.js

 

const basicModel = {};
const db = database();
const currentDateTime = new Date();
currentDateTime.setHours(currentDateTime.getHours() + 9);

// 공지 작성하기(쓰기)v
basicModel.submitPost = async (writer, title, content) => {
    let postId = null;

    await db('wb_basic').insert({
        writer: writer,
        title: title,
        content: content,
        status: 'Y',
        reg_datetime: currentDateTime,
        upd_datetime: currentDateTime
    })
    .then((newId) => {
        postId = newId;
    })
    .catch((e) => {
        console.log(e);
        postId = null;
    });

    return postId;
};
//게시글 목록을 불러오기
basicModel.getPosts = async (page=0) => {
    let postlist = null;

    await db
        .select('*')
        .from('wb_basic')
        .where('status', "Y")
        .then(rows => {
            postlist = (rows.length > 0) ? rows : [];
        })
        .catch((e) => {
            console.log(e);
            postlist = null;
        });

    return postlist;
};

//게시글 상세 불러오기
basicModel.getPostById = async (idx) => {
    let postById = null;

    await db
        .select('*')
        .from('wb_basic')
        .where('idx', idx)
        .andWhere('status','Y')
        .limit(1)
        .then(rows => {
            postById = (rows.length > 0) ? rows[0] : null;
        })
        .catch((e) => {
            console.log(e);
            postById = null;
        });
    return postById;
};

//게시글 수정하기
basicModel.updatePost = async (postData) => {
    await db('wb_basic')
        .where('idx', postData.idx)
        .andWhere('status', 'Y')
        .update({
            writer: postData.writer,
            title: postData.title,
            content: postData.content,
            upd_datetime: currentDateTime
        })
        .catch((e) => {
            console.log(e);
            return null;
        });

    // 업데이트된 내용(id와 title)을 반환합니다.
    return await basicModel.getPostById(postData.idx); // 또는 필요에 따라 업데이트된 내용 반환
}

//게시글 삭제하기
basicModel.deletePost = async (idx) => {
    await db('wb_basic')
        .where('idx', idx)
        .andWhere('status', 'Y')
        .update({
            status: 'N',
            exp_datetime: currentDateTime
        })
        .catch((e) => {
            console.log(e);
            return false;
        });

    return true; // 또는 필요에 따라 업데이트된 내용 반환
}
module.exports = basicModel;

model.js