참고 - https://velog.io/@glowing0512_/express-Router-파일분리 - https://velog.io/@unknown9732/Express.js-에서-Route-parameter-Query-string-받기 - https://oneshottenkill.tistory.com/319 - https://ko.javascript.info/promise-api#:~:text=Promise.all(promises) –,의 결과는 무시됩니다. - https://stackoverflow.com/questions/36547292/use-promise-to-process-mysql-return-value-in-node-js - https://taptorestart.tistory.com/entry/Nodejs-mysql-모듈-query-LIKE-사용시-에러 - https://stackoverflow.com/questions/21084354/select-query-into-list-on-one-column
- DB 예약어인 like를 테이블 이름으로 사용해서 작동이 안되던 이슈가 있었음.
[서버 TODO]
- jwt를 모든 통신마다 생성해서 보내가지고, 무결성 검증하기
사용자
1. 회원가입(POST /user/register)
request
{ nickname: String, // 이름 email: String, // 이메일 password: String, // 비밀번호 }
response
{ success: Boolean }
2 로그인(POST /user/login)
request
{ email: String, // 이메일 password: String, // 비밀번호 }
response
{ loginSuccess: Boolean, user: { id: Number, // 사용자 id nickname: String, // 사용자 이름 email: String, // 사용자 이메일 profileImage: String, // 사용자 프로필 사진 token: String // 사용자 token }, follow: [String], // 팔로잉하고 있는 사용자 id alarm: [ // 사용자가 받은 알람 { sender: String, // 알람을 보낸 사용자의 이름 post: String, // 관련된 post id (nullable) commentId: String, // 관련된 comment id (nullable) image: String, // 관련된 post image (nullable) content: String // 관련된 내용(좋아요인 경우 post 제목, 댓글인 경우 댓글 내용) } ] }
3. 인증(GET /user/auth)
request
response
{ isAdmin: Boolean, user: { id: Number, // 사용자 id nickname: String, // 사용자 이름 email: String, // 사용자 이메일 profileImage: String, // 사용자 프로필 사진 } }
4. 로그아웃(GET /user/logout)
request
response
{ success: true, }
5. 모든 사용자(GET /user/all)
request
response
{ success: Boolean, users: [ { id: Number, // 사용자 id nickname: String, // 사용자 이름 email: String, // 사용자 이메일 profileImage: String, // 사용자 프로필 사진 } ] }
6. 특정 사용자(GET /user/:id)
request
response
{ success: true, user: { nickname: String, // 사용자 이름 email: String, // 사용자 이메일 profileImage: String, // 사용자 프로필 사진 coverImage: String, // 사용자 커버 사진 postNum: Number, // 사용자 게시글 개수 following: Number, // 사용자가 팔로우하고 있는 사용자 수 follower: Number // 사용자를 팔로우하고 있는 사용자 수 } }
게시글
1. 특정 게시글(POST /post/:id)
request
response
{ success: true, post: { userId: Number, // 작성한 사용자 id title: String, // 게시글 제목 image: String, // 게시글 커버 사진 createdAt: String, // 게시글 생성 날짜(YYYY.MM.dd) plan: [ // 게시글 일정 { id: Number, // 일정 id title: String, // 일정 제목 content: String, // 일정 내용 image: String // 일정 이미지 } ] }, comments: [ // 게시글의 댓글 { userId: Number, // 댓글을 작성한 사용자 id profileImage: String, // 댓글을 작성한 사용자의 프로필 이미지 content: String, // 댓글 내용 createdAt: String // 댓글 생성날짜 } ], likes: [Number], // 게시글을 좋아하는 사용자 id 리스트 }
2. 게시글 생성(POST /post/create)
request
{ title: String, // 게시글 제목 image: String, // 게시글 커버 이미지 plans: [ { title: String, // 일정 제목 content: String, // 일정 내용 image: String // 일정 이미지 } ] }
response
{ success: true, postId: Number // 생성된 post id }
3. 특정 사용자의 게시글(POST /post/user)
request
{ userId: Number, // 게시글을 보고 싶은 사용자의 id offset: Number, // 게시글 offset limit: Number // 한번에 가져갈 게시글 개수 }
response
{ success: true, posts: [ { id: Number, // 게시글 id title: String, // 게시글 제목 image: String, // 게시글 이미지 createdAt: String, // 게시글 생성 날짜 author: String, // 게시글 작성자 이름 profile: String, // 게시글 작성자 프로필 사진 comments: Number, // 댓글 개수 likes: String, // 좋아요한 사용자의 id가 ,를 구분자 *수정 필요 } ] }
4. 게시글 검색 결과(POST /post/posts)
request
{ keyword: String, // 검색 키워드 offset: Number, // 게시글 offset limit: Number // 한번에 가져갈 게시글 개수 }
response
{ success: true, posts: [ { id: Number, // 게시글 id title: String, // 게시글 제목 image: String, // 게시글 이미지 createdAt: String, // 게시글 생성 날짜 author: String, // 게시글 작성자 이름 profile: String, // 게시글 작성자 프로필 사진 comments: Number, // 댓글 개수 likes: String, // 좋아요한 사용자의 id가 ,를 구분자 *수정 필요 } ] }
5. 게시글 삭제(DELETE /post/:id)
request
response
{ success: Boolean }
6. 게시글 수정(POST /post/modify)
request
{ id: String, // 게시글 id post: { title: String, // 게시글 제목 image: String, // 게시글 이미지 }, modifiedPlans: [ // 변경된 plan 정보 { // 변경된 plan id: Number, title: String, content: String, image: String }, { // 새로 추가된 Plan title: String, // 일정 제목 content: String, // 일정 내용 image: String // 일정 이미지 } ], deletedPlans: [Number] // 삭제할 일정의 id }
response
{ success: Boolean, postId: Number, // 변경한 게시글 id }
좋아요
1. 좋아요 생성(POST /like/create)
request
{ postId: Number // 좋아요할 게시글 id }
response
{ success: Boolean, }
2. 좋아요 제거(DELETE /like/:id)
request
{ postId: Number // 좋아요 취소할 게시글 id }
response
{ success: Boolean, }
구독
1. 구독 생성(POST /follow/create)
request
{ followId: Number // 구독할 사용자 id }
response
{ success: Boolean, }
2. 구독 제거(DELETE /follow/delete)
request
{ followId: Number // 구독 취소할 사용자 id }
response
{ success: Boolean, }
댓글
1. 댓글 작성(POST /comment/create)
request
{ postId: Number, // 댓글을 남길 게시글 id content: String // 댓글 }
response
{ success: Boolean, }
2. 댓글 삭제(DELETE /comment/:id)
request
{ commentId: Number // 삭제할 댓글 id }
response
{ success: Boolean, }
3. 댓글 수정(PUT /comment/:id)
request
{ content: String // 변경한 댓글 }
response
{ success: Boolean, }
알림
1. 알림 생성(POST /alarm/create)
request
{ receiver: Number, // 받는 사람 id type: Number, // 알림 타입(0: 구독, 1: 좋아요. 2: 댓글) postId: Number, // 관련된 post id (nullable) commentId: Number, // 관련된 댓글 id (nullable) }
response
{ success: Boolean, }
2. 알림 읽음 처리(PUT /alarm/read)
reques
response
{ success: Boolean, }
메인화면
1. 인기글, 최신글(GET /main)
reques
response
{ popular: [ { id: Number, title: String, image: String, createdAt: String, author: String, profile: String, comments: Number, likesNum: Number, likes: String } ], latest: [ { id: Number, title: String, image: String, createdAt: String, author: String, profile: String, comments: Number, likesNum: Number, likes: String } ] }