yavsc/src
Paul Schneider 8c47043199 feat(postit): wire Desktop address book to /api/user-search
Replaces the empty ContactService.Desktop stub with a real
implementation backed by UserSearchClient. Closes the loop
between the server-side /api/user-search endpoint (ac9eb2f0),
the client wrapper (633cf5a1), and the platform abstraction.

IContactService gains:
- SearchAsync(string query, CancellationToken): on desktop,
  hits /api/user-search and appends results to an in-memory
  cache. On mobile, throws PlatformNotSupportedException —
  mobile providers use the device-local address book
  (GetDeviceContactsAsync) and don't talk to a network search.
- Contacts (ObservableCollection<ContactDto>): live view of
  the cache; UI binds directly to it. Mobile populates it
  inside GetDeviceContactsAsync (eager load); desktop populates
  it via SearchAsync (lazy, on-demand).

ContactDto shape changes:
- Emails (IReadOnlyList<string>) -> Email (string?). The
  /api/user-search endpoint returns one email per user. The
  use case ('invite / add to a circle') only needs one.
- Mobile provider flattens its per-contact email list down
  to the first non-empty entry (a small functional loss that
  matches the wire shape).

App.axaml.cs constructs a ContactService from the
UserSearchClient singleton and registers it as
IContactService so future ViewModels can take the interface
by constructor injection.

Build + 51/51 tests green. The mobile provider is still
gated by #if ANDROID || IOS and not exercised by the
Desktop test target — runtime behaviour on Android will
need a smoke test on device when PostIt.Android lands.
2026-08-18 00:36:36 +01:00
..
cli WIP audiences 2026-07-12 02:42:13 +01:00
PostIt feat(postit): wire Desktop address book to /api/user-search 2026-08-18 00:36:36 +01:00
PostIt.Tests refactor(model): rename Yavsc.Blogspot.BlogPost to BlogPostDto 2026-08-18 00:20:01 +01:00
Yavsc.Abstract refactor(model): rename Yavsc.Blogspot.BlogPost to BlogPostDto 2026-08-18 00:20:01 +01:00
Yavsc.Api refactor(blogacl): move BlogAcl + Circle controllers from Yavsc.Api to Yavsc.Blogs 2026-08-17 23:34:48 +01:00
Yavsc.Api.Client feat(api-client): add UserSearchClient for /api/user-search 2026-08-18 00:34:29 +01:00
Yavsc.Blogs feat(user-search): add UserSearchApiController in Yavsc.Blogs 2026-08-18 00:20:10 +01:00
Yavsc.Blogs.Tests Fix blog comment endpoint path and add regression test 2026-08-10 21:48:03 +01:00
Yavsc.Org Add comments API support and tests 2026-08-10 22:27:52 +01:00
Yavsc.Org.Tests Add comments API support and tests 2026-08-10 22:27:52 +01:00
Yavsc.Server fix(billing): tolerate ReflectionTypeLoadException during init 2026-08-16 16:35:05 +01:00
Yavsc.Tests.Shared tests: configure static fixture ports and update org test config 2026-07-12 05:48:47 +01:00