# Game Business Unit ## Code * Project structure and Scaffolding using [`Phoenix`](https://phoenixframework.org/) * Use a domain driven approach ([contexts](https://hexdocs.pm/phoenix/contexts.html), [[example](https://hexdocs.pm/phoenix/Mix.Tasks.Phx.Gen.Context.html)]) instead of a layered approach (handlers/models) * Restrict communication to just between entities of the same level (IE in the same folder) * Cross Context use cases could probably go in the root domain file (inside lib) * When the domain entities are tightly related and share use cases they will probably share a context. * Context should not limit DB relations and being related through the DB doesn't mean both entities share a context. * When the use cases inside a Context are complex, define sub-context or split them when applicable * Separate the Wrappers/interfaces for external resources from the Domain (maybe directly in a lib subfolder or in a shared library) * [`OpenApiSpex`](https://github.com/open-api-spex/open_api_spex) for Api documentation and schema specification * Normalised responses ("utility attributes for data") * Automatic IO Test based on Open API * If possible Mocks and Clients generated also based on Open API. * Should Mocks, Clients and Schemas live in the same service repo and been added to the ones that depends on it. * Reduce dependency between services (API Orchestration/Composition) ## Secrets management * Careful with `fortex_nodule` and Google Secrets, we had and keep having build conflicts and a hard time with tests when integrating nodule. Would be best to avoid remote credentials, if possible. ## Tests * [`Patch`](https://hexdocs.pm/patch/readme.html) for modules mocking * (pending) Choose library for http: `MockMe` (can't run async tests), other? ## CI * Can we port the following github workflows steps into Harness? * Formatter and credo check * Static code analysis with Dialyzer * Unit tests * Smoke tests * Harness builds ## Dev experience (developer tools) * Keep Makefile with dev tasks * code formatting * credo checks * static code check with dialyzer * tests * db setup/reset * deps setup/reset * Run services with tilt for integration tests * This would be shared between teams assigned to different services in the GBU services "cluster". ## Observability * Datadog * Sentry