This is a case study project for the system library, summing up practices that have emerged in the Clojure landscape.
It demonstrates the following:
- How dependency injection works with the component library.
- How Ring handlers are being closed over to expose dependencies such as the database.
- How the Duct-style abstractions clearly and cleanly delineate endpoints, middleware and handler.
- How components are extended to provide application-level functionality.
Names are important. What names? Those behind our favorite movies, that’s who! So let’s save them via a web service.
In our development environment, we use a in-memory database and a web server listening on port 3025.
$ boot dev
Or, if you don’t intend to connect with a REPL to the running system, type simply:
$ boot dev-run
In our production environment, we use a persistent database and a web server listening on port 8008.
$ boot prod-run
To search for a movie’s director:
curl -H "Content-Type: application/edn" -X POST -d '{:movie "Realm of the Senses"}' http://localhost:3025/movie
{:director ("Nagisa Ōshima")}
To add a director to our database:
curl -H "Content-Type: application/edn" -X PUT -d '{:director "Nagisa Ōshima"}' http://localhost:3025/director
To list directors in our database:
curl http://localhost:3025/directors
("Nagisa Ōshima")
Let’s look for another all-time favorite.
curl -H "Content-Type: application/edn" -X POST -d '{:movie "Professione: reporter"}' http://localhost:3025/movie
{:director ("Michelangelo Antonioni")}
Now that we know the name of the director, we can persist it to our database.
curl -H "Content-Type: application/edn" -X PUT -d '{:director "Michelangelo Antonioni"}' http://localhost:3025/director
Let’s verify it’s there:
curl http://localhost:3025/directors
("Nagisa Ōshima" "Michelangelo Antonioni")
Let’s repeat this one more time for a third movie/director:
curl -H "Content-Type: application/edn" -X POST -d '{:movie " À bout de souffle"}' http://localhost:3025/movie
{:director ("Jean-Luc Godard")}
Saving to database:
curl -H "Content-Type: application/edn" -X PUT -d '{:director "Jean-Luc Godard"}' http://localhost:3025/director
We should now have three directors in our database:
curl http://localhost:3025/directors
("Nagisa Ōshima" "Michelangelo Antonioni" "Jean-Luc Godard")
Let’s suppose we want to remove one.
curl -H "Content-Type: application/edn" -X DELETE -d '{:director "Nagisa Ōshima"}' http://localhost:3025/director
Let’s verify the removal was properly executed.
curl http://localhost:3025/directors
("Michelangelo Antonioni" "Jean-Luc Godard")
Distributed under the Eclipse Public License, the same as Clojure.