diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000..dd7e59b
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,14 @@
+# Environment variables for EventualRepairShop
+# Copy this file to .env and update with your values
+# NEVER commit .env to version control
+
+# SQL Server
+SQL_SA_PASSWORD=!MyStrongPassword
+
+# RabbitMQ
+RABBITMQ_USER=guest
+RABBITMQ_PASSWORD=guest
+RABBITMQ_VHOST=repairshop
+
+# Note: These are development defaults.
+# For production, use strong passwords and proper secrets management.
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..e3c7b11
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,70 @@
+name: CI
+
+on:
+ push:
+ branches: [ main, develop ]
+ pull_request:
+ branches: [ main, develop ]
+
+env:
+ DOTNET_VERSION: '7.0.x'
+
+jobs:
+ build-and-test:
+ name: Build and Test
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: ${{ env.DOTNET_VERSION }}
+
+ - name: Restore dependencies
+ run: dotnet restore
+
+ - name: Build solution
+ run: dotnet build --no-restore --configuration Release
+
+ - name: Run tests
+ run: dotnet test --no-build --configuration Release --verbosity normal --logger trx --results-directory "TestResults"
+ continue-on-error: true
+
+ - name: Upload test results
+ uses: actions/upload-artifact@v4
+ if: always()
+ with:
+ name: test-results
+ path: TestResults
+
+ code-quality:
+ name: Code Quality Analysis
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: ${{ env.DOTNET_VERSION }}
+
+ - name: Restore dependencies
+ run: dotnet restore
+
+ - name: Build solution
+ run: dotnet build --no-restore --configuration Release /p:TreatWarningsAsErrors=false
+
+ - name: Check for build warnings
+ run: |
+ echo "Checking for critical build warnings..."
+ dotnet build --no-restore --configuration Release 2>&1 | tee build.log
+ if grep -q "error" build.log; then
+ echo "Build errors found!"
+ exit 1
+ fi
+ echo "Build completed successfully"
diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml
new file mode 100644
index 0000000..acba81e
--- /dev/null
+++ b/.github/workflows/docker.yml
@@ -0,0 +1,56 @@
+name: Docker Build
+
+on:
+ push:
+ branches: [ main ]
+ tags:
+ - 'v*'
+ pull_request:
+ branches: [ main ]
+
+env:
+ REGISTRY: ghcr.io
+
+jobs:
+ build-images:
+ name: Build Docker Images
+ runs-on: ubuntu-latest
+ strategy:
+ fail-fast: false
+ matrix:
+ service:
+ - name: scheduling-worker
+ dockerfile: src/Services/Scheduling/WorkerService/Dockerfile
+ - name: warehouse-worker
+ dockerfile: src/Services/Warehouse/WorkerService/Dockerfile
+ - name: customer-worker
+ dockerfile: src/Services/Customer/WorkerService/Dockerfile
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
+
+ - name: Generate image tag
+ id: image_tag
+ run: |
+ REPO_LOWER=$(echo "${{ github.repository }}" | tr '[:upper:]' '[:lower:]')
+ echo "tag=${{ env.REGISTRY }}/${REPO_LOWER}/${{ matrix.service.name }}:latest" >> $GITHUB_OUTPUT
+
+ - name: Build Docker image
+ uses: docker/build-push-action@v5
+ with:
+ context: .
+ file: ${{ matrix.service.dockerfile }}
+ push: false
+ tags: ${{ steps.image_tag.outputs.tag }}
+ cache-from: type=gha
+ cache-to: type=gha,mode=max
+
+ - name: Test image
+ run: |
+ docker images
+ echo "Image built successfully: ${{ matrix.service.name }}"
+ echo "Tagged as: ${{ steps.image_tag.outputs.tag }}"
diff --git a/.gitignore b/.gitignore
index f6b9403..03efa97 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,9 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
+# Environment variables
+.env
+
# User-specific files
*.suo
*.user
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..61a91d6
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,129 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+We as members, contributors, and leaders pledge to make participation in our
+community a harassment-free experience for everyone, regardless of age, body
+size, visible or invisible disability, ethnicity, sex characteristics, gender
+identity and expression, level of experience, education, socio-economic status,
+nationality, personal appearance, race, religion, or sexual identity
+and orientation.
+
+We pledge to act and interact in ways that contribute to an open, welcoming,
+diverse, inclusive, and healthy community.
+
+## Our Standards
+
+Examples of behavior that contributes to a positive environment for our
+community include:
+
+* Demonstrating empathy and kindness toward other people
+* Being respectful of differing opinions, viewpoints, and experiences
+* Giving and gracefully accepting constructive feedback
+* Accepting responsibility and apologizing to those affected by our mistakes,
+ and learning from the experience
+* Focusing on what is best not just for us as individuals, but for the
+ overall community
+
+Examples of unacceptable behavior include:
+
+* The use of sexualized language or imagery, and sexual attention or
+ advances of any kind
+* Trolling, insulting or derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or email
+ address, without their explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Enforcement Responsibilities
+
+Community leaders are responsible for clarifying and enforcing our standards of
+acceptable behavior and will take appropriate and fair corrective action in
+response to any behavior that they deem inappropriate, threatening, offensive,
+or harmful.
+
+Community leaders have the right and responsibility to remove, edit, or reject
+comments, commits, code, wiki edits, issues, and other contributions that are
+not aligned to this Code of Conduct, and will communicate reasons for moderation
+decisions when appropriate.
+
+## Scope
+
+This Code of Conduct applies within all community spaces, and also applies when
+an individual is officially representing the community in public spaces.
+Examples of representing our community include using an official e-mail address,
+posting via an official social media account, or acting as an appointed
+representative at an online or offline event.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported to the community leaders responsible for enforcement via GitHub issues
+or by contacting the project maintainers directly.
+
+All complaints will be reviewed and investigated promptly and fairly.
+
+All community leaders are obligated to respect the privacy and security of the
+reporter of any incident.
+
+## Enforcement Guidelines
+
+Community leaders will follow these Community Impact Guidelines in determining
+the consequences for any action they deem in violation of this Code of Conduct:
+
+### 1. Correction
+
+**Community Impact**: Use of inappropriate language or other behavior deemed
+unprofessional or unwelcome in the community.
+
+**Consequence**: A private, written warning from community leaders, providing
+clarity around the nature of the violation and an explanation of why the
+behavior was inappropriate. A public apology may be requested.
+
+### 2. Warning
+
+**Community Impact**: A violation through a single incident or series
+of actions.
+
+**Consequence**: A warning with consequences for continued behavior. No
+interaction with the people involved, including unsolicited interaction with
+those enforcing the Code of Conduct, for a specified period of time. This
+includes avoiding interactions in community spaces as well as external channels
+like social media. Violating these terms may lead to a temporary or
+permanent ban.
+
+### 3. Temporary Ban
+
+**Community Impact**: A serious violation of community standards, including
+sustained inappropriate behavior.
+
+**Consequence**: A temporary ban from any sort of interaction or public
+communication with the community for a specified period of time. No public or
+private interaction with the people involved, including unsolicited interaction
+with those enforcing the Code of Conduct, is allowed during this period.
+Violating these terms may lead to a permanent ban.
+
+### 4. Permanent Ban
+
+**Community Impact**: Demonstrating a pattern of violation of community
+standards, including sustained inappropriate behavior, harassment of an
+individual, or aggression toward or disparagement of classes of individuals.
+
+**Consequence**: A permanent ban from any sort of public interaction within
+the community.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage],
+version 2.0, available at
+https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
+
+Community Impact Guidelines were inspired by [Mozilla's code of conduct
+enforcement ladder](https://github.com/mozilla/diversity).
+
+[homepage]: https://www.contributor-covenant.org
+
+For answers to common questions about this code of conduct, see the FAQ at
+https://www.contributor-covenant.org/faq. Translations are available at
+https://www.contributor-covenant.org/translations.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..76d6358
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,267 @@
+# Contributing to EventualRepairShop
+
+First off, thank you for considering contributing to EventualRepairShop! It's people like you that make this project better.
+
+## Table of Contents
+
+- [Code of Conduct](#code-of-conduct)
+- [How Can I Contribute?](#how-can-i-contribute)
+- [Development Setup](#development-setup)
+- [Coding Standards](#coding-standards)
+- [Commit Guidelines](#commit-guidelines)
+- [Pull Request Process](#pull-request-process)
+- [Project Structure](#project-structure)
+
+## Code of Conduct
+
+This project and everyone participating in it is governed by our [Code of Conduct](CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. Please report unacceptable behavior to the project maintainers.
+
+## How Can I Contribute?
+
+### Reporting Bugs
+
+Before creating bug reports, please check the existing issues to avoid duplicates. When you create a bug report, include as many details as possible:
+
+- **Use a clear and descriptive title**
+- **Describe the exact steps to reproduce the problem**
+- **Provide specific examples** to demonstrate the steps
+- **Describe the behavior you observed** and what you expected
+- **Include screenshots** if relevant
+- **Provide your environment details** (.NET version, OS, etc.)
+
+### Suggesting Enhancements
+
+Enhancement suggestions are tracked as GitHub issues. When creating an enhancement suggestion:
+
+- **Use a clear and descriptive title**
+- **Provide a detailed description** of the suggested enhancement
+- **Explain why this enhancement would be useful**
+- **List any similar features** in other projects if applicable
+
+### Your First Code Contribution
+
+Unsure where to begin? Look for issues labeled:
+
+- `good first issue` - Simple issues perfect for newcomers
+- `help wanted` - Issues where we need community help
+- `documentation` - Documentation improvements
+
+### Pull Requests
+
+1. Fork the repository and create your branch from `main`
+2. Follow the development setup instructions
+3. Make your changes following our coding standards
+4. Add or update tests as appropriate
+5. Ensure all tests pass
+6. Update documentation as needed
+7. Submit your pull request
+
+## Development Setup
+
+### Prerequisites
+
+- .NET 7.0 SDK or later
+- Docker Desktop
+- Git
+- Your preferred IDE (Visual Studio, Rider, or VS Code)
+
+### Setup Steps
+
+```bash
+# Clone your fork
+git clone https://github.com/YOUR-USERNAME/EventualRepairShop.git
+cd EventualRepairShop
+
+# Add upstream remote
+git remote add upstream https://github.com/rudironsoni/EventualRepairShop.git
+
+# Start infrastructure
+docker-compose -f docker-compose.Development.Infrastructure.yaml up -d
+
+# Restore packages
+dotnet restore
+
+# Build solution
+dotnet build
+
+# Run tests (when available)
+dotnet test
+```
+
+## Coding Standards
+
+### C# Guidelines
+
+- Follow [Microsoft's C# Coding Conventions](https://docs.microsoft.com/en-us/dotnet/csharp/fundamentals/coding-style/coding-conventions)
+- Use meaningful variable and method names
+- Keep methods focused and small
+- Write XML documentation for public APIs
+- Use nullable reference types appropriately
+- Prefer explicit types over `var` when type is not obvious
+
+### Architecture Guidelines
+
+- **Domain Layer**: Pure domain logic, no infrastructure dependencies
+- **Application Layer**: Use cases and business workflows
+- **Infrastructure Layer**: External concerns (databases, message bus)
+- **DDD Principles**: Maintain aggregate boundaries and domain events
+- **Event Sourcing**: Store all domain events in event store
+- **CQRS**: Separate command and query responsibilities
+
+### Code Example
+
+```csharp
+namespace RepairOrder.Domain.Aggregates;
+
+///
+/// Represents a repair order aggregate root.
+///
+public sealed class RepairOrder : AggregateRoot
+{
+ private RepairOrder() { } // For EF Core
+
+ ///
+ /// Places a new repair order.
+ ///
+ /// The customer information.
+ /// The device to be repaired.
+ /// Repair description.
+ /// A new repair order instance.
+ public static RepairOrder Place(
+ Customer customer,
+ Device device,
+ string description)
+ {
+ ArgumentNullException.ThrowIfNull(customer);
+ ArgumentNullException.ThrowIfNull(device);
+ ArgumentException.ThrowIfNullOrEmpty(description);
+
+ var repairOrder = new RepairOrder();
+ // Implementation...
+ return repairOrder;
+ }
+}
+```
+
+## Commit Guidelines
+
+We follow [Conventional Commits](https://www.conventionalcommits.org/) specification:
+
+### Format
+
+```
+():
+
+
+
+