[BookShop 프로젝트] API 설계, dbdiagram

회원 API 

1. 회원 가입

Method POST
URI /users/join
HTTP status code 성공 201
Request Body {
    email : "사용가자 입력한 이메일",
    password : "사용자가 입력한 비밀번호"
}
Response Body  

 

2. 로그인

Method POST
URI  /users//login
HTTP status code 성공 200
Request Body {
    email : "사용가자 입력한 이메일",
    password : "사용자가 입력한 비밀번호"
}
Response Cookie JWT Token (문자열)

 

3. 비밀번호 초기화 요청

비밀번호를 까먹었을 때 사용, 로그인 전에 사용

Method POST
URI  /reset
HTTP status code 성공 200
Request Body {
    email : "사용자가 입력한 이메일"
}
Response Body {
    email : "이메일 (4번으로 연결)" 
}

 

4. 비밀번호 초기화(=수정) 

Method PUT
URI  /reset
HTTP status code 성공 200
Request Body {
    email : "이전 페이지에서 입력했던 이메일",
    password : "사용자가 입력한 비밀번호"
}
Response Body  

도서 API

1. 전체 도서 조회

//이미지 경로, n개씩 보내줘야함

Method GET
URI  /books?limit={page당 도서 수}&currentPage={현재 page}
HTTP status code 성공 200
Request Body  
Response Body // 전체 도서 목록에서는 도서의 상세 정보를 포합합니다.
// 필요한 데이터만 선별하여 구현 부탁드립니다. 

{
    books : [
         {
             id : 도서 id,
            title : "도서 제목",
            img : 이미지 id(piksum image #id),
            summary : "요약 설명",
            author : "도서 작가",
            price : 가격,
            likes : 좋아요 수,
            pubDate : "출간일"
        },
         {
             id : 도서 id,
            title : "도서 제목",
            img : 이미지 id(piksum image #id),
            summary : "요약 설명",
            author : "도서 작가",
            price : 가격,
            likes : 좋아요 수,
            pubDate : "출간일"
        }
    ],
    pagination : {
         currentPage : 현제 페이지,
         totalCount : 총 도서 수
    }

}

 

 

2. 개별 도서 조회

//이미지 경로 

Method GET
URI  /books/{bookId}
HTTP status code 성공 200
Request Body  
Response Body {
    id : 도서 id,
    title : "도서 제목",
    img : 이미지 id,
    categoryName : "카테고리",
    format : "포맷",
    isbn : "isbn"
    summary : "요약 설명",
    detail : "상세 설명",
    author : "도서 작가",
    pages : 쪽 수,
    contents.  "목차",
    price : 가격,
    likes : 좋아요 수,
    liked : boolean  (로그인 상태에만 보내줌)
    pubDate : "출간일"
}

 

3. 카테고리별 도서 목록 조회

- new : true => 신간 조회 (기준: 출간일 1달 이내)

// 이미지 경로, 8개씩 보내줘야함

// 카테고리 id... 어떻게 알고 보내줄까? 

Method GET
URI  /books?limit={page당 도서 수}&currentPage={현재 page}&categoryId={categoryId}&new={boolean}
HTTP status code 성공 200
Request Body  
Response Body {
    books : [
         {
             id : 도서 id,
            title : "도서 제목",
            img : 이미지 id(piksum image #id),
            summary : "요약 설명",
            author : "도서 작가",
            price : 가격,
            likes : 좋아요 수,
            pubDate : "출간일"
        },
         {
             id : 도서 id,
            title : "도서 제목",
            img : 이미지 id(piksum image #id),
            summary : "요약 설명",
            author : "도서 작가",
            price : 가격,
            likes : 좋아요 수,
            pubDate : "출간일"
        }
    ],
    pagination : {
         currentPage : 현제 페이지,
         totalCount : 총 도서 수
    }

}

 


카테고리 API 

1.  카테고리 전체 조회

Method GET
URI /category
HTTP status code 성공 200
Request Body  
Response Body {
    {
         id : 0,
         name : "동화"
    },
    {
         id : 1,
         name : "소설"
    }
}

 




좋아요 API 

1. 좋아요 추가

Method POST
URI /likes/{bookId}
HTTP status code 성공 200
Request Headers "Authorization" : 로그인할때 받은 JWT Token(문자열)
Request Body // 로그인 할 때 token 전달 > header 'Authorization'
// payload 값을 읽을 수 있음 = 사용자의 id를 읽어낼 수 있음 
Response Body  

 

2. 좋아요 취소 

Method DELETE
URI /likes/{bookId}
HTTP status code 성공 200
Request Headers "Authorization" : 로그인할때 받은 JWT Token(문자열)
Request Body  
Response Body  

장바구니 API 

회원 1명당 - 장바구니 1개씩

1. 장바구니 담기 

Method POST
URI /cart
HTTP status code 성공 201
Request Headers "Authorization" : 로그인할때 받은 JWT Token(문자열)
Request Body
{
    bookId: 도서 id,
    quantity : 수량,
    userId: 회원 id
}
Response Body  

 

2. 내 장바구니 아이템 목록 조회 / 선택한 장바구니 상품 목록 조회 

Method GET
URI /cart
HTTP status code 성공 200
Request Headers "Authorization" : 로그인할때 받은 JWT Token(문자열)
Request Body 1) 내 장바구니 아이템 목록 조회 : Request Body 없음
2) 선택한 장바구니 상품 목록 조회
{
    selected : [cartItemId, cartItemId, ...]
}
Response Body {
    {
        id : 장바구니 도서 id,
        bookId : 도서 id, 
        title: "도서 제목",
        summary : "도서 요약",
        quantity : 수량,
        price : 가격
    },
    {
        id : 장바구니 도서 id,
        bookId : 도서 id, 
        title: "도서 제목",
        summary : "도서 요약",
        quantity : 수량,
        price : 가격
    }
}

 

3. 장바구니 도서 삭제 

Method DELETE
URI /cart/{cartItemId}
HTTP status code 성공 200
Request Body  
Response Body  

 


결제(주문) API 

1. 결제하기 = 주문하기 = 주문등록 = 데이터베이스 주문 insert
= 장바구니에서 주문된 상품은 delete

Method POST
URI /orders
HTTP status code 성공 200 
Request Headers "Authorization" : 로그인할때 받은 JWT Token(문자열)
Request Body
{
    items : [장바구니 도서 id, 장바구니 도서 id ...],
    delivery : { (1) delivery insert
        address : "주소",
        receiver : "이름",
        contact : "010-0000-0000"
    }
    totalQuantity : 총 수량,  (2) orders insert
    totalPrice : 총 금액,
    firstbookTitle : 대표 도서 제목
}
Response Body  

2. 주문 목록(내역) 조회

Method GET
URI /orders
HTTP status code 성공 200 
Request Header "Authorization" : 로그인할때 받은 JWT Token(문자열)
Request Body  
Response Body {
    {
         id : 주문 id
         createdAt : "주문일자"
         address : "주소",
         receiver : "이름",
         contact : "전화번호",
         bookTitle : "대표 책 제목",
         totalQuantity : 총 수량,
         totalPrice : 결제 금액,
    }
}

3. 주문 상세 상품 조회

Method GET
URI /orders/{orderId}
HTTP status code 성공 200 
Request Header "Authorization" : 로그인할 때 받은 JWT Token(문자열)
Request Body  
Response Body {
    {
         bookId : 도서 id,
         bookTtle : "도서 제목",
         author : "작가명",
         price : 가격,
        quantity: 수량, 
    },
   {
         bookId : 도서 id,
         bookTitle : "도서 제목",
         author : "작가명",
         price : 가격,
        quantity : 수량, 
    }
}

ERD

Table users {
  id integer [primary key]
  email varchar
  password varchar
}

Table books {
  id integar [primary key]
  title varchar
  img integer
  category_id integer
  form varchar
  isbn varchar
  summary varchar
  detail text
  author varchar
  pages integar
  contents text
  price integar
  pub_date date
}

Table category {
  category_id integer [primary key]
  category_name varchar
}


Table likes {
  user_id integer
  liked_booked_id integer
}

Table cartItems {
  id integer [primary key]
  user_id integer
  book_id integer
  quantity integer
}

Table orders {
  id integer [primary key]
  book_title varchar
  total_quantity integer
  total_price integer
  created_at timestamp
  user_id integer
  delivery_id integer
}

Table delivery {
  id integar [primary key]
  address varchar
  receiver varchar
  contact varchar
}

Table orderedBook{
  id integer [primary key]
  order_id integer
  book_id integer
  quantity integer
}
Ref: books.category_id > category.category_id
Ref: likes.user_id > users.id
Ref : likes.liked_booked_id > books.id 
Ref : cartItems.book_id > books.id
Ref : cartItems.user_id > users.id

Ref: orders.delivery_id > delivery.id
Ref: orderedBook.order_id > orders.id
Ref: orderedBook.book_id > books.id
Ref: orders.user_id > users.id