phenix-flights
Multi-solution flights stack: public flights Web API, provider-orchestration API with Galileo/Travelport/Travelfusion/BA/Paxport adapters, configuration API, post-booking UI, SQL database projects and a BA schedule-change AWS lambda.
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, typescript, sql |
| Frameworks | ASP.NET Core 10, ASP.NET MVC (net472), WinForms, SpecFlow, AWS Lambda |
| Runtimes | .NET 10, .NET Framework 4.7.2, Node.js |
| 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 | 12 release pipeline(s): \flights-stream\flights-testharness; \flights-stream\flights\phenix-flights-configuration-api; \flights-stream\flights\phenix-flights-configuration-database; \flights-stream\flights\phenix-flights-database; \flights-stream\flights\phenix-flights-postbooking; \flights-stream\flights\phenix-flights-provider-api; \flights-stream\flights\phenix-flights-provider-britishairways-api; \flights-stream\flights\phenix-flights-provider-paxport-api; \flights-stream\flights\phenix-flights-provider-travelfusion-api; \flights-stream\flights\phenix-flights-provider-travelport-json-api; \flights-stream\flights\phenix-flights-webapi; phenix-flights-provider-mock-api |
| Integration | rest, soap, wcf, redis, redis-streams |
| 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, mail-service, mailtemplate-service
- Speaks WCF (host)
- Shares core database sqlserver:EventLog
Detaches when its pinning dependencies are cut or multi-targeted (application-framework, phenix-feature-service, mail-service, mailtemplate-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
Capability duplication
Part of the Feature flags family (review): Hardcoded company-GUID toggle maps inside the app
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:EventLog: schema changes move in convoy.
- 8 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:EventLog with 13 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
- Feature flags come from phenix-feature-service (WCF-only): flag reads themselves are a legacy dependency to watch
- 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:EventLog is 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.
- Inventory the schema and query surface of sqlserver:Flights, sqlserver:FlightsConfiguration, 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
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-flights to modern .NET
Runs on .NET 10, .NET Framework 4.7.2, Node.js, out of mainstream support. Blocked until stage 2 cuts: application-framework, phenix-feature-service, mail-service, mailtemplate-service. Shares sqlserver:EventLog, so batch it with its database group (stage 4).
Impact: Unblocks 8 dependent system(s)
proposedAssessment notes
phenix-flights
Purpose
The whole Phenix flights domain in one multi-solution repo: WebApi (public search/reserve/filter API), ProviderApi (routes flight operations by fare type to Galileo, Travelport Universal API, in-process Travelfusion or standalone ACL provider APIs for British Airways NDC, Paxport, Travelfusion and Travelport JSON), ConfigurationApi (cache, sales costs/taxes), PostBooking (APIS/additional-information UI), SQL script projects for the Flights and FlightsConfiguration databases, a mock provider API, WinForms test harness, and a TypeScript lambda that feeds BA Order Change Notifications into EventBridge.
Tech stack
Modern core: ~41 projects on .NET 10 (ASP.NET Core, TC.Hosting, TC.FluentResults, Swagger, health checks). Legacy edges: PostBooking is ASP.NET MVC on .NET Framework 4.7.2 with packages.config and Autofac; the domain tests target net462; the test harness is WinForms; contract packages multi-target net462/net472/netstandard2.0. Providers integrate over WCF/SOAP (TC.UniversalAPI, TC.Galileo.Service) and REST/JSON (Travelport JSON, BA NDC). AWS lambdas are TypeScript (webpack, jest). StyleCop/rulesets, Nerdbank versioning, and thorough per-area AGENTS.md context files.
Deployment
Heaviest-released repo in this batch: 12 release pipelines under \flights-stream\ (web API, provider API, four provider ACLs, configuration API, both databases, post-booking, test harness, mock API) from 18 build pipelines. YAML pipelines for every component live at the root, plus dedicated MongoDB script-deployment pipelines (deploy-mongodb-*.yml).
Dependencies
Internal packages map broadly across the estate: TC.ConnectionBroker.* (tc-connectionbroker), TC.Exceptions.* (tc-exceptions), TC.Phenix.ApplicationFramework (application-framework), TC.Phenix.Feature/TC.Cache.Specialised.PhenixFeature (phenix-feature-service), TC.Phenix.User.API.Client (phenix-user-api), TC.UserAccount.ServiceClient (backoffice-useraccount-service), TC.BookingDownload.* (booking-download), TC.Destination.Queries.* (phenix-destination-management), TC.ExchangeRate.ServiceContract (exchange-rate-service), TC.Mail.* (mail-service, mailtemplate-service), TC.Phenix.CompanyInfo (company-info-api), TC.Quote.Api.Client (phenix-quote), TC.Phenix.Tax.* (tax-service), TC.VirtualCreditCard.Api.Client (vcc-service), TC.Documentation.Booking.Contract (backoffice-documentation-booking). External: Travelport/Galileo, Travelfusion, Paxport and British Airways NDC supplier APIs, AWS EventBridge/API Gateway, MongoDB Atlas, New Relic.
Data stores
SQL Server Flights (schedule changes, auditing, ticketing) and FlightsConfiguration, both deployed from script projects in-repo; EventLog via ConnectionBroker; MongoDB for Travelport JSON state (FlightsTravelportJson) and per-service request logging (FlightsWebApi_logs, FlightsProviderApi_logs, etc.); Redis for caching, remote session and TC.Streams.
Integration points
REST between the flights services and consumers (contract/client NuGet packages published per area); SOAP/WCF to Travelport Universal API and Galileo; REST to Travelfusion, Paxport, Travelport JSON and BA NDC; Redis streams (TC.Streams) for events; the BA OCN flow enters via API Gateway → lambda → EventBridge → Web API event processors.
Code health
Strong: 43 test projects (unit, SpecFlow acceptance, jest for lambdas), YAML CI per component, ADRs and unusually good agent/context documentation under Docs/. Actively developed (last commit 2026-07-24). The root README is untouched boilerplate. One oddity: company feature toggles in src/TC.Phenix.FeatureService are hardcoded C# maps, so toggling a feature requires redeploying every consumer.
Modernisation risks
Core services are already .NET 10, so the main risks are the edges: the net472 PostBooking MVC app and WinForms test harness are Windows-bound; WCF/SOAP adapters for Galileo/Universal API pin legacy bindings; the monorepo couples 12 deployables and their contract packages; and hardcoded company toggles make behaviour changes deployment events. Medium priority — modern and well-tested, but big, heavily released and business-critical.