Platform Evolution
Assessment run-2026-07-27-1 · 213 of 213 repos assessed
Repos / phenix-reviews

phenix-reviews

Accommodation reviews platform monorepo: a .NET 8 REST API strangling a legacy .NET Framework WCF reviews service, plus the Reviews database project and a WinForms review-shell management tool.

35 · redmediumkernelOn-premZDD: not applicableapisecrets in source

Health score

35

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
0
.NET Framework, out of mainstream support
Legacy transport / 15
2
Hosts WCF or SOAP endpoints with no successor on modern .NET
Test posture / 15
15
Good test coverage
Security hygiene / 15
0
Credentials or keys committed to source
Dangerous coupling / 15
3
shares a core database (sqlserver:EventLog); depends on pinning component(s): application-framework, phenix-feature-service
Activity / 10
10
Actively maintained
Deployment hygiene / 5
5
CI in place
Health over time
2026-07-24 (run-2026-07-24-1): 352026-07-27 (run-2026-07-27-1): 35
No change since 2026-07-24 (35 to 35).

Facts

Languagescsharp, sql
FrameworksASP.NET Core 8, WCF, WinForms, MediatR, Dapper
Runtimes.NET 8, .NET Framework 4.7.2, .NET Framework 4.6.2
Tests / CIgood / CI in place
Last commit2026-04-17
OwnerOwner unknown (mapping to be curated)
DomainContent and destinations (system generated; curate in repo-owners.json to override)
Product areaPhenix
HostedOn-prem Deployed to our own machines
  • Release "\commercial\reviews\phenix-reviews-api": Production: deployment-group phase (agents on our own machines)
  • Release "\commercial\reviews\phenix-reviews-api": Training: deployment-group phase (agents on our own machines)
  • Release "\commercial\reviews\phenix-reviews-api": DR: deployment-group phase (agents on our own machines)
  • Release "\commercial\reviews\phenix-reviews-api": QA: deployment-group phase (agents on our own machines)
  • Release "\commercial\reviews\phenix-reviews-api": Staging: deployment-group phase (agents on our own machines)
Releases5 release pipeline(s): \commercial\reviews\phenix-reviews-api; \commercial\reviews\phenix-reviews-database; \commercial\reviews\phenix-reviews-reviewshellmanager; \commercial\reviews\phenix-reviews-service; \commercial\reviews\phenix-reviews-ui DEPRECATED
Integrationrest, wcf, redis-streams, graphql
SourceOpen in Azure DevOps

Dependencies in context

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

Entanglement

kernel Bound into the core by 3 mechanism(s).

Detaches when its pinning dependencies are cut or multi-targeted (application-framework, phenix-feature-service); and when its WCF surface gains a modern interface or its WCF calls move to one; and when the shared database group it belongs to gains an owned API or completes schema separation (sqlserver:EventLog).

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. Desktop application distributed to user machines; server-side ZDD does not apply.

SQL Server exit

Blocked by a shared core database

sqlserver:Reviews, sqlserver:EventLog are shared, so this system cannot change engine on its own: every sharer moves in convoy. The stage 4 work (named owner, declarative schema, owned API) has to land first; after that, the steps below apply to whatever slice this system ends up owning.

Blockers
Steps
  1. Inventory the schema and query surface of sqlserver:Reviews, sqlserver:EventLog: tables, stored procedures, triggers, cross-database joins and anything else engine-specific.
  2. Confirm the target: PostgreSQL (relational model; keep transactions and joins, swap the engine).
  3. Replatform to modern .NET first (see the recommended actions): current PostgreSQL and MongoDB drivers and EF Core providers target modern .NET, and doing one risky change at a time is cheaper than doing two.
  4. Data access is not through an ORM, so port the SQL by hand: translate T-SQL constructs, replace stored procedures with application code or target-native equivalents, and add integration tests around the queries that matter first.
  5. Stand up the target alongside SQL Server, backfill with an ETL pass (pgloader or an export/import job), then dual-write or replicate until parity is proven.
  6. Move reads to the target, watch correctness and latency, then cut writes over and keep SQL Server read-only until confidence is earned.
  7. Decommission the SQL Server database and remove the connection strings and firewall paths that pointed at it.

Containerisation

Not appropriate

This is a desktop application distributed to user machines; containers do not apply. Its modernisation path is replacement by a web application, not containerisation.

Recommended actions

Rotate the credentials committed to phenix-reviews

Risk flags indicate credentials or keys in source (plaintext-credentials). 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

Replatform phenix-reviews to modern .NET

Runs on .NET 8, .NET Framework 4.7.2, .NET Framework 4.6.2, out of mainstream support. Blocked until stage 2 cuts: application-framework, phenix-feature-service. Shares sqlserver:EventLog, so batch it with its database group (stage 4).

Impact: Unblocks 1 dependent system(s)

proposed

Assessment notes

phenix-reviews

Purpose

Monorepo for the Phenix accommodation reviews platform. It contains five deployables: Reviews.Api (modern REST API), TC.Service.Reviews (legacy IIS-hosted WCF service), ReviewsDatabase (SQL project), TC.ServiceContract.Reviews (shared contract NuGet) and ReviewShellManager (WinForms admin tool). The README describes an explicit Strangler Fig migration from the WCF service to the API.

Tech stack

Reviews.Api is ASP.NET Core on .NET 8 with CQRS/MediatR, Dapper, a Redis Streams reader (TC.Streams.Provider.Redis) and central package management (Directory.Packages.props). The WCF service and its IIS host target .NET Framework 4.7.2; ReviewShellManager is a .NET Framework 4.6.2 WinForms app with packages.config. The service contract multi-targets net462/net472/net8.0.

Deployment

Five release pipelines under \commercial\reviews\ (api, database, reviewshellmanager, service, and a DEPRECATED ui), release_count 5, each fed by its own build pipeline with azure-pipelines.yml per component in the repo. No reviews UI code remains in the repo — the phenix-reviews-ui pipeline is deprecated.

Dependencies

Internal packages: TC.ConnectionBroker suite (Sql, Redis, Wcf, Api), TC.Exceptions, TC.Phenix.ApplicationFramework, TC.Phenix.Feature, TC.Phenix.ServiceManagement, TC.Phenix.User, TC.Phenix.CompanyInfo, TC.Destination.Management.GraphQL.Client, TC.ContactCentre.ServiceClient, TC.UserAccount.ServiceClient, TC.Cache and TC.Streams. External: AWS Cognito auth client.

Data stores

Owns the Reviews SQL Server database (dedicated sqlproj and release pipeline). ReviewShellManager configs also connect to the shared EventLog database. Redis is used for streams-based event integration (ReviewShellUpdated events) and caching.

Integration points

Inbound REST (versioned ASP.NET Core API) and legacy WCF (basicHttp/wsHttp/netTcp bindings). Consumes Redis Streams events, calls destination management over GraphQL and the contact-centre/user-account services over WCF/SOAP.

Code health

Five test projects across the API, contract and WCF service — good coverage for the estate. Thorough, current README with architecture docs; stylecop and rulesets enforced. Active development (last commit 2026-04-17). ReviewShellManager App*.config files contain plaintext SQL credentials for several environments, including preproduction.

Modernisation risks

The strangler migration is incomplete, so a .NET Framework 4.7.2 WCF service and a 4.6.2 WinForms thick client remain in production alongside the .NET 8 API. Plaintext credentials in per-environment configs need moving to a secret store. Priority medium: the modern API is in good shape, but the legacy halves keep the WCF and desktop deployment burden alive.