The Captain's Log - Full CRUD Project
Learning Objectives
- Full CRUD app with a mongo database
Prerequisites
- JavaScript
- Express / Node
- Mongo / Mongoose
Multi-part/Multi-day Lab
Every great captain, whether on the waters or in the skies, keeps a daily log.
Let's build the perfect Captain's Log App for our extraordinary captains.
There are many ways to get started building an app. This lab follows a specific order for two reasons:
- to align with the content of lecture
- to give you an order to guide you to create small bits of functionality and test each one before moving on to the next part
If you finish lab early consider:
- adding some CSS and practice styling your app
- try working with the date object! Try to make it look human readable in HTML. It's tricky! A Hint
- try working through the next section of the lab before it is covered in lecture - see what you can figure out
- SUPER BONUS - Once you finish this whole lab, add a second model for comments, it should have the name of the person who wrote it, and some text for the comment (maybe time stamps?). This model should 'belong' the the post, the data should be related in some way. Do your own research on how to set up a
one-to-many
relationship (one post can have many comments, one comment only belongs to one post), in MongoDB. Use Mongo Documents, Google, or Matt's Notes - note we will not have class time to teach a second, related model.
Set up
Let's keep track of our Restful Routes as we build out our app. Copy/paste this table into a fresh file, open an excel/sheets spreadsheet or draw on a piece of paper. Feel free to add more columns and notes to help you put it all together.
Index, New and Create has been completed for you.
Restful Routes
# | Action | URL | HTTP Verb | EJS view filename | mongoose method |
---|---|---|---|---|---|
1 | Index | /logs/ | GET | index.ejs | Log.find() |
2 | Show | ||||
3 | New | /logs/new | GET | new.ejs | none |
4 | Create | /logs/ | POS T | none | Log.create(req.body) |
5 | Edit | ||||
6 | Update | ||||
7 | Destroy |
- In your
student_labs
folder mkdir captains_log
cd catpains_log
- create a new express app
New
- create a
new
route in yourserver.js
- be sure to follow the Restful convention - just have it
res.send('new')
as the response for now - make a views directory
- install
ejs
touch views/new.ejs
- Create the view, it should contain a form with the following:
form
withaction="/logs"
andmethod="POST"
input
type text for atitle
input
type textarea for anentry
input
type checkbox forshipIsBroken
input
type submit
- change your
res.send
tores.render
this view - don't forget to
git add
andgit commit
your work, give yourself an informative commit message so you can trace back your work, if you need to
Create
- create a
create
route in yourserver.js
- be sure to follow the Restful convention - just have it
res.send('received')
as the response for now - use and configure
body-parser
in yourserver.js
(note, this package was once separate, but has been added back in to express more details - check to make sure it works by changing the
res.send
from a string to sending thereq.body
- it should send the data you inputted to yournew
form - upgrade your data
- change the input of your checkbox to be true/false rather than
on
- now when you check your
res.send(req.body)
you should see true/false rather than 'on/off' - the rest of your data should stay the same - don't forget to
git add
andgit commit
your work, give yourself an informative commit message so you can trace back your work, if you need to
Mongo
- install mongoose and configure it in your
server.js
Logs Model
mkdir models
touch models/logs.js
- Create the logs schema
- title: string
- entry: string
- shipIsBroken: Boolean (bonus: set a default to true)
- Super bonus:
- as a second argument to mongoose.Schema(), add
{ timestamps: true }
- as a second argument to mongoose.Schema(), add
- Super bonus:
Upgrade your Create Route
- upgrade your code to create your log in MongoDB
- have your route redirect to the show page after create
- don't forget to
git add
andgit commit
your work, give yourself an informative commit message so you can trace back your work, if you need to - Stretch: make a seed file and seed it
Index Route
- In
server.js
make an index route, be sure to follow the Restful convention - first, just test it by having it
res.send('index')
- Don't forget to fill out your Restful table!
- create
index.ejs
and change yourres.send
tores.render
this page - upgrade your route and ejs to render all the logs in your database, just make an unordered list of the titles for now
- Add a link to the create page
- don't forget to
git add
andgit commit
your work, give yourself an informative commit message so you can trace back your work, if you need to
Show Route
- Fill out your Restful table
- In
server.js
make a show route, be sure to follow the Restful convention - create a mongo query and
res.send
your data as a string - upgrade your
index.ejs
so that each title links to its show page - Create a
show.ejs
and add HTML
- show the title
- show the entry
- show whether the ship is broken or not
- add a link back to the index page
- bonus:
- if you had added time stamps to your model, display the date the entry was created
- upgrade your
res.send
to ares.render
of yourshow.ejs
- don't forget to
git add
andgit commit
your work, give yourself an informative commit message so you can trace back your work, if you need to
Delete Route
- Fill out your Restful table
- in your
index.ejs
, add a delete form - install and configure
method-override
- upgrade your delete form to have the appropriate action and method
- make your delete route in your
server.js
- make your delete route delete your log and redirect back to your index route
- don't forget to
git add
andgit commit
your work, give yourself an informative commit message so you can trace back your work, if you need to
Edit Route
- Fill out your Restful table
- in your
index.ejs
, add a link to your edit route - create your edit route in your
server.js
- create your
edit.ejs
- test it to make sure it works as expected (be sure to populate your form with your log's data)
- don't forget to
git add
andgit commit
your work, give yourself an informative commit message so you can trace back your work, if you need to
Put Route
- Fill out your Restful table
- upgrade your
edit.ejs
form to have the appropriate action and method - create your PUT route
- First, just have it
res.send
the updated log and check it is as expected - change the
res.send
to ares.redirect
to your index page - don't forget to
git add
andgit commit
your work, give yourself an informative commit message so you can trace back your work, if you need to
Router
mkdir controllers
touch controllers/logs.js
- work on refactoring your code so your logs routes are in your controller file, rather than in
server.js
Bonuses
- The captain wants to keep track of eating habits: make a new set of routes in a new file in your controller folder called foodlogs
- build out the 7 restful routes for foodlogs, include a new model with whatever properties make sense
- make a seed file and seed it
- have your update route redirect to the show page of the log that was edited
- research
res.redirect('back')
- create a seed file and seed your database
- work on your css, make this Captain's Log look awesome!
- if you have timestamps, figure out how to edit/display the edited date
- research ejs partials and implement them