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.
Health score
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.
Facts
| Languages | csharp, sql |
| Frameworks | ASP.NET Core 8, WCF, WinForms, MediatR, Dapper |
| Runtimes | .NET 8, .NET Framework 4.7.2, .NET Framework 4.6.2 |
| Tests / CI | good / CI in place |
| Last commit | 2026-04-17 |
| Owner | Owner unknown (mapping to be curated) |
| Domain | Content and destinations (system generated; curate in repo-owners.json to override) |
| Product area | Phenix |
| Hosted | On-prem Deployed to our own machines
|
| Releases | 5 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 |
| Integration | rest, wcf, redis-streams, graphql |
| Source | Open in Azure DevOps |
Risk flags
Each flag links to its glossary definition.
Dependencies in context
Entanglement
kernel Bound into the core by 3 mechanism(s).
- Pinning dependency: application-framework, phenix-feature-service
- Speaks WCF (host)
- Shares core database sqlserver:EventLog
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).
Depends on / used by
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 applicableNot 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 databasesqlserver: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.
- sqlserver:Reviews is shared with 1 other system(s)
- sqlserver:EventLog is shared with 13 other system(s) and is a core database
- Inventory the schema and query surface of sqlserver:Reviews, sqlserver:EventLog: tables, stored procedures, triggers, cross-database joins and anything else engine-specific.
- Confirm the target: PostgreSQL (relational model; keep transactions and joins, swap the engine).
- 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.
- 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.
- 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.
- Move reads to the target, watch correctness and latency, then cut writes over and keep SQL Server read-only until confidence is earned.
- Decommission the SQL Server database and remove the connection strings and firewall paths that pointed at it.
Containerisation
Not appropriateThis 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
proposedReplatform 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)
proposedAssessment 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.