In this challenge, you design and create a web API to manage the following resources: Projects
and Actions
.
Read these instructions carefully. Understand exactly what is expected before starting to code.
This is an individual assessment, please work on it alone. It is an opportunity to demonstrate proficiency of the concepts and objectives introduced and practiced in preceding days.
If the instructions are not clear, please seek support from your TL and Instructor on Slack.
The Minimum Viable Product must be completed in three hours.
Follow these steps to set up and work on your project:
- Create a forked copy of this project.
- Add your Team Lead as collaborator on Github.
- Clone your forked version of the Repository.
- Create a new Branch on the clone: git checkout -b
firstName-lastName
. - Implement the project on this Branch, committing changes regularly.
- Push commits: git push origin
firstName-lastName
.
Follow these steps for completing your project.
- Submit a Pull-Request to merge
firstName-lastName
Branch into master on your fork, don't make Pull Requests against Lambda's repository. - Please don't merge your own pull request.
- Add your Team Lead as a Reviewer on the Pull-request
- Your Team Lead will count the challenge as done by merging the branch into master.
Commit your code regularly and use descriptive messages. This helps both you (in case you ever need to return to old code) and your Team Lead.
Demonstrate your understanding of this Sprint's concepts by answering the following free-form questions. Edit this document to include your answers after each question. Make sure to leave a blank line above and below your answer so it is clear and easy to read by your Team Lead.
- Mention two parts of Express that you learned about this week.
Express is a minimal and flexible Node.js web application framework that provides a robust set of features to develop web and mobile applications. Express helps to create restful api’s which was proposed by a phd student in his doctoral thesis.
- Describe Middleware?
We can think of middleware as an array of functions that get executed in the order they are introduced into the server code. I like to think of middleware like less from when we learned it to help organize and manage our applications styling. It allows us to break down our api’s code into smaller more manageable portions allowing for quicker editing if something were to change.
- Describe a Resource?
We can have a single URL per resource so a resource in this case is an endpoint or set of data we want to acquire from the database.
- What can the API return to help clients know if a request was successful?
A 201 status is common to tell the user they have been successful in getting the data they wanted.
- How can we partition our application into sub-applications?
You can use: .use() a router or sub-router, also works on the Express application instance! That means I can create new instances of the Express object, and .use it in another Express object just like a router or other middleware.
- Configure an npm script named "server" that will execute your code using nodemon. Make nodemon be a development time dependency only, it shouldn't be deployed to production.
- Configure an npm script named "start" that will execute your code using node.
Design and build the necessary endpoints to:
- Perform CRUD operations on projects and actions. When adding an action, make sure the
project_id
provided belongs to an existingproject
. If you try to add an action with anid
of 3 and there is no project with thatid
the database will return an error. - [ x] Retrieve the list of actions for a project.
Please read the following sections before implementing the Minimum Viable Product, they describe how the database is structured and the files and methods available for interacting with the data.
The description of the structure and extra information about each resource stored in the included database (./data/lambda.db3
) is listed below.
Field | Data Type | Metadata |
---|---|---|
id | number | no need to provide it when creating projects, the database will generate it |
name | string | required. |
description | string | required. |
completed | boolean | used to indicate if the project has been completed, not required |
Field | Data Type | Metadata |
---|---|---|
id | number | no need to provide it when creating posts, the database will automatically generate it. |
project_id | number | required, must be the id of an existing project. |
description | string | up to 128 characters long, required. |
notes | string | no size limit, required. Used to record additional notes or requirements to complete the action. |
completed | boolean | used to indicate if the action has been completed, not required |
The /data/helpers
folder includes files you can use to manage the persistence of project and action data. These files are projectModel.js
and actionModel.js
. Both files publish the following api, which you can use to store, modify and retrieve each resource:
All these helper methods return a promise. Remember to use .then().catch() or async/await.
get()
: resolves to an array of all the resources contained in the database. If you pass anid
to this method it will return the resource with that id if one is found.insert()
: calling insert passing it a resource object will add it to the database and return the newly created resource.update()
: accepts two arguments, the first is theid
of the resource to update, and the second is an object with thechanges
to apply. It returns the updated resource. If a resource with the providedid
is not found, the method returnsnull
.remove()
: the remove method accepts anid
as it's first parameter and, upon successfully deleting the resource from the database, returns the number of records deleted.
The projectModel.js
helper includes an extra method called getProjectActions()
that takes a project id as it's only argument and returns a list of all the actions for the project.
We have provided test data for all the resources.
- Use
create-react-app
to create an application in a separate folder (outside the API project folder). Name it anything you want. - From the React application show a list of all projects using the API you built.
- Add functionality to show the details of a project, including its actions, when clicking a project name in the list. Use React Router to navigate to a separate route to show the project details.
- Add styling!