Exercise 1: Implement an audit record. Make sure it has these features:
- a timestamp of when the record was created
- a user-id to tell us who created the record
- a reason why in the form of human readable text
- immutable, including transitively reachable subobjects
- Malformed records cannot be created. Automatically set the timestamp so it cannot be forged.
Now we have to keep them somewhere safe, and get them back on occasion.
Exercise 2a: Make a repository with some sort of stable storage for a backing store, like a file.
Exercise 2b: When creating an audit record, log it to stable storage. Make the repository be a required argument for creation of an audit record. Log the record in the repository, but don't store info about the repository itself in the record. The record doesn't have to know where it lives.
Exercise 2c: Have a way to load all the audit records back in from stable storage. Intern the audit records so re-loading is idempotent and eq-ness is preserved.
Exercise 3: Implement random access to a repository's audit log (indexed by integer)
These are all very easy. Don't worry, I'll make it harder.