Thank you for applying for an engineering position at Sun Finance.
The goal of this task is to test tactical and strategic Domain-Driven Design [1] skills of the candidate in close to real word (small) project.
You will build the event driven Verification system with public and private facing RESTish API [2] in Domain-Driven design manner.
Tooling:
- use the programming language of your choice e.g. Java, Kotlin, PHP;
- use the framework of your choice e.g. Spring Boot, Ktor, Symfony;
- use the storage of your choice e.g. PostgreSQL, MySQL, MongoDB, SQLite;
- use the message broker of your choice e.g. RabbitMQ, Kafka, NATS;
- use Docker.
Result evaluation:
- we expect to checkout your code from Git;
- running
docker-compose upshould start the project with schema and fixtures loaded; - we should be able to access containers from local machine in order to evaluate the result;
- add README with your notes and setup instruction if required.
Hints:
- take your time, learn what you don't know;
- follow supplied references if you want to expand on some topic;
- if you have any questions don't hesitate to contact us (contact person will be provided to you);
- don't try to be perfect.
Additional services you will use:
- https://github.com/mailhog/MailHog - for Email verifications
- https://gotify.net - for SMS verifications
The project will include three aggregates [3]: Template, Notification and Verification itself.
Think of it as 3 different services. However, you may share common interfaces, value objects or infrastructure code.
This part of the system acts like Open Host Service [4]. Template specification.
Upstream public facing part of the system. Verification specification.
Downstream consumer part of the system. Notification specification.
It is completely fine to stop right away, when above specification is implemented.
However, if you're feeling advantageous below are additional points to make your work perfect:
- implement unit tests for application [5] and domain services;
- implement outbox pattern [6];
- configure API Gateway [7] e.g. Kong or KrakenD.
- https://martinfowler.com/bliki/DomainDrivenDesign.html
- Stick to Level 2 maturity model
- https://martinfowler.com/bliki/DDD_Aggregate.html
- http://ddd.fed.wiki.org/view/open-host-service
- https://martinfowler.com/eaaCatalog/serviceLayer.html
- https://microservices.io/patterns/data/transactional-outbox.html
- https://microservices.io/patterns/apigateway.html