Domain Registration
Software Architect and .NET Developer
Overview
Automatically register a domain on DNSimple for the client, register a profile in Office365, add A records and MX records, and add the user to the Office365 subscription.

Goals
Goal: Implement it as a workflow to address potential issues with unexpected or no responses from external resources and retry if necessary. Generally, implement a principle akin to ACID for databases: Atomicity, Consistency, Isolation, Durability

Tasks that I, as a developer and project architect, have faced:
Consistency. All steps follow a specific order, one after another; none of the steps can be completed without successfully completing the previous one. Considering that external services (DNSimple and Office365) may be temporarily unavailable, an efficient waiting mechanism is necessary. Additionally, handling cases where an external service cannot process a specific request for some reason, with possible rollback to a certain phase and notification of responsible personnel, is essential.
Variety of actions. In addition to "standard" API calls to external resources, it is also necessary to work with specific methods (for example, finding a way to add a TXT record to a domain registrar if there is no corresponding API available, and even using an emulator to simulate the use of a graphical web interface in a Virtual Machine).
The complexity of debugging and writing integration tests
Implementation
Technologies:
-
.NET Core
-
Azure SQL
-
Azure Functions
-
Azure Storage Queue
-
Entity Framework Core
-
ASP.NET Core
Since the workflow consists of several dozen steps (with branching possibilities in some cases) that are isolated from each other, the system is built using Queues. Queues guarantee the atomicity of actions, allowing one module to interact with another (or others) using the corresponding Queue. After successfully completing its task, a module reliably retrieves a message from its incoming queue and adds it to the outgoing queue (or queues), which is then listened to by the next module.
The implementation consists of a foundational abstract base class at the top level, providing basic functionality required by all modules (Azure Functions), and several child abstract classes based on the type of request. Concrete classes inherit from these child abstract classes.
Responsibilities
Design Project Architecture: Develop a robust architecture for automating domain registration on DNSimple and user profile management in Office365, ensuring the workflow adheres to principles akin to ACID (Atomicity, Consistency, Isolation, Durability).
Code Development: Produce clean, efficient, and maintainable code that adheres to project specifications, focusing on integration with external services and implementing necessary fallback mechanisms
Workflow Implementation: Implement the automated workflow for domain registration and Office365 profile management, including retry mechanisms and handling potential issues with unexpected or no responses from external resources.
Testing and Debugging: Conduct thorough testing, debugging, and troubleshooting of the code and integration points to ensure reliable functionality and address issues related to external services and system integration.
Integration and Automation: Utilize Azure Functions and Queues to automate the workflow, including adding A records, MX records, and managing Office365 subscriptions. Ensure proper handling of service unavailability and request processing failures.
Handling External Service Variability: Address the variety of actions required, including working with APIs and emulators for graphical interfaces methods (Selenium) to manage domain records and Office365 profiles effectively