Commit Graph

10 Commits

Author SHA1 Message Date
benjamin 449a4a7d75 Add unit and integration tests
I won't be lying, Claude Code was extremely helpful to write those
tests, although it had a lot of issues with properly using in-memory
SQLite (db and integration tests) and with parsing responses
(integration test).
2026-02-01 06:00:12 +01:00
benjamin b78b8cca41 Refactor: split into multiple files
Given the size of the assignment, having everything in the same file was
OK. However, splitting into different files is a good option for better
maintainance once this API grows, and now is a good time to do it before
it gets more complicated.
2026-02-01 03:06:00 +01:00
benjamin 1f62fe6f66 Add API documentation using OpenAPI and SwaggerUI 2026-02-01 02:32:39 +01:00
benjamin 3ca0514b7a Add missing docstrings / comments 2026-01-31 13:43:00 +01:00
benjamin 3f561ab70e Create a config map
For now, the config contains:
- database "credentials" (safe to commit, it's just the name of the
  sqlite file)
- port on which the HTTP server will listen
2026-01-31 13:43:00 +01:00
benjamin 78948fd017 Add GET /item/:id endpoint
This new endpoint was so easy to add, it would have been a shame not to
do it. Besides, it makes sense since the reponse from `POST /items`
provided a `Location` header for the newly created item.
2026-01-31 13:43:00 +01:00
benjamin eded366570 Persist items to the database
The database that was chosen here is SQLite, because it's dead simple to
setup and more than enough for this project.

Please note that I took some liberty with the assignment. I chose to use
a numeric field for the `id` column of an item. This leverages automatic
creation and incrementation of the id by SQLite itself.
2026-01-31 13:42:57 +01:00
benjamin da6f8b4519 Add input validation
Input validation uses Malli coercion. Sadly enough, email is validated
with a regexp.
2026-01-31 13:39:34 +01:00
benjamin b9ae9a8b56 Check 'POST /items' payload is application/json
This commit adds a middleware function that checks any POST endpoint is
called with Content-Type: application/json. Returns `HTTP 415
Unsupported Media Type` if this is not the case.

TODO: this commit does not check that the payload is actually
well-formed JSON. If the payload is *not* valid JSON, muutaja will fail,
which will result in an `HTTP 500 Server error`.
2026-01-31 13:37:20 +01:00
benjamin c278633c66 Initial commit
This initial version is purposely extremily limited:
* `GET /ahoy` endpoint, just to check the server is alive
* `GET /items` endpoint, always returns the same item
* `POST items` endpoint, checks and print request payload, no
  persistance
* calling any other route defaults to a 404
2026-01-31 13:37:16 +01:00