westagram을 만들 건데
백엔드는 기능만 만드는 것.
[백엔드가 넣을 기능들]
Express를 이용한 API 서버 만들기
- Express초기 환경세팅 (이미 했고)
- 회원가입/로그인 (이미했고)
회원가입
회원가입, 로그인 전체 코드
만약 아래 예시로 코딩 안 되면, 참고 (코딩 실행 된 사례 )
게시물 Crud 가 회원가입 로그인과 같다
회원가입 유저 생성 = 게시글 생성 (app.post) insert into --> 새로운 row 추가 [INSERT INTO]
로그인 유저 불러오는 거 = 게시글 리스트 읽는 거 read (app.get)--> 데이터 조회 [SELECT FROM}
게시글 update = 유저 정보 update ( 명령어는 같고, 데이터베이스 이름과 키 값만 달라짐) [UPDATE SET]
게시글 delete = 유저 삭제와 같다 [DELETE FROM]
프론트에게 통신, 연결할 때 배우는 거
1) url
2) body의 req 를 보낼 때
rest api의 path, query parameter는
url로 프론트에게 주려고 할 때 --> product/1 이런 식으로 보내줘야
<장바구니>
결제 후 삭제도 해야 하고
<결제>
쿠키개념을 모르기에, 결제 수단을 안 하고,
예시 [1]
app.post( "/createPosting", async (req,res)=>{
try{
//1. 유저 정보를 프론트에게 받는다
const newPostData= req.body;
// console.log(newPostData);
const title = newPostData.title;
const content = newPostData.content;
const user_id = newPostData.user_id;
//2. 데이터베이스로 정보 저장
const userData = await myDataSource.query(
`INSERT INTO posts (title, content, user_id)
VALUES ("${title}", "${content}", "${user_id}");`
);
return res.status(201).json({ message: "postCreated" });
} catch (err) {console.log(err);}
};
// 찍어내면, {"title":"'복습 중이다'", "content":"갈길이 머네.", "user_id": 6}
[예시2]
const createPost = async (req, res) => {
try {
const body = req.body;
const { user_id, post_image_url } = body;
// key 안 줬을때
const isInputNotExist = !user_id || !post_image_url;
throwError(isInputNotExist, 400, "KEY_ERROR");
// 데이터 저장
const columnsQueryText = createColumnsQueryText(body);
const valuesQueryText = createValuesQueryText(body);
await appDataSource.query(
`INSERT INTO posts (${columnsQueryText})
VALUES ('${valuesQueryText}')`
);
return res.status(201).json({ message: "postCreated" });
} catch (error) {
console.log(error);
if (error.errno === 1452) {
return res.status(400).json({ message: "INVALID_USER_ID" });
}
if (error.errno === 1054) {
return res.status(400).json({ message: "KEY_ERROR" });
}
return res.status(error.status).json({ message: error.message });
}
};
- 게시글을 불러오는거 (전체 게시글 조회)
혼자 해보기;
예시1.
const showPosts = async (req, res) => {
try {
const postsData = await myDataSource.query(
"SELECT posts.user_id, users.profile_image AS userProfileImage, posts.id AS postingId, posts.content AS postingContent FROM posts JOIN users ON posts.user_id = users.id;"
);
console.log(postsData);
return res.status(200).json({ Data: postsData });
} catch (err) {console.log(err);
}
};
예시2.
const getPosts = async (req, res) => {
try {
const result = await appDataSource.query(
`SELECT
posts.user_id AS userId,
users.profile_image AS userProfileImage,
posts.id AS postingId,
posts.post_image_url AS postingImageURL,
posts.content AS postingContent
FROM posts
JOIN users ON posts.user_id = users.id`
);
return res.status(200).json({ data: result });
} catch (error) {console.log(error);
return res.status(error.status).json({ message: error.message });
}
};
- 게시글 불러오기 (유저의 게시글 조회)
혼자 해보기;
예시1.
const searchPostsByUserId = async (req, res) => {
try {
const userId = req.params.user_id;
// console.log("유저아이디가 뭡니까?" + userId);
const userPosts = await myDataSource.query(
`SELECT * FROM posts WHERE posts.user_id = ${userId}`
);
return res.status(200).json({ Data: { userPosts } });
} catch (err) {
console.log(err);
}
};
예시 2.
const getUserPosts = async (req, res) => {
try {
const userId = req.params.user_id;
throwError(!userId, 400, "KEY_ERROR");
const user = await appDataSource.query(
`SELECT
users.id AS userId,
users.profile_image AS userProfileImage
FROM users
WHERE users.id = ${userId};`
);
const result = user[0];
const userNotFound = !result;
throwError(userNotFound, 404, "USER_NOT_FOUND");
//+ 유저의 post여야 하니까
const posts = await appDataSource.query(
`SELECT
posts.id AS postingId,
posts.post_image_url AS postingImageURL,
posts.content AS postingContent
FROM posts
WHERE posts.user_id = ${userId};`
);
result["postings"] = posts;
return res.status(200).json({ data: result });
} catch (error) {
console.log(error);
return res.status(error.status).json({ message: error.message });
}
};
- 게시글 수정
혼자 해보기;
예시1.
const updatePost = async (req, res) => {
try {
const postId = req.params.post_id;
const content_string = req.body.content;
console.log(postId);
console.log();
console.log(content_string);
const updatePost = await myDataSource.query(
`UPDATE posts SET content = ${content_string} WHERE posts.id = ${postId}`
);
console.log(postId);
return res.status(200).json({ updatePost });
} catch (err) {
console.log(err);
}
};
예시2.
const updatePost = async (req, res) => {
try {
const post_id = req.params.post_id;
const body = req.body;
const oldPost = await appDataSource.query(
`SELECT *
FROM posts
WHERE posts.id = ${post_id};`
);
throwError(oldPost[0].user_id !== body.user_id, 401, "UNAUTHORIZED");
await appDataSource.query(
`UPDATE posts
SET content = '${body.content}',
post_image_url = '${body.post_image_url}'
WHERE posts.id = ${post_id};`
);
// 사용자 id, 이름, 포스트 이미지, 내용 select로 가져와서/ 유저의 post에 join / 근데 해당 post를 수정하니-> post.id 조건
const result = await appDataSource.query(
`SELECT
users.id AS userId,
users.name AS userName,
posts.id AS postingId,
posts.post_image_url AS postingImageURL,
posts.content AS postingContent
FROM users
JOIN posts ON posts.user_id = users.id
WHERE posts.id = ${post_id};`
);
return res.status(200).json({ data: result });
} catch (error) {
console.log(error);
return res.status(error.status).json({ message: error.message });
}
};
- 게시글 삭제
혼자 해보기;
원하는 하나의 게시글을 삭제하려면,
- 데이터베이스에 저장된, 해당 게시글을 가져오기 (post_id 일치하는)
예시1.
const delPosts = async (req, res) => {
try {
const postId = req.params.post_id;
const deletePost = await myDataSource.query(
`DELETE FROM posts WHERE id = ${postId}`
);
return res.status(204).json({ message: "postingDeleted" });
} catch (err) {
console.log(err);
}
};
예시2.
const deletePost = async (req, res) => {
try {
const postId = req.params.post_id;
throwError(!postId, 400, "KEY_ERROR");
//해당 post의 id인 모든 걸 다 가져와라
const existingPost = await appDataSource.query(`
SELECT * FROM posts WHERE id = ${postId};
`);
throwError(existingPost.length === 0, 400, "POST_NOT_FOUND");
//좋아요 삭제
await appDataSource.query(
`DELETE FROM likes
WHERE post_id = ${postId}`
);
// 댓글 삭제
await appDataSource.query(
`DELETE FROM comments
WHERE post_id = ${postId}`
);
이 분은 왜 이렇게 각각 삭제했을까?
// posts 삭제
await appDataSource.query(
`DELETE FROM posts
WHERE posts.id = ${postId};`
);
return res.status(200).json({ message: "postingDeleted" });
} catch (error) {
console.log(error);
}
};
- 다른 사람 게시글 좋아요 눌러보기 (좋아요 누르기)
혼자 해보기;
예시1.
const likePost = async (req, res) => {
try {
const userId = req.params.user_id;
console.log(userId);
const postId = req.body.postId;
console.log(postId);
const likePost = await myDataSource.query(
`INSERT INTO likes (user_id, post_id) VALUES ("${userId}", "${postId}")`
);
return res.status(204).json({ message: "likeCreated" });
} catch (err) {
console.log(err);
}
};
예시 2.
const createLike = async (req, res) => {
try {
const postId = req.body.post_id;
const userId = req.body.user_id;
const duplicateLike = await appDataSource.query(
`SELECT * FROM likes
WHERE user_id = ${userId} AND post_id = ${postId};`
);
throwError(duplicateLike.length > 0, 400, "DUPLICATE_LIKES_REQUESTED");
await appDataSource.query(
`INSERT INTO likes
(user_id, post_id)
VALUES
('${userId}', '${postId}');`
);
return res.status(200).json({ message: "likeCreated" });
} catch (error) {
console.log(error);
return res.status(error.status).json({ message: error.message });
}
};
좋아요 삭제
혼자해보기;
예시2.
const deleteLike = async (req, res) => {
try {
const postId = req.body.post_id;
const userId = req.body.user_id;
const duplicateLike = await appDataSource.query(
`SELECT * FROM likes
WHERE user_id = ${userId} AND post_id = ${postId};`
);
throwError(duplicateLike.length === 0, 400, "LIKES_NOT_FOUND");
await appDataSource.query(
`DELETE FROM likes
WHERE likes.id = ${duplicateLike[0].id};`
);
return res.status(200).json({ message: "likeDeleted" });
} catch (error) {
console.log(error);
return res.status(error.status).json({ message: error.message });
}
};
project 통해서 채워나갈 부분.
'Wecode -Foundation 2 (부트캠프) > 회원가입, 로그인 API' 카테고리의 다른 글
Foundation 2.5 - [정규식] 특수기호 포함, . @ 등, 비밀번호/ 이메일 조건 (error handling) (0) | 2023.09.10 |
---|---|
Foundation 2- Http, Js, Node.js, Server, endpoint(api) 호출까지 (0) | 2023.09.10 |