phenix-accommodation
Monorepo for the Phenix accommodation product: search/booking APIs, supplier anti-corruption-layer APIs for ~20 hotel suppliers, configuration service and database, hotel-sweep worker and agent-facing UI.
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, javascript, sql |
| Frameworks | ASP.NET Core (net10.0), ASP.NET MVC (.NET Framework), WCF, MassTransit, gulp/sass |
| Runtimes | .NET 10, .NET Framework 4.8.1, .NET Framework 4.7.2 |
| Tests / CI | good / CI in place |
| Last commit | 2026-07-24 |
| Owner | Owner unknown (mapping to be curated) |
| Domain | Selling and quoting (system generated; curate in repo-owners.json to override) |
| Product area | Phenix |
| Hosted | AWS + on-prem Ships artefacts to both AWS and on-prem machines (see evidence below)
|
| Releases | 9 release pipeline(s): \commercial\accommodation\accommodation-acl-swapsystems-api; \commercial\accommodation\accommodation-api; \commercial\accommodation\accommodation-api v2; \commercial\accommodation\accommodation-configuration-api; \commercial\accommodation\accommodation-hotelsweep-api; \commercial\accommodation\accommodation-service-consumer-api; \commercial\accommodation\phenix-accommodation-ui; \commercial\acommodation-configuration\accommodation-configuration-db; \commercial\acommodation-configuration\accommodation-configuration-service |
| Integration | rest, wcf, masstransit, sqs, redis |
| Source | Open in Azure DevOps |
Risk flags
Each flag links to its glossary definition.
Dependencies in context
Entanglement
kernel Bound into the core by 2 mechanism(s).
- Speaks WCF (host)
- Shares core database sqlserver:Phenix
Detaches 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:Phenix).
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
A long roadTechnically eligible one day, but the blockers are structural: hosted WCF or SOAP contracts that cannot run two versions at once, or heavy legacy coupling. Sequence the modernisation work first. Hosts WCF or SOAP endpoints: strict serialization contracts cannot safely run two versions at once (the shared-enum trap). End-of-life runtime compounds the work. Shares sqlserver:Phenix: schema changes move in convoy.
- 1 system(s) depend on this repo; during a rolling deploy they will talk to old and new versions at once, so responses must stay compatible
- Shares sqlserver:Phenix with 21 system(s): destructive schema change is prohibited in a single release; expand and contract only
- Serialized state or messages in flight (Redis or queues): new code must deserialize objects written by the previous version
- Adopt the four-stage discipline from the ZDD engineering standard: pre-deployment compatibility, deployment, feature activation behind a flag, post-release cleanup.
- Make every change dual-version safe: backwards-compatible APIs (new major version for breaking wire changes), expand and contract for any schema change, and consumers tolerant of unknown fields.
- Audit serialized data: anything in Redis, queues or shared caches must deserialize cleanly across adjacent versions.
- Wrap behaviour changes in feature flags so code deploys dark and release becomes a business decision, not a deployment event.
- Route deployments through the Workflow Engine's automated drain, deploy, health-check, return cycle (the path proven by the first automated production run in mid-2026).
- Verify with area-scoped regression rather than the whole-platform cycle, and watch error rates after rollout with automated rollback on alert.
SQL Server exit
Blocked by a shared core databasesqlserver:Phenix, sqlserver:HotelsDesertAdventures 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:Phenix is shared with 21 other system(s) and is a core database
- sqlserver:HotelsDesertAdventures is shared with 1 other system(s)
- Inventory the schema and query surface of sqlserver:Phenix, sqlserver:AccommodationConfiguration, sqlserver:HotelsDesertAdventures: 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
Feasible after replatformingAppropriate eventually, but not from here: the legacy runtime and the hosted WCF surface both have to go first, and that work is already in this repo's recommended actions.
- .NET Framework only runs on Windows; practical (Linux) containers need modern .NET
- Hosts WCF or SOAP endpoints, which have no home on modern .NET; consumers need a modern interface first
- Replatform to modern .NET first (see the recommended actions), replacing the hosted WCF/SOAP surface with REST, gRPC or messaging so consumers can follow. Containerising then becomes routine.
- Add a Dockerfile and make the app read all configuration from environment variables and the secrets manager, never from machine-local files.
- Log to stdout and expose a health check endpoint so ECS can supervise it.
- Adopt the shared ci.yml pipeline template with the container parameters (awsRegion, containerAfterBuild, ecsTerraformRepo), which is exactly how the estate's existing AWS services deploy.
- Define the service in the Terraform repo, deploy to a non-production environment, then shift traffic and disarm the deployment-group release pipeline.
Recommended actions
Replatform phenix-accommodation to modern .NET
Runs on .NET 10, .NET Framework 4.8.1, .NET Framework 4.7.2, out of mainstream support. No pinning dependency blocks it; sequence by fan-in (providers before consumers). Shares sqlserver:Phenix, so batch it with its database group (stage 4).
Impact: Unblocks 1 dependent system(s)
proposedAssessment notes
phenix-accommodation
Purpose
Commercial-stream monorepo for everything accommodation in Phenix: core accommodation and V2 search/booking APIs, per-supplier ACL APIs (Expedia, DerbySoft, WebBeds, Travelgate, Hilton, SynXis and ~15 more), configuration API/WCF service/database, hotel-sweep worker, room-type mapping (Gimmonix), back-office integration and the agent-facing accommodation UI.
Tech stack
Predominantly modern C# on .NET 10 (130+ projects) with a legacy tail on .NET Framework 4.8.1/4.7.2 (configuration service host, UI web project, back-office integration). Central package management (Directory.Packages.props), StyleCop/rulesets, MongoDB driver, StackExchange.Redis, MassTransit over Amazon SQS, OpenTelemetry. UI assets built with gulp/sass and TC's shared style packages.
Deployment
Heaviest repo in scope: 11 build pipelines and 9 release pipelines (release_count 9) covering the API, V2 API, ACL swapsystems API, configuration API/DB/service, hotel-sweep API, consumer and UI. Per-component build-*.yml files use shared InternalOSS/azure-pipelines-templates.
Dependencies
Internal: TC.ConnectionBroker.* (tc-connectionbroker) for SQL/Mongo/Redis/AWS connections; the DirectStock ACL fronts the internal direct-stock system; reads/writes the shared Phenix database owned by phenix-database. Also many shared TC packages (TC.Cache., TC.ApiTools., TC.BuildingBlocks, TC.Cognito.Auth.Client). External: ~20 third-party hotel suppliers plus Gimmonix room-type mapping.
Data stores
Shared Phenix SQL Server database, dedicated AccommodationConfiguration and HotelsDesertAdventures SQL databases, an Accommodation MongoDB database (recent searches, request/response logging) and Redis caching.
Integration points
Inbound REST APIs; legacy WCF configuration service; MassTransit messaging over Amazon SQS; Redis cache; outbound REST/SOAP/OTA calls to supplier APIs.
Code health
Strong: ~55 test directories, dedicated fast/coverage test scripts, Testcontainers usage, code-coverage runsettings, and very active development (last commit 2026-07-24). CI fully in-repo.
Modernisation risks
Mixed runtimes: most code is on .NET 10 but the configuration service host, UI web layer and back-office integration remain on .NET Framework 4.7.2–4.8.1 with WCF. Shared Phenix database couples it to the wider estate. Sheer size (166 MB, 20 sub-systems, 11 pipelines) makes changes and ownership harder; memory-analysis reports in the repo indicate known runtime issues under investigation.