Platform Evolution
Assessment run-2026-07-27-1 · 213 of 213 repos assessed
Repos / crm-reporting-api

crm-reporting-api

ASP.NET Core API exposing CRM reporting data (corporate leads / prospective email-domain lookups) from a replicated Dynamics CRM reporting database in Azure SQL.

46 · redhighlooseOn-premZDD: not applicableapidormantsecrets in source

Health score

46

0 to 100 across seven weighted factors; nothing is hidden. Green is 75 and above, amber 50 to 74, red below 50. How scoring works.


Runtime currency / 25
4
End-of-life runtime outside .NET Framework
Legacy transport / 15
15
No legacy WCF or SOAP surface
Test posture / 15
8
Some tests, coverage is thin
Security hygiene / 15
0
Credentials or keys committed to source
Dangerous coupling / 15
15
No dangerous coupling detected
Activity / 10
0
Dormant: no meaningful change for two years or more while still deployed
Deployment hygiene / 5
5
CI in place
Health over time
2026-07-24 (run-2026-07-24-1): 462026-07-27 (run-2026-07-27-1): 46
No change since 2026-07-24 (46 to 46).

Facts

Languagescsharp
FrameworksASP.NET Core 2.2, Entity Framework Core 2.2, MediatR 7
Runtimes.NET Core 2.2
Tests / CIsome / CI in place
Last commit2019-12-05
OwnerOwner unknown (mapping to be curated)
DomainContact centre and CRM (system generated; curate in repo-owners.json to override)
Product areaShared platform
HostedOn-prem Deployed to our own machines
  • Release "\crm-reporting-api\crm-reporting-api": QA: deployment-group phase (agents on our own machines)
  • Release "\crm-reporting-api\crm-reporting-api": Staging: deployment-group phase (agents on our own machines)
  • Release "\crm-reporting-api\crm-reporting-api": Production: deployment-group phase (agents on our own machines)
  • Release "\crm-reporting-api\crm-reporting-api": Training: deployment-group phase (agents on our own machines)
  • Release "\crm-reporting-api\crm-reporting-api": DR: deployment-group phase (agents on our own machines)
Releases1 release pipeline(s): \crm-reporting-api\crm-reporting-api
Integrationrest
SourceOpen in Azure DevOps

Risk flags

Each flag links to its glossary definition.

Dependencies in context

Laying out the graph…
greenamberreddata store (square, dashed link)Node size follows fan-in. Click any node to open it.

Entanglement

loose No binding mechanisms apply: this system needs no untangling work.

    Depends on / used by

    Depends on (1)
    Used by (0)
    No internal dependents.

    Data stores
    sqlserver:crmreporting (Azure SQL, aznesqlrecruitmentprod)

    Migration playbooks

    Generated from this repo's assessment data: what is feasible, what blocks it, and the steps in order. Ratings: green means actionable now, amber means sequence other work first, red means blocked, grey means not applicable.

    ZDD adoption

    Not applicable

    Not a deployed service (libraries, database definitions, desktop apps) or a retirement candidate not worth the investment. Retirement or consolidation candidate; do not invest in ZDD adoption.

    SQL Server exit

    Retire instead

    This repo is a retirement or consolidation candidate. Do not invest in a database migration; execute the retirement and the SQL Server dependency disappears with it.

    Containerisation

    Retire instead

    This repo is a retirement or consolidation candidate; containerising it would be investment in something we intend to switch off.

    Recommended actions

    Rotate the credentials committed to crm-reporting-api

    Risk flags indicate credentials or keys in source (secrets-in-source). Rotate now and enable secret scanning in CI; this is independent of all other work.

    Impact: Closes a live security exposure at near-zero cost

    proposed

    Review crm-reporting-api for retirement

    Dormant (last commit 2019-12-05) yet still release-linked, and nothing depends on it. Confirm remaining use, then retire and disarm its pipeline.

    Impact: Shrinks the estate before the expensive work begins

    proposed

    Assessment notes

    crm-reporting-api

    Purpose

    A small read-only REST API over a CRM reporting database. The single controller (CorporateLeadsController) answers queries such as whether a prospective email domain already exists among CRM accounts/contacts/leads — used for corporate-lead qualification. The DAL is an EF Core scaffold of Dynamics CRM-shaped tables (Account, Contact, Lead, BusinessUnit, etc.).

    Tech stack

    C# on .NET Core 2.2 (ASP.NET Core, Microsoft.AspNetCore.App), MediatR query handlers, EF Core 2.2 SqlServer provider, TC.Swagger.Versioning, TC.Exceptions.WebApiClient.Middleware, health checks (URIs + EF Core). SDK-style projects with Directory.Build.props, StyleCop/Sonar/FxCop analyzers.

    Deployment

    Included as a prod application with 1 release; build pipeline crm-reporting-api CI using the shared azure-pipelines-templates dotnet-core job, release pipeline \crm-reporting-api\crm-reporting-api. Per-environment appsettings for qa, datafixqa, liveproviderqa, preproduction, training, live.

    Dependencies

    Internal: exception reporting posts to the webapi-exceptions service via TC.Exceptions middleware; builds on shared TC.Swagger.Versioning packaging. External: the underlying data originates from Dynamics CRM (replicated into the reporting database); no direct calls to other TC services.

    Data stores

    sqlserver:crmreporting on the Azure SQL server aznesqlrecruitmentprod.database.windows.net (sandbox catalog crmreportingsandbox in dev). Note: SQL credentials, including the live password, are committed in appsettings*.json.

    Integration points

    REST/JSON API with Swagger; health-check endpoints. Read-only SQL access via EF Core; no message bus.

    Code health

    Unit tests for the query handler plus a SpecFlow/xUnit integration-test project — reasonable for its size. CI via shared templates. Last commit 2019-12-05: dormant for over six years.

    Modernisation risks

    .NET Core 2.2 has been end-of-life since December 2019 (eol-runtime, legacy-framework). Plain-text production credentials in source are a security exposure (secrets-in-source). Long dormancy suggests it should be verified as still needed; if so, a lift to .NET 8 with secrets moved to a vault is straightforward given the tiny surface area.