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 + +``` +(): + + + +