Skip to content

refactor: rename Catalogs to ServiceCatalogs - Phase 1a (Domain + Inf…#19

Merged
frigini merged 4 commits intomasterfrom
rename-servicecatalogs-phase1a
Nov 19, 2025
Merged

refactor: rename Catalogs to ServiceCatalogs - Phase 1a (Domain + Inf…#19
frigini merged 4 commits intomasterfrom
rename-servicecatalogs-phase1a

Conversation

@frigini
Copy link
Owner

@frigini frigini commented Nov 19, 2025

…rastructure)

  • Renamed Domain layer: entities, value objects, repositories, events
  • Renamed Infrastructure layer: DbContext, migrations, repositories
  • Updated namespaces to MeAjudaAi.Modules.ServiceCatalogs
  • Updated solution file to reference new paths
  • Updated Shared validation constants

Files: 32 (Domain + Infrastructure layers)
Phase: 1a of 3
Next: Phase 1b will add Application + API layers

Summary by CodeRabbit

  • New Features

    • Introduced Service Catalog module with support for managing service categories and individual services
    • Added lifecycle management: services and categories can be created, updated, activated, or deactivated
    • Implemented service ordering and categorization capabilities
  • Chores

    • Reorganized module structure from "Catalogs" to "ServiceCatalogs"
    • Established foundational database schema and data persistence layer

…rastructure)

- Renamed Domain layer: entities, value objects, repositories, events
- Renamed Infrastructure layer: DbContext, migrations, repositories
- Updated namespaces to MeAjudaAi.Modules.ServiceCatalogs
- Updated solution file to reference new paths
- Updated Shared validation constants

Files: 32 (Domain + Infrastructure layers)
Phase: 1a of 3
Next: Phase 1b will add Application + API layers
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 19, 2025

Warning

Rate limit exceeded

@frigini has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 7 minutes and 5 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between a8abcfc and 2aaea7b.

📒 Files selected for processing (7)
  • MeAjudaAi.sln (1 hunks)
  • src/Modules/ServiceCatalogs/Domain/Exceptions/CatalogDomainException.cs (1 hunks)
  • src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceId.cs (1 hunks)
  • src/Modules/ServiceCatalogs/Infrastructure/Extensions.cs (1 hunks)
  • src/Modules/ServiceCatalogs/Infrastructure/MeAjudaAi.Modules.ServiceCatalogs.Infrastructure.csproj (1 hunks)
  • src/Modules/ServiceCatalogs/Infrastructure/Persistence/Repositories/ServiceRepository.cs (1 hunks)
  • src/Modules/ServiceCatalogs/Infrastructure/Persistence/ServiceCatalogsDbContextFactory.cs (1 hunks)

Walkthrough

The pull request renames the Catalogs module to ServiceCatalogs across the solution structure and introduces a complete new ServiceCatalogs module with domain entities (Service, ServiceCategory), value objects, domain events, repositories, EF Core persistence layer with initial migrations, and infrastructure wiring.

Changes

Cohort / File(s) Summary
Solution structure refactoring
MeAjudaAi.sln
Updated module project references from MeAjudaAi.Modules.Catalogs.* to MeAjudaAi.Modules.ServiceCatalogs.* across Domain, Application, Infrastructure, API, and Tests projects with corresponding path updates.
Domain value objects
src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceId.cs, ServiceCategoryId.cs
Introduced strongly-typed identifier value objects with Guid-backed values, factory methods (New, From), implicit Guid conversions, and value-based equality.
Domain entities
src/Modules/ServiceCatalogs/Domain/Entities/Service.cs, ServiceCategory.cs
Implemented aggregate roots with state management: ServiceCategory with name/description/display order; Service with category reference and lifecycle methods. Both support Create factory, Update mutations, and Activate/Deactivate operations with comprehensive validation.
Domain events
src/Modules/ServiceCatalogs/Domain/Events/Service/*, src/Modules/ServiceCatalogs/Domain/Events/ServiceCategory/*
Created sealed domain event records for lifecycle transitions: ServiceCreatedDomainEvent, ServiceUpdatedDomainEvent, ServiceCategoryChangedDomainEvent, ServiceActivatedDomainEvent, ServiceDeactivatedDomainEvent, and corresponding ServiceCategory events.
Domain infrastructure
src/Modules/ServiceCatalogs/Domain/Exceptions/CatalogDomainException.cs, src/Modules/ServiceCatalogs/Domain/Repositories/IServiceRepository.cs, IServiceCategoryRepository.cs, src/Modules/ServiceCatalogs/Domain/MeAjudaAi.Modules.ServiceCatalogs.Domain.csproj
Introduced custom domain exception, repository interfaces with CRUD and query operations, and project configuration with test internals visibility.
Database configuration and context
src/Modules/ServiceCatalogs/Infrastructure/Persistence/ServiceCatalogsDbContext.cs, ServiceCatalogsDbContextFactory.cs, src/Modules/ServiceCatalogs/Infrastructure/Persistence/Configurations/ServiceConfiguration.cs, ServiceCategoryConfiguration.cs
Configured EF Core DbContext with two DbSets, design-time factory for migrations, and entity configurations including column mappings, constraints, indexes, and foreign key relationships.
Repository implementations
src/Modules/ServiceCatalogs/Infrastructure/Persistence/Repositories/ServiceRepository.cs, ServiceCategoryRepository.cs
Implemented async repository methods with filtering, ordering, existence checks, and write operations using EF Core AsNoTracking and SaveChangesAsync.
Database migrations
src/Modules/ServiceCatalogs/Infrastructure/Persistence/Migrations/20251117205349_InitialCreate.cs, 20251117205349_InitialCreate.Designer.cs, CatalogsDbContextModelSnapshot.cs
Created initial migration creating service_categories and services tables with proper constraints, indexes, foreign key relationships, and model snapshot for schema evolution.
Infrastructure wiring
src/Modules/ServiceCatalogs/Infrastructure/Extensions.cs, src/Modules/ServiceCatalogs/Infrastructure/MeAjudaAi.Modules.ServiceCatalogs.Infrastructure.csproj
Implemented service collection extension for DbContext registration with PostgreSQL configuration, repository registration, and handler assembly scanning.
Shared constants
src/Shared/Constants/ValidationConstants.cs, ValidationMessages.cs
Updated XML documentation summaries from "módulo Catalogs" to "módulo ServiceCatalogs" within existing CatalogLimits and Catalogs classes.

Sequence Diagram

sequenceDiagram
    participant Client
    participant Handler
    participant Domain as Service/Category<br/>(Domain)
    participant Repo as Repository
    participant DbContext as DbContext
    participant Events as Domain Events

    Note over Client,Events: Service Creation Flow
    Client->>Handler: CreateServiceCommand
    Handler->>Domain: Service.Create(categoryId, name, ...)
    Domain->>Domain: Validate inputs
    Domain->>Events: Emit ServiceCreatedDomainEvent
    Domain-->>Handler: Service instance
    Handler->>Repo: AddAsync(service)
    Repo->>DbContext: Add + SaveChangesAsync
    DbContext-->>Repo: Persisted
    Repo-->>Handler: ✓
    Handler-->>Client: Success

    Note over Domain,Events: Service State Transitions
    Domain->>Domain: Activate/Deactivate/Update
    Domain->>Domain: Conditional validation
    Domain->>Events: Emit corresponding event
    Domain->>DbContext: Mark as updated
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

  • Entity validation logic: Service and ServiceCategory implement comprehensive input validation with custom exception handling; verify all validation paths are covered (name length, null checks, display order bounds)
  • EF Core configurations: Review foreign key constraints, index definitions (especially composite indexes on CategoryId + DisplayOrder), and cascading delete behavior settings
  • Repository query correctness: Validate LINQ queries for filtering (activeOnly), includes (Category navigation), and ordering semantics; confirm AsNoTracking usage is appropriate for read operations
  • Migration integrity: Verify schema naming ("ServiceCatalogs"), column constraints (NOT NULL, unique constraints), and index definitions match entity configurations
  • Service registration: Confirm Extensions.cs correctly registers all handlers, repositories, and DbContext with proper connection string fallbacks and EF Core options

Possibly related PRs

  • Catalogs module implementation #15: Introduces the original Catalogs module structure that serves as the template pattern mirrored in this ServiceCatalogs refactor.
  • refactor modulo catalogs #16: Implements equivalent domain models, repositories, and event handling for the Catalogs module that directly parallels the ServiceCatalogs implementation.

Poem

🐰 A catalog of services blooms, now named ServiceCatalogs so clear,
With domains, events, and repositories drawing near,
Categories and services dancing in arrays,
Entities validated through PostgreSQL's maze,
The module takes flight on infrastructure's flair!

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 45.83% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and specifically describes the main refactoring change: renaming Catalogs to ServiceCatalogs across Domain and Infrastructure layers in Phase 1a, which accurately reflects the primary scope of the changeset.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (6)
src/Modules/ServiceCatalogs/Domain/Exceptions/CatalogDomainException.cs (1)

1-12: CatalogDomainException is appropriate; optionally add full standard ctors

The sealed exception with message and message + innerException is enough for domain validation scenarios. If your analyzer rules or guidelines expect the full .NET exception pattern, consider later adding the parameterless and serialization constructors to avoid diagnostics and support cross-boundary serialization, but it’s not required for typical in-process domain use.

src/Modules/ServiceCatalogs/Infrastructure/MeAjudaAi.Modules.ServiceCatalogs.Infrastructure.csproj (1)

1-33: Infrastructure project wiring looks good; double‑check package version strategy

Targeting net9.0, enabling nullable/implicit usings, wiring Shared/Application/Domain references, and exposing internals to the tests project all look consistent with the rest of the module layout.

For EFCore.NamingConventions, if you’re not already using central package management (e.g., Directory.Packages.props), it’s worth pinning an explicit Version here to keep builds reproducible across environments.

src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceId.cs (1)

1-32: ServiceId value object is consistent and robust

Validation, factory methods, equality components, ToString, and implicit conversions all match the established pattern (e.g., ServiceCategoryId) and are suitable for use as an aggregate key and EF mapping.

If you want to tighten the type a bit further, you could mark ServiceId as sealed (as it’s a value object not intended for inheritance):

-public class ServiceId : ValueObject
+public sealed class ServiceId : ValueObject
src/Modules/ServiceCatalogs/Infrastructure/Persistence/ServiceCatalogsDbContextFactory.cs (1)

1-55: Design‑time DbContext factory is well structured; just ensure Npgsql extensions are in scope

The factory is nicely documented, enforces the required ServiceCatalogs_DB_CONNECTION configuration, and configures the migrations history table and SplitQuery behavior consistently with the ServiceCatalogsDbContext schema.

One thing to double‑check: this relies on the Npgsql UseNpgsql extension method and related EF Core APIs being available in scope (typically via a reference to Npgsql.EntityFrameworkCore.PostgreSQL and an appropriate using / global using). If you don’t already have a global using for the Npgsql namespace, consider adding an explicit using in this file so UseNpgsql and its options lambda resolve cleanly.

src/Modules/ServiceCatalogs/Infrastructure/Extensions.cs (1)

33-67: Align connection string resolution with DapperConnection to avoid divergence

Here you resolve connection strings only via named connection strings (DefaultConnection, ServiceCatalogs, meajudaai-db) and then fall back to a hard-coded test connection when none are found. DapperConnection.GetConnectionString(PostgresOptions?) instead relies on PostgresOptions.ConnectionString (likely bound from Postgres:ConnectionString) plus the same test fallback and error message.

This means EF and Dapper can silently diverge: Dapper can work (options bound from Postgres:ConnectionString) while EF fails because no named connection string is present. Consider centralizing this resolution (e.g., a shared helper that both EF and Dapper use) or at least including the PostgresOptions‑based path here so both stacks obey the same precedence rules.

src/Modules/ServiceCatalogs/Infrastructure/Persistence/Migrations/CatalogsDbContextModelSnapshot.cs (1)

13-141: Snapshot matches the current model and migrations

The model snapshot accurately reflects the ServiceCatalogsDbContext model (schema, tables, columns, indexes, and FK behavior) and is in sync with the Designer/migration. No functional issues here. If you care about consistency, you might eventually rename the file to ServiceCatalogsDbContextModelSnapshot.cs, but that’s cosmetic only.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d778434 and a8abcfc.

📒 Files selected for processing (31)
  • MeAjudaAi.sln (1 hunks)
  • src/Modules/ServiceCatalogs/Domain/Entities/Service.cs (1 hunks)
  • src/Modules/ServiceCatalogs/Domain/Entities/ServiceCategory.cs (1 hunks)
  • src/Modules/ServiceCatalogs/Domain/Events/Service/ServiceActivatedDomainEvent.cs (1 hunks)
  • src/Modules/ServiceCatalogs/Domain/Events/Service/ServiceCategoryChangedDomainEvent.cs (1 hunks)
  • src/Modules/ServiceCatalogs/Domain/Events/Service/ServiceCreatedDomainEvent.cs (1 hunks)
  • src/Modules/ServiceCatalogs/Domain/Events/Service/ServiceDeactivatedDomainEvent.cs (1 hunks)
  • src/Modules/ServiceCatalogs/Domain/Events/Service/ServiceUpdatedDomainEvent.cs (1 hunks)
  • src/Modules/ServiceCatalogs/Domain/Events/ServiceCategory/ServiceCategoryActivatedDomainEvent.cs (1 hunks)
  • src/Modules/ServiceCatalogs/Domain/Events/ServiceCategory/ServiceCategoryCreatedDomainEvent.cs (1 hunks)
  • src/Modules/ServiceCatalogs/Domain/Events/ServiceCategory/ServiceCategoryDeactivatedDomainEvent.cs (1 hunks)
  • src/Modules/ServiceCatalogs/Domain/Events/ServiceCategory/ServiceCategoryUpdatedDomainEvent.cs (1 hunks)
  • src/Modules/ServiceCatalogs/Domain/Exceptions/CatalogDomainException.cs (1 hunks)
  • src/Modules/ServiceCatalogs/Domain/MeAjudaAi.Modules.ServiceCatalogs.Domain.csproj (1 hunks)
  • src/Modules/ServiceCatalogs/Domain/Repositories/IServiceCategoryRepository.cs (1 hunks)
  • src/Modules/ServiceCatalogs/Domain/Repositories/IServiceRepository.cs (1 hunks)
  • src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceCategoryId.cs (1 hunks)
  • src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceId.cs (1 hunks)
  • src/Modules/ServiceCatalogs/Infrastructure/Extensions.cs (1 hunks)
  • src/Modules/ServiceCatalogs/Infrastructure/MeAjudaAi.Modules.ServiceCatalogs.Infrastructure.csproj (1 hunks)
  • src/Modules/ServiceCatalogs/Infrastructure/Persistence/Configurations/ServiceCategoryConfiguration.cs (1 hunks)
  • src/Modules/ServiceCatalogs/Infrastructure/Persistence/Configurations/ServiceConfiguration.cs (1 hunks)
  • src/Modules/ServiceCatalogs/Infrastructure/Persistence/Migrations/20251117205349_InitialCreate.Designer.cs (1 hunks)
  • src/Modules/ServiceCatalogs/Infrastructure/Persistence/Migrations/20251117205349_InitialCreate.cs (1 hunks)
  • src/Modules/ServiceCatalogs/Infrastructure/Persistence/Migrations/CatalogsDbContextModelSnapshot.cs (1 hunks)
  • src/Modules/ServiceCatalogs/Infrastructure/Persistence/Repositories/ServiceCategoryRepository.cs (1 hunks)
  • src/Modules/ServiceCatalogs/Infrastructure/Persistence/Repositories/ServiceRepository.cs (1 hunks)
  • src/Modules/ServiceCatalogs/Infrastructure/Persistence/ServiceCatalogsDbContext.cs (1 hunks)
  • src/Modules/ServiceCatalogs/Infrastructure/Persistence/ServiceCatalogsDbContextFactory.cs (1 hunks)
  • src/Shared/Constants/ValidationConstants.cs (1 hunks)
  • src/Shared/Constants/ValidationMessages.cs (1 hunks)
🧰 Additional context used
🧬 Code graph analysis (25)
src/Modules/ServiceCatalogs/Domain/Events/ServiceCategory/ServiceCategoryCreatedDomainEvent.cs (3)
src/Modules/ServiceCatalogs/Domain/Entities/ServiceCategory.cs (3)
  • ServiceCategory (13-127)
  • ServiceCategory (37-37)
  • ServiceCategory (46-63)
src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceCategoryId.cs (4)
  • ServiceCategoryId (9-32)
  • ServiceCategoryId (13-18)
  • ServiceCategoryId (20-20)
  • ServiceCategoryId (21-21)
src/Modules/Catalogs/Domain/Events/ServiceCategoryDomainEvents.cs (2)
  • ServiceCategoryCreatedDomainEvent (6-7)
  • ServiceCategoryUpdatedDomainEvent (9-10)
src/Modules/ServiceCatalogs/Infrastructure/Extensions.cs (5)
src/Modules/ServiceCatalogs/Infrastructure/Persistence/ServiceCatalogsDbContext.cs (1)
  • ServiceCatalogsDbContext (10-24)
src/Modules/ServiceCatalogs/Infrastructure/Persistence/ServiceCatalogsDbContextFactory.cs (1)
  • ServiceCatalogsDbContext (30-54)
src/Shared/Database/DapperConnection.cs (1)
  • GetConnectionString (11-22)
src/Modules/ServiceCatalogs/Infrastructure/Persistence/Repositories/ServiceCategoryRepository.cs (1)
  • ServiceCategoryRepository (8-73)
src/Modules/ServiceCatalogs/Infrastructure/Persistence/Repositories/ServiceRepository.cs (1)
  • ServiceRepository (8-121)
src/Modules/ServiceCatalogs/Domain/Events/Service/ServiceUpdatedDomainEvent.cs (3)
src/Modules/ServiceCatalogs/Domain/Entities/Service.cs (3)
  • Service (13-159)
  • Service (45-45)
  • Service (55-76)
src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceId.cs (4)
  • ServiceId (9-32)
  • ServiceId (13-18)
  • ServiceId (20-20)
  • ServiceId (21-21)
src/Modules/Catalogs/Domain/Events/ServiceDomainEvents.cs (1)
  • ServiceUpdatedDomainEvent (9-10)
src/Modules/ServiceCatalogs/Domain/Events/Service/ServiceCreatedDomainEvent.cs (4)
src/Modules/ServiceCatalogs/Domain/Entities/Service.cs (3)
  • Service (13-159)
  • Service (45-45)
  • Service (55-76)
src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceId.cs (4)
  • ServiceId (9-32)
  • ServiceId (13-18)
  • ServiceId (20-20)
  • ServiceId (21-21)
src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceCategoryId.cs (4)
  • ServiceCategoryId (9-32)
  • ServiceCategoryId (13-18)
  • ServiceCategoryId (20-20)
  • ServiceCategoryId (21-21)
src/Modules/Catalogs/Domain/Events/ServiceDomainEvents.cs (1)
  • ServiceCreatedDomainEvent (6-7)
src/Modules/ServiceCatalogs/Domain/Events/ServiceCategory/ServiceCategoryActivatedDomainEvent.cs (3)
src/Modules/ServiceCatalogs/Domain/Entities/ServiceCategory.cs (3)
  • ServiceCategory (13-127)
  • ServiceCategory (37-37)
  • ServiceCategory (46-63)
src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceCategoryId.cs (4)
  • ServiceCategoryId (9-32)
  • ServiceCategoryId (13-18)
  • ServiceCategoryId (20-20)
  • ServiceCategoryId (21-21)
src/Modules/Catalogs/Domain/Events/ServiceCategoryDomainEvents.cs (2)
  • ServiceCategoryActivatedDomainEvent (12-13)
  • ServiceCategoryDeactivatedDomainEvent (15-16)
src/Modules/ServiceCatalogs/Domain/Events/ServiceCategory/ServiceCategoryDeactivatedDomainEvent.cs (3)
src/Modules/ServiceCatalogs/Domain/Entities/ServiceCategory.cs (3)
  • ServiceCategory (13-127)
  • ServiceCategory (37-37)
  • ServiceCategory (46-63)
src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceCategoryId.cs (4)
  • ServiceCategoryId (9-32)
  • ServiceCategoryId (13-18)
  • ServiceCategoryId (20-20)
  • ServiceCategoryId (21-21)
src/Modules/Catalogs/Domain/Events/ServiceCategoryDomainEvents.cs (2)
  • ServiceCategoryDeactivatedDomainEvent (15-16)
  • ServiceCategoryActivatedDomainEvent (12-13)
src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceCategoryId.cs (3)
src/Shared/Domain/ValueObject.cs (1)
  • ValueObject (3-32)
src/Shared/Time/UuidGenerator.cs (1)
  • UuidGenerator (8-33)
src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceId.cs (2)
  • IEnumerable (23-26)
  • ToString (28-28)
src/Modules/ServiceCatalogs/Domain/Events/ServiceCategory/ServiceCategoryUpdatedDomainEvent.cs (3)
src/Modules/ServiceCatalogs/Domain/Entities/ServiceCategory.cs (3)
  • ServiceCategory (13-127)
  • ServiceCategory (37-37)
  • ServiceCategory (46-63)
src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceCategoryId.cs (4)
  • ServiceCategoryId (9-32)
  • ServiceCategoryId (13-18)
  • ServiceCategoryId (20-20)
  • ServiceCategoryId (21-21)
src/Modules/Catalogs/Domain/Events/ServiceCategoryDomainEvents.cs (1)
  • ServiceCategoryUpdatedDomainEvent (9-10)
src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceId.cs (3)
src/Shared/Domain/ValueObject.cs (1)
  • ValueObject (3-32)
src/Shared/Time/UuidGenerator.cs (1)
  • UuidGenerator (8-33)
src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceCategoryId.cs (2)
  • IEnumerable (23-26)
  • ToString (28-28)
src/Modules/ServiceCatalogs/Domain/Events/Service/ServiceActivatedDomainEvent.cs (3)
src/Modules/ServiceCatalogs/Domain/Entities/Service.cs (3)
  • Service (13-159)
  • Service (45-45)
  • Service (55-76)
src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceId.cs (4)
  • ServiceId (9-32)
  • ServiceId (13-18)
  • ServiceId (20-20)
  • ServiceId (21-21)
src/Modules/Catalogs/Domain/Events/ServiceDomainEvents.cs (1)
  • ServiceActivatedDomainEvent (12-13)
src/Modules/ServiceCatalogs/Infrastructure/Persistence/Migrations/20251117205349_InitialCreate.cs (2)
src/Modules/Catalogs/Infrastructure/Persistence/Migrations/20251117205349_InitialCreate.cs (2)
  • MeAjudaAi (6-118)
  • Up (12-104)
src/Modules/Catalogs/Infrastructure/Persistence/Migrations/20251117205349_InitialCreate.Designer.cs (1)
  • DbContext (14-145)
src/Modules/ServiceCatalogs/Infrastructure/Persistence/Configurations/ServiceCategoryConfiguration.cs (3)
src/Modules/ServiceCatalogs/Domain/Entities/ServiceCategory.cs (3)
  • ServiceCategory (13-127)
  • ServiceCategory (37-37)
  • ServiceCategory (46-63)
src/Modules/ServiceCatalogs/Infrastructure/Persistence/Configurations/ServiceConfiguration.cs (1)
  • Configure (10-76)
src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceCategoryId.cs (4)
  • ServiceCategoryId (9-32)
  • ServiceCategoryId (13-18)
  • ServiceCategoryId (20-20)
  • ServiceCategoryId (21-21)
src/Modules/ServiceCatalogs/Domain/Repositories/IServiceCategoryRepository.cs (2)
src/Modules/ServiceCatalogs/Domain/Entities/ServiceCategory.cs (3)
  • ServiceCategory (13-127)
  • ServiceCategory (37-37)
  • ServiceCategory (46-63)
src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceCategoryId.cs (4)
  • ServiceCategoryId (9-32)
  • ServiceCategoryId (13-18)
  • ServiceCategoryId (20-20)
  • ServiceCategoryId (21-21)
src/Modules/ServiceCatalogs/Infrastructure/Persistence/ServiceCatalogsDbContext.cs (6)
src/Modules/ServiceCatalogs/Infrastructure/Persistence/ServiceCatalogsDbContextFactory.cs (1)
  • ServiceCatalogsDbContext (30-54)
src/Modules/ServiceCatalogs/Infrastructure/Persistence/Migrations/20251117205349_InitialCreate.Designer.cs (1)
  • DbContext (14-145)
src/Modules/ServiceCatalogs/Infrastructure/Persistence/Migrations/CatalogsDbContextModelSnapshot.cs (1)
  • DbContext (13-142)
src/Modules/ServiceCatalogs/Domain/Entities/ServiceCategory.cs (3)
  • ServiceCategory (13-127)
  • ServiceCategory (37-37)
  • ServiceCategory (46-63)
src/Modules/ServiceCatalogs/Domain/Entities/Service.cs (3)
  • Service (13-159)
  • Service (45-45)
  • Service (55-76)
src/Modules/Catalogs/Infrastructure/Persistence/CatalogsDbContext.cs (1)
  • CatalogsDbContext (10-24)
src/Modules/ServiceCatalogs/Domain/Events/Service/ServiceCategoryChangedDomainEvent.cs (4)
src/Modules/ServiceCatalogs/Domain/Entities/Service.cs (3)
  • Service (13-159)
  • Service (45-45)
  • Service (55-76)
src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceId.cs (4)
  • ServiceId (9-32)
  • ServiceId (13-18)
  • ServiceId (20-20)
  • ServiceId (21-21)
src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceCategoryId.cs (4)
  • ServiceCategoryId (9-32)
  • ServiceCategoryId (13-18)
  • ServiceCategoryId (20-20)
  • ServiceCategoryId (21-21)
src/Modules/Catalogs/Domain/Events/ServiceDomainEvents.cs (1)
  • ServiceCategoryChangedDomainEvent (18-22)
src/Modules/ServiceCatalogs/Infrastructure/Persistence/Migrations/CatalogsDbContextModelSnapshot.cs (3)
src/Modules/ServiceCatalogs/Infrastructure/Persistence/Migrations/20251117205349_InitialCreate.Designer.cs (1)
  • DbContext (14-145)
src/Modules/ServiceCatalogs/Infrastructure/Persistence/ServiceCatalogsDbContext.cs (1)
  • ServiceCatalogsDbContext (10-24)
src/Modules/ServiceCatalogs/Infrastructure/Persistence/ServiceCatalogsDbContextFactory.cs (1)
  • ServiceCatalogsDbContext (30-54)
src/Modules/ServiceCatalogs/Domain/Events/Service/ServiceDeactivatedDomainEvent.cs (2)
src/Modules/ServiceCatalogs/Domain/Entities/Service.cs (3)
  • Service (13-159)
  • Service (45-45)
  • Service (55-76)
src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceId.cs (4)
  • ServiceId (9-32)
  • ServiceId (13-18)
  • ServiceId (20-20)
  • ServiceId (21-21)
src/Modules/ServiceCatalogs/Infrastructure/Persistence/ServiceCatalogsDbContextFactory.cs (1)
src/Modules/ServiceCatalogs/Infrastructure/Persistence/ServiceCatalogsDbContext.cs (1)
  • ServiceCatalogsDbContext (10-24)
src/Modules/ServiceCatalogs/Domain/Repositories/IServiceRepository.cs (4)
src/Modules/ServiceCatalogs/Domain/Entities/Service.cs (3)
  • Service (13-159)
  • Service (45-45)
  • Service (55-76)
src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceId.cs (5)
  • ServiceId (9-32)
  • ServiceId (13-18)
  • ServiceId (20-20)
  • ServiceId (21-21)
  • IEnumerable (23-26)
src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceCategoryId.cs (5)
  • IEnumerable (23-26)
  • ServiceCategoryId (9-32)
  • ServiceCategoryId (13-18)
  • ServiceCategoryId (20-20)
  • ServiceCategoryId (21-21)
src/Modules/Catalogs/Domain/Repositories/IServiceRepository.cs (1)
  • IServiceRepository (9-69)
src/Modules/ServiceCatalogs/Infrastructure/Persistence/Repositories/ServiceCategoryRepository.cs (4)
src/Modules/ServiceCatalogs/Infrastructure/Persistence/ServiceCatalogsDbContext.cs (1)
  • ServiceCatalogsDbContext (10-24)
src/Modules/ServiceCatalogs/Domain/Repositories/IServiceCategoryRepository.cs (7)
  • Task (16-16)
  • Task (23-23)
  • Task (30-30)
  • Task (38-38)
  • Task (45-45)
  • Task (52-52)
  • Task (59-59)
src/Modules/ServiceCatalogs/Domain/Entities/ServiceCategory.cs (4)
  • ServiceCategory (13-127)
  • ServiceCategory (37-37)
  • ServiceCategory (46-63)
  • Update (68-80)
src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceCategoryId.cs (4)
  • ServiceCategoryId (9-32)
  • ServiceCategoryId (13-18)
  • ServiceCategoryId (20-20)
  • ServiceCategoryId (21-21)
src/Modules/ServiceCatalogs/Domain/Entities/ServiceCategory.cs (5)
src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceCategoryId.cs (4)
  • ServiceCategoryId (9-32)
  • ServiceCategoryId (13-18)
  • ServiceCategoryId (20-20)
  • ServiceCategoryId (21-21)
src/Modules/ServiceCatalogs/Domain/Entities/Service.cs (6)
  • ValidateName (139-146)
  • ValidateDescription (148-152)
  • ValidateDisplayOrder (154-158)
  • Update (81-93)
  • Activate (117-124)
  • Deactivate (130-137)
src/Shared/Domain/BaseEntity.cs (2)
  • AddDomainEvent (22-22)
  • MarkAsUpdated (24-24)
src/Modules/ServiceCatalogs/Domain/Exceptions/CatalogDomainException.cs (3)
  • CatalogDomainException (6-12)
  • CatalogDomainException (8-8)
  • CatalogDomainException (10-11)
src/Shared/Constants/ValidationConstants.cs (2)
  • ValidationConstants (9-79)
  • CatalogLimits (69-78)
src/Modules/ServiceCatalogs/Domain/Entities/Service.cs (6)
src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceId.cs (4)
  • ServiceId (9-32)
  • ServiceId (13-18)
  • ServiceId (20-20)
  • ServiceId (21-21)
src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceCategoryId.cs (4)
  • ServiceCategoryId (9-32)
  • ServiceCategoryId (13-18)
  • ServiceCategoryId (20-20)
  • ServiceCategoryId (21-21)
src/Modules/ServiceCatalogs/Domain/Entities/ServiceCategory.cs (9)
  • ServiceCategory (13-127)
  • ServiceCategory (37-37)
  • ServiceCategory (46-63)
  • ValidateName (107-114)
  • ValidateDescription (116-120)
  • ValidateDisplayOrder (122-126)
  • Update (68-80)
  • Activate (85-92)
  • Deactivate (98-105)
src/Modules/ServiceCatalogs/Domain/Exceptions/CatalogDomainException.cs (3)
  • CatalogDomainException (6-12)
  • CatalogDomainException (8-8)
  • CatalogDomainException (10-11)
src/Shared/Domain/BaseEntity.cs (2)
  • AddDomainEvent (22-22)
  • MarkAsUpdated (24-24)
src/Shared/Constants/ValidationConstants.cs (2)
  • ValidationConstants (9-79)
  • CatalogLimits (69-78)
src/Modules/ServiceCatalogs/Infrastructure/Persistence/Repositories/ServiceRepository.cs (5)
src/Modules/ServiceCatalogs/Infrastructure/Persistence/ServiceCatalogsDbContext.cs (1)
  • ServiceCatalogsDbContext (10-24)
src/Modules/ServiceCatalogs/Domain/Repositories/IServiceRepository.cs (9)
  • Task (16-16)
  • Task (23-23)
  • Task (30-30)
  • Task (37-37)
  • Task (45-45)
  • Task (54-54)
  • Task (62-62)
  • Task (69-69)
  • Task (76-76)
src/Modules/ServiceCatalogs/Domain/Entities/Service.cs (4)
  • Service (13-159)
  • Service (45-45)
  • Service (55-76)
  • Update (81-93)
src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceId.cs (5)
  • ServiceId (9-32)
  • ServiceId (13-18)
  • ServiceId (20-20)
  • ServiceId (21-21)
  • IEnumerable (23-26)
src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceCategoryId.cs (5)
  • IEnumerable (23-26)
  • ServiceCategoryId (9-32)
  • ServiceCategoryId (13-18)
  • ServiceCategoryId (20-20)
  • ServiceCategoryId (21-21)
src/Modules/ServiceCatalogs/Infrastructure/Persistence/Configurations/ServiceConfiguration.cs (4)
src/Modules/ServiceCatalogs/Domain/Entities/Service.cs (3)
  • Service (13-159)
  • Service (45-45)
  • Service (55-76)
src/Modules/ServiceCatalogs/Infrastructure/Persistence/Configurations/ServiceCategoryConfiguration.cs (1)
  • Configure (10-59)
src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceId.cs (4)
  • ServiceId (9-32)
  • ServiceId (13-18)
  • ServiceId (20-20)
  • ServiceId (21-21)
src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceCategoryId.cs (4)
  • ServiceCategoryId (9-32)
  • ServiceCategoryId (13-18)
  • ServiceCategoryId (20-20)
  • ServiceCategoryId (21-21)
src/Modules/ServiceCatalogs/Infrastructure/Persistence/Migrations/20251117205349_InitialCreate.Designer.cs (5)
src/Modules/ServiceCatalogs/Infrastructure/Persistence/Migrations/CatalogsDbContextModelSnapshot.cs (1)
  • DbContext (13-142)
src/Modules/ServiceCatalogs/Infrastructure/Persistence/ServiceCatalogsDbContext.cs (1)
  • ServiceCatalogsDbContext (10-24)
src/Modules/ServiceCatalogs/Infrastructure/Persistence/ServiceCatalogsDbContextFactory.cs (1)
  • ServiceCatalogsDbContext (30-54)
src/Modules/ServiceCatalogs/Infrastructure/Persistence/Migrations/20251117205349_InitialCreate.cs (1)
  • InitialCreate (9-117)
src/Modules/Catalogs/Infrastructure/Persistence/Migrations/20251117205349_InitialCreate.Designer.cs (3)
  • DbContext (14-145)
  • BuildTargetModel (19-144)
  • b (29-82)
🔇 Additional comments (31)
src/Shared/Constants/ValidationMessages.cs (1)

80-83: Doc summary now matches ServiceCatalogs module naming

The updated summary correctly reflects the ServiceCatalogs module without affecting behavior. No further changes needed here.

src/Shared/Constants/ValidationConstants.cs (1)

66-70: ValidationConstants summary aligned with ServiceCatalogs naming

The summary text now matches the ServiceCatalogs terminology and leaves the constants behavior untouched. Looks good.

src/Modules/ServiceCatalogs/Domain/Events/ServiceCategory/ServiceCategoryDeactivatedDomainEvent.cs (1)

1-7: ServiceCategoryDeactivatedDomainEvent matches existing domain event conventions

The event shape (keyed by CategoryId.Value, Version: 1) is consistent with the other ServiceCategory events and the aggregate’s Deactivate method. No issues spotted.

src/Modules/ServiceCatalogs/Domain/Events/ServiceCategory/ServiceCategoryActivatedDomainEvent.cs (1)

1-7: ServiceCategoryActivatedDomainEvent is consistent with the ServiceCategory event suite

This event cleanly follows the same pattern as the other ServiceCategory domain events (Id + version), so wiring from Activate() should behave as expected.

src/Modules/ServiceCatalogs/Domain/MeAjudaAi.Modules.ServiceCatalogs.Domain.csproj (1)

1-19: ServiceCatalogs.Domain project configuration is clean and layered correctly

The domain project targeting net9.0, depending only on Shared, and exposing internals to the tests assembly aligns well with the intended architecture. No changes suggested here.

src/Modules/ServiceCatalogs/Domain/Events/Service/ServiceUpdatedDomainEvent.cs (1)

1-7: ServiceUpdatedDomainEvent correctly represents Service updates

The event definition matches the pattern used by the Service aggregate (Id + fixed version) and aligns with the previous Catalogs events. Looks solid.

src/Modules/ServiceCatalogs/Domain/Events/ServiceCategory/ServiceCategoryCreatedDomainEvent.cs (1)

1-7: ServiceCategoryCreated event mirrors the previous Catalogs event correctly

Usings, namespace, payload, and DomainEvent key all align with the existing pattern; this is a clean relocation/rename with no behavioral change.

src/Modules/ServiceCatalogs/Domain/Events/Service/ServiceCreatedDomainEvent.cs (1)

1-7: ServiceCreated event is correctly modeled around the Service aggregate

The event shape (ServiceId + CategoryId) and use of ServiceId.Value as the DomainEvent key are consistent with the existing Catalogs implementation and the Service.Create factory.

src/Modules/ServiceCatalogs/Domain/Events/Service/ServiceActivatedDomainEvent.cs (1)

1-7: ServiceActivated event wiring looks correct

The event’s payload and use of ServiceId.Value as the DomainEvent identifier match the activation logic in Service.Activate() and the previous Catalogs event.

src/Modules/ServiceCatalogs/Domain/Events/Service/ServiceDeactivatedDomainEvent.cs (1)

1-7: ServiceDeactivated event is consistent with activation and legacy behavior

Shape and keying match the Catalogs version and the Service.Deactivate() method, keeping the lifecycle event pattern coherent.

src/Modules/ServiceCatalogs/Domain/Events/ServiceCategory/ServiceCategoryUpdatedDomainEvent.cs (1)

1-7: ServiceCategoryUpdated event cleanly mirrors the old Catalogs event

Correctly carries only the CategoryId and uses CategoryId.Value as the DomainEvent key, matching the ServiceCategory.Update() behavior.

src/Modules/ServiceCatalogs/Domain/Events/Service/ServiceCategoryChangedDomainEvent.cs (1)

1-10: ServiceCategoryChanged event correctly captures the category transition

Including both old and new category IDs with ServiceId.Value as the DomainEvent key matches the Service.ChangeCategory behavior and the legacy event, so consumers can react with full context.

src/Modules/ServiceCatalogs/Infrastructure/Extensions.cs (1)

24-95: Overall infrastructure wiring looks consistent and cohesive

DbContext registration, repository registrations, and command/query handler wiring are coherent and align with the new ServiceCatalogs module structure and migrations. Nothing blocking here.

src/Modules/ServiceCatalogs/Infrastructure/Persistence/Migrations/20251117205349_InitialCreate.cs (1)

12-116: Migration matches the new schema and domain model

The InitialCreate migration cleanly recreates the previous structure under the ServiceCatalogs schema: table shapes, constraints, and indexes are consistent with the Designer and model snapshot. Up/Down are symmetric and look correct.

src/Modules/ServiceCatalogs/Infrastructure/Persistence/ServiceCatalogsDbContext.cs (1)

7-23: DbContext configuration is minimal and correct

Default schema, DbSets, and ApplyConfigurationsFromAssembly all line up with the migrations and EF configurations. This is a clean, conventional DbContext for the module.

src/Modules/ServiceCatalogs/Domain/ValueObjects/ServiceCategoryId.cs (1)

9-32: Strongly-typed ID implementation looks solid

Non-empty Guid enforcement, value-based equality, factory methods, and implicit conversions are all coherent and consistent with the existing ServiceId pattern.

src/Modules/ServiceCatalogs/Infrastructure/Persistence/Configurations/ServiceCategoryConfiguration.cs (1)

8-59: ServiceCategory EF configuration matches domain and migrations

Table name, value-object Id conversion, max lengths, required flags, and index names all align with ServiceCategory validations and the InitialCreate migration. Ignoring DomainEvents is appropriate.

src/Modules/ServiceCatalogs/Infrastructure/Persistence/Migrations/20251117205349_InitialCreate.Designer.cs (1)

12-144: Migration designer is consistent with model configuration

The model snapshot for Service and ServiceCategory (schema, columns, max lengths, indexes, and FK constraint) matches the explicit configurations and the InitialCreate migration. No manual edits needed here.

src/Modules/ServiceCatalogs/Domain/Repositories/IServiceCategoryRepository.cs (1)

6-59: ServiceCategory repository interface is cohesive and matches domain needs

Method set (lookups, listing with activeOnly, existence check, and basic CRUD) is clear and aligns with the ServiceCategory aggregate and the EF implementation.

src/Modules/ServiceCatalogs/Infrastructure/Persistence/Configurations/ServiceConfiguration.cs (1)

8-75: Service EF configuration is consistent and well‑indexed

Mappings (value-object keys, required fields, max lengths) and index/relationship setup match the Service/ServiceCategory domain model and the migration. Ignoring DomainEvents is correct.

src/Modules/ServiceCatalogs/Infrastructure/Persistence/Repositories/ServiceCategoryRepository.cs (1)

25-36: Use AsNoTracking for GetAllAsync read query

GetAllAsync currently uses a tracked query, while other read methods use AsNoTracking. For consistency and to avoid unnecessary tracking for list scenarios, consider:

-        var query = context.ServiceCategories.AsQueryable();
+        var query = context.ServiceCategories
+            .AsNoTracking();

[ suggest_recommended_refactor ]

src/Modules/ServiceCatalogs/Domain/Repositories/IServiceRepository.cs (1)

6-83: Service repository interface cleanly models required queries and commands

API shape (ID/name/category queries, activeOnly filters, existence/count helpers, and CRUD) is coherent and matches the ServiceRepository implementation and domain semantics.

src/Modules/ServiceCatalogs/Domain/Entities/ServiceCategory.cs (1)

9-126: ServiceCategory aggregate invariants and events look solid

Validation rules match ValidationConstants and EF config, state changes are idempotent, and each mutation correctly marks the entity as updated and emits the appropriate domain event. This is a clear and consistent DDD aggregate.

MeAjudaAi.sln (1)

152-168: LGTM! Solution file correctly updated for module rename.

The project references have been properly renamed from Catalogs to ServiceCatalogs across all layers (Domain, Application, Infrastructure, API, Tests) with paths updated accordingly. GUIDs are correctly preserved, ensuring existing project references and build configurations remain intact.

src/Modules/ServiceCatalogs/Domain/Entities/Service.cs (7)

1-7: LGTM! Imports and namespace correctly configured.

The using statements include all necessary dependencies (domain events, exceptions, value objects, shared constants, and domain base classes), and the namespace correctly reflects the renamed ServiceCatalogs module structure.


13-42: LGTM! Well-designed aggregate root with proper encapsulation.

The entity follows DDD best practices:

  • Sealed class prevents inheritance
  • Private setters protect invariants
  • Navigation property supports lazy loading
  • Comprehensive XML documentation

The null! initialization on Line 18 is an acceptable pattern for EF Core compatibility with non-nullable reference types, as the Create factory method ensures proper initialization.


55-76: LGTM! Factory method correctly enforces domain invariants.

The Create method properly:

  • Validates all inputs before construction
  • Initializes with a new ServiceId
  • Sets sensible defaults (IsActive = true)
  • Trims string inputs to prevent whitespace issues
  • Emits ServiceCreatedDomainEvent with both service and category identifiers

81-93: LGTM! Update method follows proper domain patterns.

The method correctly validates inputs, updates properties with trimmed values, marks the entity as updated, and emits the appropriate domain event.


98-112: LGTM! Category change logic is well-implemented.

The method correctly:

  • Validates the new categoryId
  • Avoids no-op changes with early return
  • Stores the old categoryId for the domain event
  • Invalidates the Category navigation property (Line 108) to ensure EF Core reloads it when needed
  • Emits a comprehensive domain event with both old and new identifiers

The comparison on Line 103 could optionally use CategoryId == newCategoryId since ValueObject implements equality, but the explicit .Value comparison is clear and correct.


117-137: LGTM! Activation state management is properly implemented.

Both methods correctly:

  • Use early returns to prevent no-op state changes and duplicate events
  • Update the IsActive flag appropriately
  • Mark the entity as updated
  • Emit the corresponding domain events

The documentation clearly explains the business rules around service deactivation.


139-158: LGTM! Validation logic is thorough and consistent.

The validation methods correctly:

  • Enforce required fields (Name)
  • Validate string lengths after trimming (preventing whitespace padding issues)
  • Check business rules (non-negative DisplayOrder)
  • Use shared validation constants for consistency
  • Provide clear error messages including actual limits
  • Handle optional fields appropriately (Description)

The approach is consistent with the ServiceCategory entity validation pattern.

…uild

Code review fixes:
- Add null/empty guard in ServiceRepository.GetByIdsAsync to prevent NullReferenceException
- Add parameterless constructor to CatalogDomainException for full .NET pattern
- Mark ServiceId as sealed (value object not intended for inheritance)
- Add explicit Npgsql using in ServiceCatalogsDbContextFactory
- Align connection string resolution with DapperConnection (include Postgres:ConnectionString)

Phase 1a preparation:
- Remove Application layer references from Infrastructure project
- Remove Application project reference from Infrastructure.csproj
- Remove command/query handler registrations from Extensions.cs
- Remove Application, API and Tests projects from solution file
- Add note about handlers being added in Phase 1b

Build verified successfully.
@github-actions
Copy link

📊 Code Coverage Report

Coverage: 40.51% (extracted from OpenCover (Direct))

📈 Coverage Details

  • Coverage badges: Coverage
  • Minimum threshold: 70% (warning) / 85% (good)
  • Report format: Auto-detected from OpenCover/Cobertura XML files
  • Coverage source: OpenCover (Direct)

📋 Coverage Analysis

  • Line Coverage: Shows percentage of code lines executed during tests
  • Branch Coverage: Shows percentage of code branches/conditions tested
  • Complexity: Code complexity metrics for maintainability

🎯 Quality Gates

  • Pass: Coverage ≥ 85%
  • ⚠️ Warning: Coverage 70-84%
  • Fail: Coverage < 70%

📁 Artifacts

  • Coverage reports: Available in workflow artifacts
  • Test results: TRX files with detailed test execution data

This comment is updated automatically on each push to track coverage trends.

@frigini frigini merged commit f220dfd into master Nov 19, 2025
6 checks passed
@frigini frigini deleted the rename-servicecatalogs-phase1a branch November 19, 2025 18:02
@coderabbitai coderabbitai bot mentioned this pull request Nov 28, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant