feat(sharing): name a record's owner in full to whoever they share with

The switcher and the banner named a shared record's owner by their greeting
name — the value they typed at onboarding for "how should HealthLog address
you". When an owner has set a full name, that is what a delegate should see:
entering somebody's record, you read whose it is by who they are.

- the account-access resolver publishes the owner's `fullName` alongside the
  greeting name and the username
- `accountLabel` prefers fullName, then displayName, then username. Optional
  on the argument so the grant-view and actor shapes that never carried it
  keep the old two-field behaviour untouched
- the closed presentation schema carries `fullName` and its parity matcher
  compares it, so the two published views of the active record cannot name
  the same owner differently
- the OpenAPI contract regenerates with the additive field

This deliberately discloses the owner's full name to every delegate, read-only
included — it was patient-identity data behind a MANAGE-gated export until now.
That is the intended behaviour, documented at `accountLabel` so it is not
mistaken for a leak and tightened back. The resolver, the schema parity, the
label fallback and a read-only delegate's banner are each pinned by a test.
This commit is contained in:
Marc-André Bombeck committed 2026-08-08 16:07:25 +02:00
1 parent 73ea1b03f3
commit e33700c7a9
20 files changed
+202 -13

No files matched your search

+10
View File
@@ -38831,6 +38831,10 @@ components:
anyOf:
- type: string
- type: "null"
fullName:
anyOf:
- type: string
- type: "null"
access:
type: string
enum:
@@ -38868,6 +38872,7 @@ components:
- accountId
- username
- displayName
- fullName
- access
- level
- recordKind
@@ -38888,6 +38893,10 @@ components:
anyOf:
- type: string
- type: "null"
fullName:
anyOf:
- type: string
- type: "null"
access:
type: string
enum:
@@ -38925,6 +38934,7 @@ components:
- accountId
- username
- displayName
- fullName
- access
- level
- recordKind