Skip to content
Draft
Show file tree
Hide file tree
Changes from 199 commits
Commits
Show all changes
494 commits
Select commit Hold shift + click to select a range
f05507a
fix(docs): mobile font sizes, author image fill, hero-to-stats gap
iammukeshm Mar 27, 2026
a2dd020
feat(docs): upgrade hero eyebrow to interactive pill badge
iammukeshm Mar 27, 2026
c4c3b43
fix(docs): constrain author card width for better proportions
iammukeshm Mar 27, 2026
e0b031a
fix(docs): widen author image column to 340px, card to 56rem max
iammukeshm Mar 27, 2026
6dee763
fix(docs): force author image to fill cover with absolute positioning
iammukeshm Mar 27, 2026
afbb9e7
fix(docs): force author image fill with fixed grid column and absolut…
iammukeshm Mar 27, 2026
5e5b21e
fix(docs): force author image fill via inline style attribute
iammukeshm Mar 27, 2026
4b35e2c
fix(docs): disable Astro dev toolbar to suppress aria-query audit error
iammukeshm Mar 27, 2026
fcbe305
fix(build): update slnx to reference renamed FSH.Api project
iammukeshm Mar 27, 2026
f3bc238
feat(infra): move terraform to deploy/, fix bugs, production-grade ha…
iammukeshm Mar 27, 2026
4f41531
refactor: rename Playground.Api to FSH.Api, modernize Aspire setup
iammukeshm Mar 27, 2026
ff88424
fix(build): remove uncommitted Integration.Tests from slnx
iammukeshm Mar 27, 2026
a631f8b
feat(tests): add production-grade integration tests with Testcontainers
iammukeshm Apr 3, 2026
e12336b
fix(blazor): prevent token refresh loop with proactive JWT renewal (#…
iammukeshm Apr 3, 2026
b6627e2
fix(build): add domain event handlers to satisfy Mediator source gene…
iammukeshm Apr 3, 2026
aee5943
test(auth): add token expiry and refresh rotation tests
iammukeshm Apr 3, 2026
12c47a5
fix: move Hangfire stale lock cleanup to hosted service, harden tenan…
iammukeshm Apr 3, 2026
836b1c1
fix(build): suppress CA1812 on DI-instantiated HangfireStaleLockClean…
iammukeshm Apr 3, 2026
6054e02
fix(build): add domain event handlers to satisfy Mediator source gene…
iammukeshm Apr 3, 2026
f8a4c39
fix(tests): fix Hangfire job timing race in integration tests
iammukeshm Apr 3, 2026
e3adee4
fix(eventing): make inbox idempotent, use no-op mail in integration t…
iammukeshm Apr 3, 2026
5807b9f
fix(tests): fix startup race conditions and Hangfire dual-server in i…
iammukeshm Apr 3, 2026
8a0d508
fix(tests): fix CI integration test failures — add missing migrations…
iammukeshm Apr 3, 2026
83228df
fix: suppress expected shutdown and startup errors in tests
iammukeshm Apr 3, 2026
bf49011
feat: add response compression, health checks, traceId in errors, tag…
iammukeshm Apr 3, 2026
e25511f
fix: resolve remaining antipatterns from Roslyn architecture audit
iammukeshm Apr 3, 2026
3cc479a
fix: move catch-block comments inside body to resolve S125 in CI
iammukeshm Apr 3, 2026
f44e07f
fix: distribution gaps — pack Webhooks in CI, fix template version, a…
iammukeshm Apr 3, 2026
375674c
feat: remove Blazor UI and fix Redis TLS for Aspire 13.x
iammukeshm Apr 4, 2026
9b9734f
fix: suppress analyzer noise in EF migrations and integration tests t…
iammukeshm Apr 8, 2026
1afe7dd
feat: restructure admin app as pnpm monorepo and wire into Aspire via…
iammukeshm Apr 8, 2026
a858970
refactor: migrate caching to Microsoft.Extensions.Caching.Hybrid
iammukeshm Apr 8, 2026
cd00e1e
perf(caching): exploit HybridCache fast paths — ImmutableObject, stat…
iammukeshm Apr 8, 2026
cb9aa41
chore: remove Next.js admin app and lock frontend/platform requirements
iammukeshm Apr 20, 2026
a431324
feat(rate-limiting): enforce per-tenant + per-user + per-IP simultane…
iammukeshm Apr 20, 2026
46f1466
feat(storage): enable MinIO via S3-compatible endpoint and wire Aspir…
iammukeshm Apr 20, 2026
fba6ee8
feat(identity): add user impersonation with actor claims and audit trail
iammukeshm Apr 20, 2026
cd67cb9
feat(quota): meter tenant API calls with Redis counters and 429 rejec…
iammukeshm Apr 20, 2026
72e6728
feat(quota): add user-count gauge for Users quota
iammukeshm Apr 20, 2026
ee96df2
feat(quota): meter tenant storage bytes on upload and delete
iammukeshm Apr 20, 2026
a616b50
feat(billing): add internal billing module with usage-based invoicing
iammukeshm Apr 20, 2026
6e2e853
feat(sse): enable realtime stream with single-use token auth
iammukeshm Apr 20, 2026
459a6f4
feat(admin): scaffold React + Vite admin console
iammukeshm Apr 20, 2026
0d2166a
feat(apphost): wire admin app into Aspire via JavaScript hosting
iammukeshm Apr 20, 2026
fd11440
feat(dashboard): scaffold tenant dashboard with SSE live feed and usa…
iammukeshm Apr 20, 2026
e4d9c3f
fix(identity): remove silent permission requirement on self-register …
iammukeshm Apr 24, 2026
808365e
fix(webhooks): enforce tenant isolation on subscriptions and deliveries
iammukeshm Apr 24, 2026
8589e31
fix(auditing): remove misleading query.TenantId filter; add isolation…
iammukeshm Apr 24, 2026
442de62
test(jobs): lock in Hangfire dashboard BasicAuth behavior with regres…
iammukeshm Apr 24, 2026
e8da0e3
test(multitenancy): assert all provisioning steps transition to Compl…
iammukeshm Apr 24, 2026
d598f34
fix(identity): apply auth rate limit policy to reset-password and sel…
iammukeshm Apr 24, 2026
c3dd9b9
Merge Phase 1 of API Hardening Sprint into develop
iammukeshm Apr 24, 2026
45512ed
feat(billing): add ops endpoint for manual usage snapshot capture
iammukeshm Apr 24, 2026
b6bf460
feat(webhooks): add production dispatcher with Hangfire retry on tran…
iammukeshm Apr 24, 2026
faf2eea
feat(idempotency): wire .WithIdempotency() on high-value mutating end…
iammukeshm Apr 24, 2026
e7d7934
test(multitenancy): explicit regression test for tenant seed data on …
iammukeshm Apr 24, 2026
1566da6
Merge Phase 2 of API Hardening Sprint into develop
iammukeshm Apr 24, 2026
18db49c
feat(identity): enforce account lockout after consecutive failed logins
iammukeshm Apr 24, 2026
104da4e
feat(identity): add TOTP two-factor authentication (enroll, verify, d…
iammukeshm Apr 24, 2026
b5b5016
Merge Phase 3 of API Hardening Sprint into develop
iammukeshm Apr 24, 2026
f5f2703
feat(jobs): harden HangfireOptions; lock in health probes with tests
iammukeshm Apr 24, 2026
9b020a0
Merge Phase 4 of API Hardening Sprint into develop — SPRINT COMPLETE
iammukeshm Apr 24, 2026
4e7e4d3
fix(ui): remove hardcoded test credentials from login forms
iammukeshm Apr 24, 2026
b2cb81d
feat(ui): eslint config, route-level error boundary, permission-aware…
iammukeshm Apr 24, 2026
dda46e3
feat(ui): add sonner toast surface; document SSE token refresh invariant
iammukeshm Apr 24, 2026
b54d417
Merge Phase 1 of UI Hardening Sprint — correctness + shared infrastru…
iammukeshm Apr 24, 2026
d403f2f
feat(admin-ui): tenant create + detail page with live provisioning st…
iammukeshm Apr 24, 2026
47d93b9
feat(dashboard-ui): add dev-only one-click login as default seeded admin
iammukeshm Apr 24, 2026
af5ada1
fix(web): run CORS before HTTPS redirection so preflights aren't redi…
iammukeshm Apr 24, 2026
462e96e
chore: pre-upgrade checkpoint — dashboard https default + audit recur…
iammukeshm Apr 29, 2026
6e91786
chore(deps): bump NuGet packages to latest patch + minor
iammukeshm Apr 29, 2026
cd3bd54
test: fix pre-existing failures uncovered during package upgrade
iammukeshm Apr 29, 2026
fe8b265
chore(deps): bump coverlet.collector 8.0.1 -> 10.0.0
iammukeshm Apr 29, 2026
7bd86d4
chore(deps): bump Asp.Versioning.* 8.1.1 -> 10.0.0
iammukeshm Apr 29, 2026
06f0802
chore(deps): drop unused Mapster dependency
iammukeshm Apr 29, 2026
3d85683
fix(identity): emit RFC 7519 'sub' claim in JWT alongside NameIdentifier
iammukeshm Apr 29, 2026
a9412dd
fix(identity): make access Token optional on RefreshTokenCommand
iammukeshm Apr 29, 2026
31331fb
fix(dashboard): align refresh request and response shapes with server…
iammukeshm Apr 29, 2026
a699555
feat(dashboard): modern design-token system, theme switcher, login re…
iammukeshm Apr 29, 2026
7723599
feat(dashboard/overview): redesign overview page with KPI strip + ani…
iammukeshm Apr 29, 2026
3332fa1
feat(dashboard): require confirmation dialog before sign-out
iammukeshm Apr 29, 2026
6b322ed
fix(identity+dashboard): resolve username 'Unknown' by emitting RFC s…
iammukeshm Apr 29, 2026
70071ba
feat(dashboard): collapsible sidebar with persisted state, refreshed …
iammukeshm Apr 29, 2026
3680ea5
feat(dashboard): add Settings page with deep-linkable pill tabs
iammukeshm Apr 29, 2026
9b04dc1
feat(dashboard): selectable accent palettes + 12 fonts in Appearance
iammukeshm Apr 29, 2026
be766c5
feat(dashboard): redesign topbar as profile dropdown
iammukeshm Apr 29, 2026
3ba4395
feat(dashboard/invoices): refresh into KPI + token-driven list vocabu…
iammukeshm Apr 29, 2026
f50812e
feat(dashboard): command palette (⌘K) with five action groups
iammukeshm Apr 29, 2026
1f420de
feat(dashboard/security): wire active sessions to the real backend
iammukeshm Apr 29, 2026
79713eb
feat(dashboard): wire density mode (compact spacing across pages)
iammukeshm Apr 29, 2026
7ec45b3
feat(dashboard): catalog pages + frontend-design polish
iammukeshm Apr 30, 2026
d304380
feat(dashboard): polish dialogs, skeletons, settings + lazy-load routes
iammukeshm Apr 30, 2026
aa9eaa1
feat(tickets): add Tickets module — second demo vertical
iammukeshm Apr 30, 2026
600f124
feat(catalog,tickets): soft delete + restore for all entities
iammukeshm Apr 30, 2026
d4202ed
test(catalog,tickets): coverage for soft-delete + Tickets endpoints
iammukeshm Apr 30, 2026
607f566
feat(dashboard): tickets pages + unified trash view
iammukeshm Apr 30, 2026
69b59e0
feat(auditing): production-grade hardening + named query filters
iammukeshm Apr 30, 2026
a338847
feat(dashboard/health): rack-unit faceplate styling for check cards
iammukeshm Apr 30, 2026
e1a450e
feat(identity,dashboard): tenant-wide sessions admin console
iammukeshm Apr 30, 2026
f73627b
feat(admin): user management console (Phase 2.2 UI)
iammukeshm May 6, 2026
d8d5656
feat(identity): system role/group protection + last-admin guards
iammukeshm May 6, 2026
672121f
fix(dashboard): eliminate double scrollbar from sidebar overflow
iammukeshm May 6, 2026
8c6d1ca
Merge feature/ui-admin-management into develop
iammukeshm May 6, 2026
fa91023
chore: in-flight WIP sweep — Playground→Starter rename, dev seeding, …
iammukeshm May 6, 2026
f7f5300
Merge feature/ui-admin-management — WIP sweep (Playground→Starter, de…
iammukeshm May 6, 2026
754f1af
fix(apphost): normalize minio-init script line endings to LF
iammukeshm May 6, 2026
06c1e97
fix(api): ensure wwwroot/ exists so the API can boot
iammukeshm May 6, 2026
0df9f8f
fix(dashboard): rebuild toast layout in flex; modernise the chrome
iammukeshm May 6, 2026
025339a
feat(dashboard): mirror server-side system-role guards in role-detail UI
iammukeshm May 6, 2026
5f2118e
feat(dashboard/overview): cockpit hero + first-run panel + recent ope…
iammukeshm May 6, 2026
85a8b0e
feat(dashboard/appearance): custom-accent picker — pick any brand hue
iammukeshm May 6, 2026
5d6e8a5
feat(dashboard/audits): related-events timeline in the detail drawer
iammukeshm May 6, 2026
395d821
feat(dashboard): unified PageHero across non-list surfaces
iammukeshm May 6, 2026
55eb23f
feat(dashboard/sidebar): single-select accordion sections + top-level…
iammukeshm May 6, 2026
a5548ec
feat(dashboard/sidebar): subtle accordion animations + matched typogr…
iammukeshm May 6, 2026
7f74102
fix(dashboard/hero): stop clipping descenders on Settings, Audit trai…
iammukeshm May 6, 2026
e40187c
feat(dashboard/login): brand-story column on wide viewports
iammukeshm May 6, 2026
93b05fd
feat(dashboard/login): editorial product-page redesign
iammukeshm May 6, 2026
5b33117
feat(dashboard/login): blueprint-style centered redesign + demo popup
iammukeshm May 6, 2026
01e798d
fix: achieve zero-warning build across all projects
May 9, 2026
00e8fec
test: enhance coverage and stabilize infrastructure
May 9, 2026
d1b82b3
Merge branch 'fix/zero-warnings' into integrate/stabilized-base
May 9, 2026
c5f5f5b
test: remove TODO to achieve zero-warning build in architecture tests
May 9, 2026
0ee7c20
Merge branch 'feat/test-coverage-improvements' into integrate/stabili…
May 9, 2026
292b458
chore: fix CI build errors and architecture test discovery
May 9, 2026
9024fb6
chore: stabilize architecture tests and fix CA1062 warnings
May 9, 2026
73a5cb0
chore: stabilize CI pipeline by resolving 60 build errors (CA, MSG, S…
May 9, 2026
208fc7b
Merge feat/test-coverage-improvements into fix/zero-warnings stabiliz…
May 9, 2026
b09a106
security: fix CodeQL CWE-312 — do not log SharedPassword in clear text
May 10, 2026
c7b70aa
security: fix CodeQL CWE-312 — do not log SharedPassword in clear text
May 10, 2026
559f5ca
Merge pull request #1240 from cesarcastrocuba/feat/test-coverage-impr…
iammukeshm May 11, 2026
c4f9e52
ui
iammukeshm May 11, 2026
ae78e9b
Merge branch 'develop' of github.com:fullstackhero/dotnet-starter-kit…
iammukeshm May 11, 2026
68f974a
Merge pull request #1239 from cesarcastrocuba/fix/zero-warnings
iammukeshm May 12, 2026
064092d
docs(specs): Files module design spec
iammukeshm May 12, 2026
36a3de9
docs(plans): Files module Phase A implementation plan
iammukeshm May 12, 2026
63245f7
feat(files): scaffold Modules.Files + .Contracts projects
iammukeshm May 12, 2026
b64ffd0
feat(storage): presigned URL + HEAD on IStorageService
iammukeshm May 12, 2026
b3f2b39
feat(apphost): MinIO CORS for browser presigned PUT uploads
iammukeshm May 12, 2026
344b1ae
feat(files): FileAsset aggregate + FilesDbContext + appsettings
iammukeshm May 12, 2026
28046f8
feat(files): module skeleton registration + EF migration for FileAssets
iammukeshm May 12, 2026
e3c1fef
feat(files): module services + contracts + 23 unit tests
iammukeshm May 12, 2026
5a8c11c
feat(files): 6 endpoints + handlers + module wiring
iammukeshm May 12, 2026
a85b528
feat(files): Hangfire purge jobs + recurring registration
iammukeshm May 12, 2026
a5d865c
feat(files): admin endpoints — RestoreFile + ListTrashedFiles
iammukeshm May 12, 2026
6db3c1a
fix(files): architecture compliance — drop IHttpContextAccessor + add…
iammukeshm May 12, 2026
9a2f733
test(files): MinIO integration tests + wire Files module into Mediator
iammukeshm May 12, 2026
af0db33
feat(dashboard): Files module UI — useFileUpload + Dropzone + Gallery…
iammukeshm May 12, 2026
19bed3b
feat(files): product image + avatar upload + preview modal
iammukeshm May 12, 2026
7d618e1
chore(arch): allow Set verb + suppress CA1055 on BuildPublicUrl
iammukeshm May 12, 2026
ccfeddc
chore(aspire): upgrade to Aspire 13.3.0
iammukeshm May 12, 2026
beeda07
fix(apphost): MinIO CORS via server env var, not mc admin config
iammukeshm May 12, 2026
6696c33
fix(files): PDF preview + drop category-tab UX in My Files
iammukeshm May 12, 2026
39c0fdd
fix(dashboard): toast follows in-app theme, not OS preference
iammukeshm May 12, 2026
9a3c90c
feat(dashboard): confirmation dialog before deleting a file
iammukeshm May 12, 2026
832894e
feat(catalog): multi-image product support + gallery + thumbnail
iammukeshm May 12, 2026
6182c24
fix(catalog): AddProductImage 500 — ProductImage.Id ValueGeneratedNever
iammukeshm May 12, 2026
6c6dbf1
fix(catalog): SetProductThumbnail/RemoveImage 404 for unknown image id
iammukeshm May 12, 2026
40227f4
fix(catalog): drop partial unique index on ProductImages.IsThumbnail
iammukeshm May 12, 2026
9f02777
fix(files): preview reliability — fresh URL per modal open + onError …
iammukeshm May 12, 2026
b00ab29
docs(specs): Chat module design spec
iammukeshm May 12, 2026
3181d69
docs(plans): Chat module implementation plan
iammukeshm May 12, 2026
ae94c52
feat(chat-1): scaffold Modules.Chat + Modules.Chat.Contracts projects
iammukeshm May 12, 2026
070fc0a
feat(chat-1): permissions + ChatChannel/Message aggregates + domain e…
iammukeshm May 12, 2026
1120883
feat(chat-1): ChatDbContext + EF configurations + module registration…
iammukeshm May 12, 2026
5c25594
feat(chat-1): contracts — DTOs, commands, queries
iammukeshm May 12, 2026
9a938b4
feat(chat-1): CreateChannel feature + ChatMappers + wire Mediator mar…
iammukeshm May 12, 2026
4946f42
feat(chat-1): channel management endpoints — Update, Archive, Restore…
iammukeshm May 12, 2026
f3c392f
feat(chat): channel/message queries + edit/delete/read-marker endpoints
iammukeshm May 12, 2026
d666c9a
test(arch): include Chat module in contracts purity + host boundary c…
iammukeshm May 12, 2026
389cd36
test(chat): unit tests for ChatChannel + Message aggregate invariants
iammukeshm May 12, 2026
e218f3b
test(chat): integration tests for channels + messages (23 tests)
iammukeshm May 12, 2026
b071013
feat(chat-2): SignalR AppHub + Redis backplane + handler broadcasts
iammukeshm May 12, 2026
261b907
test(chat-2): SignalR realtime integration tests + auth fix
iammukeshm May 12, 2026
bdbf60a
feat(chat-3): scaffold Notifications module + InitialNotifications mi…
iammukeshm May 12, 2026
7a63b9b
feat(chat-3): Notifications REST endpoints (list/count/mark/mark-all)
iammukeshm May 12, 2026
adba177
feat(chat-3): MessageMention domain + @username parsing in SendMessage
iammukeshm May 12, 2026
b555dcc
feat(chat-3): MentionedInChannel handler + integration tests (3)
iammukeshm May 12, 2026
d8841c7
feat(chat-4): thread replies endpoint + message reactions
iammukeshm May 12, 2026
c3d1614
feat(chat-4): full-text message search via Postgres tsvector
iammukeshm May 12, 2026
c7a1f72
test(chat-4): typing-indicator integration tests (3)
iammukeshm May 12, 2026
1fe8499
feat(chat-4): ChatChannelFileAccessPolicy for message attachments
iammukeshm May 12, 2026
16734df
feat(chat-4): dashboard /chat page + NotificationBell + RealtimeProvider
iammukeshm May 12, 2026
33d2ace
feat(chat-4): UI polish pass — unread divider, jump pill, live status…
iammukeshm May 13, 2026
84d65e0
fix(chat-4): composer sent empty body when optimistic clear raced the…
iammukeshm May 13, 2026
688bc18
feat(chat-4): resolve user IDs to real names in messages, DM titles, …
iammukeshm May 13, 2026
141e6f9
fix(cors): allow credentialed requests in dev so SignalR negotiate works
iammukeshm May 13, 2026
2ea0dbe
feat(chat-4): topbar chat-unread badge + global toast on incoming mes…
iammukeshm May 13, 2026
152d280
feat(chat-4): @mention autocomplete in composer
iammukeshm May 13, 2026
a16a066
feat(chat-4): redesign chat toast — opt out of .fsh-toast tone-rail
iammukeshm May 13, 2026
39f8e71
fix(chat-4): chat toasts vanished after the previous redesign — kept …
iammukeshm May 13, 2026
fe80223
feat(chat-4): MessageList lands at the latest message on channel open
iammukeshm May 13, 2026
d09a171
feat(realtime): rebuild SignalR hub on token rotation + warn on missi…
iammukeshm May 13, 2026
919bb50
feat(files): paginate ListTrashedFiles via PagedResponse
iammukeshm May 13, 2026
6a43f8f
test(chat): integration tests for POST /messages mirroring dashboard …
iammukeshm May 13, 2026
d334d57
docs(chat-4): spec for deferred UI items — ThreadPanel, mention profi…
iammukeshm May 13, 2026
814b9c4
docs(chat-4): implementation plan for deferred UI items
iammukeshm May 13, 2026
2b13ce2
feat(chat-4): partner avatar on 1-on-1 DM rail rows
iammukeshm May 13, 2026
8aa4b63
feat(chat-4): mention pill opens profile peek with Open DM action
iammukeshm May 13, 2026
2c6d52d
feat(chat-4): ThreadPanel overlay — wire onReply through to a reply s…
iammukeshm May 13, 2026
dbb1115
feat(chat-4): Teams-style inline replies — quote in composer + inline…
iammukeshm May 13, 2026
93abc2f
feat(chat-4): Teams-style chat — right-aligned own bubbles, flat feed…
iammukeshm May 13, 2026
9273d13
feat(chat-4): hover-only merged-row time + jump-to-parent on reply pr…
iammukeshm May 13, 2026
5ad9a5b
feat(chat-4): inline search overlay + smooth scroll on jump-to-parent
iammukeshm May 13, 2026
7c0577a
feat(chat-5): optimistic send — message lands in feed before the netw…
iammukeshm May 13, 2026
53e1156
feat(chat-5): channel settings dialog — rename, members, archive/leave
iammukeshm May 13, 2026
be1d22d
feat(chat-5): message pagination — load older on scroll-to-top
iammukeshm May 13, 2026
1957eef
feat(ui): modernize sonner toasts — frosted gradient-border + tone-ti…
iammukeshm May 13, 2026
3700111
feat(chat-5): file attachments in composer + message bubbles
iammukeshm May 13, 2026
077fb20
feat(chat-5): read receipts under the caller's latest top-level message
iammukeshm May 13, 2026
9137cee
feat(chat-5): mobile responsive sweep — rail / message column alterna…
iammukeshm May 13, 2026
d8ea0d6
fix(chat-5): increase merged-row spacing — bubbles no longer overlap
iammukeshm May 13, 2026
c7402a5
feat(chat-5): pin messages — domain + endpoints + realtime + UI
iammukeshm May 13, 2026
ff5543a
feat(presence): online dots driven by an in-memory PresenceTracker
iammukeshm May 13, 2026
69f2a64
test(chat-5): integration tests for pin messages + presence (18 new) …
iammukeshm May 13, 2026
b828875
fix(chat-5): live read receipts + scope presence broadcasts to tenant…
iammukeshm May 13, 2026
38560bf
feat(infra): FSH.Starter.DbMigrator — dedicated console for applying …
iammukeshm May 13, 2026
0831d10
fix(chat-5): dedupe own-send temp against the SignalR echo to kill th…
iammukeshm May 13, 2026
d130f3f
feat(infra): wire DbMigrator into Aspire + advisory lock + wait-for-DB
iammukeshm May 13, 2026
b5d3818
fix(infra): DbMigrator end-to-end smoke clean — DI + logging + IHoste…
iammukeshm May 13, 2026
011a6e9
fix(chat-5): more breathing room between consecutive bubbles
iammukeshm May 13, 2026
f691c9d
fix(chat-5): bubble halo + much more breathing room between merged rows
iammukeshm May 13, 2026
d78f7d8
fix(chat-5): make merged-row spacing uniform — drop conditional row p…
iammukeshm May 13, 2026
0f4d1f8
fix(chat-5): presign chat attachment URLs at upload so SendMessage do…
iammukeshm May 13, 2026
9edaafe
fix(chat-5): allow attachment-only messages + skip markRead for optim…
iammukeshm May 13, 2026
7fd285a
test(catalog): integration tests for the product CRUD endpoints
iammukeshm May 13, 2026
76fec24
fix(persistence): soft-delete interceptor leaves owned-type reference…
iammukeshm May 13, 2026
e3fac31
fix(migrator): clear CI -warnaserror analyzer errors
iammukeshm May 13, 2026
122a44d
build: treat warnings as errors locally to match CI
iammukeshm May 13, 2026
eda868b
build(aspire): bump Aspire to 13.3.2
iammukeshm May 14, 2026
be2afee
refactor(multitenancy): remove API auto-migration; DbMigrator is the …
iammukeshm May 14, 2026
22cf457
fix(chat): align MessageTests with attachment-only-message contract
iammukeshm May 14, 2026
bdfee3b
build: bump runtime packages to 10.0.8 / 10.6.0; adapt Testcontainers…
iammukeshm May 14, 2026
1f7f4d8
docs: backend health audit — 2026-05-14 (Grade A, 97/100)
iammukeshm May 14, 2026
a432f4c
docs: add CONTRIBUTING.md and SECURITY.md
iammukeshm May 14, 2026
f85d266
fix(docs/deps): patch 8 Dependabot alerts via npm audit fix
iammukeshm May 14, 2026
8483312
test: add Catalog/Notifications/Billing endpoint tests; fix README do…
iammukeshm May 14, 2026
7e0a764
build: finish Testcontainers 4.11 API adaptation in 3 remaining files
iammukeshm May 14, 2026
6e9e22d
fix(security): resolve 5 CodeQL alerts (1 high, 4 medium)
iammukeshm May 15, 2026
dabecf4
fix(ci): use ContainerImageTags (plural) in DbMigrator smoke publish
iammukeshm May 15, 2026
bb370a7
fix(ci): drop legacy PublishProfile=DefaultContainer, use PublishCont…
iammukeshm May 15, 2026
e08f3ff
feat: multitenancy hardening, impersonation, admin app rebuild, demo …
iammukeshm May 18, 2026
169bb4e
fix(security): bump devalue 5.6.4 → 5.8.1 (GHSA-77vg-94rm-hx3p)
iammukeshm May 18, 2026
861381e
fix(migrator): resolve JwtOptions validation failure in Aspire orches…
cesarcastrocuba May 18, 2026
4b307cd
feat(v1-ui): admin + dashboard gap closure with Playwright coverage
iammukeshm May 18, 2026
59aaaa0
feat(v1-backend): v1 P0 hardening pass (security + correctness)
iammukeshm May 18, 2026
e2a740c
fix(migrator): inject JwtOptions placeholder when SigningKey is empty
iammukeshm May 18, 2026
ab38a51
build(aspire): bump Aspire.Hosting.* + AppHost SDK 13.3.2 → 13.3.3
iammukeshm May 18, 2026
40352a4
fix(ui): audit-detail crash, banner redesign, cursor affordance
iammukeshm May 18, 2026
ed6e699
refactor(admin/audits): redesign /audits/:id for the forensic-record …
iammukeshm May 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
20 changes: 20 additions & 0 deletions .config/dotnet-tools.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"version": 1,
"isRoot": true,
"tools": {
"nswag.consolecore": {
"version": "14.6.3",
"commands": [
"nswag"
],
"rollForward": false
},
"dotnet-ef": {
"version": "10.0.2",
"commands": [
"dotnet-ef"
],
"rollForward": false
}
}
}
7 changes: 7 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
**/bin
**/obj
**/.vs
**/node_modules
.git
*.md
src/Tests/
55 changes: 0 additions & 55 deletions .github/workflows/blazor.yml

This file was deleted.

24 changes: 0 additions & 24 deletions .github/workflows/changelog.yml

This file was deleted.

274 changes: 274 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,274 @@
name: CI/CD Pipeline

on:
push:
branches:
- main
- develop
tags:
- 'v*'
pull_request:
branches:
- main
- develop
workflow_dispatch:
inputs:
version:
description: 'Package version (e.g., 10.0.0-rc.1)'
required: false
type: string

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

permissions:
contents: read
packages: write

env:
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
DOTNET_CLI_TELEMETRY_OPTOUT: true
DOTNET_NOLOGO: true


jobs:
build:
name: Build
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@v6

- name: Setup .NET SDK
uses: actions/setup-dotnet@v5
with:
dotnet-version: '10.0.x'
dotnet-quality: 'preview'

- name: Cache NuGet packages
uses: actions/cache@v5
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/Directory.Packages.props') }}
restore-keys: |
${{ runner.os }}-nuget-

- name: Restore dependencies
run: dotnet restore src/FSH.Framework.slnx

- name: Build
run: dotnet build src/FSH.Framework.slnx -c Release --no-restore -warnaserror

- name: Check for vulnerable packages
run: dotnet list src/FSH.Framework.slnx package --vulnerable --include-transitive 2>&1 | tee vulnerability-report.txt
continue-on-error: true

- name: Upload build artifacts
uses: actions/upload-artifact@v7
with:
name: build-output
path: |
src/**/bin/Release
src/**/obj/Release
retention-days: 1

test:
name: Test - ${{ matrix.test-project.name }}
runs-on: ubuntu-latest
needs: build

strategy:
fail-fast: false
matrix:
test-project:
- name: Architecture.Tests
path: src/Tests/Architecture.Tests
- name: Auditing.Tests
path: src/Tests/Auditing.Tests
- name: Generic.Tests
path: src/Tests/Generic.Tests
- name: Identity.Tests
path: src/Tests/Identity.Tests
- name: Multitenancy.Tests
path: src/Tests/Multitenancy.Tests

steps:
- name: Checkout
uses: actions/checkout@v6

- name: Setup .NET SDK
uses: actions/setup-dotnet@v5
with:
dotnet-version: '10.0.x'
dotnet-quality: 'preview'

- name: Cache NuGet packages
uses: actions/cache@v5
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/Directory.Packages.props') }}
restore-keys: |
${{ runner.os }}-nuget-

- name: Download build artifacts
uses: actions/download-artifact@v8
with:
name: build-output
path: src

- name: Run ${{ matrix.test-project.name }}
run: dotnet test ${{ matrix.test-project.path }} -c Release --no-build --verbosity normal --logger "trx;LogFileName=${{ matrix.test-project.name }}.trx"

- name: Upload test results
uses: actions/upload-artifact@v7
if: always()
with:
name: test-results-${{ matrix.test-project.name }}
path: '**/*.trx'
retention-days: 7

publish-dev-containers:
name: Publish Dev Containers
runs-on: ubuntu-latest
needs: test
if: github.ref == 'refs/heads/develop' && github.event_name == 'push'

steps:
- name: Checkout
uses: actions/checkout@v6

- name: Setup .NET SDK
uses: actions/setup-dotnet@v5
with:
dotnet-version: '10.0.x'
dotnet-quality: 'preview'

- name: Cache NuGet packages
uses: actions/cache@v5
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/Directory.Packages.props') }}
restore-keys: |
${{ runner.os }}-nuget-

- name: Login to GHCR
uses: docker/login-action@v4
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Publish API container image
run: |
dotnet publish src/Playground/Playground.Api/Playground.Api.csproj \
-c Release -r linux-x64 \
-p:PublishProfile=DefaultContainer \
-p:ContainerRepository=ghcr.io/${{ github.repository_owner }}/fsh-playground-api \
-p:ContainerImageTags='"dev-${{ github.sha }};dev-latest"'

- name: Publish Blazor container image
run: |
dotnet publish src/Playground/Playground.Blazor/Playground.Blazor.csproj \
-c Release -r linux-x64 \
-p:PublishProfile=DefaultContainer \
-p:ContainerRepository=ghcr.io/${{ github.repository_owner }}/fsh-playground-blazor \
-p:ContainerImageTags='"dev-${{ github.sha }};dev-latest"'

publish-release:
name: Publish Release (NuGet + Containers)
runs-on: ubuntu-latest
needs: test
if: |
(github.ref == 'refs/heads/main' && github.event_name == 'workflow_dispatch') ||
startsWith(github.ref, 'refs/tags/v')

steps:
- name: Checkout
uses: actions/checkout@v6

- name: Setup .NET SDK
uses: actions/setup-dotnet@v5
with:
dotnet-version: '10.0.x'
dotnet-quality: 'preview'

- name: Cache NuGet packages
uses: actions/cache@v5
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/Directory.Packages.props') }}
restore-keys: |
${{ runner.os }}-nuget-

- name: Determine version
id: version
run: |
if [ "${{ github.event_name }}" == "workflow_dispatch" ] && [ -n "${{ github.event.inputs.version }}" ]; then
VERSION="${{ github.event.inputs.version }}"
elif [[ "$GITHUB_REF" == refs/tags/v* ]]; then
VERSION="${GITHUB_REF#refs/tags/v}"
else
echo "No version specified and not a tag push"
exit 1
fi
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "Publishing version: $VERSION"

- name: Restore and Build with version
run: |
dotnet restore src/FSH.Framework.slnx
dotnet build src/FSH.Framework.slnx -c Release --no-restore -p:Version=${{ steps.version.outputs.version }}

- name: Pack BuildingBlocks
run: |
dotnet pack src/BuildingBlocks/Core/Core.csproj -c Release --no-build -o ./nupkgs -p:PackageVersion=${{ steps.version.outputs.version }}
dotnet pack src/BuildingBlocks/Shared/Shared.csproj -c Release --no-build -o ./nupkgs -p:PackageVersion=${{ steps.version.outputs.version }}
dotnet pack src/BuildingBlocks/Persistence/Persistence.csproj -c Release --no-build -o ./nupkgs -p:PackageVersion=${{ steps.version.outputs.version }}
dotnet pack src/BuildingBlocks/Caching/Caching.csproj -c Release --no-build -o ./nupkgs -p:PackageVersion=${{ steps.version.outputs.version }}
dotnet pack src/BuildingBlocks/Mailing/Mailing.csproj -c Release --no-build -o ./nupkgs -p:PackageVersion=${{ steps.version.outputs.version }}
dotnet pack src/BuildingBlocks/Jobs/Jobs.csproj -c Release --no-build -o ./nupkgs -p:PackageVersion=${{ steps.version.outputs.version }}
dotnet pack src/BuildingBlocks/Storage/Storage.csproj -c Release --no-build -o ./nupkgs -p:PackageVersion=${{ steps.version.outputs.version }}
dotnet pack src/BuildingBlocks/Eventing/Eventing.csproj -c Release --no-build -o ./nupkgs -p:PackageVersion=${{ steps.version.outputs.version }}
dotnet pack src/BuildingBlocks/Eventing.Abstractions/Eventing.Abstractions.csproj -c Release --no-build -o ./nupkgs -p:PackageVersion=${{ steps.version.outputs.version }}
dotnet pack src/BuildingBlocks/Web/Web.csproj -c Release --no-build -o ./nupkgs -p:PackageVersion=${{ steps.version.outputs.version }}
dotnet pack src/BuildingBlocks/Blazor.UI/Blazor.UI.csproj -c Release --no-build -o ./nupkgs -p:PackageVersion=${{ steps.version.outputs.version }}

- name: Pack Modules
run: |
dotnet pack src/Modules/Auditing/Modules.Auditing.Contracts/Modules.Auditing.Contracts.csproj -c Release --no-build -o ./nupkgs -p:PackageVersion=${{ steps.version.outputs.version }}
dotnet pack src/Modules/Auditing/Modules.Auditing/Modules.Auditing.csproj -c Release --no-build -o ./nupkgs -p:PackageVersion=${{ steps.version.outputs.version }}
dotnet pack src/Modules/Identity/Modules.Identity.Contracts/Modules.Identity.Contracts.csproj -c Release --no-build -o ./nupkgs -p:PackageVersion=${{ steps.version.outputs.version }}
dotnet pack src/Modules/Identity/Modules.Identity/Modules.Identity.csproj -c Release --no-build -o ./nupkgs -p:PackageVersion=${{ steps.version.outputs.version }}
dotnet pack src/Modules/Multitenancy/Modules.Multitenancy.Contracts/Modules.Multitenancy.Contracts.csproj -c Release --no-build -o ./nupkgs -p:PackageVersion=${{ steps.version.outputs.version }}
dotnet pack src/Modules/Multitenancy/Modules.Multitenancy/Modules.Multitenancy.csproj -c Release --no-build -o ./nupkgs -p:PackageVersion=${{ steps.version.outputs.version }}

- name: Pack CLI Tool
run: dotnet pack src/Tools/CLI/FSH.CLI.csproj -c Release --no-build -o ./nupkgs -p:PackageVersion=${{ steps.version.outputs.version }}

- name: Push to NuGet.org
run: dotnet nuget push "./nupkgs/*.nupkg" --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate

- name: Login to GHCR
uses: docker/login-action@v4
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Build and push API container
run: |
dotnet publish src/Playground/Playground.Api/Playground.Api.csproj \
-c Release -r linux-x64 \
-p:PublishProfile=DefaultContainer \
-p:ContainerRepository=ghcr.io/${{ github.repository_owner }}/fsh-playground-api \
-p:ContainerImageTags='"${{ steps.version.outputs.version }};latest"'

- name: Build and push Blazor container
run: |
dotnet publish src/Playground/Playground.Blazor/Playground.Blazor.csproj \
-c Release -r linux-x64 \
-p:PublishProfile=DefaultContainer \
-p:ContainerRepository=ghcr.io/${{ github.repository_owner }}/fsh-playground-blazor \
-p:ContainerImageTags='"${{ steps.version.outputs.version }};latest"'
Loading
Loading