controller

밥이·2022년 4월 28일
0

CRUD project

목록 보기
3/4

auth-controller

const { User } = require("../models/User");
const bcrypt = require("bcrypt"); // 해싱 라이브러리

// 회원가입
const addUser = async (req, res) => {
  try {
    const salt = await bcrypt.genSalt(10);

    // ↓ 해시된 암호 생성  2번쨰 인자로 salt전달
    const hashedPassword = await bcrypt.hash(req.body.password, salt);

    // User모델에 있는것들 가져오기
    const newUser = new User({
      username: req.body.username,
      email: req.body.email,
      password: hashedPassword,
    });

    const user = await newUser.save();
    res.status(200).json(user);
  } catch (err) {
    res.status(500).json(err);
  }
};

// 로그인
const findUser = async (req, res) => {
  try {
    // username 틀리면 에러 보내기
    const user = await User.findOne({ username: req.body.username });
    !user && res.status(400).json("ID를 찾을 수 없습니다.");

    // password 틀리면 에러 보내기
    const validate = await bcrypt.compare(req.body.password, user.password);
    !validate && res.status(400).json("비밀번호를 찾을 수 없습니다.");

    // 반환할때 사용자에게 비밀번호 제외하고 보여주기 위해 설정
    const { password, ...others } = user._doc;

    // ID, PW 맞으면 반환
    res.status(200).json(others);
  } catch (err) {
    res.status(500).json(err);
  }
};

exports.addUser = addUser;
exports.findUser = findUser;

user-controller

const { User } = require("../models/User");
const { Post } = require("../models/Post");

const bcrypt = require("bcrypt"); // 해싱 라이브러리

// 계정 업데이트
const userUpdate = async (req, res) => {
  // userId랑 params.id가 같으면 실행
  if (req.body.userId === req.params.id) {
    if (req.body.password) {
      const salt = await bcrypt.genSalt(10);
      req.body.password = await bcrypt.hash(req.body.password, salt);
    }
    try {
      const updatedUser = await User.findByIdAndUpdate(
        req.params.id,
        {
          $set: req.body,
        },
        { new: true } // 업데이트된 사용자 내용을 보냄
      );

      res.status(200).json(updatedUser);
    } catch (err) {
      res.status(500).json(err);
    }
  } else {
    res.status(401).json("계정을 업데이트할 수 없습니다.");
  }
};

// 계정 삭제

const userDelete = async (req, res) => {
  // userId랑 params.id가 같으면 실행
  if (req.body.userId === req.params.id) {
    try {
      // ↓ User모델에서 사용자를 찾아야 삭제할 수 있음
      const user = await User.findById(req.params.id);
      try {
        // db내부의 Post에서 username이 같은지 확인
        await Post.deleteMany({ username: user.username });

        // db내부의 User에서 id가 같은지 확인
        await User.findByIdAndDelete(req.params.id);

        res.status(200).json("계정이 삭제되었습니다.");
      } catch (err) {
        res.status(500).json(err);
      }
    } catch (err) {
      // 사용자를 못찾으면 삭제 불가
      res.status(404).json("사용자를 찾을수 없습니다.");
    }
  } else {
    res.status(401).json("계정을 삭제할 수 없습니다.");
  }
};

// 사용자 가져오기 (GET USER)
const getUser = async (req, res) => {
  try {
    const user = await User.findById(req.params.id);

    // ↓사용자 가져오면서 비밀번호는 볼 수 없게 설정
    const { password, ...others } = user._doc;
    res.status(200).json(others);
  } catch (err) {
    res.status(500).json(err);
  }
};

exports.userUpdate = userUpdate;
exports.userDelete = userDelete;
exports.getUser = getUser;

posts-controller

const { User } = require("../models/User");
const { Post } = require("../models/Post");

// CREATE POST (게시물 작성)
const createPost = async (req, res) => {
  const newPost = new Post(req.body);
  try {
    const savedPost = await newPost.save();
    res.status(200).json(savedPost);
  } catch (err) {
    res.status(500).json(err);
  }
};

// UPDATE POST (게시물 업데이트)

const updatePost = async (req, res) => {
  try {
    const post = await Post.findById(req.params.id);
    // 유효성 검사
    // 올린 게시글 username과 사용자 username이 같으면
    if (post.username === req.body.username) {
      try {
        const updatedPost = await Post.findByIdAndUpdate(
          req.params.id,
          {
            $set: req.body,
          },
          { new: true }
        );
        res.status(200).json(updatedPost);
      } catch (err) {
        res.status(500).json(err);
      }
    } else {
      res.status(401).json("내 게시물만 업데이트할 수 있습니다.");
    }
  } catch (err) {
    res.status(500).json(err);
  }
};

// DELETE POST (게시물 삭제)

// const deletePost = async (req, res) => {};

// GET POST (게시물 가져오기)

// const getPost = async (req, res) => {};

exports.createPost = createPost;
exports.updatePost = updatePost;
// exports.deletePost = deletePost;
// exports.getPost = getPost;

0개의 댓글