We are now going to add persistency to this application.
The initial stage of the exercise now uses a database to store the prices of products, instead of a file.
Exercise 0: make it work
Install postgresql. On Mac, assuming that you have installed the "Homebrew" project, do
brew install postgresql
On Ubuntu, do
apt-get install postgresql postgresql-contrib
Then, in any case, create the databases by running
The database schema is defined in the file
src/main/sql/000_create_products.sql. The initial state of the database is in file
src/main/sql/seed.sql. If you open it, you will see that the price of product "A" is set at 111. Run the application, and verify that when we enter code "A" and press the button "Scan", the display should show "Price: 111".
Exercise 1: persist the total
We want to make it possible to persist the state of the checkout on the database. Even if the JVM process is shut down, we should retain the total. For this reason we get rid of the static checkout variable in the servlet. We will use the "repository" pattern, so that the repository will give us a new instance of the SupermarketCheckout at every request, initialized with the state that was saved in the database.
Create a new table to store the total of our checkouts. In preparation for the moment when we will support more checkouts at the same time, you will define two columns: an "id" integer column, and a "total" integer column. You will need to add a new file
src/main/sql/002_create_checkouts.sql. You will also need to update the seed.sql to add a row to this new table. Make it so that there is a checkout with id == 0. Remember to run
Change the SupermarketCheckoutRepository class so that the metdhods findById and save do the right thing.
Test your work by proving that - after scanning a few codes, the total displayed by
http://localhost:8080/totalis correct. - kill the server with control-C. Restart it. The total should stay the same.
Exercise 2: more than one checkout
We want to support more than one checkout at the time. Define at least three checkouts in file seed.sql, with ids 0,1 and 2. Change the controller so that when we open
http://localhost:8080/?checkout_id=1, when we scan codes, the total that is incremented is visible at http://localhost:8080/total?checkout_id=1.
Test that if we scan codes on
http://localhost:8080/?checkout_id=2, we see the appropriate total at
http://localhost:8080/total?checkout_id=2. The total at
http://localhost:8080/total?checkout_id=1 should not change.
Update the "total" and "reset" buttons on the UI so that they all work on the correct checkout, using the parameter checkout_id on the query string.