Platform Evolution
Assessment run-2026-07-27-1 · 213 of 213 repos assessed
Repos / tc-gift-registry

tc-gift-registry

ASP.NET Core 8 API for creating and managing gift-collection accounts (honeymoon funds, group bookings, gift registries), replacing the legacy honeymoon booking system.

87 · greenlowkernelAWS + on-premZDD: no excuseapi

Health score

87

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
25
Runs on supported modern .NET
Legacy transport / 15
6
Calls at least one legacy WCF endpoint
Test posture / 15
15
Good test coverage
Security hygiene / 15
15
No credentials found in source
Dangerous coupling / 15
11
depends on pinning component(s): mailtemplate-service, application-framework
Activity / 10
10
Actively maintained
Deployment hygiene / 5
5
CI in place
Health over time
2026-07-24 (run-2026-07-24-1): 872026-07-27 (run-2026-07-27-1): 87
No change since 2026-07-24 (87 to 87).

Facts

Languagescsharp
FrameworksASP.NET Core 8, FluentValidation 12, Serilog, Mediator 3, GraphQL.Client 6, Swashbuckle/NSwag
Runtimes.NET 8
Tests / CIgood / CI in place
Last commit2026-07-08
OwnerOwner unknown (mapping to be curated)
DomainPublic web (system generated; curate in repo-owners.json to override)
Product areaShared platform
HostedAWS + on-prem Ships artefacts to both AWS and on-prem machines (see evidence below)
  • Release "\finance\tc-gift-registry\tc-gift-registry-api on-prem": QA: deployment-group phase (agents on our own machines)
  • Release "\finance\tc-gift-registry\tc-gift-registry-api on-prem": Staging: deployment-group phase (agents on our own machines)
  • Release "\finance\tc-gift-registry\tc-gift-registry-api on-prem": Production: deployment-group phase (agents on our own machines)
  • Release "\finance\tc-gift-registry\tc-gift-registry-api on-prem": Training: deployment-group phase (agents on our own machines)
  • Release "\finance\tc-gift-registry\tc-gift-registry-api on-prem": DR: deployment-group phase (agents on our own machines)
Releases1 release pipeline(s): \finance\tc-gift-registry\tc-gift-registry-api on-prem
Integrationrest, graphql, jwt, wcf
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

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

Detaches when its pinning dependencies are cut or multi-targeted (mailtemplate-service, application-framework); and when its WCF surface gains a modern interface or its WCF calls move to one.

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

No excuse

Nothing technical is holding this repo on the three-week release. It either already deploys without downtime (AWS) or is a modern, well-tested service the automated stealth path can carry today. Already deploys as a container to AWS, which releases without downtime today. Some artefacts still deploy on-prem; they follow the on-prem path. Separating it from the three-week release is a process decision, not a technical one.

Dependencies and gotchas
  • 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
  • Consumes WCF contract packages: never take a breaking client bump mid-feature, and treat obsolete warnings as migration debt
Steps
  1. Adopt the four-stage discipline from the ZDD engineering standard: pre-deployment compatibility, deployment, feature activation behind a flag, post-release cleanup.
  2. 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.
  3. Audit serialized data: anything in Redis, queues or shared caches must deserialize cleanly across adjacent versions.
  4. Wrap behaviour changes in feature flags so code deploys dark and release becomes a business decision, not a deployment event.
  5. 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).
  6. 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 database

sqlserver:CustomerPortal is shared, so this system cannot change engine on its own: every sharer moves in convoy. Either agree the move with all sharers as one programme, or first split this system's data out behind an owned API, then follow the steps below.

Blockers
Steps
  1. Inventory the schema and query surface of sqlserver:CustomerPortal: 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. 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.
  4. 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.
  5. Move reads to the target, watch correctness and latency, then cut writes over and keep SQL Server read-only until confidence is earned.
  6. Decommission the SQL Server database and remove the connection strings and firewall paths that pointed at it.

Containerisation

Partially containerised

Part of this repo already builds containers for AWS while other artefacts still deploy to on-prem machines. Finish the job by moving the remaining artefacts (see the hosting evidence on this page) through the same pipeline template.

Steps
  1. Identify the artefacts still deploying through deployment-group release pipelines (listed in the hosting evidence).
  2. Move each to the shared ci.yml pipeline template with the container parameters, as the already-containerised artefacts in this repo do.
  3. Disarm the old release pipelines once traffic is confirmed on the new deployment.

Recommended actions

No specific actions for this repo. It either needs only normal maintenance, or its work is covered by an estate-level action. See the full programme.

Assessment notes

tc-gift-registry

Purpose

Gift Registry replaces the legacy "honeymoon" booking system with an extensible platform for collection accounts of three types (Honeymoon, Group Booking, Gift Registry), where friends and family contribute funds towards a customer's travel. Creating a registry provisions a miscellaneous booking component against a Phenix Group Supplier; the API also migrates legacy honeymoon bookings and sends contribution notification emails.

Tech stack

C# on .NET 8 with a layered solution (API, API.AWS, Application, Common, DataAccess, AccountsGraphQLIntegration, Honeymoon.Database, Permissions.ApiClient, published API.Client). Asp.Versioning, FluentValidation 12, Mediator source generator, Serilog, Swashbuckle plus an NSwag-generated client, PhenixAuth/Phenix.Auth.JWTBearer and TC.Cognito auth, TC.ConnectionBroker (Api/HttpClient/Mongo/Sql/Wcf), Nerdbank GitVersioning.

Deployment

Included as prod_application with 1 release: release pipeline \finance\tc-gift-registry\tc-gift-registry-api on-prem from build tc-gift-registry. YAML CI uses the shared InternalOSS/azure-pipelines-templates (SDK 8.x) building the API app and packing the client package; a second azure-pipelines-aws.yml plus a dedicated TC.GiftRegistry.API.AWS host indicates a parallel AWS/container deployment path. Per-environment appsettings (testqa, qa, preproduction, production, live, training, datafixqa).

Dependencies

Internal: TC.ConnectionBroker.* (tc-connectionbroker), TC.Exceptions.WebApiClient (webapi-exceptions), TC.Mail.Template.ServiceContract (mailtemplate-service), TC.Phenix.User.API.Client (phenix-user-api), TC.Teams.API.Client (teams-service), TC.Permissions.Api.Client (tc-permissions-api), TC.ExchangeRate.ServiceContract (exchange-rate-service), TC.UserAccount.ServiceClient (backoffice-useraccount-service), TC.Phenix.ApplicationFramework (application-framework), plus the TC Accounts GraphQL API for Phenix booking lookups and TC.Phenix.Services.Client/TC.Public.Assets.Api.Client (source repos not confirmed). External: AWS Cognito auth, New Relic APM.

Data stores

Owns the GiftRegistry MongoDB database (Account, EmailAudit, RequestLogs collections via ConnectionBroker Mongo). Also reads the legacy dbo.HoneymoonAccount table from the SQL Server CustomerPortal database (via ConnectionBroker) for legacy honeymoon migration.

Integration points

REST/JSON API (versioned, Swagger, generated NSwag client) secured with PhenixAuth JWT and Cognito; outbound GraphQL to the Accounts API; outbound WCF (ConnectionBroker.Wcf) to the mail-template service for notification emails.

Code health

Good: five xunit.v3 test projects with ~277 tests across API, AWS host, Application, Common and Permissions layers; coverlet coverage; a substantive, maintained README covering supplier configuration. Actively developed (last commit 2026-07-08).

Modernisation risks

Low — modern .NET 8, YAML CI and solid tests. Residual concerns: the WCF client dependency on the legacy mail-template service, a read dependency on the legacy CustomerPortal SQL database that must persist until honeymoon migration completes, and dual on-prem/AWS hosting paths that double the deployment surface.