For example, in api.yml, a GET of /status is mapped to spiffworkflow_backend.routes.health_controller.status, where status is a function in health_controller.py.
Controllers can use services (preferred) and models (allowed) to do their work, but they can never use another controller.
### Services
Services are where most of the business logic lives.
- We have a general notion that services should not call other services (or at least it must be calls in a single direction. If you call serviceB with serviceA, then serviceB cannot call serviceA)
- Avoid json.dumps when you are creating JSON. Use jsonify (a Flask thing) instead.
- Avoid Marshmallow when possible and instead use @dataclass on your model.
- If you need to represent your object in a very custom way (the default dataclass columns are not working out), write a method called serialized on your model (this is used by the default serializer).
All exception classes should be defined in 1) one file, if there are not too many, or 2) files that contain only other exception class definitions, again to avoid circular imports.