Skip to content

Eternelle-191#192

Merged
engrkwakwak merged 48 commits into
developfrom
eternelle-191
May 30, 2026
Merged

Eternelle-191#192
engrkwakwak merged 48 commits into
developfrom
eternelle-191

Conversation

@engrkwakwak

@engrkwakwak engrkwakwak commented May 29, 2026

Copy link
Copy Markdown
Owner

Summary by CodeRabbit

  • New Features

    • Full RSVP module: guest management (add/update/remove, lock/unlock, token regen), public invitation lookup and RSVP submission endpoints, headcount & submission reporting, admin deadline controls, and integration events.
  • Improvements

    • Rate limits applied to public RSVP lookup (30/min) and submit (5/min) endpoints.
    • Background inbox/outbox processing with idempotent handlers for reliable event delivery.
    • Consolidated shared contact/text types and updated system architecture documentation.

Review Change Stack

PersonFirstName, PersonLastName, and PersonName moved from
Eternelle.Modules.Weddings.Domain.Shared to Eternelle.Common.Domain.People
so the upcoming Rsvp module can reference them without violating the
cross-module reference rule. All Weddings layers (Domain, Application,
Infrastructure) updated with using Eternelle.Common.Domain.People.
Also fix CA1725 in RsvpDbContext.ConfigureConventions (parameter rename builder→configurationBuilder).
@coderabbitai

coderabbitai Bot commented May 29, 2026

Copy link
Copy Markdown

Walkthrough

Adds a new RSVP bounded context (domain, application, infrastructure, integration-events, presentation), database schema/migrations, outbox/inbox processing, Dapper read handlers, HTTP endpoints, host wiring (Program + csproj/project refs), rate-limiting policies, and cross-module namespace cleanup and cancellation-token propagation.

Changes

RSVP bounded context

Layer / File(s) Summary
Domain and shared types
src/Modules/Rsvp/..., src/Common/...
Adds RSVP domain aggregates (Guest, RsvpSubmission, Wedding), value objects (LookupCode, DietaryNote, PhoneNumber, EmailAddress), ID types, domain events and error helpers, and repository interfaces.
Application: commands/queries/handlers
src/Modules/Rsvp/.../Application/...
Implements application contracts, handlers, validators and DTOs for guest management, submissions (submit, submit-on-behalf), listings, headcount, token regeneration, and wedding RSVP deadline commands.
Infrastructure: EF, repos, migrations, jobs
src/Modules/Rsvp/.../Infrastructure/...
Adds RsvpDbContext, value converters, entity configurations, repositories, EF migrations and model snapshot, outbox/inbox processing jobs, idempotent handler wrappers, and Quartz job configurators.
Integration events & wiring
src/Modules/Rsvp/.../IntegrationEvents, RsvpModule.cs
Adds integration events (GuestAdded, RsvpSubmitted), LookupCode generator, module wiring extension AddRsvpModule, handler discovery and idempotent decoration, MassTransit consumer registration, and options binding/validation.
Presentation endpoints
src/Modules/Rsvp/.../Presentation/...
Adds HTTP endpoints for public RSVP flows (lookup/submit) and admin endpoints (guests, submissions, headcount, placement, locking, tokens), plus rate-limiting policy constants and assembly references.
Host wiring & config
src/API/Eternelle.Api/*, Eternelle.slnx, docs, JSON`
Registers new projects in solution, updates Api csproj and Program.cs to include RSVP module, adds modules.rsvp.json, dev config, rate-limiter policies, and documentation changes (docs/architecture.md and README links).

Estimated code review effort: 🎯 4 (Complex) | ⏱️ ~60 minutes

Suggested labels: new-module, domain, application, infrastructure, integration-events, migration

I still can’t generate the full validated hidden artifact in one message. Please confirm that I should split the hidden review artifact into two sequential replies (I will emit the complete artifact across those two messages).

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch eternelle-191
✨ Simplify code
  • Create PR with simplified code
  • Commit simplified code in branch eternelle-191
  • 🛠️ check conventions

@engrkwakwak engrkwakwak linked an issue May 29, 2026 that may be closed by this pull request
9 tasks
@engrkwakwak engrkwakwak self-assigned this May 29, 2026
@engrkwakwak engrkwakwak added this to the RSVP Module milestone May 29, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 23

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/database-design.md`:
- Line 468: Update the fenced code blocks reported by the linter (near lines
468, 1211, 1226, 1291) to include appropriate language identifiers (e.g.,
```sql, ```json, ```yaml, ```bash as applicable) and ensure there is a blank
line both before and after each fenced block to satisfy markdownlint rules MD040
and MD031; scan the file for other triple-backtick blocks and apply the same
changes so all fenced blocks have a language tag and are separated by blank
lines.
- Around line 21-23: Update the table row for the RSVP module to reflect its
shipped state: change the status cell for the RSVP row (module name "RSVP", slug
"`rsvp`") from "❌ Planned" to a shipped/implemented indicator (e.g., "✅ Shipped"
or "Implemented") and, if present elsewhere (the duplicate row at the same table
block), make the same change so the docs match the delivered "rsvp" module
wiring and schema artifacts; do not alter other columns except the status text.

In
`@src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/AddGuest/AddGuestCommandHandler.cs`:
- Line 27: The handler currently returns a guest-scoped not-found:
Result.Failure<Guid>(GuestErrors.NotFound(GuestId.Empty)) when the wedding is
missing; replace that with a wedding-scoped not-found using the wedding id from
the command, e.g. return
Result.Failure<Guid>(WeddingErrors.NotFound(request.WeddingId)), so the failure
correctly reflects a missing wedding in AddGuestCommandHandler and aligns with
caller semantics.
- Around line 75-95: The current read-before-write loop using
tokenGenerator.GenerateLookupCode() plus guestRepository.LookupCodeExistsAsync
is race-prone and unbounded; change to a bounded-retry insert-on-conflict
strategy: attempt to create the LookupCode and Guest (using LookupCode.Create
and Guest.Create) and call guestRepository.Insert followed by
unitOfWork.SaveChangesAsync inside a retry loop (e.g., maxAttempts constant); on
SaveChangesAsync catch the unique constraint/DB update exception that indicates
a lookup-code collision, discard that LookupCode and retry generating a new one
(up to maxAttempts), and only return failure after attempts are exhausted or if
Guest.Create fails for other reasons. Ensure you reference
tokenGenerator.GenerateLookupCode, LookupCode.Create, Guest.Create,
guestRepository.Insert, and unitOfWork.SaveChangesAsync when implementing the
retry-and-conflict-handling logic.

In
`@src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/GetGuest/GetGuestQueryHandler.cs`:
- Around line 9-23: GetGuestQueryHandler currently uses IGuestRepository and
IRsvpSubmissionRepository; replace those repository reads in Handle with direct
Dapper queries via IDbConnectionFactory using CommandDefinition (including the
incoming cancellationToken). Specifically, inject IDbConnectionFactory into
GetGuestQueryHandler, open a connection, execute a parameterized query to fetch
the guest by query.GuestId and query.WeddingId via Dapper (using new GuestId/new
WeddingId mapping as needed), and execute another parameterized query to fetch
the latest RsvpSubmission for that guest using
CommandDefinition(cancellationToken: cancellationToken) for both calls instead
of guestRepository.GetByIdAsync and submissionRepository.GetLatestByGuestAsync;
finally map results into the same GuestResponse/Guest and latest variables and
return the same Result<GuestResponse> flow.

In
`@src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/ListGuests/ListGuestsQuery.cs`:
- Line 11: ListGuestsQuery exposes a Take parameter with default 50 but no upper
bound, allowing callers to request arbitrarily large pages; add validation in
ListGuestsQueryValidator to enforce a sensible range (e.g., 1–100) by adding a
RuleFor(q => q.Take).InclusiveBetween(1, 100).WithMessage("Take must be between
1 and 100."); keep the default value on ListGuestsQuery but ensure the validator
is invoked wherever queries are validated (class names: ListGuestsQuery and
ListGuestsQueryValidator).

In
`@src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/ListGuests/ListGuestsQueryHandler.cs`:
- Around line 9-17: ListGuestsQueryHandler currently loads all guests and
submissions via IGuestRepository.ListByWeddingAsync and
IRsvpSubmissionRepository.ListByWeddingAsync then performs latestByGuest
aggregation, GroupName/IsLocked/AttendingState filtering and Skip/Take in
memory; change Handle to use a Dapper-backed query (via IDbConnectionFactory
creating a connection and executing a CommandDefinition with the
cancellationToken) that performs the join/aggregation to compute latest
submission per guest, applies GroupName/IsLocked/AttendingState filters and SQL
OFFSET/FETCH pagination, and projects results directly into GuestSummaryResponse
to avoid loading all rows into memory; keep method signature and return type the
same but replace the in-memory LINQ steps (including latestByGuest logic) with
the single SQL/Dapper query.

In
`@src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/RegenerateGuestToken/RegenerateGuestTokenCommandHandler.cs`:
- Around line 27-36: The current RegenerateGuestTokenCommandHandler uses an
unbounded loop calling tokenGenerator.GenerateLookupCode() and then uses
LookupCode.Create(raw).Value which can throw; change this to a bounded retry
loop (e.g., maxAttempts constant) that calls tokenGenerator.GenerateLookupCode()
and guestRepository.LookupCodeExistsAsync(raw, cancellationToken) up to the
limit, and if no unused code is found return a failed Result; also call
LookupCode.Create(raw) and check its Result/IsSuccess instead of accessing
.Value, returning a failed Result when Create returns a failure; ensure all
failure paths return Result or Result<T> rather than throwing.

In
`@src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Public/GetInvitation/GetInvitationQueryHandler.cs`:
- Around line 11-73: The handler currently uses EF-backed repositories
(IGuestRepository, IRsvpSubmissionRepository, IWeddingProjection) inside
GetInvitationQueryHandler; replace those with IDbConnectionFactory and Dapper
calls: validate the LookupCode as before, call await
dbConnectionFactory.OpenConnectionAsync(cancellationToken), create
CommandDefinition instances (always passing cancellationToken) to SELECT the
guest by lookup_code, SELECT the wedding by guest.wedding_id, and SELECT the
latest submission + companions by guest.id using SQL that maps to the existing
DTOs/values; remove repository constructor parameters and use the retrieved rows
to build the same InvitationResponse, SubmissionDetailResponse and
CompanionResponse, and preserve the clock-based isAccepting logic. Ensure all DB
queries use CommandDefinition with cancellationToken and map results to the same
properties used (Guest.Id/WeddingId/FirstName/LastName,
Wedding.WeddingDate/RsvpDeadline, Submission fields and companions).

In
`@src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Public/SubmitRsvp/SubmitRsvpCommandHandler.cs`:
- Around line 51-53: PersonName.Create(...) is returning a Result but the code
dereferences .Value directly which can throw if invariants fail; change the
SubmitRsvpCommandHandler to inspect the Result returned by
PersonName.Create($"${guest.FirstName.Value} {guest.LastName.Value}") and handle
the failure branch (e.g., return a failed Result/command response or throw a
controlled exception) instead of accessing .Value; assign nameSnapshot only when
the Result is successful and propagate or log the error otherwise to preserve
the Result-based flow.

In
`@src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Submissions/GetSubmission/GetSubmissionQueryHandler.cs`:
- Around line 8-49: GetSubmissionQueryHandler currently depends on
IRsvpSubmissionRepository and loads the EF aggregate; change it to use
IDbConnectionFactory and Dapper instead: inject IDbConnectionFactory into the
handler, open a connection, create a CommandDefinition (passing the
cancellationToken) with a SQL query that selects the submission row and its
companion rows (join or two queries) using parameters submissionId =
query.SubmissionId and weddingId = query.WeddingId, execute with
QueryAsync/QueryMultipleAsync and map results into the same SubmissionResponse
and List<SubmissionCompanionResponse> shapes, and keep the same null/not-found
check returning RsvpSubmissionErrors.NotFound(new
SubmissionId(query.SubmissionId)) when no rows; ensure you remove the call to
submissionRepository.GetByIdAsync and use CommandDefinition for every Dapper
call so the cancellationToken is passed through.

In
`@src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Submissions/ListSubmissions/ListSubmissionsQueryHandler.cs`:
- Around line 14-40: The handler currently loads all submissions via
submissionRepository.ListByWeddingAsync and performs in-memory filtering and
pagination (using query.Attending, query.Source, query.Skip, query.Take) which
must be pushed into the repository; add a repository method (e.g.,
submissionRepository.ListByWeddingAsync or ListByWeddingWithFiltersAsync) that
accepts weddingId plus optional filters for Attending and Source and pagination
parameters Skip/Take, implement the DB-level Where/Skip/Take there, and update
ListSubmissionsQueryHandler to call the new repository method and only map the
returned results into SubmissionSummaryResponse (preserving fields like
s.Id.Value, s.GuestId?.Value, s.NameSnapshot.Value, s.Attending,
s.Companions.Count, s.Source, s.SubmittedAtUtc).

In
`@src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Submissions/SubmitOnBehalf/SubmitOnBehalfCommandHandler.cs`:
- Around line 37-39: The code constructs a PersonName snapshot using
PersonName.Create($"{guest.FirstName.Value} {guest.LastName.Value}").Value which
can throw on invalid input; update SubmitOnBehalfCommandHandler to call
PersonName.Create and check the returned Result (or use a Try/TryParse-style
API) before accessing .Value, and if creation fails return or propagate a
failure Result from the handler instead of letting an exception escape;
reference the PersonName.Create call and the nameSnapshot variable when
implementing the guard so the handler preserves its Result error contract.

In
`@src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Weddings/ClearRsvpDeadline/ClearRsvpDeadlineCommandHandler.cs`:
- Around line 8-22: The handler ClearRsvpDeadlineCommandHandler currently
mutates the aggregate and calls IWeddingProjection.UpdateAsync; replace the
projection write with the domain repository + unit of work pattern: inject
IWeddingRepository and IUnitOfWork instead of IWeddingProjection, use
repository.Update(wedding) after calling wedding.SetRsvpDeadline(...), then call
await unitOfWork.SaveChangesAsync(cancellationToken) before returning; remove
the call to projection.UpdateAsync and ensure null-wedding handling and Result
return remain the same.

In
`@src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Weddings/SetRsvpDeadline/SetRsvpDeadlineCommandHandler.cs`:
- Around line 8-25: Replace use of IWeddingProjection with the domain repository
and unit-of-work pattern: change the handler constructor to accept
IWeddingRepository weddingRepository and IUnitOfWork unitOfWork (keep
IDateTimeProvider clock), fetch the aggregate via weddingRepository.GetAsync(new
WeddingId(command.WeddingId), ...), perform the same null check and call
wedding.SetRsvpDeadline(command.Deadline, clock.UtcNow), then call
weddingRepository.Update(wedding) and finally await
unitOfWork.SaveChangesAsync(cancellationToken) instead of calling
projection.UpdateAsync; update method/signature names accordingly
(SetRsvpDeadlineCommandHandler, weddingRepository.GetAsync,
weddingRepository.Update, unitOfWork.SaveChangesAsync).

In `@src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Guests/Guest.cs`:
- Around line 15-19: The properties FirstName, LastName and LookupCode use
null-forgiving (!) suppressions without justification; update the Guest
aggregate (properties FirstName, LastName, LookupCode in Guest.cs) to include an
inline comment explaining the nullable suppression reason (for example:
"initialized by EF Core during materialization" or equivalent) next to each =
null! initializer so it complies with project nullable policy and makes the
intent explicit.

In `@src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Weddings/WeddingId.cs`:
- Around line 3-7: Add a static New() factory to the WeddingId record so it
matches GuestId/SubmissionId patterns; implement static WeddingId New() that
returns a new WeddingId seeded with a UUIDv7 using the project's UUIDv7
generator (e.g., Uuid.NewV7() or GuidHelpers.NewV7()), keep the existing Empty
property and ToString() intact so callers can create consistent, strongly-typed
IDs via WeddingId.New().

In
`@src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Inbox/ConfigureProcessInboxJob.cs`:
- Around line 20-21: The schedule builder in ConfigureProcessInboxJob uses
WithIntervalInSeconds(_inboxOptions.IntervalInSeconds) without validating
non-positive values; add a guard before building the trigger in
ConfigureProcessInboxJob (or its enclosing method/constructor) to ensure
_inboxOptions.IntervalInSeconds > 0 and either throw a clear ArgumentException
or use a safe default, so the .WithSimpleSchedule(...) call never receives 0 or
negative seconds; reference the _inboxOptions.IntervalInSeconds field and the
schedule-building code that calls WithIntervalInSeconds to locate where to add
the check.

In
`@src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Outbox/ProcessOutboxJob.cs`:
- Around line 74-77: GetOutboxMessagesAsync and UpdateOutboxMessageAsync
currently call Dapper QueryAsync/ExecuteAsync without a CancellationToken, so
propagate the Quartz cancellation by adding a CancellationToken parameter to
these helpers (and to Execute where it calls them) and use Dapper's
CommandDefinition with cancellationToken: context.CancellationToken when calling
QueryAsync/ExecuteAsync; specifically update GetOutboxMessagesAsync and
UpdateOutboxMessageAsync signatures to accept a CancellationToken, thread
context.CancellationToken from Execute into those calls, and construct
CommandDefinition instances for the SQL executions to pass the token to Dapper.

In
`@src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Submissions/RsvpSubmissionConfiguration.cs`:
- Around line 59-64: The HasMaxLength(45) call in RsvpSubmissionConfiguration
for the IpAddress property uses a magic number; add or use the domain
value-object constant (e.g., on the IP address VO such as IpAddress.MaxLength or
RsvpIpAddress.MaxLength) and replace the literal 45 with that constant in the
HasMaxLength call inside the RsvpSubmissionConfiguration class; ensure the
constant is public on the owning domain type so the EF configuration can
reference it.

In
`@src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Weddings/WeddingProjection.cs`:
- Around line 12-19: UpsertAsync in WeddingProjection no-ops when an existing
Wedding is found; update the tracked entity with the incoming wedding's values
before SaveChangesAsync. Locate the UpsertAsync method and, when existing !=
null, apply the incoming wedding onto the tracked entity (for example by mapping
properties or using context.Entry(existing).CurrentValues.SetValues(wedding)) so
fields are updated, then call await context.SaveChangesAsync(cancellationToken);
ensure you preserve the existing entity's key and navigation tracking rather
than replacing the tracked instance.

In
`@src/Modules/Rsvp/Eternelle.Modules.Rsvp.Presentation/Submissions/ListSubmissionsEndpoint.cs`:
- Line 31: The current parsing in ListSubmissionsEndpoint.cs uses
Enum.TryParse<RsvpSource> which will accept numeric strings that don't map to
declared members; change the logic around the RsvpSource parsing so you still
TryParse into the local variable (s) but only assign parsedSource = s if
Enum.IsDefined(typeof(RsvpSource), s) returns true, otherwise set parsedSource
to null; update the single expression that defines parsedSource (or the
surrounding block) to perform both TryParse and Enum.IsDefined checks using the
RsvpSource type and the local variable name s.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 3fccc054-60b9-4ce1-9d4a-090ec8a2b382

📥 Commits

Reviewing files that changed from the base of the PR and between 42cac9f and e173eec.

📒 Files selected for processing (223)
  • Eternelle.slnx
  • docs/database-design.md
  • src/API/Eternelle.Api/Eternelle.Api.csproj
  • src/API/Eternelle.Api/Extensions/MigrationExtensions.cs
  • src/API/Eternelle.Api/Program.cs
  • src/API/Eternelle.Api/modules.rsvp.Development.json
  • src/API/Eternelle.Api/modules.rsvp.json
  • src/Common/Eternelle.Common.Domain/AssemblyInfo.cs
  • src/Common/Eternelle.Common.Domain/People/EmailAddress.cs
  • src/Common/Eternelle.Common.Domain/People/EmailAddressErrors.cs
  • src/Common/Eternelle.Common.Domain/People/PersonFirstName.cs
  • src/Common/Eternelle.Common.Domain/People/PersonFirstNameErrors.cs
  • src/Common/Eternelle.Common.Domain/People/PersonLastName.cs
  • src/Common/Eternelle.Common.Domain/People/PersonLastNameErrors.cs
  • src/Common/Eternelle.Common.Domain/People/PersonName.cs
  • src/Common/Eternelle.Common.Domain/People/PersonNameErrors.cs
  • src/Common/Eternelle.Common.Domain/People/PhoneNumber.cs
  • src/Common/Eternelle.Common.Domain/People/PhoneNumberErrors.cs
  • src/Common/Eternelle.Common.Domain/Text/GroupLabel.cs
  • src/Common/Eternelle.Common.Domain/Text/GroupLabelErrors.cs
  • src/Common/Eternelle.Common.Domain/Text/InternalNote.cs
  • src/Common/Eternelle.Common.Domain/Text/InternalNoteErrors.cs
  • src/Common/Eternelle.Common.Domain/Text/RichDescription.cs
  • src/Common/Eternelle.Common.Domain/Text/RichDescriptionErrors.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Abstractions/Data/IUnitOfWork.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Abstractions/Security/ITokenGenerator.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/AssemblyReference.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Eternelle.Modules.Rsvp.Application.csproj
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/AddGuest/AddGuestCommand.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/AddGuest/AddGuestCommandHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/AddGuest/AddGuestCommandValidator.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/ChangeGuestAllowance/ChangeGuestAllowanceCommand.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/ChangeGuestAllowance/ChangeGuestAllowanceCommandHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/ChangeGuestAllowance/ChangeGuestAllowanceCommandValidator.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/GetGuest/GetGuestQuery.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/GetGuest/GetGuestQueryHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/GetGuest/GuestResponse.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/GuestAddedDomainEventHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/ListGuests/GuestSummaryResponse.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/ListGuests/ListGuestsQuery.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/ListGuests/ListGuestsQueryHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/LockGuest/LockGuestCommand.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/LockGuest/LockGuestCommandHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/LockGuest/LockGuestCommandValidator.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/RegenerateGuestToken/RegenerateGuestTokenCommand.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/RegenerateGuestToken/RegenerateGuestTokenCommandHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/RegenerateGuestToken/RegenerateGuestTokenCommandValidator.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/RemoveGuest/RemoveGuestCommand.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/RemoveGuest/RemoveGuestCommandHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/RemoveGuest/RemoveGuestCommandValidator.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/UnlockGuest/UnlockGuestCommand.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/UnlockGuest/UnlockGuestCommandHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/UnlockGuest/UnlockGuestCommandValidator.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/UpdateGuestContact/UpdateGuestContactCommand.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/UpdateGuestContact/UpdateGuestContactCommandHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/UpdateGuestContact/UpdateGuestContactCommandValidator.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/UpdateGuestPlacement/UpdateGuestPlacementCommand.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/UpdateGuestPlacement/UpdateGuestPlacementCommandHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/UpdateGuestPlacement/UpdateGuestPlacementCommandValidator.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Public/GetInvitation/GetInvitationQuery.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Public/GetInvitation/GetInvitationQueryHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Public/GetInvitation/InvitationResponse.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Public/SubmitRsvp/SubmitRsvpCommand.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Public/SubmitRsvp/SubmitRsvpCommandHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Public/SubmitRsvp/SubmitRsvpCommandValidator.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Submissions/GetHeadcount/GetHeadcountQuery.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Submissions/GetHeadcount/GetHeadcountQueryHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Submissions/GetHeadcount/HeadcountResponse.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Submissions/GetSubmission/GetSubmissionQuery.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Submissions/GetSubmission/GetSubmissionQueryHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Submissions/GetSubmission/SubmissionResponse.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Submissions/ListSubmissions/ListSubmissionsQuery.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Submissions/ListSubmissions/ListSubmissionsQueryHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Submissions/ListSubmissions/SubmissionSummaryResponse.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Submissions/RsvpSubmittedDomainEventHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Submissions/SubmitOnBehalf/SubmitOnBehalfCommand.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Submissions/SubmitOnBehalf/SubmitOnBehalfCommandHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Submissions/SubmitOnBehalf/SubmitOnBehalfCommandValidator.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Weddings/ClearRsvpDeadline/ClearRsvpDeadlineCommand.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Weddings/ClearRsvpDeadline/ClearRsvpDeadlineCommandHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Weddings/ClearRsvpDeadline/ClearRsvpDeadlineCommandValidator.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Weddings/SetRsvpDeadline/SetRsvpDeadlineCommand.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Weddings/SetRsvpDeadline/SetRsvpDeadlineCommandHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Weddings/SetRsvpDeadline/SetRsvpDeadlineCommandValidator.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/AssemblyInfo.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Eternelle.Modules.Rsvp.Domain.csproj
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Guests/Guest.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Guests/GuestAddedDomainEvent.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Guests/GuestAllowanceChangedDomainEvent.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Guests/GuestContactUpdatedDomainEvent.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Guests/GuestErrors.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Guests/GuestId.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Guests/GuestLockedDomainEvent.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Guests/GuestLookupCodeRegeneratedDomainEvent.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Guests/GuestPlacementUpdatedDomainEvent.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Guests/GuestRemovedDomainEvent.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Guests/GuestUnlockedDomainEvent.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Guests/IGuestRepository.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Shared/DietaryNote.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Shared/DietaryNoteErrors.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Shared/LookupCode.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Shared/LookupCodeErrors.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Submissions/CompanionId.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Submissions/IRsvpSubmissionRepository.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Submissions/RsvpSource.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Submissions/RsvpSubmission.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Submissions/RsvpSubmissionErrors.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Submissions/RsvpSubmittedDomainEvent.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Submissions/SubmissionCompanion.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Submissions/SubmissionId.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Weddings/IWeddingProjection.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Weddings/Wedding.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Weddings/WeddingId.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Database/Converters/CompanionIdConverter.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Database/Converters/GuestIdConverter.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Database/Converters/SubmissionIdConverter.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Database/Converters/WeddingIdConverter.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Database/RsvpDbContext.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Database/RsvpDbContextFactory.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Database/Schemas.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Eternelle.Modules.Rsvp.Infrastructure.csproj
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Guests/GuestConfiguration.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Guests/GuestRepository.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Inbox/ConfigureProcessInboxJob.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Inbox/IdempotentIntegrationEventHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Inbox/InboxOptions.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Inbox/IntegrationEventConsumer.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Inbox/ProcessInboxJob.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Migrations/20260529094037_InitialRsvp.Designer.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Migrations/20260529094037_InitialRsvp.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Migrations/RsvpDbContextModelSnapshot.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Outbox/ConfigureProcessOutboxJob.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Outbox/IdempotentDomainEventHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Outbox/OutboxOptions.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Outbox/ProcessOutboxJob.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/RsvpModule.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Security/LookupCodeGenerator.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Submissions/RsvpSubmissionConfiguration.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Submissions/RsvpSubmissionRepository.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Weddings/WeddingConfiguration.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Weddings/WeddingProjection.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.IntegrationEvents/Eternelle.Modules.Rsvp.IntegrationEvents.csproj
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.IntegrationEvents/Guests/GuestAddedIntegrationEvent.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.IntegrationEvents/Submissions/RsvpSubmittedIntegrationEvent.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Presentation/AssemblyReference.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Presentation/Eternelle.Modules.Rsvp.Presentation.csproj
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Presentation/Guests/AddGuestEndpoint.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Presentation/Guests/ChangeGuestAllowanceEndpoint.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Presentation/Guests/GetGuestEndpoint.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Presentation/Guests/ListGuestsEndpoint.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Presentation/Guests/LockGuestEndpoint.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Presentation/Guests/RegenerateGuestTokenEndpoint.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Presentation/Guests/RemoveGuestEndpoint.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Presentation/Guests/UnlockGuestEndpoint.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Presentation/Guests/UpdateGuestContactEndpoint.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Presentation/Guests/UpdateGuestPlacementEndpoint.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Presentation/Public/GetInvitationEndpoint.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Presentation/Public/SubmitRsvpEndpoint.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Presentation/RateLimitingPolicies.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Presentation/Submissions/GetHeadcountEndpoint.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Presentation/Submissions/GetSubmissionEndpoint.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Presentation/Submissions/ListSubmissionsEndpoint.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Presentation/Submissions/SubmitOnBehalfEndpoint.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Presentation/Tags.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Presentation/Weddings/ClearRsvpDeadlineEndpoint.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Presentation/Weddings/SetRsvpDeadlineEndpoint.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Presentation/Weddings/WeddingCreatedIntegrationEventHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/CeremonyActs/CreateCeremonyAct/CreateCeremonyActCommandHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/CeremonyActs/CreateCeremonyAct/CreateCeremonyActCommandValidator.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/CeremonyActs/UpdateCeremonyAct/UpdateCeremonyActCommandHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/CeremonyActs/UpdateCeremonyAct/UpdateCeremonyActCommandValidator.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/DressCodeConfigs/CreateDressCodeConfig/CreateDressCodeConfigCommandHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/DressCodeConfigs/CreateDressCodeConfig/CreateDressCodeConfigCommandValidator.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/DressCodeConfigs/UpdateDressCodeConfig/UpdateDressCodeConfigCommandHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/DressCodeConfigs/UpdateDressCodeConfig/UpdateDressCodeConfigCommandValidator.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/EntourageGroups/AddEntourageMember/AddEntourageMemberCommandHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/EntourageGroups/AddEntourageMember/AddEntourageMemberCommandValidator.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/EntourageGroups/CreateEntourageGroup/CreateEntourageGroupCommandHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/EntourageGroups/CreateEntourageGroup/CreateEntourageGroupCommandValidator.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/EntourageGroups/PairEntourageCouple/PairEntourageCoupleCommandHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/EntourageGroups/UpdateEntourageGroup/UpdateEntourageGroupCommandHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/EntourageGroups/UpdateEntourageGroup/UpdateEntourageGroupCommandValidator.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/EntourageGroups/UpdateEntourageMember/UpdateEntourageMemberCommandHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/EntourageGroups/UpdateEntourageMember/UpdateEntourageMemberCommandValidator.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/GiftOptions/CreateGiftOption/CreateGiftOptionCommandHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/GiftOptions/CreateGiftOption/CreateGiftOptionCommandValidator.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/GiftOptions/UpdateGiftOption/UpdateGiftOptionCommandHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/GiftOptions/UpdateGiftOption/UpdateGiftOptionCommandValidator.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/GuestPhotos/RegisterGuestPhotos/RegisterGuestPhotosCommandHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/GuestPhotos/RegisterGuestPhotos/RegisterGuestPhotosCommandValidator.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/Reminders/CreateReminder/CreateReminderCommandHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/Reminders/CreateReminder/CreateReminderCommandValidator.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/Reminders/UpdateReminder/UpdateReminderCommandHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/Reminders/UpdateReminder/UpdateReminderCommandValidator.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/StoryMoments/CreateStoryMoment/CreateStoryMomentCommandHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/StoryMoments/CreateStoryMoment/CreateStoryMomentCommandValidator.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/StoryMoments/UpdateStoryMoment/UpdateStoryMomentCommandHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/StoryMoments/UpdateStoryMoment/UpdateStoryMomentCommandValidator.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/Weddings/AddPartner/AddPartnerCommandHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/Weddings/AddPartner/AddPartnerCommandValidator.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/Weddings/UpdatePartner/UpdatePartnerCommandHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/Weddings/UpdatePartner/UpdatePartnerCommandValidator.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Domain/CeremonyActs/CeremonyAct.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Domain/DressCodeConfigs/DressCodeConfig.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Domain/EntourageGroups/EntourageCouple.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Domain/EntourageGroups/EntourageGroup.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Domain/EntourageGroups/EntourageMember.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Domain/GiftOptions/GiftOption.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Domain/GuestPhotos/GuestPhoto.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Domain/Reminders/Reminder.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Domain/StoryMoments/StoryMoment.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Domain/Weddings/Partner.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Domain/Weddings/Wedding.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Infrastructure/CeremonyActs/CeremonyActConfiguration.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Infrastructure/DressCodeConfigs/DressCodeConfigConfiguration.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Infrastructure/EntourageGroups/EntourageCoupleConfiguration.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Infrastructure/EntourageGroups/EntourageGroupConfiguration.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Infrastructure/EntourageGroups/EntourageMemberConfiguration.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Infrastructure/GiftOptions/GiftOptionConfiguration.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Infrastructure/GuestPhotos/GuestPhotoConfiguration.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Infrastructure/Reminders/ReminderConfiguration.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Infrastructure/StoryMoments/StoryMomentConfiguration.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Infrastructure/Weddings/WeddingConfiguration.cs

Comment thread docs/database-design.md Outdated
Comment thread docs/database-design.md Outdated
Changed Tier, PriceClass, and SectionId columns from string to integer types in migration and model snapshot files. Removed SQL data seeding from migration and made minor formatting and namespace adjustments.
Replace the stale database-design.md draft with a system-level architecture.md
covering runtime topology, the shared kernel, the synchronous request lifecycle,
the async outbox/inbox messaging pipeline, a corrected cross-module data view
(shipped schemas only) + integration-event map, cross-cutting concerns, and
architecture decisions. Repoint references in CLAUDE.md, README.md,
Eternelle.slnx, and docs/modules/README.md.
Removed the weddings inbox/outbox alignment plan from the solution. Added warning-level log filters for Catalog, Tenancy, and Rsvp module Outbox and Inbox components in development settings.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/architecture.md`:
- Around line 99-100: Add missing blank lines around subsection headings and
tables: ensure there is a blank line before each subsection heading like "###
`Common.Domain`" and add blank lines above and below each markdown table and
code block throughout the document (sections referenced: headings and tables
around `Common.Domain` and the listed ranges). Also update the closing code
fence that currently reads ```text to ```markdown to explicitly set the language
for that fenced block; verify every fenced block has a blank line before the
opening fence and before the closing fence. Fix the noted occurrences (including
the one with "### `Common.Domain`" and the fenced block using ```text)
consistently across the file.
- Around line 264-275: The docs list for WeddingCreatedIntegrationEvent is
stale; update the Integration-event map row for WeddingCreatedIntegrationEvent
to show RSVP as a consumer (since RsvpModule and
WeddingCreatedIntegrationEventHandler already handle it) by replacing “(none
yet)” with “RSVP” (or, if you prefer the repo-main-only doc rule, add an
explicit parenthetical note stating RSVP handling exists in RsvpModule /
WeddingCreatedIntegrationEventHandler but is pending merge); ensure you
reference the event name WeddingCreatedIntegrationEvent and the consumer module
identifiers RsvpModule and WeddingCreatedIntegrationEventHandler so readers can
find the implementation.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 0d9070a6-96e8-4c13-a79d-aab06c9f0216

📥 Commits

Reviewing files that changed from the base of the PR and between ab613a6 and 31aaba6.

📒 Files selected for processing (6)
  • CLAUDE.md
  • Eternelle.slnx
  • README.md
  • docs/architecture.md
  • docs/modules/README.md
  • src/API/Eternelle.Api/appsettings.Development.json

Comment thread docs/architecture.md
Comment thread docs/architecture.md Outdated
Refactored RSVP module query handlers to use Dapper and direct SQL via IDbConnectionFactory, replacing repository/domain model access for guest and submission queries. Improved error handling, added query validation, and updated ProcessOutboxJob for cancellation support. Enhanced enum validation, upsert logic, and documentation. Introduced WeddingErrors for consistent error reporting.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Public/GetInvitation/GetInvitationQueryHandler.cs`:
- Line 26: GetInvitationQueryHandler currently calls
IDbConnectionFactory.OpenConnectionAsync() without a CancellationToken but the
interface/DbConnectionFactory lack a CancellationToken overload; add a new
OpenConnectionAsync(CancellationToken) method to IDbConnectionFactory and
implement it in DbConnectionFactory (and any other implementations), then update
GetInvitationQueryHandler to call OpenConnectionAsync(cancellationToken) so
connection acquisition can be cancelled while leaving existing Dapper
CommandDefinition cancellation handling unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: d8686371-3d90-4578-a9b4-d88a6cfe3b3f

📥 Commits

Reviewing files that changed from the base of the PR and between 31aaba6 and ee60578.

📒 Files selected for processing (19)
  • Eternelle.slnx
  • docs/architecture.md
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/AddGuest/AddGuestCommandHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/GetGuest/GetGuestQueryHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/ListGuests/ListGuestsQueryHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/ListGuests/ListGuestsQueryValidator.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/RegenerateGuestToken/RegenerateGuestTokenCommandHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Public/GetInvitation/GetInvitationQueryHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Submissions/GetHeadcount/GetHeadcountQueryHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Submissions/GetSubmission/GetSubmissionQueryHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Submissions/ListSubmissions/ListSubmissionsQueryHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Submissions/SubmitOnBehalf/SubmitOnBehalfCommandHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Guests/Guest.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Submissions/RsvpSubmission.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Domain/Weddings/WeddingErrors.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Outbox/ProcessOutboxJob.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Submissions/RsvpSubmissionConfiguration.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Weddings/WeddingProjection.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Presentation/Submissions/ListSubmissionsEndpoint.cs

Consistently pass CancellationToken to all async DB connections by updating IDbConnectionFactory and all usages. Replace some .ToList() calls with spread operator for brevity. Fix PersonName creation error handling in SubmitRsvpCommandHandler.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@src/Modules/Weddings/Eternelle.Modules.Weddings.Application/Weddings/GetWedding/GetWeddingQueryHandler.cs`:
- Line 15: The multi-mapping Dapper call in GetWeddingQueryHandler uses
connection.QueryAsync(...) without a CommandDefinition, so the query isn’t
cancellable; change the call to use new CommandDefinition(sql, query,
cancellationToken: cancellationToken) (or equivalent) when invoking
connection.QueryAsync to pass the cancellationToken through, keeping the same
sql and query parameters and preserving the multi-mapping delegate and splitOn
behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 60c6a333-6628-4362-9906-752e6a99f479

📥 Commits

Reviewing files that changed from the base of the PR and between ee60578 and 7db7476.

📒 Files selected for processing (38)
  • src/Common/Eternelle.Common.Application/Data/IDbConnectionFactory.cs
  • src/Common/Eternelle.Common.Infrastructure/Data/DbConnectionFactory.cs
  • src/Modules/Catalog/Eternelle.Modules.Catalog.Application/Templates/GetSectionVariants/GetSectionVariantsQueryHandler.cs
  • src/Modules/Catalog/Eternelle.Modules.Catalog.Application/Templates/GetSupportedSections/GetSupportedSectionsQueryHandler.cs
  • src/Modules/Catalog/Eternelle.Modules.Catalog.Application/Templates/GetTemplateById/GetTemplateByIdQueryHandler.cs
  • src/Modules/Catalog/Eternelle.Modules.Catalog.Application/Templates/GetTemplates/GetTemplatesQueryHandler.cs
  • src/Modules/Catalog/Eternelle.Modules.Catalog.Infrastructure/Outbox/IdempotentDomainEventHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/GetGuest/GetGuestQueryHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/ListGuests/ListGuestsQueryHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Public/GetInvitation/GetInvitationQueryHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Public/SubmitRsvp/SubmitRsvpCommandHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Submissions/GetHeadcount/GetHeadcountQueryHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Submissions/GetSubmission/GetSubmissionQueryHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Submissions/ListSubmissions/ListSubmissionsQueryHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Inbox/IdempotentIntegrationEventHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Outbox/IdempotentDomainEventHandler.cs
  • src/Modules/Tenancy/Eternelle.Modules.Tenancy.Application/Tenants/GetTenant/GetTenantQueryHandler.cs
  • src/Modules/Tenancy/Eternelle.Modules.Tenancy.Application/Tenants/GetTenantSections/GetTenantSectionsQueryHandler.cs
  • src/Modules/Tenancy/Eternelle.Modules.Tenancy.Infrastructure/Inbox/IdempotentIntegrationEventHandler.cs
  • src/Modules/Tenancy/Eternelle.Modules.Tenancy.Infrastructure/Outbox/IdempotentDomainEventHandler.cs
  • src/Modules/Users/Eternelle.Modules.Users.Application/Users/GetUser/GetUserQueryHandler.cs
  • src/Modules/Users/Eternelle.Modules.Users.Application/Users/GetUserPermissions/GetUserPermissionsQueryHandler.cs
  • src/Modules/Users/Eternelle.Modules.Users.Infrastructure/Inbox/IdempotentIntegrationEventHandler.cs
  • src/Modules/Users/Eternelle.Modules.Users.Infrastructure/Outbox/IdempotentDomainEventHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/CeremonyActs/GetCeremonyActs/GetCeremonyActsQueryHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/DressCodeConfigs/GetDressCodeConfig/GetDressCodeConfigQueryHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/EntourageGroups/GetEntourageGroups/GetEntourageGroupsQueryHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/GalleryImages/GetGalleryImages/GetGalleryImagesQueryHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/GiftOptions/GetGiftOptions/GetGiftOptionsQueryHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/GuestPhotos/GetGuestPhotos/GetGuestPhotosQueryHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/GuestPhotos/GetPublicGuestPhotos/GetPublicGuestPhotosQueryHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/GuestPhotos/GetUploadContext/GetUploadContextQueryHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/Reminders/GetReminders/GetRemindersQueryHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/StoryMoments/GetStoryMoments/GetStoryMomentsQueryHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/VendorCredits/GetVendorCredits/GetVendorCreditsQueryHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/Weddings/GetWedding/GetWeddingQueryHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Infrastructure/Inbox/IdempotentIntegrationEventHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Infrastructure/Outbox/IdempotentDomainEventHandler.cs

Updated QueryAsync to use CommandDefinition, ensuring proper parameter handling and support for cancellation tokens during query execution. This improves reliability and consistency in database operations.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
src/Modules/Tenancy/Eternelle.Modules.Tenancy.Infrastructure/Inbox/IdempotentIntegrationEventHandler.cs (1)

19-30: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Propagate cancellationToken to Dapper operations.

Same issue as in Users.Infrastructure.IdempotentIntegrationEventHandler: the cancellationToken is passed to OpenConnectionAsync but not to the Dapper ExecuteScalarAsync (line 47) and ExecuteAsync (line 60) operations. For consistent cancellation support, wrap these in CommandDefinition and pass the token.

Proposed fix

Update the helper method signatures to accept CancellationToken:

 private static async Task<bool> InboxConsumerExistsAsync(
     DbConnection dbConnection,
-    InboxMessageConsumer inboxMessageConsumer)
+    InboxMessageConsumer inboxMessageConsumer,
+    CancellationToken cancellationToken)
 private static async Task InsertInboxConsumerAsync(
     DbConnection dbConnection,
-    InboxMessageConsumer inboxMessageConsumer)
+    InboxMessageConsumer inboxMessageConsumer,
+    CancellationToken cancellationToken)

Then use CommandDefinition:

-        return await dbConnection.ExecuteScalarAsync<bool>(sql, inboxMessageConsumer);
+        return await dbConnection.ExecuteScalarAsync<bool>(
+            new CommandDefinition(sql, inboxMessageConsumer, cancellationToken: cancellationToken));
-        await dbConnection.ExecuteAsync(sql, inboxMessageConsumer);
+        await dbConnection.ExecuteAsync(
+            new CommandDefinition(sql, inboxMessageConsumer, cancellationToken: cancellationToken));

Update callsites at lines 23 and 30 to pass cancellationToken.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@src/Modules/Tenancy/Eternelle.Modules.Tenancy.Infrastructure/Inbox/IdempotentIntegrationEventHandler.cs`
around lines 19 - 30, The Dapper calls in IdempotentIntegrationEventHandler are
not honoring cancellation; update the helper methods InboxConsumerExistsAsync
and InsertInboxConsumerAsync to accept a CancellationToken parameter, and inside
each method construct and use Dapper.CommandDefinition (or equivalent) that
includes the CancellationToken for ExecuteScalarAsync/ExecuteAsync calls; then
pass the cancellationToken from the caller when invoking
InboxConsumerExistsAsync(...) and InsertInboxConsumerAsync(...). Ensure you
reference the existing inboxMessageConsumer parameter and the opened
DbConnection when building the CommandDefinition so the correct SQL, parameters
and connection are used.
src/Modules/Users/Eternelle.Modules.Users.Infrastructure/Inbox/IdempotentIntegrationEventHandler.cs (1)

19-30: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Propagate cancellationToken to Dapper operations.

The cancellationToken is passed to OpenConnectionAsync but not to ExecuteScalarAsync (line 47) and ExecuteAsync (line 60). For consistent cancellation support, pass the token to all async operations.

Proposed fix
-        return await dbConnection.ExecuteScalarAsync<bool>(sql, inboxMessageConsumer);
+        return await dbConnection.ExecuteScalarAsync<bool>(
+            new CommandDefinition(sql, inboxMessageConsumer, cancellationToken: cancellationToken));

And similarly for InsertInboxConsumerAsync:

-        await dbConnection.ExecuteAsync(sql, inboxMessageConsumer);
+        await dbConnection.ExecuteAsync(
+            new CommandDefinition(sql, inboxMessageConsumer, cancellationToken: cancellationToken));

Note: These methods need access to the cancellationToken, so update their signatures:

 private static async Task<bool> InboxConsumerExistsAsync(
     DbConnection dbConnection,
-    InboxMessageConsumer inboxMessageConsumer)
+    InboxMessageConsumer inboxMessageConsumer,
+    CancellationToken cancellationToken)
 private static async Task InsertInboxConsumerAsync(
     DbConnection dbConnection,
-    InboxMessageConsumer inboxMessageConsumer)
+    InboxMessageConsumer inboxMessageConsumer,
+    CancellationToken cancellationToken)

Then update the callsites at lines 23 and 30 to pass cancellationToken.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@src/Modules/Users/Eternelle.Modules.Users.Infrastructure/Inbox/IdempotentIntegrationEventHandler.cs`
around lines 19 - 30, The Dapper calls are not propagating cancellation even
though OpenConnectionAsync receives cancellationToken; update the
InboxConsumerExistsAsync and InsertInboxConsumerAsync methods to accept a
CancellationToken parameter and pass that token into the Dapper async calls
(e.g., ExecuteScalarAsync/ExecuteAsync) inside those methods; then update the
caller in IdempotentIntegrationEventHandler to pass the same cancellationToken
when invoking InboxConsumerExistsAsync(inboxMessageConsumer, cancellationToken)
and InsertInboxConsumerAsync(inboxMessageConsumer, cancellationToken), leaving
the decorated.Handle(integrationEvent, cancellationToken) call as-is so all
async operations honor cancellation.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In
`@src/Modules/Tenancy/Eternelle.Modules.Tenancy.Infrastructure/Inbox/IdempotentIntegrationEventHandler.cs`:
- Around line 19-30: The Dapper calls in IdempotentIntegrationEventHandler are
not honoring cancellation; update the helper methods InboxConsumerExistsAsync
and InsertInboxConsumerAsync to accept a CancellationToken parameter, and inside
each method construct and use Dapper.CommandDefinition (or equivalent) that
includes the CancellationToken for ExecuteScalarAsync/ExecuteAsync calls; then
pass the cancellationToken from the caller when invoking
InboxConsumerExistsAsync(...) and InsertInboxConsumerAsync(...). Ensure you
reference the existing inboxMessageConsumer parameter and the opened
DbConnection when building the CommandDefinition so the correct SQL, parameters
and connection are used.

In
`@src/Modules/Users/Eternelle.Modules.Users.Infrastructure/Inbox/IdempotentIntegrationEventHandler.cs`:
- Around line 19-30: The Dapper calls are not propagating cancellation even
though OpenConnectionAsync receives cancellationToken; update the
InboxConsumerExistsAsync and InsertInboxConsumerAsync methods to accept a
CancellationToken parameter and pass that token into the Dapper async calls
(e.g., ExecuteScalarAsync/ExecuteAsync) inside those methods; then update the
caller in IdempotentIntegrationEventHandler to pass the same cancellationToken
when invoking InboxConsumerExistsAsync(inboxMessageConsumer, cancellationToken)
and InsertInboxConsumerAsync(inboxMessageConsumer, cancellationToken), leaving
the decorated.Handle(integrationEvent, cancellationToken) call as-is so all
async operations honor cancellation.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: fdba92e0-5124-4efc-b13b-e8e3ab76a4c4

📥 Commits

Reviewing files that changed from the base of the PR and between ee60578 and a2135df.

📒 Files selected for processing (38)
  • src/Common/Eternelle.Common.Application/Data/IDbConnectionFactory.cs
  • src/Common/Eternelle.Common.Infrastructure/Data/DbConnectionFactory.cs
  • src/Modules/Catalog/Eternelle.Modules.Catalog.Application/Templates/GetSectionVariants/GetSectionVariantsQueryHandler.cs
  • src/Modules/Catalog/Eternelle.Modules.Catalog.Application/Templates/GetSupportedSections/GetSupportedSectionsQueryHandler.cs
  • src/Modules/Catalog/Eternelle.Modules.Catalog.Application/Templates/GetTemplateById/GetTemplateByIdQueryHandler.cs
  • src/Modules/Catalog/Eternelle.Modules.Catalog.Application/Templates/GetTemplates/GetTemplatesQueryHandler.cs
  • src/Modules/Catalog/Eternelle.Modules.Catalog.Infrastructure/Outbox/IdempotentDomainEventHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/GetGuest/GetGuestQueryHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Guests/ListGuests/ListGuestsQueryHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Public/GetInvitation/GetInvitationQueryHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Public/SubmitRsvp/SubmitRsvpCommandHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Submissions/GetHeadcount/GetHeadcountQueryHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Submissions/GetSubmission/GetSubmissionQueryHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Application/Submissions/ListSubmissions/ListSubmissionsQueryHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Inbox/IdempotentIntegrationEventHandler.cs
  • src/Modules/Rsvp/Eternelle.Modules.Rsvp.Infrastructure/Outbox/IdempotentDomainEventHandler.cs
  • src/Modules/Tenancy/Eternelle.Modules.Tenancy.Application/Tenants/GetTenant/GetTenantQueryHandler.cs
  • src/Modules/Tenancy/Eternelle.Modules.Tenancy.Application/Tenants/GetTenantSections/GetTenantSectionsQueryHandler.cs
  • src/Modules/Tenancy/Eternelle.Modules.Tenancy.Infrastructure/Inbox/IdempotentIntegrationEventHandler.cs
  • src/Modules/Tenancy/Eternelle.Modules.Tenancy.Infrastructure/Outbox/IdempotentDomainEventHandler.cs
  • src/Modules/Users/Eternelle.Modules.Users.Application/Users/GetUser/GetUserQueryHandler.cs
  • src/Modules/Users/Eternelle.Modules.Users.Application/Users/GetUserPermissions/GetUserPermissionsQueryHandler.cs
  • src/Modules/Users/Eternelle.Modules.Users.Infrastructure/Inbox/IdempotentIntegrationEventHandler.cs
  • src/Modules/Users/Eternelle.Modules.Users.Infrastructure/Outbox/IdempotentDomainEventHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/CeremonyActs/GetCeremonyActs/GetCeremonyActsQueryHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/DressCodeConfigs/GetDressCodeConfig/GetDressCodeConfigQueryHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/EntourageGroups/GetEntourageGroups/GetEntourageGroupsQueryHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/GalleryImages/GetGalleryImages/GetGalleryImagesQueryHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/GiftOptions/GetGiftOptions/GetGiftOptionsQueryHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/GuestPhotos/GetGuestPhotos/GetGuestPhotosQueryHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/GuestPhotos/GetPublicGuestPhotos/GetPublicGuestPhotosQueryHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/GuestPhotos/GetUploadContext/GetUploadContextQueryHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/Reminders/GetReminders/GetRemindersQueryHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/StoryMoments/GetStoryMoments/GetStoryMomentsQueryHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/VendorCredits/GetVendorCredits/GetVendorCreditsQueryHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Application/Weddings/GetWedding/GetWeddingQueryHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Infrastructure/Inbox/IdempotentIntegrationEventHandler.cs
  • src/Modules/Weddings/Eternelle.Modules.Weddings.Infrastructure/Outbox/IdempotentDomainEventHandler.cs

@engrkwakwak engrkwakwak merged commit 30cc52b into develop May 30, 2026
1 check passed
@engrkwakwak engrkwakwak deleted the eternelle-191 branch May 30, 2026 11:19
This was referenced May 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Umbrella] RSVP Module — invitation-gated guest list + submission flow

1 participant