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;