# Bookmate
"Bookmate" is a social network for book lovers.
## [Table of contents](#Table-of-contents)
1. [Description](#Description)
2. [Data source](#Data-source)
3. [User Stories](#User-stories)
- [Authentication](#Authentication)
- [Users](#Users)
- [Friends](#Friends)
- [Book List](#Book-List)
- [Reviews](#Reviews)
- [Search](#Search)
- [Book Offer](#Book-Offer)
- [Book Swap](#Book-Swap)
4. [Endpoint API](#API-Endpoint)
- [Authentication APIs](#Authentication-APIs)
- [Users APIs](#Users-APIs)
- [Friends APIs](#Friends-APIs)
- [Books APIs](#Books-APIs)
- [Reviews APIs](#Reviews-APIs)
- [BookOffer APIs](#BookOffer-APIs)
- [BookSwap APIs](#BookSwap-APIs)
## Description
- "Bookmate" is a social network for book lovers.
- User can see the information of a book (title, author, reviews, book cover,...)
- User can search a book to read reviews about the book and write review about the book that user finished reading.
- User can find friends who have the same interest in books and send a friend request to send message or follow friend's list of books.
- User can exchange book with another users.
- Only registered users can search books, write reviews, find friends and exchange books
## Data source
[Kaggle](https://www.kaggle.com/)
## User stories
### Authentication
- As a user, I can register a new account with an unique username, unique email and password.
- As a user, I can register a new account with google account
- Password will be encrypted and protected from being seen.
- When logged in, registered user will be logged in persistently until user decides to logout
- After logged in, registered user can access their own account page and full homepage.
### Users
- As a user, I can see full homepage (include book swap information)
- As a user, I can write reviews for books
- As a user, I can find and send friend request to another users or accept/ reject my pending friend request
- As a user, I can offer books that I want to exchange with another users
- As a user, I can add my favorite books to my wishlist to swap when someone offers
### Friends
- As a user, I can send friend request to another user who is not my friend
- As a user, I can see list of friend requests I have received
- As a user, I can see list of friend requests I have sent
- As a user, I can see list of my friends
- As a user, I can accept or decline a friend request
- As a user, I can cancel a friend request that I sent
- As a user, I can unfriend a user in my friend list
### Book List
- As a user, I can see list of books on homepage.
- Only registered users can see the full list with reviews about books.
### Reviews
- As a user, I can see reviews of a book.
- As a user, I can write, edit or delete my reviews of a book.
### Search
- As a user, I can search book by title, author, ...
### Book Offer
- As a user, I can offer books that I want to exchange with another users
- As a user, I can see the list of books that I offered
- As a user, I can edit my book offer's info (description about book, change receiver, or status of book offer)
- As a user, I can delete my pending book offer that I created
### Book Swap (Book Exchange)
- As a user, I can apply to a book offer to borrow book that I want to read from another user
- As a user, I can see the list of books that I borrow
- As a user, I can delete my pending request for book offer
## Endpoint API
### Authentication APIs
```Javascript
/**
* @route POST /auth/login
* @description login with email and pass
* @body { username, email, password }
* @access public
*/
```
### Users APIs
```Javascript
/**
* @route POST /users
* @description Register new account
* @body { username, email, password }
* @access public
*/
```
```Javascript
/**
* @route GET /users?page=1&limit=10
* @description Get users with pagination
* @access Login required
*/
```
```Javascript
/**
* @route GET /users/me
* @description Get current user info
* @access Login required
*/
```
```Javascript
/**
* @route GET /users/:id
* @description Get a user info
* @access Login required
*/
```
```Javascript
/**
* @route PUT /users/:id
* @description Update a user info
* @body { name, avatarUrl, aboutMe, city, country, wishlist }
* @access Login required
*/
```
### Friends APIs
```Javascript
/**
* @route POST /friends/request
* @description Send a friend request
* @body { to: userId }
* @access Login required
*/
```
```Javascript
/**
* @route GET /friends/request/incoming
* @description Get the list of received pending requests
* @access Login required
*/
```
```Javascript
/**
* @route GET /friends/request/outgoing
* @description Get the list of sent pending requests
* @access Login required
*/
```
```Javascript
/**
* @route GET /friends
* @description Get the list of friends
* @access Login required
*/
```
```Javascript
/**
* @route PUT /friends/requests/:userId
* @description Accepted/Reject a received pending friend request
* @body { status: 'accepted' or 'declined' }
* @access Login required
*/
```
```Javascript
/**
* @route DELETE /friends/requests/:userId
* @description Delete a received pending friend request
* @access Login required
*/
```
```Javascript
/**
* @route DELETE /friends/:userId
* @description Remove a friend
* @access Login required
*/
```
### Book List
```Javascript
/**
* @route GET /books
* @description Get the list of books
* @access public
*/
```
```Javascript
/**
* @route GET /books/:id
* @description Get a single book
* @access public
*/
```
### Reviews APIs
```Javascript
/**
* @route GET /reviews/user/:userId?page=1&limit=10
* @description Get all reviews an user can see with pagination
* @access Login required
*/
```
```Javascript
/**
* @route POST /reviews
* @description Create a new review
* @body { content }
* @access Login required
*/
```
```Javascript
/**
* @route DELETE /reviews/:id
* @description Delete a review
* @access Login required
*/
```
```Javascript
/**
* @route GET /reviews/:id
* @description Get a single review
* @access Login required
*/
```
```Javascript
/**
* @route PUT /reviews/:id
* @description Update a review
* @body { content }
* @access Login required
*/
```
### BookOffer APIs
```Javascript
/**
* @route POST /bookoffer
* @description Create new offer
* @body { condition, points, delivery, status }
* @access Login required
*/
```
```Javascript
/**
* @route GET /bookoffer?page=1&limit=10
* @description Get all books on offer an user can see with pagination
* @access Login required
*/
```
```Javascript
/**
* @route GET /bookoffer/:id
* @description Get a single book on offer
* @access Login required
*/
```
```Javascript
/**
* @route PUT /bookoffer/:id
* @description Update a book offer
* @body { condition, points, delivery, status, receiver }
* @access Login required
*/
```
```Javascript
/**
* @route DELETE /bookoffer/:id
* @description Delete a book offer
* @access Login required
*/
```
### BookSwap APIs
```Javascript
/**
* @route POST /bookswap
* @description Create new book swap (book exchange)
* @body { condition, points, delivery, status }
* @access Login required
*/
```
```Javascript
/**
* @route GET /bookswap/incoming
* @description Get the list of received pending bookswap
* @access Login required
*/
```
```Javascript
/**
* @route GET /bookswap/outgoing
* @description Get the list of sent pending bookswap
* @access Login required
*/
```
```Javascript
/**
* @route GET /bookswap?page=1&limit=10
* @description Get all books swap an user can see with pagination
* @access Login required
*/
```
```Javascript
/**
* @route GET /bookswap/:id
* @description Get a single book swap
* @access Login required
*/
```
```Javascript
/**
* @route PUT /bookswap/:id
* @description Update a book swap
* @body { status }
* @access Login required
*/
```
```Javascript
/**
* @route DELETE /bookswap/:id
* @description Delete a book swap
* @access Login required
*/
```
## License
[HoaiAnh](https://github.com/hoaianh1611)