feat: F-037 provider showcase — photo, logo, portfolio, QR code - #179
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… layout Route builders, wire models, error mapping and EN/es-MX copy for the provider showcase and media routes, with the Maui-free pieces tested. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ing, messages, dashboard and profile Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s clauses Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nk button Gender-neutral copy guard, icon-only button descriptions, pinned showcase actions, and view-model tests for the directory, message, dashboard and profile entry points. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Blob-backed media pipeline (re-encode to JPEG, header-checked limits), authenticated media route, showcase read/write handlers, anonymous /go store redirect, reports, customer hide, operator takedown, erasure of showcase rows and blobs, hourly detached-media sweep. Gateway allowlist rows for /showcase, /media and /go; Azure Storage (Azurite locally) in the AppHost. Unit, integration, OpenAPI and Bruno updated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Multi-photo add silently added nothing on iOS: MediaPicker's MaximumWidth/
MaximumHeight route every result through MAUI's compression inside an async
callback that swallows a failure without completing the pick. The picker now
returns originals and EncodeAsync downsizes them itself.
- Sign-out left every tab's pushed pages in place, so the next account on the
device opened More onto the previous account's Profile (email, avatar,
provider rows). UpdateForRoleAsync, the one step every sign-in passes
through, now pops every tab to its root first.
- "Tu código: {0}" rendered its placeholder literally through x:Static;
StaticStringPlaceholderTest now fails on any format placeholder in a string
a view binds statically.
- Mi vitrina: edit buttons stacked (Spanish labels truncated at half width),
code label hidden with a hint until a code exists; share-format buttons no
longer clip "Publicación".
- CLAUDE.md test counts: 1339 backend, 448 integration, 1305 mobile.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ogdevlabs
marked this pull request as ready for review
September 30, 2026 22:06
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
F-037 — Provider Showcase ("Mi vitrina")
A provider photo, a logo, a portfolio of up to 20 images, and a shareable QR code, all served by the Provider service.
Backend
AgendaBuddy.Library/Showcase/+Media/, handlers inAgendaBuddy.Provider.Core/Showcase/, routes inShowcase/Media/GoModule.cs. New Gateway allowlist rows:/api/v1/showcase,/api/v1/media,/api/v1/go./api/v1/go/{code}is the only anonymous route (ADR-070). Known, unknown and malformed codes get identical answers; it redirects only to anhttpsstore URL and keeps an anonymous per-platform counter.MediaSweepercleans up detached uploads.AddAzureStorage("storage").AddBlobs("media")— Azurite locally, managed identity in the cloud.Mobile
Checked by hand on the iOS simulator
Every flow above except the camera QR scan, which the simulator cannot do. Defects found and fixed in
22d5d36:MaximumWidth/MaximumHeightswallow a compression failure without completing the pick. The picker now returns originals, and the app resizes them itself.SignInResetsTabStacksTest.{0}rendered throughx:Static, now guarded byStaticStringPlaceholderTest. Two Spanish labels were truncated.Gates (local)
MobileWorkloads=false)dotnet format --verify-no-changesnet10.0-androidbuilddotnet list package --vulnerableBefore release
deploy.ymlwithprovision: true(new storage account).Showcase:Go:AppStoreUrl,Showcase:Go:PlayStoreUrl,Showcase:ReportEmail.🤖 Generated with Claude Code