A Google Books API search engine built with a RESTful API, refactored to be a GraphQL API built with Apollo Server. The app was built using the MERN stack with a React front end, MongoDB database, and Node.js/Express.js server and API. It's already set up to allow users to save book searches to the back end.
Explore the docs »
View Demo
·
Report Bug
·
Request Feature
Table of Contents
- Set up an Apollo Server to use GraphQL queries and mutations to fetch and modify data, replacing the existing RESTful API.
- Modified the existing authentication middleware so that it works in the context of a GraphQL API.
- Created an Apollo Provider so that requests can communicate with an Apollo Server.
- Deployed the application to Heroku with a MongoDB database using MongoDB Atlas.
AS AN avid reader
I WANT to search for new books to read
SO THAT I can keep a list of books to purchase
images.
GIVEN a book search engine
WHEN I load the search engine
THEN I am presented with a menu with the options Search for Books and Login/Signup and an input field to search for books and a submit button
WHEN I click on the Search for Books menu option
THEN I am presented with an input field to search for books and a submit button
WHEN I am not logged in and enter a search term in the input field and click the submit button
THEN I am presented with several search results, each featuring a book’s title, author, description, image, and a link to that book on the Google Books site
WHEN I click on the Login/Signup menu option
THEN a modal appears on the screen with a toggle between the option to log in or sign up
WHEN the toggle is set to Signup
THEN I am presented with three inputs for a username, an email address, and a password, and a signup button
WHEN the toggle is set to Login
THEN I am presented with two inputs for an email address and a password and login button
WHEN I enter a valid email address and create a password and click on the signup button
THEN my user account is created and I am logged in to the site
WHEN I enter my account’s email address and password and click on the login button
THEN I the modal closes and I am logged in to the site
WHEN I am logged in to the site
THEN the menu options change to Search for Books, an option to see my saved books, and Logout
WHEN I am logged in and enter a search term in the input field and click the submit button
THEN I am presented with several search results, each featuring a book’s title, author, description, image, and a link to that book on the Google Books site and a button to save a book to my account
WHEN I click on the Save button on a book
THEN that book’s information is saved to my account
WHEN I click on the option to see my saved books
THEN I am presented with all of the books I have saved to my account, each featuring the book’s title, author, description, image, and a link to that book on the Google Books site and a button to remove a book from my account
WHEN I click on the Remove button on a book
THEN that book is deleted from my saved books list
WHEN I click on the Logout button
THEN I am logged out of the site and presented with a menu with the options Search for Books and Login/Signup and an input field to search for books and a submit button
You’ll need to complete the following tasks in each of these back-end files:
-
auth.js
: Update the auth middleware function to work with the GraphQL API. -
server.js
: Implement the Apollo Server and apply it to the Express server as middleware. -
Schemas
directory:-
index.js
: Export your typeDefs and resolvers. -
resolvers.js
: Define the query and mutation functionality to work with the Mongoose models. -
typeDefs.js
: Define the necessaryQuery
andMutation
types:-
Query
type:me
: Which returns aUser
type.
-
Mutation
type:-
login
: Accepts an email and password as parameters; returns anAuth
type. -
addUser
: Accepts a username, email, and password as parameters; returns anAuth
type. -
saveBook
: Accepts a book author's array, description, title, bookId, image, and link as parameters; returns aUser
type. (Look into creating what's known as aninput
type to handle all of these parameters!) -
removeBook
: Accepts a book'sbookId
as a parameter; returns aUser
type.
-
-
User
type:-
_id
-
username
-
email
-
bookCount
-
savedBooks
(This will be an array of theBook
type.)
-
-
Book
type:-
bookId
(Not the_id
, but the book'sid
value returned from Google's Book API.) -
authors
(An array of strings, as there may be more than one author.) -
description
-
title
-
image
-
link
-
-
Auth
type:-
token
-
user
(References theUser
type.)
-
-
-
You'll need to create the following front-end files:
-
queries.js
: This will hold the queryGET_ME
, which will execute theme
query set up using Apollo Server. -
mutations.js
:-
LOGIN_USER
will execute theloginUser
mutation set up using Apollo Server. -
ADD_USER
will execute theaddUser
mutation. -
SAVE_BOOK
will execute thesaveBook
mutation. -
REMOVE_BOOK
will execute theremoveBook
mutation.
-
Additionally, you’ll need to complete the following tasks in each of these front-end files:
-
App.js
: Create an Apollo Provider to make every request work with the Apollo Server. -
SearchBooks.js
:-
Use the Apollo
useMutation()
Hook to execute theSAVE_BOOK
mutation in thehandleSaveBook()
function instead of thesaveBook()
function imported from theAPI
file. -
Make sure you keep the logic for saving the book's ID to state in the
try...catch
block!
-
-
SavedBooks.js
:-
Remove the
useEffect()
Hook that sets the state forUserData
. -
Instead, use the
useQuery()
Hook to execute theGET_ME
query on load and save it to a variable nameduserData
. -
Use the
useMutation()
Hook to execute theREMOVE_BOOK
mutation in thehandleDeleteBook()
function instead of thedeleteBook()
function that's imported fromAPI
file. (Make sure you keep theremoveBookId()
function in place!)
-
-
SignupForm.js
: Replace theaddUser()
functionality imported from theAPI
file with theADD_USER
mutation functionality. -
LoginForm.js
: Replace theloginUser()
functionality imported from theAPI
file with theLOGIN_USER
mutation functionality.
- Run deployed app at: https://book-search-engine-hy.herokuapp.com/
- Clone the repo
git clone git@github.com:heranYang93/book-search-engin.git
- Install NPM packages
npm i
- run
npm run develop
Install all necessary dependencies by executing:
npm i
"apollo-server-express": "^3.6.7",
"bcrypt": "^4.0.1",
"dotenv": "^16.0.0",
"express": "^4.17.1",
"graphql": "^16.4.0",
"jsonwebtoken": "^8.5.1",
"mongoose": "^5.9.10"
"@apollo/client": "^3.5.10",
"@testing-library/jest-dom": "^4.2.4",
"@testing-library/react": "^9.3.2",
"@testing-library/user-event": "^7.1.2",
"bootstrap": "^4.4.1",
"graphql": "^16.4.0",
"jwt-decode": "^2.2.0",
"react": "^16.13.1",
"react-bootstrap": "^1.0.1",
"react-dom": "^16.13.1",
"react-router-dom": "^6.2.1",
"react-scripts": "^4.0.2"
If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star! Thanks again!
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature
) - Commit your Changes (
git commit -m 'Add some AmazingFeature'
) - Push to the Branch (
git push origin feature/AmazingFeature
) - Open a Pull Request
Project | URL |
---|---|
book search engine | https://book-search-engine-hy.herokuapp.com/ |
Distributed under the MIT License. See LICENSE.txt
for more information.
Project Link: github.com/heranYang93/book-search-engine