master 91c8ef24b4cb cached
1289 files
2.2 MB
657.7k tokens
3486 symbols
1 requests
Download .txt
Showing preview only (2,600K chars total). Download the full file or copy to clipboard to get everything.
Repository: kgrzybek/modular-monolith-with-ddd
Branch: master
Commit: 91c8ef24b4cb
Files: 1289
Total size: 2.2 MB

Directory structure:
gitextract_sty9z65e/

├── .github/
│   └── workflows/
│       └── buildPipeline.yml
├── .gitignore
├── .nuke/
│   ├── build.schema.json
│   └── parameters.json
├── LICENSE
├── README.md
├── azure-pipelines.yml
├── build/
│   ├── .editorconfig
│   ├── Build.cs
│   ├── BuildIntegrationTests.cs
│   ├── Configuration.cs
│   ├── Database.cs
│   ├── Directory.Build.props
│   ├── Directory.Build.targets
│   ├── SUTCreator.cs
│   ├── Utils/
│   │   └── SqlReadinessChecker.cs
│   ├── _build.csproj
│   └── _build.csproj.DotSettings
├── build.cmd
├── build.ps1
├── build.sh
├── docker-compose.yml
├── docs/
│   ├── C4/
│   │   ├── c1_system_context.puml
│   │   ├── c2_container.puml
│   │   ├── c3_components.puml
│   │   ├── c3_components_module.puml
│   │   └── c4_class.puml
│   ├── PlantUML/
│   │   ├── Commenting_Conceptual_Model.puml
│   │   └── Conceptual_Model.puml
│   ├── Project/
│   │   └── MyMeetings.vpp
│   ├── architecture-decision-log/
│   │   ├── 0001-record-architecture-decisions.md
│   │   ├── 0002-use_modular-monolith-system-architecture.md
│   │   ├── 0003-use_dotnetcore_and_csharp.md
│   │   ├── 0004-divide-the-system-into-4-modules.md
│   │   ├── 0005-create-one-rest-api-module.md
│   │   ├── 0006-create-facade-between-api-and-business-module.md
│   │   ├── 0007-use-cqrs-architectural-style.md
│   │   ├── 0008-allow-return-result-after-command-processing.md
│   │   ├── 0009-use-2-layered-architectural-style-for-reads.md
│   │   ├── 0010-use-clean-architecture-for-writes.md
│   │   ├── 0011-create-rich-domain-models.md
│   │   ├── 0012-use-domain-driven-design-tactical-patterns.md
│   │   ├── 0013-protect-business-invariants-using-exceptions.md
│   │   ├── 0014-event-driven-communication-between-modules.md
│   │   ├── 0015-use-in-memory-events-bus.md
│   │   ├── 0016-create-ioc-container-per-module.md
│   │   └── 0017-implement-archictecture-tests.md
│   ├── catalog-of-terms/
│   │   ├── Aggregate-DDD/
│   │   │   ├── README.md
│   │   │   └── aggregate-ddd.puml
│   │   ├── Command/
│   │   │   ├── README.md
│   │   │   └── command.puml
│   │   ├── Decorator-Pattern/
│   │   │   ├── README.md
│   │   │   └── decorator-pattern.puml
│   │   ├── Dependency-Injection/
│   │   │   ├── README.md
│   │   │   └── dependency-injection.puml
│   │   ├── Domain-Event/
│   │   │   ├── README.md
│   │   │   └── domain-event.puml
│   │   ├── Entity-DDD/
│   │   │   ├── README.md
│   │   │   └── entity-ddd.puml
│   │   ├── Event/
│   │   │   └── README.md
│   │   ├── Event-Driven-Architecture/
│   │   │   └── README.md
│   │   ├── Event-Sourcing/
│   │   │   └── README.md
│   │   ├── Event-Storming/
│   │   │   └── README.md
│   │   ├── Integration-Event/
│   │   │   └── README.md
│   │   ├── README.md
│   │   ├── Strategy-Pattern/
│   │   │   ├── README.md
│   │   │   └── strategy-pattern.puml
│   │   └── ValueObject-DDD/
│   │       ├── README.md
│   │       └── value-object-ddd.puml
│   └── mutation-tests-reports/
│       └── mutation-report.html
├── runIntegrationTests.cmd
└── src/
    ├── .dockerignore
    ├── .editorconfig
    ├── API/
    │   ├── CompanyName.MyMeetings.API/
    │   │   ├── CompanyName.MyMeetings.API.csproj
    │   │   ├── Configuration/
    │   │   │   ├── Authorization/
    │   │   │   │   ├── AttributeAuthorizationHandler.cs
    │   │   │   │   ├── AuthorizationChecker.cs
    │   │   │   │   ├── HasPermissionAttribute.cs
    │   │   │   │   ├── HasPermissionAuthorizationHandler.cs
    │   │   │   │   ├── HasPermissionAuthorizationRequirement.cs
    │   │   │   │   └── NoPermissionRequiredAttribute.cs
    │   │   │   ├── ExecutionContext/
    │   │   │   │   ├── CorrelationMiddleware.cs
    │   │   │   │   └── ExecutionContextAccessor.cs
    │   │   │   ├── Extensions/
    │   │   │   │   └── SwaggerExtensions.cs
    │   │   │   └── Validation/
    │   │   │       ├── BusinessRuleValidationExceptionProblemDetails.cs
    │   │   │       └── InvalidCommandProblemDetails.cs
    │   │   ├── Modules/
    │   │   │   ├── Administration/
    │   │   │   │   ├── AdministrationAutofacModule.cs
    │   │   │   │   ├── AdministrationPermissions.cs
    │   │   │   │   └── MeetingGroupProposals/
    │   │   │   │       └── MeetingGroupProposalsController.cs
    │   │   │   ├── Meetings/
    │   │   │   │   ├── Countries/
    │   │   │   │   │   └── CountriesController.cs
    │   │   │   │   ├── MeetingCommentingConfiguration/
    │   │   │   │   │   └── MeetingCommentingConfigurationController.cs
    │   │   │   │   ├── MeetingComments/
    │   │   │   │   │   ├── AddMeetingCommentRequest.cs
    │   │   │   │   │   ├── EditMeetingCommentRequest.cs
    │   │   │   │   │   └── MeetingCommentsController.cs
    │   │   │   │   ├── MeetingGroupProposals/
    │   │   │   │   │   ├── MeetingGroupProposalsController.cs
    │   │   │   │   │   └── ProposeMeetingGroupRequest.cs
    │   │   │   │   ├── MeetingGroups/
    │   │   │   │   │   ├── CreateNewMeetingGroupRequest.cs
    │   │   │   │   │   ├── EditMeetingGroupGeneralAttributesRequest.cs
    │   │   │   │   │   └── MeetingGroupsController.cs
    │   │   │   │   ├── Meetings/
    │   │   │   │   │   ├── AddMeetingAttendeeRequest.cs
    │   │   │   │   │   ├── ChangeMeetingMainAttributesRequest.cs
    │   │   │   │   │   ├── CreateMeetingRequest.cs
    │   │   │   │   │   ├── MeetingsController.cs
    │   │   │   │   │   ├── RemoveMeetingAttendeeRequest.cs
    │   │   │   │   │   ├── SetMeetingAttendeeRequest.cs
    │   │   │   │   │   └── SetMeetingHostRequest.cs
    │   │   │   │   ├── MeetingsAutofacModule.cs
    │   │   │   │   └── MeetingsPermissions.cs
    │   │   │   ├── Payments/
    │   │   │   │   ├── MeetingFees/
    │   │   │   │   │   ├── CreateMeetingFeePaymentRequest.cs
    │   │   │   │   │   ├── MeetingFeePaymentsController.cs
    │   │   │   │   │   └── RegisterMeetingFeePaymentRequest.cs
    │   │   │   │   ├── Payers/
    │   │   │   │   │   └── PayersController.cs
    │   │   │   │   ├── PaymentsAutofacModule.cs
    │   │   │   │   ├── PaymentsPermissions.cs
    │   │   │   │   ├── PriceListItems/
    │   │   │   │   │   ├── ChangePriceListItemAttributesRequest.cs
    │   │   │   │   │   ├── CreatePriceListItemRequest.cs
    │   │   │   │   │   ├── GetPriceListItemRequest.cs
    │   │   │   │   │   └── PriceListItemsController.cs
    │   │   │   │   ├── RegisterSubscriptionRenewalPaymentRequest.cs
    │   │   │   │   ├── SubscriptionRenewalsController.cs
    │   │   │   │   └── Subscriptions/
    │   │   │   │       ├── BuySubscriptionRequest.cs
    │   │   │   │       ├── RegisterSubscriptionPaymentRequest.cs
    │   │   │   │       ├── RenewSubscriptionRequest.cs
    │   │   │   │       ├── SubscriptionPaymentsController.cs
    │   │   │   │       └── SubscriptionsController.cs
    │   │   │   └── UserAccess/
    │   │   │       ├── AuthenticatedUserController.cs
    │   │   │       ├── EmailsController.cs
    │   │   │       ├── RegisterNewUserRequest.cs
    │   │   │       ├── UserAccessAutofacModule.cs
    │   │   │       └── UserRegistrationsController.cs
    │   │   ├── Program.cs
    │   │   ├── Properties/
    │   │   │   └── launchSettings.json
    │   │   ├── Startup.cs
    │   │   ├── appsettings.Development.json
    │   │   ├── appsettings.Production.json
    │   │   ├── appsettings.json
    │   │   ├── entrypoint.sh
    │   │   └── tempkey.rsa
    │   └── RequestExamples/
    │       ├── Authentication.http
    │       ├── Users.http
    │       └── http-client.env.json
    ├── BuildingBlocks/
    │   ├── Application/
    │   │   ├── CompanyName.MyMeetings.BuildingBlocks.Application.csproj
    │   │   ├── Data/
    │   │   │   └── ISqlConnectionFactory.cs
    │   │   ├── Emails/
    │   │   │   ├── EmailMessage.cs
    │   │   │   └── IEmailSender.cs
    │   │   ├── Events/
    │   │   │   ├── DomainNotificationBase.cs
    │   │   │   └── IDomainEventNotification.cs
    │   │   ├── IExecutionContextAccessor.cs
    │   │   ├── InvalidCommandException.cs
    │   │   ├── Outbox/
    │   │   │   ├── IOutbox.cs
    │   │   │   └── OutboxMessage.cs
    │   │   └── Queries/
    │   │       ├── IPagedQuery.cs
    │   │       ├── PageData.cs
    │   │       └── PagedQueryHelper.cs
    │   ├── Domain/
    │   │   ├── BusinessRuleValidationException.cs
    │   │   ├── CompanyName.MyMeetings.BuildingBlocks.Domain.csproj
    │   │   ├── DomainEventBase.cs
    │   │   ├── Entity.cs
    │   │   ├── IAggregateRoot.cs
    │   │   ├── IBusinessRule.cs
    │   │   ├── IDomainEvent.cs
    │   │   ├── IgnoreMemberAttribute.cs
    │   │   ├── TypedIdValueBase.cs
    │   │   └── ValueObject.cs
    │   ├── Infrastructure/
    │   │   ├── BiDictionary.cs
    │   │   ├── CompanyName.MyMeetings.BuildingBlocks.Infrastructure.csproj
    │   │   ├── DomainEventsDispatching/
    │   │   │   ├── DomainEventsAccessor.cs
    │   │   │   ├── DomainEventsDispatcher.cs
    │   │   │   ├── DomainEventsDispatcherNotificationHandlerDecorator.cs
    │   │   │   ├── DomainNotificationsMapper.cs
    │   │   │   ├── IDomainEventsAccessor.cs
    │   │   │   ├── IDomainEventsDispatcher.cs
    │   │   │   ├── IDomainNotificationsMapper.cs
    │   │   │   └── UnitOfWorkCommandHandlerDecorator.cs
    │   │   ├── Emails/
    │   │   │   ├── EmailSender.cs
    │   │   │   └── EmailsConfiguration.cs
    │   │   ├── EventBus/
    │   │   │   ├── IEventsBus.cs
    │   │   │   ├── IIntegrationEventHandler.cs
    │   │   │   ├── InMemoryEventBus.cs
    │   │   │   ├── InMemoryEventBusClient.cs
    │   │   │   └── IntegrationEvent.cs
    │   │   ├── IUnitOfWork.cs
    │   │   ├── Inbox/
    │   │   │   └── InboxMessage.cs
    │   │   ├── InternalCommands/
    │   │   │   ├── IInternalCommandsMapper.cs
    │   │   │   ├── InternalCommand.cs
    │   │   │   └── InternalCommandsMapper.cs
    │   │   ├── Serialization/
    │   │   │   └── AllPropertiesContractResolver.cs
    │   │   ├── ServiceProviderWrapper.cs
    │   │   ├── SqlConnectionFactory.cs
    │   │   ├── StronglyTypedIdValueConverterSelector.cs
    │   │   ├── TypedIdValueConverter.cs
    │   │   └── UnitOfWork.cs
    │   └── Tests/
    │       ├── Application.UnitTests/
    │       │   ├── CompanyName.MyMeetings.BuildingBlocks.Application.UnitTests.csproj
    │       │   └── Queries/
    │       │       └── PagedQueryHelperTests.cs
    │       └── IntegrationTests/
    │           ├── CompanyName.MyMeetings.BuildingBlocks.IntegrationTests.csproj
    │           ├── EnvironmentVariablesProvider.cs
    │           └── Probing/
    │               ├── AssertErrorException.cs
    │               ├── IProbe.cs
    │               ├── Poller.cs
    │               └── Timeout.cs
    ├── CompanyName.MyMeetings.sln
    ├── Database/
    │   ├── .dockerignore
    │   ├── ClearDatabase.sql
    │   ├── CompanyName.MyMeetings.Database/
    │   │   ├── CompanyName.MyMeetings.Database.sqlproj
    │   │   ├── Scripts/
    │   │   │   ├── ClearDatabase.sql
    │   │   │   ├── CreateDatabase.sql
    │   │   │   ├── CreateDatabase_Linux.sql
    │   │   │   ├── CreateDatabase_Windows.sql
    │   │   │   ├── CreateStructure.sql
    │   │   │   ├── Migrations/
    │   │   │   │   └── 1_0_0_0/
    │   │   │   │       ├── 0001_initial_structure.sql
    │   │   │   │       ├── 0002_change_meeting_comments_edit_date_type_and_add_meeting_comments_view.sql
    │   │   │   │       ├── 0003_add_meetings_countries_table.sql
    │   │   │   │       ├── 0004_add_meeting_commenting_configurations_table.sql
    │   │   │   │       ├── 0005_add_payer_id_to_subcription_details_view.sql
    │   │   │   │       ├── 0006_add_member_meeting_groups_view.sql
    │   │   │   │       ├── 0007_add_meeting_attendees_view.sql
    │   │   │   │       ├── 0008_add_meeting_details_view.sql
    │   │   │   │       ├── 0009_add_mock_emails_table.sql
    │   │   │   │       ├── 0010_add_member_meetings_view.sql
    │   │   │   │       ├── 0011_add_likes_count_to_meeting_comments_table.sql
    │   │   │   │       ├── 0012_add_likes_count_to_meeting_comments_view.sql
    │   │   │   │       ├── 0013_add_meeting_member_comment_likes_table.sql
    │   │   │   │       └── 0014_add_missing_tables_for_registrations.sql
    │   │   │   ├── SeedDatabase.sql
    │   │   │   └── Seeds/
    │   │   │       └── 0001_SeedCountries.sql
    │   │   └── Structure/
    │   │       ├── Security/
    │   │       │   └── Schemas.sql
    │   │       ├── administration/
    │   │       │   ├── Tables/
    │   │       │   │   ├── InboxMessages.sql
    │   │       │   │   ├── InternalCommands.sql
    │   │       │   │   ├── MeetingGroupProposals.sql
    │   │       │   │   ├── Members.sql
    │   │       │   │   └── OutboxMessages.sql
    │   │       │   └── Views/
    │   │       │       ├── v_MeetingGroupProposals.sql
    │   │       │       └── v_Members.sql
    │   │       ├── app/
    │   │       │   └── Tables/
    │   │       │       ├── Emails.sql
    │   │       │       └── MigrationsJournal.sql
    │   │       ├── meetings/
    │   │       │   ├── Tables/
    │   │       │   │   ├── Countries.sql
    │   │       │   │   ├── InboxMessages.sql
    │   │       │   │   ├── InternalCommands.sql
    │   │       │   │   ├── MeetingAttendees.sql
    │   │       │   │   ├── MeetingCommentingConfigurations.sql
    │   │       │   │   ├── MeetingComments.sql
    │   │       │   │   ├── MeetingGroupMembers.sql
    │   │       │   │   ├── MeetingGroupProposals.sql
    │   │       │   │   ├── MeetingGroups.sql
    │   │       │   │   ├── MeetingMemberCommentLikes.sql
    │   │       │   │   ├── MeetingNotAttendees.sql
    │   │       │   │   ├── MeetingWaitlistMembers.sql
    │   │       │   │   ├── Meetings.sql
    │   │       │   │   ├── MemberSubscriptions.sql
    │   │       │   │   ├── Members.sql
    │   │       │   │   └── OutboxMessages.sql
    │   │       │   └── Views/
    │   │       │       ├── v_Countries.sql
    │   │       │       ├── v_MeetingAttendees.sql
    │   │       │       ├── v_MeetingComments.sql
    │   │       │       ├── v_MeetingDetails.sql
    │   │       │       ├── v_MeetingGroupMembers.sql
    │   │       │       ├── v_MeetingGroupProposals.sql
    │   │       │       ├── v_MeetingGroups.sql
    │   │       │       ├── v_Meetings.sql
    │   │       │       ├── v_MemberMeetingGroups.sql
    │   │       │       ├── v_MemberMeetings.sql
    │   │       │       └── v_Members.sql
    │   │       ├── payments/
    │   │       │   ├── Tables/
    │   │       │   │   ├── InboxMessages.sql
    │   │       │   │   ├── InternalCommands.sql
    │   │       │   │   ├── MeetingFees.sql
    │   │       │   │   ├── Messages.sql
    │   │       │   │   ├── OutboxMessages.sql
    │   │       │   │   ├── Payers.sql
    │   │       │   │   ├── PriceListItems.sql
    │   │       │   │   ├── Streams.sql
    │   │       │   │   ├── SubscriptionCheckpoints.sql
    │   │       │   │   ├── SubscriptionDetails.sql
    │   │       │   │   └── SubscriptionPayments.sql
    │   │       │   └── Types/
    │   │       │       └── NewStreamMessages.sql
    │   │       ├── registrations/
    │   │       │   ├── Tables/
    │   │       │   │   ├── InboxMessages.sql
    │   │       │   │   ├── InternalCommands.sql
    │   │       │   │   ├── OutboxMessages.sql
    │   │       │   │   └── UserRegistrations.sql
    │   │       │   └── Views/
    │   │       │       └── v_UserRegistrations.sql
    │   │       └── users/
    │   │           ├── Tables/
    │   │           │   ├── InboxMessages.sql
    │   │           │   ├── InternalCommands.sql
    │   │           │   ├── OutboxMessages.sql
    │   │           │   ├── Permissions.sql
    │   │           │   ├── RolesToPermissions.sql
    │   │           │   ├── UserRoles.sql
    │   │           │   └── Users.sql
    │   │           └── Views/
    │   │               ├── v_UserPermissions.sql
    │   │               ├── v_UserRoles.sql
    │   │               └── v_Users.sql
    │   ├── CompanyName.MyMeetings.Database.Build/
    │   │   └── CompanyName.MyMeetings.Database.Build.csproj
    │   ├── DatabaseMigrator/
    │   │   ├── .dockerignore
    │   │   ├── DatabaseMigrator.csproj
    │   │   ├── Program.cs
    │   │   └── SerilogUpgradeLog.cs
    │   ├── Dockerfile
    │   ├── Dockerfile_DatabaseMigrator
    │   ├── InitializeDatabase.sql
    │   ├── entrypoint.sh
    │   ├── entrypoint_DatabaseMigrator.sh
    │   └── wait-for-it.sh
    ├── Directory.Build.props
    ├── Directory.Build.targets
    ├── Directory.Packages.props
    ├── Dockerfile
    ├── Modules/
    │   ├── Administration/
    │   │   ├── Application/
    │   │   │   ├── CompanyName.MyMeetings.Modules.Administration.Application.csproj
    │   │   │   ├── Configuration/
    │   │   │   │   ├── Commands/
    │   │   │   │   │   ├── ICommandHandler.cs
    │   │   │   │   │   ├── ICommandsScheduler.cs
    │   │   │   │   │   └── InternalCommandBase.cs
    │   │   │   │   └── Queries/
    │   │   │   │       └── IQueryHandler.cs
    │   │   │   ├── Contracts/
    │   │   │   │   ├── CommandBase.cs
    │   │   │   │   ├── IAdministrationModule.cs
    │   │   │   │   ├── ICommand.cs
    │   │   │   │   ├── IQuery.cs
    │   │   │   │   ├── IRecurringCommand.cs
    │   │   │   │   └── QueryBase.cs
    │   │   │   ├── MeetingGroupProposals/
    │   │   │   │   ├── AcceptMeetingGroupProposal/
    │   │   │   │   │   ├── AcceptMeetingGroupProposalCommand.cs
    │   │   │   │   │   ├── AcceptMeetingGroupProposalCommandHandler.cs
    │   │   │   │   │   ├── MeetingGroupProposalAcceptedNotification.cs
    │   │   │   │   │   └── MeetingGroupProposalAcceptedNotificationHandler.cs
    │   │   │   │   ├── GetMeetingGroupProposal/
    │   │   │   │   │   ├── GetMeetingGroupProposalQuery.cs
    │   │   │   │   │   ├── GetMeetingGroupProposalQueryHandler.cs
    │   │   │   │   │   └── MeetingGroupProposalDto.cs
    │   │   │   │   ├── GetMeetingGroupProposals/
    │   │   │   │   │   ├── GetMeetingGroupProposalsQuery.cs
    │   │   │   │   │   └── GetMeetingGroupProposalsQueryHandler.cs
    │   │   │   │   ├── MeetingGroupProposedIntegrationEventHandler.cs
    │   │   │   │   └── RequestMeetingGroupProposalVerification/
    │   │   │   │       ├── RequestMeetingGroupProposalVerificationCommand.cs
    │   │   │   │       └── RequestMeetingGroupProposalVerificationCommandHandler.cs
    │   │   │   └── Members/
    │   │   │       ├── CreateMember/
    │   │   │       │   ├── CreateMemberCommand.cs
    │   │   │       │   └── CreateMemberCommandHandler.cs
    │   │   │       ├── GetMember/
    │   │   │       │   ├── GetMemberQuery.cs
    │   │   │       │   ├── GetMemberQueryHandler.cs
    │   │   │       │   └── MemberDto.cs
    │   │   │       └── NewUserRegisteredIntegrationEventHandler.cs
    │   │   ├── Domain/
    │   │   │   ├── CompanyName.MyMeetings.Modules.Administration.Domain.csproj
    │   │   │   ├── MeetingGroupProposals/
    │   │   │   │   ├── Events/
    │   │   │   │   │   ├── MeetingGroupProposalAcceptedDomainEvent.cs
    │   │   │   │   │   ├── MeetingGroupProposalRejectedDomainEvent.cs
    │   │   │   │   │   └── MeetingGroupProposalVerificationRequestedDomainEvent.cs
    │   │   │   │   ├── IMeetingGroupProposalRepository.cs
    │   │   │   │   ├── MeetingGroupLocation.cs
    │   │   │   │   ├── MeetingGroupProposal.cs
    │   │   │   │   ├── MeetingGroupProposalDecision.cs
    │   │   │   │   ├── MeetingGroupProposalId.cs
    │   │   │   │   ├── MeetingGroupProposalStatus.cs
    │   │   │   │   └── Rules/
    │   │   │   │       ├── MeetingGroupProposalCanBeVerifiedOnceRule.cs
    │   │   │   │       └── MeetingGroupProposalRejectionMustHaveAReasonRule.cs
    │   │   │   ├── Members/
    │   │   │   │   ├── Events/
    │   │   │   │   │   └── MemberCreatedDomainEvent.cs
    │   │   │   │   ├── IMemberRepository.cs
    │   │   │   │   ├── Member.cs
    │   │   │   │   └── MemberId.cs
    │   │   │   └── Users/
    │   │   │       ├── IUserContext.cs
    │   │   │       └── UserId.cs
    │   │   ├── Infrastructure/
    │   │   │   ├── AdministrationContext.cs
    │   │   │   ├── AdministrationModule.cs
    │   │   │   ├── CompanyName.MyMeetings.Modules.Administration.Infrastructure.csproj
    │   │   │   ├── Configuration/
    │   │   │   │   ├── AdministrationCompositionRoot.cs
    │   │   │   │   ├── AdministrationStartup.cs
    │   │   │   │   ├── AllConstructorFinder.cs
    │   │   │   │   ├── Assemblies.cs
    │   │   │   │   ├── Authentication/
    │   │   │   │   │   └── AuthenticationModule.cs
    │   │   │   │   ├── DataAccess/
    │   │   │   │   │   └── DataAccessModule.cs
    │   │   │   │   ├── EventsBus/
    │   │   │   │   │   ├── EventsBusModule.cs
    │   │   │   │   │   ├── EventsBusStartup.cs
    │   │   │   │   │   └── IntegrationEventGenericHandler.cs
    │   │   │   │   ├── Logging/
    │   │   │   │   │   └── LoggingModule.cs
    │   │   │   │   ├── Mediation/
    │   │   │   │   │   └── MediatorModule.cs
    │   │   │   │   ├── Processing/
    │   │   │   │   │   ├── CommandsExecutor.cs
    │   │   │   │   │   ├── IRecurringCommand.cs
    │   │   │   │   │   ├── Inbox/
    │   │   │   │   │   │   ├── InboxMessageDto.cs
    │   │   │   │   │   │   ├── ProcessInboxCommand.cs
    │   │   │   │   │   │   ├── ProcessInboxCommandHandler.cs
    │   │   │   │   │   │   └── ProcessInboxJob.cs
    │   │   │   │   │   ├── InternalCommands/
    │   │   │   │   │   │   ├── CommandsScheduler.cs
    │   │   │   │   │   │   ├── InternalCommandsModule.cs
    │   │   │   │   │   │   ├── ProcessInternalCommandsCommand.cs
    │   │   │   │   │   │   ├── ProcessInternalCommandsCommandHandler.cs
    │   │   │   │   │   │   └── ProcessInternalCommandsJob.cs
    │   │   │   │   │   ├── LoggingCommandHandlerDecorator.cs
    │   │   │   │   │   ├── LoggingCommandHandlerWithResultDecorator.cs
    │   │   │   │   │   ├── Outbox/
    │   │   │   │   │   │   ├── OutboxMessageDto.cs
    │   │   │   │   │   │   ├── OutboxModule.cs
    │   │   │   │   │   │   ├── ProcessOutboxCommand.cs
    │   │   │   │   │   │   ├── ProcessOutboxCommandHandler.cs
    │   │   │   │   │   │   └── ProcessOutboxJob.cs
    │   │   │   │   │   ├── ProcessingModule.cs
    │   │   │   │   │   ├── UnitOfWorkCommandHandlerDecorator.cs
    │   │   │   │   │   ├── UnitOfWorkCommandHandlerWithResultDecorator.cs
    │   │   │   │   │   ├── ValidationCommandHandlerDecorator.cs
    │   │   │   │   │   └── ValidationCommandHandlerWithResultDecorator.cs
    │   │   │   │   ├── Quartz/
    │   │   │   │   │   ├── QuartzModule.cs
    │   │   │   │   │   ├── QuartzStartup.cs
    │   │   │   │   │   └── SerilogLogProvider.cs
    │   │   │   │   └── Users/
    │   │   │   │       └── UserContext.cs
    │   │   │   ├── Domain/
    │   │   │   │   ├── MeetingGroupProposals/
    │   │   │   │   │   ├── MeetingGroupProposalEntityTypeConfiguration.cs
    │   │   │   │   │   └── MeetingGroupProposalRepository.cs
    │   │   │   │   └── Members/
    │   │   │   │       ├── MemberEntityTypeConfiguration.cs
    │   │   │   │       └── MemberRepository.cs
    │   │   │   ├── InternalCommands/
    │   │   │   │   └── InternalCommandEntityTypeConfiguration.cs
    │   │   │   └── Outbox/
    │   │   │       ├── OutboxAccessor.cs
    │   │   │       └── OutboxMessageEntityTypeConfiguration.cs
    │   │   ├── IntegrationEvents/
    │   │   │   ├── CompanyName.MyMeetings.Modules.Administration.IntegrationEvents.csproj
    │   │   │   └── MeetingGroupProposals/
    │   │   │       └── MeetingGroupProposalAcceptedIntegrationEvent.cs
    │   │   └── Tests/
    │   │       ├── ArchTests/
    │   │       │   ├── Application/
    │   │       │   │   └── ApplicationTests.cs
    │   │       │   ├── CompanyName.MyMeetings.Modules.Administration.ArchTests.csproj
    │   │       │   ├── Domain/
    │   │       │   │   └── DomainTests.cs
    │   │       │   ├── Module/
    │   │       │   │   └── LayersTests.cs
    │   │       │   └── SeedWork/
    │   │       │       └── TestBase.cs
    │   │       ├── IntegrationTests/
    │   │       │   ├── AssemblyInfo.cs
    │   │       │   ├── CompanyName.MyMeetings.Modules.Administration.IntegrationTests.csproj
    │   │       │   ├── MeetingGroupProposals/
    │   │       │   │   ├── MeetingGroupProposalSampleData.cs
    │   │       │   │   └── MeetingGroupProposalTests.cs
    │   │       │   ├── Members/
    │   │       │   │   ├── CreateMemberTests.cs
    │   │       │   │   └── MemberSampleData.cs
    │   │       │   └── SeedWork/
    │   │       │       ├── ExecutionContextMock.cs
    │   │       │       ├── OutboxMessagesHelper.cs
    │   │       │       └── TestBase.cs
    │   │       └── UnitTests/
    │   │           ├── CompanyName.MyMeetings.Modules.Administration.Domain.UnitTests.csproj
    │   │           ├── MeetingGroupProposals/
    │   │           │   └── MeetingGroupProposalTests.cs
    │   │           ├── Members/
    │   │           │   └── MemberTests.cs
    │   │           └── SeedWork/
    │   │               ├── DomainEventsTestHelper.cs
    │   │               └── TestBase.cs
    │   ├── Meetings/
    │   │   ├── Application/
    │   │   │   ├── CompanyName.MyMeetings.Modules.Meetings.Application.csproj
    │   │   │   ├── Configuration/
    │   │   │   │   ├── Commands/
    │   │   │   │   │   ├── ICommandHandler.cs
    │   │   │   │   │   ├── ICommandsScheduler.cs
    │   │   │   │   │   └── InternalCommandBase.cs
    │   │   │   │   └── Queries/
    │   │   │   │       └── IQueryHandler.cs
    │   │   │   ├── Contracts/
    │   │   │   │   ├── CommandBase.cs
    │   │   │   │   ├── ICommand.cs
    │   │   │   │   ├── IMeetingsModule.cs
    │   │   │   │   ├── IQuery.cs
    │   │   │   │   ├── IRecurringCommand.cs
    │   │   │   │   └── QueryBase.cs
    │   │   │   ├── Countries/
    │   │   │   │   ├── CountryDto.cs
    │   │   │   │   ├── GetAllCountriesQuery.cs
    │   │   │   │   └── GetAllCountriesQueryHandler.cs
    │   │   │   ├── MeetingCommentingConfigurations/
    │   │   │   │   ├── DisableMeetingCommentingConfiguration/
    │   │   │   │   │   ├── DisableMeetingCommentingConfigurationCommand.cs
    │   │   │   │   │   └── DisableMeetingCommentingConfigurationCommandHandler.cs
    │   │   │   │   ├── EnableMeetingCommentingConfiguration/
    │   │   │   │   │   ├── EnableMeetingCommentingConfigurationCommand.cs
    │   │   │   │   │   └── EnableMeetingCommentingConfigurationCommandHandler.cs
    │   │   │   │   ├── GetMeetingCommentingConfiguration/
    │   │   │   │   │   ├── GetMeetingCommentingConfigurationQuery.cs
    │   │   │   │   │   ├── GetMeetingCommentingConfigurationQueryHandler.cs
    │   │   │   │   │   └── MeetingCommentingConfigurationDto.cs
    │   │   │   │   └── MeetingCreatedEventHandler.cs
    │   │   │   ├── MeetingComments/
    │   │   │   │   ├── AddMeetingComment/
    │   │   │   │   │   ├── AddMeetingCommentCommand.cs
    │   │   │   │   │   ├── AddMeetingCommentCommandHandler.cs
    │   │   │   │   │   └── AddMeetingCommentCommandValidator.cs
    │   │   │   │   ├── AddMeetingCommentLike/
    │   │   │   │   │   ├── AddMeetingCommentLikeCommand.cs
    │   │   │   │   │   └── AddMeetingCommentLikeCommandHandler.cs
    │   │   │   │   ├── AddMeetingCommentReply/
    │   │   │   │   │   ├── AddReplyToMeetingCommentCommand.cs
    │   │   │   │   │   └── AddReplyToMeetingCommentCommandHandler.cs
    │   │   │   │   ├── EditMeetingComment/
    │   │   │   │   │   ├── EditMeetingCommentCommand.cs
    │   │   │   │   │   ├── EditMeetingCommentCommandHandler.cs
    │   │   │   │   │   └── EditMeetingCommentCommandValidator.cs
    │   │   │   │   ├── GetMeetingCommentLikers/
    │   │   │   │   │   ├── GetMeetingCommentLikersQuery.cs
    │   │   │   │   │   ├── GetMeetingCommentLikersQueryHandler.cs
    │   │   │   │   │   └── MeetingCommentLikerDto.cs
    │   │   │   │   ├── GetMeetingComments/
    │   │   │   │   │   ├── GetMeetingCommentsQuery.cs
    │   │   │   │   │   ├── GetMeetingCommentsQueryHandler.cs
    │   │   │   │   │   └── MeetingCommentDto.cs
    │   │   │   │   ├── MeetingCommentLikedNotification.cs
    │   │   │   │   ├── MeetingCommentLikedNotificationHandler.cs
    │   │   │   │   ├── MeetingCommentUnlikeNotificationHandler.cs
    │   │   │   │   ├── MeetingCommentUnlikedNotification.cs
    │   │   │   │   ├── RemoveMeetingComment/
    │   │   │   │   │   ├── RemoveMeetingCommentCommand.cs
    │   │   │   │   │   └── RemoveMeetingCommentCommandHandler.cs
    │   │   │   │   └── RemoveMeetingCommentLike/
    │   │   │   │       ├── RemoveMeetingCommentLikeCommand.cs
    │   │   │   │       └── RemoveMeetingCommentLikeCommandHandler.cs
    │   │   │   ├── MeetingGroupProposals/
    │   │   │   │   ├── AcceptMeetingGroupProposal/
    │   │   │   │   │   ├── AcceptMeetingGroupProposalCommand.cs
    │   │   │   │   │   ├── AcceptMeetingGroupProposalCommandHandler.cs
    │   │   │   │   │   ├── AcceptMeetingGroupProposalCommandValidator.cs
    │   │   │   │   │   ├── MeetingGroupProposalAcceptedNotification.cs
    │   │   │   │   │   └── MeetingGroupProposalAcceptedNotificationHandler.cs
    │   │   │   │   ├── GetAllMeetingGroupProposals/
    │   │   │   │   │   ├── GetAllMeetingGroupProposalsQuery.cs
    │   │   │   │   │   └── GetAllMeetingGroupProposalsQueryHandler.cs
    │   │   │   │   ├── GetMeetingGroupProposal/
    │   │   │   │   │   ├── GetMeetingGroupProposalQuery.cs
    │   │   │   │   │   ├── GetMeetingGroupProposalQueryHandler.cs
    │   │   │   │   │   └── MeetingGroupProposalDto.cs
    │   │   │   │   ├── GetMemberMeetingGroupProposals/
    │   │   │   │   │   ├── GetMemberMeetingGroupProposalsQuery.cs
    │   │   │   │   │   └── GetMemberMeetingGroupProposalsQueryHandler.cs
    │   │   │   │   ├── MeetingGroupProposalAcceptedIntegrationEventHandler.cs
    │   │   │   │   ├── MeetingGroupProposedNotification.cs
    │   │   │   │   ├── MeetingGroupProposedNotificationHandler.cs
    │   │   │   │   └── ProposeMeetingGroup/
    │   │   │   │       ├── ProposeMeetingGroupCommand.cs
    │   │   │   │       ├── ProposeMeetingGroupCommandHandler.cs
    │   │   │   │       └── ProposeMeetingGroupCommandValidator.cs
    │   │   │   ├── MeetingGroups/
    │   │   │   │   ├── CreateNewMeetingGroup/
    │   │   │   │   │   ├── CreateNewMeetingGroupCommand.cs
    │   │   │   │   │   └── CreateNewMeetingGroupCommandHandler.cs
    │   │   │   │   ├── EditMeetingGroupGeneralAttributes/
    │   │   │   │   │   ├── EditMeetingGroupGeneralAttributesCommand.cs
    │   │   │   │   │   └── EditMeetingGroupGeneralAttributesCommandHandler.cs
    │   │   │   │   ├── GetAllMeetingGroups/
    │   │   │   │   │   ├── GetAllMeetingGroupsQuery.cs
    │   │   │   │   │   ├── GetAllMeetingGroupsQueryHandler.cs
    │   │   │   │   │   └── MeetingGroupDto.cs
    │   │   │   │   ├── GetAuthenticationMemberMeetingGroups/
    │   │   │   │   │   ├── GetAuthenticationMemberMeetingGroupsQuery.cs
    │   │   │   │   │   ├── GetAuthenticationMemberMeetingGroupsQueryHandler.cs
    │   │   │   │   │   └── MemberMeetingGroupDto.cs
    │   │   │   │   ├── GetMeetingGroupDetails/
    │   │   │   │   │   ├── GetMeetingGroupDetailsQuery.cs
    │   │   │   │   │   ├── GetMeetingGroupDetailsQueryHandler.cs
    │   │   │   │   │   └── MeetingGroupDetailsDto.cs
    │   │   │   │   ├── JoinToGroup/
    │   │   │   │   │   ├── JoinToGroupCommand.cs
    │   │   │   │   │   └── JoinToGroupCommandHandler.cs
    │   │   │   │   ├── LeaveMeetingGroup/
    │   │   │   │   │   ├── LeaveMeetingGroupCommand.cs
    │   │   │   │   │   └── LeaveMeetingGroupCommandHandler.cs
    │   │   │   │   ├── MeetingGroupCreatedNotification.cs
    │   │   │   │   ├── MeetingGroupCreatedSendEmailHandler.cs
    │   │   │   │   ├── SendMeetingGroupCreatedEmail/
    │   │   │   │   │   ├── SendMeetingGroupCreatedEmailCommand.cs
    │   │   │   │   │   └── SendMeetingGroupCreatedEmailCommandHandler.cs
    │   │   │   │   └── SetMeetingGroupExpirationDate/
    │   │   │   │       ├── SetMeetingGroupExpirationDateCommand.cs
    │   │   │   │       └── SetMeetingGroupExpirationDateCommandHandler.cs
    │   │   │   ├── Meetings/
    │   │   │   │   ├── AddMeetingAttendee/
    │   │   │   │   │   ├── AddMeetingAttendeeCommand.cs
    │   │   │   │   │   └── AddMeetingAttendeeCommandHandler.cs
    │   │   │   │   ├── AddMeetingNotAttendee/
    │   │   │   │   │   ├── AddMeetingNotAttendeeCommand.cs
    │   │   │   │   │   └── AddMeetingNotAttendeeCommandHandler.cs
    │   │   │   │   ├── CancelMeeting/
    │   │   │   │   │   ├── CancelMeetingCommand.cs
    │   │   │   │   │   └── CancelMeetingCommandHandler.cs
    │   │   │   │   ├── ChangeMeetingMainAttributes/
    │   │   │   │   │   ├── ChangeMeetingMainAttributesCommand.cs
    │   │   │   │   │   └── ChangeMeetingMainAttributesCommandHandler.cs
    │   │   │   │   ├── ChangeNotAttendeeDecision/
    │   │   │   │   │   ├── ChangeNotAttendeeDecisionCommand.cs
    │   │   │   │   │   └── ChangeNotAttendeeDecisionCommandHandler.cs
    │   │   │   │   ├── CreateMeeting/
    │   │   │   │   │   ├── CreateMeetingCommand.cs
    │   │   │   │   │   └── CreateMeetingCommandHandler.cs
    │   │   │   │   ├── GetAuthenticatedMemberMeetings/
    │   │   │   │   │   ├── GetAuthenticatedMemberMeetingsQuery.cs
    │   │   │   │   │   ├── GetAuthenticatedMemberMeetingsQueryHandler.cs
    │   │   │   │   │   └── MemberMeetingDto.cs
    │   │   │   │   ├── GetMeetingAttendees/
    │   │   │   │   │   ├── GetMeetingAttendeesQuery.cs
    │   │   │   │   │   ├── GetMeetingAttendeesQueryHandler.cs
    │   │   │   │   │   └── MeetingAttendeeDto.cs
    │   │   │   │   ├── GetMeetingDetails/
    │   │   │   │   │   ├── GetMeetingDetailsQuery.cs
    │   │   │   │   │   ├── GetMeetingDetailsQueryHandler.cs
    │   │   │   │   │   └── MeetingDetailsDto.cs
    │   │   │   │   ├── MarkMeetingAttendeeFeeAsPayedCommand.cs
    │   │   │   │   ├── MarkMeetingAttendeeFeeAsPayedCommandHandler.cs
    │   │   │   │   ├── MeetingDto.cs
    │   │   │   │   ├── MeetingFeePaidIntegrationEventHandler.cs
    │   │   │   │   ├── MeetingsQueryHelper.cs
    │   │   │   │   ├── RemoveMeetingAttendee/
    │   │   │   │   │   ├── RemoveMeetingAttendeeCommand.cs
    │   │   │   │   │   └── RemoveMeetingAttendeeCommandHandler.cs
    │   │   │   │   ├── SendMeetingAttendeeAddedEmail/
    │   │   │   │   │   ├── MeetingAttendeeAddedNotification.cs
    │   │   │   │   │   ├── MeetingAttendeeAddedNotificationHandler.cs
    │   │   │   │   │   ├── MeetingAttendeeAddedPublishEventNotificationHandler.cs
    │   │   │   │   │   ├── SendMeetingAttendeeAddedEmailCommand.cs
    │   │   │   │   │   └── SendMeetingAttendeeAddedEmailCommandHandler.cs
    │   │   │   │   ├── SetMeetingAttendeeRole/
    │   │   │   │   │   ├── SetMeetingAttendeeRoleCommand.cs
    │   │   │   │   │   └── SetMeetingAttendeeRoleCommandHandler.cs
    │   │   │   │   ├── SetMeetingHostRole/
    │   │   │   │   │   ├── SetMeetingHostRoleCommand.cs
    │   │   │   │   │   └── SetMeetingHostRoleCommandHandler.cs
    │   │   │   │   ├── SignOffMemberFromWaitlist/
    │   │   │   │   │   ├── SignOffMemberFromWaitlistCommand.cs
    │   │   │   │   │   └── SignOffMemberFromWaitlistCommandHandler.cs
    │   │   │   │   └── SignUpMemberToWaitlist/
    │   │   │   │       ├── SignUpMemberToWaitlistCommand.cs
    │   │   │   │       └── SignUpMemberToWaitlistCommandHandler.cs
    │   │   │   ├── MemberSubscriptions/
    │   │   │   │   ├── ChangeSubscriptionExpirationDateForMember/
    │   │   │   │   │   ├── ChangeSubscriptionExpirationDateForMemberCommand.cs
    │   │   │   │   │   └── ChangeSubscriptionExpirationDateForMemberCommandHandler.cs
    │   │   │   │   ├── MemberSubscriptionExpirationDateChangedNotification.cs
    │   │   │   │   ├── MemberSubscriptionExpirationDateChangedNotificationHandler.cs
    │   │   │   │   └── SubscriptionExpirationDateChangedIntegrationEventHandler.cs
    │   │   │   └── Members/
    │   │   │       ├── CreateMember/
    │   │   │       │   ├── CreateMemberCommand.cs
    │   │   │       │   ├── CreateMemberCommandHandler.cs
    │   │   │       │   ├── MemberCratedNotificationHandler.cs
    │   │   │       │   ├── MemberCreatedNotification.cs
    │   │   │       │   └── NewUserRegisteredIntegrationEventHandler.cs
    │   │   │       ├── MemberContext.cs
    │   │   │       ├── MemberDto.cs
    │   │   │       └── MembersQueryHelper.cs
    │   │   ├── Domain/
    │   │   │   ├── CompanyName.MyMeetings.Modules.Meetings.Domain.csproj
    │   │   │   ├── MeetingCommentingConfigurations/
    │   │   │   │   ├── Events/
    │   │   │   │   │   ├── MeetingCommentingConfigurationCreatedDomainEvent.cs
    │   │   │   │   │   ├── MeetingCommentingDisabledDomainEvent.cs
    │   │   │   │   │   └── MeetingCommentingEnabledDomainEvent.cs
    │   │   │   │   ├── IMeetingCommentingConfigurationRepository.cs
    │   │   │   │   ├── MeetingCommentingConfiguration.cs
    │   │   │   │   ├── MeetingCommentingConfigurationId.cs
    │   │   │   │   └── Rules/
    │   │   │   │       ├── MeetingCommentingCanBeDisabledOnlyByGroupOrganizerRule.cs
    │   │   │   │       └── MeetingCommentingCanBeEnabledOnlyByGroupOrganizerRule.cs
    │   │   │   ├── MeetingComments/
    │   │   │   │   ├── Events/
    │   │   │   │   │   ├── MeetingCommentAddedDomainEvent.cs
    │   │   │   │   │   ├── MeetingCommentEditedDomainEvent.cs
    │   │   │   │   │   ├── MeetingCommentRemovedDomainEvent.cs
    │   │   │   │   │   └── ReplyToMeetingCommentAddedDomainEvent.cs
    │   │   │   │   ├── IMeetingCommentRepository.cs
    │   │   │   │   ├── MeetingComment.cs
    │   │   │   │   ├── MeetingCommentId.cs
    │   │   │   │   └── Rules/
    │   │   │   │       ├── CommentCanBeAddedOnlyByMeetingGroupMemberRule.cs
    │   │   │   │       ├── CommentCanBeCreatedOnlyIfCommentingForMeetingEnabledRule.cs
    │   │   │   │       ├── CommentCanBeEditedOnlyIfCommentingForMeetingEnabledRule.cs
    │   │   │   │       ├── CommentCanBeLikedOnlyByMeetingGroupMemberRule.cs
    │   │   │   │       ├── CommentCannotBeLikedByTheSameMemberMoreThanOnceRule.cs
    │   │   │   │       ├── CommentTextMustBeProvidedRule.cs
    │   │   │   │       ├── MeetingCommentCanBeEditedOnlyByAuthorRule.cs
    │   │   │   │       ├── MeetingCommentCanBeRemovedOnlyByAuthorOrGroupOrganizerRule.cs
    │   │   │   │       └── RemovingReasonCanBeProvidedOnlyByGroupOrganizerRule.cs
    │   │   │   ├── MeetingGroupProposals/
    │   │   │   │   ├── Events/
    │   │   │   │   │   ├── MeetingGroupProposalAcceptedDomainEvent.cs
    │   │   │   │   │   └── MeetingGroupProposedDomainEvent.cs
    │   │   │   │   ├── IMeetingGroupProposalRepository.cs
    │   │   │   │   ├── MeetingGroupProposal.cs
    │   │   │   │   ├── MeetingGroupProposalId.cs
    │   │   │   │   ├── MeetingGroupProposalStatus.cs
    │   │   │   │   └── Rules/
    │   │   │   │       └── MeetingGroupProposalCannotBeAcceptedMoreThanOnceRule.cs
    │   │   │   ├── MeetingGroups/
    │   │   │   │   ├── Events/
    │   │   │   │   │   ├── MeetingAttendeeChangedDecisionDomainEvent.cs
    │   │   │   │   │   ├── MeetingGroupCreatedDomainEvent.cs
    │   │   │   │   │   ├── MeetingGroupGeneralAttributesEditedDomainEvent.cs
    │   │   │   │   │   ├── MeetingGroupMemberLeftGroupDomainEvent.cs
    │   │   │   │   │   ├── MeetingGroupPaymentInfoUpdatedDomainEvent.cs
    │   │   │   │   │   ├── MeetingNotAttendeeChangedDecisionDomainEvent.cs
    │   │   │   │   │   └── NewMeetingGroupMemberJoinedDomainEvent.cs
    │   │   │   │   ├── IMeetingGroupRepository.cs
    │   │   │   │   ├── MeetingGroup.cs
    │   │   │   │   ├── MeetingGroupId.cs
    │   │   │   │   ├── MeetingGroupLocation.cs
    │   │   │   │   ├── MeetingGroupMember.cs
    │   │   │   │   ├── MeetingGroupMemberRole.cs
    │   │   │   │   ├── Policies/
    │   │   │   │   │   ├── MeetingGroupExpirationDatePolicy.cs
    │   │   │   │   │   └── MeetingGroupMemberData.cs
    │   │   │   │   └── Rules/
    │   │   │   │       ├── MeetingCanBeOrganizedOnlyByPayedGroupRule.cs
    │   │   │   │       ├── MeetingGroupMemberCannotBeAddedTwiceRule.cs
    │   │   │   │       ├── MeetingHostMustBeAMeetingGroupMemberRule.cs
    │   │   │   │       └── NotActualGroupMemberCannotLeaveGroupRule.cs
    │   │   │   ├── MeetingMemberCommentLikes/
    │   │   │   │   ├── Events/
    │   │   │   │   │   ├── MeetingCommentLikedDomainEvent.cs
    │   │   │   │   │   └── MeetingCommentUnlikedDomainEvent.cs
    │   │   │   │   ├── IMeetingMemberCommentLikesRepository.cs
    │   │   │   │   ├── MeetingMemberCommentLike.cs
    │   │   │   │   └── MeetingMemberCommentLikeId.cs
    │   │   │   ├── Meetings/
    │   │   │   │   ├── Events/
    │   │   │   │   │   ├── MeetingAttendeeAddedDomainEvent.cs
    │   │   │   │   │   ├── MeetingAttendeeFeePaidDomainEvent.cs
    │   │   │   │   │   ├── MeetingAttendeeRemovedDomainEvent.cs
    │   │   │   │   │   ├── MeetingCanceledDomainEvent.cs
    │   │   │   │   │   ├── MeetingCreatedDomainEvent.cs
    │   │   │   │   │   ├── MeetingEditedDomainEvent.cs
    │   │   │   │   │   ├── MeetingMainAttributesChangedDomainEvent.cs
    │   │   │   │   │   ├── MeetingNotAttendeeAddedDomainEvent.cs
    │   │   │   │   │   ├── MeetingWaitlistMemberAddedDomainEvent.cs
    │   │   │   │   │   ├── MemberSetAsAttendeeDomainEvent.cs
    │   │   │   │   │   ├── MemberSignedOffFromMeetingWaitlistDomainEvent.cs
    │   │   │   │   │   └── NewMeetingHostSetDomainEvent.cs
    │   │   │   │   ├── IMeetingRepository.cs
    │   │   │   │   ├── Meeting.cs
    │   │   │   │   ├── MeetingAttendee.cs
    │   │   │   │   ├── MeetingAttendeeRole.cs
    │   │   │   │   ├── MeetingId.cs
    │   │   │   │   ├── MeetingLimits.cs
    │   │   │   │   ├── MeetingLocation.cs
    │   │   │   │   ├── MeetingNotAttendee.cs
    │   │   │   │   ├── MeetingTerm.cs
    │   │   │   │   ├── MeetingWaitlistMember.cs
    │   │   │   │   ├── MoneyValue.cs
    │   │   │   │   ├── Rules/
    │   │   │   │   │   ├── AttendeeCanBeAddedOnlyInRsvpTermRule.cs
    │   │   │   │   │   ├── AttendeesLimitCannotBeChangedToSmallerThanActiveAttendeesRule.cs
    │   │   │   │   │   ├── MeetingAttendeeMustBeAMemberOfGroupRule.cs
    │   │   │   │   │   ├── MeetingAttendeesLimitCannotBeNegativeRule.cs
    │   │   │   │   │   ├── MeetingAttendeesLimitMustBeGreaterThanGuestsLimitRule.cs
    │   │   │   │   │   ├── MeetingAttendeesNumberIsAboveLimitRule.cs
    │   │   │   │   │   ├── MeetingCannotBeChangedAfterStartRule.cs
    │   │   │   │   │   ├── MeetingGuestsLimitCannotBeNegativeRule.cs
    │   │   │   │   │   ├── MeetingGuestsNumberIsAboveLimitRule.cs
    │   │   │   │   │   ├── MeetingMustHaveAtLeastOneHostRule.cs
    │   │   │   │   │   ├── MemberCannotBeAnAttendeeOfMeetingMoreThanOnceRule.cs
    │   │   │   │   │   ├── MemberCannotBeMoreThanOnceOnMeetingWaitlistRule.cs
    │   │   │   │   │   ├── MemberCannotBeNotAttendeeTwiceRule.cs
    │   │   │   │   │   ├── MemberCannotHaveSetAttendeeRoleMoreThanOnceRule.cs
    │   │   │   │   │   ├── MemberOnWaitlistMustBeAMemberOfGroupRule.cs
    │   │   │   │   │   ├── NotActiveMemberOfWaitlistCannotBeSignedOffRule.cs
    │   │   │   │   │   ├── NotActiveNotAttendeeCannotChangeDecisionRule.cs
    │   │   │   │   │   ├── OnlyActiveAttendeeCanBeRemovedFromMeetingRule.cs
    │   │   │   │   │   ├── OnlyMeetingAttendeeCanHaveChangedRoleRule.cs
    │   │   │   │   │   ├── OnlyMeetingOrGroupOrganizerCanSetMeetingMemberRolesRule.cs
    │   │   │   │   │   └── ReasonOfRemovingAttendeeFromMeetingMustBeProvidedRule.cs
    │   │   │   │   └── Term.cs
    │   │   │   ├── Members/
    │   │   │   │   ├── Events/
    │   │   │   │   │   └── MemberCreatedDomainEvent.cs
    │   │   │   │   ├── IMemberContext.cs
    │   │   │   │   ├── IMemberRepository.cs
    │   │   │   │   ├── MeetingGroupMemberData.cs
    │   │   │   │   ├── Member.cs
    │   │   │   │   ├── MemberId.cs
    │   │   │   │   └── MemberSubscriptions/
    │   │   │   │       ├── Events/
    │   │   │   │       │   └── MemberSubscriptionExpirationDateChangedDomainEvent.cs
    │   │   │   │       ├── IMemberSubscriptionRepository.cs
    │   │   │   │       ├── MemberSubscription.cs
    │   │   │   │       └── MemberSubscriptionId.cs
    │   │   │   └── SharedKernel/
    │   │   │       └── SystemClock.cs
    │   │   ├── Infrastructure/
    │   │   │   ├── CompanyName.MyMeetings.Modules.Meetings.Infrastructure.csproj
    │   │   │   ├── Configuration/
    │   │   │   │   ├── AllConstructorFinder.cs
    │   │   │   │   ├── Assemblies.cs
    │   │   │   │   ├── Authentication/
    │   │   │   │   │   └── AuthenticationModule.cs
    │   │   │   │   ├── DataAccess/
    │   │   │   │   │   └── DataAccessModule.cs
    │   │   │   │   ├── Email/
    │   │   │   │   │   └── EmailModule.cs
    │   │   │   │   ├── EventsBus/
    │   │   │   │   │   ├── EventsBusModule.cs
    │   │   │   │   │   ├── EventsBusStartup.cs
    │   │   │   │   │   └── IntegrationEventGenericHandler.cs
    │   │   │   │   ├── Logging/
    │   │   │   │   │   └── LoggingModule.cs
    │   │   │   │   ├── Mediation/
    │   │   │   │   │   └── MediatorModule.cs
    │   │   │   │   ├── MeetingsCompositionRoot.cs
    │   │   │   │   ├── MeetingsStartup.cs
    │   │   │   │   ├── Processing/
    │   │   │   │   │   ├── CommandsExecutor.cs
    │   │   │   │   │   ├── IRecurringCommand.cs
    │   │   │   │   │   ├── Inbox/
    │   │   │   │   │   │   ├── InboxMessageDto.cs
    │   │   │   │   │   │   ├── ProcessInboxCommand.cs
    │   │   │   │   │   │   ├── ProcessInboxCommandHandler.cs
    │   │   │   │   │   │   └── ProcessInboxJob.cs
    │   │   │   │   │   ├── InternalCommands/
    │   │   │   │   │   │   ├── CommandsScheduler.cs
    │   │   │   │   │   │   ├── ProcessInternalCommandsCommand.cs
    │   │   │   │   │   │   ├── ProcessInternalCommandsCommandHandler.cs
    │   │   │   │   │   │   └── ProcessInternalCommandsJob.cs
    │   │   │   │   │   ├── LoggingCommandHandlerDecorator.cs
    │   │   │   │   │   ├── LoggingCommandHandlerWithResultDecorator.cs
    │   │   │   │   │   ├── Outbox/
    │   │   │   │   │   │   ├── OutboxMessageDto.cs
    │   │   │   │   │   │   ├── OutboxModule.cs
    │   │   │   │   │   │   ├── ProcessOutboxCommand.cs
    │   │   │   │   │   │   ├── ProcessOutboxCommandHandler.cs
    │   │   │   │   │   │   └── ProcessOutboxJob.cs
    │   │   │   │   │   ├── ProcessingModule.cs
    │   │   │   │   │   ├── UnitOfWorkCommandHandlerDecorator.cs
    │   │   │   │   │   ├── UnitOfWorkCommandHandlerWithResultDecorator.cs
    │   │   │   │   │   ├── ValidationCommandHandlerDecorator.cs
    │   │   │   │   │   └── ValidationCommandHandlerWithResultDecorator.cs
    │   │   │   │   └── Quartz/
    │   │   │   │       ├── QuartzModule.cs
    │   │   │   │       ├── QuartzStartup.cs
    │   │   │   │       └── SerilogLogProvider.cs
    │   │   │   ├── Domain/
    │   │   │   │   ├── MeetingCommentingConfigurations/
    │   │   │   │   │   ├── MeetingCommentingConfigurationEntityTypeConfiguration.cs
    │   │   │   │   │   └── MeetingCommentingConfigurationRepository.cs
    │   │   │   │   ├── MeetingComments/
    │   │   │   │   │   ├── MeetingCommentEntityTypeConfiguration.cs
    │   │   │   │   │   └── MeetingCommentRepository.cs
    │   │   │   │   ├── MeetingGroupProposals/
    │   │   │   │   │   ├── MeetingGroupProposalEntityTypeConfiguration.cs
    │   │   │   │   │   └── MeetingGroupProposalRepository.cs
    │   │   │   │   ├── MeetingGroups/
    │   │   │   │   │   ├── MeetingGroupRepository.cs
    │   │   │   │   │   └── MeetingGroupsEntityTypeConfiguration.cs
    │   │   │   │   ├── MeetingMemberCommentLikes/
    │   │   │   │   │   ├── MeetingMemberCommentLikeEntityTypeConfiguration.cs
    │   │   │   │   │   └── MeetingMemberCommentLikeRepository.cs
    │   │   │   │   ├── Meetings/
    │   │   │   │   │   ├── MeetingEntityTypeConfiguration.cs
    │   │   │   │   │   └── MeetingRepository.cs
    │   │   │   │   └── Members/
    │   │   │   │       ├── MemberEntityTypeConfiguration.cs
    │   │   │   │       ├── MemberRepository.cs
    │   │   │   │       └── MemberSubscriptions/
    │   │   │   │           ├── MemberSubscriptionEntityTypeConfiguration.cs
    │   │   │   │           └── MemberSubscriptionRepository.cs
    │   │   │   ├── InternalCommands/
    │   │   │   │   └── InternalCommandEntityTypeConfiguration.cs
    │   │   │   ├── MeetingsContext.cs
    │   │   │   ├── MeetingsModule.cs
    │   │   │   └── Outbox/
    │   │   │       ├── OutboxAccessor.cs
    │   │   │       └── OutboxMessageEntityTypeConfiguration.cs
    │   │   ├── IntegrationEvents/
    │   │   │   ├── CompanyName.MyMeetings.Modules.Meetings.IntegrationEvents.csproj
    │   │   │   ├── MeetingAttendeeAddedIntegrationEvent.cs
    │   │   │   ├── MeetingGroupProposedIntegrationEvent.cs
    │   │   │   └── MemberCreatedIntegrationEvent.cs
    │   │   └── Tests/
    │   │       ├── ArchTests/
    │   │       │   ├── Application/
    │   │       │   │   └── ApplicationTests.cs
    │   │       │   ├── CompanyName.MyMeetings.Modules.Meetings.ArchTests.csproj
    │   │       │   ├── Domain/
    │   │       │   │   └── DomainTests.cs
    │   │       │   ├── Module/
    │   │       │   │   └── LayersTests.cs
    │   │       │   └── SeedWork/
    │   │       │       └── TestBase.cs
    │   │       ├── IntegrationTests/
    │   │       │   ├── AssemblyInfo.cs
    │   │       │   ├── CompanyName.MyMeetings.Modules.Meetings.IntegrationTests.csproj
    │   │       │   ├── Countries/
    │   │       │   │   ├── 0001_SeedCountries.sql
    │   │       │   │   └── GetCountriesTests.cs
    │   │       │   ├── MeetingCommentLikes/
    │   │       │   │   ├── AddMeetingCommentLikeTests.cs
    │   │       │   │   ├── GetLikedMeetingCommentProbe.cs
    │   │       │   │   ├── GetMeetingCommentsProbe.cs
    │   │       │   │   └── RemoveMeetingCommentLikeTests.cs
    │   │       │   ├── MeetingCommentingConfigurations/
    │   │       │   │   ├── CreateMeetingCommentingConfigurationTests.cs
    │   │       │   │   ├── DisableMeetingCommentingConfigurationTests.cs
    │   │       │   │   └── EnableMeetingCommentingConfigurationTests.cs
    │   │       │   ├── MeetingComments/
    │   │       │   │   ├── AddMeetingCommentTests.cs
    │   │       │   │   ├── AddReplyToMeetingCommentTests.cs
    │   │       │   │   ├── EditMeetingCommentTests.cs
    │   │       │   │   ├── GetMeetingCommentsTests.cs
    │   │       │   │   └── RemoveMeetingCommentTests.cs
    │   │       │   ├── MeetingGroupProposals/
    │   │       │   │   ├── GetMeetingGroupProposalsTests.cs
    │   │       │   │   ├── MeetingGroupProposalSampleData.cs
    │   │       │   │   └── ProposeMeetingGroupTests.cs
    │   │       │   ├── MeetingGroups/
    │   │       │   │   └── CreateNewMeetingGroupTests.cs
    │   │       │   ├── Meetings/
    │   │       │   │   ├── MeetingCreateTests.cs
    │   │       │   │   └── MeetingHelper.cs
    │   │       │   └── SeedWork/
    │   │       │       ├── EventsBusMock.cs
    │   │       │       ├── ExecutionContextMock.cs
    │   │       │       ├── OutboxMessagesHelper.cs
    │   │       │       └── TestBase.cs
    │   │       └── UnitTests/
    │   │           ├── CompanyName.MyMeetings.Modules.Meetings.Domain.UnitTests.csproj
    │   │           ├── MeetingGroupProposals/
    │   │           │   └── MeetingGroupProposalTests.cs
    │   │           ├── MeetingGroups/
    │   │           │   └── MeetingGroupTests.cs
    │   │           ├── Meetings/
    │   │           │   ├── MeetingAddAttendeeTests.cs
    │   │           │   ├── MeetingAddNotAttendeeTests.cs
    │   │           │   ├── MeetingCommentTests.cs
    │   │           │   ├── MeetingCommentingConfigurationTests.cs
    │   │           │   ├── MeetingLimitsTests.cs
    │   │           │   ├── MeetingRolesTests.cs
    │   │           │   ├── MeetingTests.cs
    │   │           │   ├── MeetingTestsBase.cs
    │   │           │   └── MeetingWaitlistTests.cs
    │   │           ├── Members/
    │   │           │   └── MemberTests.cs
    │   │           └── SeedWork/
    │   │               ├── DomainEventsTestHelper.cs
    │   │               └── TestBase.cs
    │   ├── Payments/
    │   │   ├── Application/
    │   │   │   ├── CompanyName.MyMeetings.Modules.Payments.Application.csproj
    │   │   │   ├── Configuration/
    │   │   │   │   ├── Commands/
    │   │   │   │   │   ├── ICommandHandler.cs
    │   │   │   │   │   ├── ICommandsScheduler.cs
    │   │   │   │   │   └── InternalCommandBase.cs
    │   │   │   │   ├── Projections/
    │   │   │   │   │   ├── IProjector.cs
    │   │   │   │   │   └── ProjectorBase.cs
    │   │   │   │   └── Queries/
    │   │   │   │       └── IQueryHandler.cs
    │   │   │   ├── Contracts/
    │   │   │   │   ├── CommandBase.cs
    │   │   │   │   ├── ICommand.cs
    │   │   │   │   ├── IPaymentsModule.cs
    │   │   │   │   ├── IQuery.cs
    │   │   │   │   ├── IRecurringCommand.cs
    │   │   │   │   └── QueryBase.cs
    │   │   │   ├── MeetingFees/
    │   │   │   │   ├── CreateMeetingFee/
    │   │   │   │   │   ├── CreateMeetingFeeCommand.cs
    │   │   │   │   │   └── CreateMeetingFeeCommandHandler.cs
    │   │   │   │   ├── CreateMeetingFeePayment/
    │   │   │   │   │   ├── CreateMeetingFeePaymentCommand.cs
    │   │   │   │   │   └── CreateMeetingFeePaymentCommandHandler.cs
    │   │   │   │   ├── GetMeetingFees/
    │   │   │   │   │   ├── GetMeetingFeesQuery.cs
    │   │   │   │   │   ├── GetMeetingFeesQueryHandler.cs
    │   │   │   │   │   ├── MeetingFeeDto.cs
    │   │   │   │   │   └── MeetingFeesProjector.cs
    │   │   │   │   ├── MarkMeetingFeeAsPaid/
    │   │   │   │   │   ├── MarkMeetingFeeAsPaidCommand.cs
    │   │   │   │   │   ├── MarkMeetingFeeAsPaidCommandHandler.cs
    │   │   │   │   │   ├── MeetingFeePaidNotification.cs
    │   │   │   │   │   └── MeetingFeePaidNotificationHandler.cs
    │   │   │   │   ├── MarkMeetingFeePaymentAsPaid/
    │   │   │   │   │   ├── MarkMeetingFeePaymentAsPaidCommand.cs
    │   │   │   │   │   ├── MarkMeetingFeePaymentAsPaidCommandHandler.cs
    │   │   │   │   │   ├── MeetingFeePaymentPaidNotification.cs
    │   │   │   │   │   └── MeetingFeePaymentPaidNotificationHandler.cs
    │   │   │   │   └── MeetingAttendeeAddedIntegrationEventHandler.cs
    │   │   │   ├── Payers/
    │   │   │   │   ├── CreatePayer/
    │   │   │   │   │   ├── CreatePayerCommand.cs
    │   │   │   │   │   ├── CreatePayerCommandHandler.cs
    │   │   │   │   │   └── NewUserRegisteredIntegrationEventHandler.cs
    │   │   │   │   ├── GetPayer/
    │   │   │   │   │   ├── GetPayerQuery.cs
    │   │   │   │   │   ├── GetPayerQueryHandler.cs
    │   │   │   │   │   ├── PayerDetailsProjector.cs
    │   │   │   │   │   └── PayerDto.cs
    │   │   │   │   └── GetPayerEmail/
    │   │   │   │       └── PayerEmailProvider.cs
    │   │   │   ├── PriceListItems/
    │   │   │   │   ├── ActivatePriceListItem/
    │   │   │   │   │   ├── ActivatePriceListItemCommand.cs
    │   │   │   │   │   └── ActivatePriceListItemCommandHandler.cs
    │   │   │   │   ├── ChangePriceListItemAttributes/
    │   │   │   │   │   ├── ChangePriceListItemAttributesCommand.cs
    │   │   │   │   │   └── ChangePriceListItemAttributesCommandHandler.cs
    │   │   │   │   ├── CreatePriceListItem/
    │   │   │   │   │   ├── CreatePriceListItemCommand.cs
    │   │   │   │   │   └── CreatePriceListItemCommandHandler.cs
    │   │   │   │   ├── DeactivatePriceListItem/
    │   │   │   │   │   ├── DeactivatePriceListItemCommand.cs
    │   │   │   │   │   └── DeactivatePriceListItemCommandHandler.cs
    │   │   │   │   ├── GetPriceListItem/
    │   │   │   │   │   ├── GetPriceListItemQuery.cs
    │   │   │   │   │   ├── GetPriceListItemQueryHandler.cs
    │   │   │   │   │   ├── PriceListItemMoneyValueDto.cs
    │   │   │   │   │   └── PriceListItemsProjector.cs
    │   │   │   │   ├── GetPriceListItems/
    │   │   │   │   │   ├── GetPriceListItemsQuery.cs
    │   │   │   │   │   └── GetPriceListItemsQueryHandler.cs
    │   │   │   │   ├── PriceListFactory.cs
    │   │   │   │   └── PriceListItemDto.cs
    │   │   │   └── Subscriptions/
    │   │   │       ├── BuySubscription/
    │   │   │       │   ├── BuySubscriptionCommand.cs
    │   │   │       │   └── BuySubscriptionCommandHandler.cs
    │   │   │       ├── BuySubscriptionRenewal/
    │   │   │       │   ├── BuySubscriptionRenewalCommand.cs
    │   │   │       │   └── BuySubscriptionRenewalCommandHandler.cs
    │   │   │       ├── CreateSubscription/
    │   │   │       │   ├── CreateSubscriptionCommand.cs
    │   │   │       │   ├── CreateSubscriptionCommandHandler.cs
    │   │   │       │   ├── SubscriptionCreatedEnqueueEmailConfirmationHandler.cs
    │   │   │       │   ├── SubscriptionCreatedNotification.cs
    │   │   │       │   └── SubscriptionCreatedNotificationHandler.cs
    │   │   │       ├── ExpireSubscription/
    │   │   │       │   ├── ExpireSubscriptionCommand.cs
    │   │   │       │   └── ExpireSubscriptionCommandHandler.cs
    │   │   │       ├── ExpireSubscriptionPayment/
    │   │   │       │   ├── ExpireSubscriptionPaymentCommand.cs
    │   │   │       │   └── ExpireSubscriptionPaymentCommandHandler.cs
    │   │   │       ├── ExpireSubscriptionPayments/
    │   │   │       │   ├── ExpireSubscriptionPaymentsCommand.cs
    │   │   │       │   └── ExpireSubscriptionPaymentsCommandHandler.cs
    │   │   │       ├── ExpireSubscriptions/
    │   │   │       │   ├── ExpireSubscriptionsCommand.cs
    │   │   │       │   └── ExpireSubscriptionsCommandHandler.cs
    │   │   │       ├── GetPayerSubscription/
    │   │   │       │   ├── GetAuthenticatedPayerSubscriptionQuery.cs
    │   │   │       │   └── GetAuthenticatedPayerSubscriptionQueryHandler.cs
    │   │   │       ├── GetSubscriptionDetails/
    │   │   │       │   ├── GetSubscriptionDetailsQuery.cs
    │   │   │       │   ├── GetSubscriptionDetailsQueryHandler.cs
    │   │   │       │   ├── SubscriptionDetailsDto.cs
    │   │   │       │   └── SubscriptionDetailsProjector.cs
    │   │   │       ├── GetSubscriptionPayments/
    │   │   │       │   ├── GetSubscriptionPaymentsQuery.cs
    │   │   │       │   ├── GetSubscriptionPaymentsQueryHandler.cs
    │   │   │       │   ├── SubscriptionPaymentDto.cs
    │   │   │       │   └── SubscriptionPaymentsProjector.cs
    │   │   │       ├── MarkSubscriptionPaymentAsPaid/
    │   │   │       │   ├── MarkSubscriptionPaymentAsPaidCommand.cs
    │   │   │       │   ├── MarkSubscriptionPaymentAsPaidCommandHandler.cs
    │   │   │       │   ├── SubscriptionPaymentPaidNotification.cs
    │   │   │       │   └── SubscriptionPaymentPaidNotificationHandler.cs
    │   │   │       ├── MarkSubscriptionRenewalPaymentAsPaid/
    │   │   │       │   ├── MarkSubscriptionRenewalPaymentAsPaidCommand.cs
    │   │   │       │   ├── MarkSubscriptionRenewalPaymentAsPaidCommandHandler.cs
    │   │   │       │   ├── SubscriptionRenewalPaymentAsPaidNotificationHandler.cs
    │   │   │       │   └── SubscriptionRenewalPaymentPaidNotification.cs
    │   │   │       ├── RenewSubscription/
    │   │   │       │   ├── RenewSubscriptionCommand.cs
    │   │   │       │   ├── RenewSubscriptionCommandHandler.cs
    │   │   │       │   ├── SubscriptionRenewedEnqueueEmailConfirmationHandler.cs
    │   │   │       │   ├── SubscriptionRenewedNotification.cs
    │   │   │       │   └── SubscriptionRenewedNotificationHandler.cs
    │   │   │       ├── SendSubscriptionCreationConfirmationEmail/
    │   │   │       │   ├── SendSubscriptionCreationConfirmationEmailCommand.cs
    │   │   │       │   └── SendSubscriptionCreationConfirmationEmailCommandHandler.cs
    │   │   │       └── SendSubscriptionRenewalConfirmationEmail/
    │   │   │           ├── SendSubscriptionRenewalConfirmationEmailCommand.cs
    │   │   │           └── SendSubscriptionRenewalConfirmationEmailCommandHandler.cs
    │   │   ├── Domain/
    │   │   │   ├── CompanyName.MyMeetings.Modules.Payments.Domain.csproj
    │   │   │   ├── MeetingFeePayments/
    │   │   │   │   ├── Events/
    │   │   │   │   │   ├── MeetingFeePaymentCreatedDomainEvent.cs
    │   │   │   │   │   ├── MeetingFeePaymentExpiredDomainEvent.cs
    │   │   │   │   │   └── MeetingFeePaymentPaidDomainEvent.cs
    │   │   │   │   ├── MeetingFeePayment.cs
    │   │   │   │   ├── MeetingFeePaymentId.cs
    │   │   │   │   ├── MeetingFeePaymentSnapshot.cs
    │   │   │   │   └── MeetingFeePaymentStatus.cs
    │   │   │   ├── MeetingFees/
    │   │   │   │   ├── Events/
    │   │   │   │   │   ├── MeetingFeeCanceledDomainEvent.cs
    │   │   │   │   │   ├── MeetingFeeCreatedDomainEvent.cs
    │   │   │   │   │   ├── MeetingFeeExpiredDomainEvent.cs
    │   │   │   │   │   └── MeetingFeePaidDomainEvent.cs
    │   │   │   │   ├── MeetingFee.cs
    │   │   │   │   ├── MeetingFeeId.cs
    │   │   │   │   ├── MeetingFeeSnapshot.cs
    │   │   │   │   ├── MeetingFeeStatus.cs
    │   │   │   │   └── MeetingId.cs
    │   │   │   ├── Payers/
    │   │   │   │   ├── Events/
    │   │   │   │   │   └── PayerCreatedDomainEvent.cs
    │   │   │   │   ├── IPayerContext.cs
    │   │   │   │   ├── IPayerRepository.cs
    │   │   │   │   ├── Payer.cs
    │   │   │   │   └── PayerId.cs
    │   │   │   ├── PriceListItems/
    │   │   │   │   ├── Events/
    │   │   │   │   │   ├── PriceListItemActivatedDomainEvent.cs
    │   │   │   │   │   ├── PriceListItemAttributesChangedDomainEvent.cs
    │   │   │   │   │   ├── PriceListItemCreatedDomainEvent.cs
    │   │   │   │   │   └── PriceListItemDeactivatedDomainEvent.cs
    │   │   │   │   ├── PriceList.cs
    │   │   │   │   ├── PriceListItem.cs
    │   │   │   │   ├── PriceListItemCategory.cs
    │   │   │   │   ├── PriceListItemData.cs
    │   │   │   │   ├── PriceListItemId.cs
    │   │   │   │   └── PricingStrategies/
    │   │   │   │       ├── DirectValueFromPriceListPricingStrategy.cs
    │   │   │   │       ├── DirectValuePricingStrategy.cs
    │   │   │   │       ├── DiscountedValueFromPriceListPricingStrategy.cs
    │   │   │   │       └── IPricingStrategy.cs
    │   │   │   ├── SeedWork/
    │   │   │   │   ├── AggregateId.cs
    │   │   │   │   ├── AggregateRoot.cs
    │   │   │   │   ├── IAggregateStore.cs
    │   │   │   │   ├── MoneyValue.cs
    │   │   │   │   ├── Rules/
    │   │   │   │   │   ├── MoneyMustHaveTheSameCurrencyRule.cs
    │   │   │   │   │   └── ValueOfMoneyMustNotBeNegativeRule.cs
    │   │   │   │   └── SystemClock.cs
    │   │   │   ├── SubscriptionPayments/
    │   │   │   │   ├── Events/
    │   │   │   │   │   ├── SubscriptionPaymentCreatedDomainEvent.cs
    │   │   │   │   │   ├── SubscriptionPaymentExpiredDomainEvent.cs
    │   │   │   │   │   └── SubscriptionPaymentPaidDomainEvent.cs
    │   │   │   │   ├── Rules/
    │   │   │   │   │   ├── PriceForSubscriptionMustBeDefinedRule.cs
    │   │   │   │   │   └── PriceOfferMustMatchPriceInPriceListRule.cs
    │   │   │   │   ├── SubscriptionPayment.cs
    │   │   │   │   ├── SubscriptionPaymentId.cs
    │   │   │   │   ├── SubscriptionPaymentSnapshot.cs
    │   │   │   │   └── SubscriptionPaymentStatus.cs
    │   │   │   ├── SubscriptionRenewalPayments/
    │   │   │   │   ├── Events/
    │   │   │   │   │   ├── SubscriptionRenewalPaymentCreatedDomainEvent.cs
    │   │   │   │   │   └── SubscriptionRenewalPaymentPaidDomainEvent.cs
    │   │   │   │   ├── Rules/
    │   │   │   │   │   └── PriceOfferMustMatchPriceInPriceListRule.cs
    │   │   │   │   ├── SubscriptionRenewalPayment.cs
    │   │   │   │   ├── SubscriptionRenewalPaymentId.cs
    │   │   │   │   ├── SubscriptionRenewalPaymentSnapshot.cs
    │   │   │   │   └── SubscriptionRenewalPaymentStatus.cs
    │   │   │   ├── Subscriptions/
    │   │   │   │   ├── Events/
    │   │   │   │   │   ├── SubscriptionCreatedDomainEvent.cs
    │   │   │   │   │   ├── SubscriptionExpiredDomainEvent.cs
    │   │   │   │   │   └── SubscriptionRenewedDomainEvent.cs
    │   │   │   │   ├── SubscriberId.cs
    │   │   │   │   ├── Subscription.cs
    │   │   │   │   ├── SubscriptionDateExpirationCalculator.cs
    │   │   │   │   ├── SubscriptionId.cs
    │   │   │   │   ├── SubscriptionPeriod.cs
    │   │   │   │   └── SubscriptionStatus.cs
    │   │   │   └── Users/
    │   │   │       ├── IUserContext.cs
    │   │   │       └── UserId.cs
    │   │   ├── Infrastructure/
    │   │   │   ├── AggregateStore/
    │   │   │   │   ├── AggregateStoreDomainEventsAccessor.cs
    │   │   │   │   ├── DomainEventTypeMappings.cs
    │   │   │   │   ├── ICheckpointStore.cs
    │   │   │   │   ├── SqlOutboxAccessor.cs
    │   │   │   │   ├── SqlServerCheckpointStore.cs
    │   │   │   │   ├── SqlStreamAggregateStore.cs
    │   │   │   │   ├── SubscriptionCode.cs
    │   │   │   │   └── SubscriptionsManager.cs
    │   │   │   ├── CompanyName.MyMeetings.Modules.Payments.Infrastructure.csproj
    │   │   │   ├── Configuration/
    │   │   │   │   ├── AllConstructorFinder.cs
    │   │   │   │   ├── Assemblies.cs
    │   │   │   │   ├── Authentication/
    │   │   │   │   │   ├── AuthenticationModule.cs
    │   │   │   │   │   └── PayerContext.cs
    │   │   │   │   ├── DataAccess/
    │   │   │   │   │   └── DataAccessModule.cs
    │   │   │   │   ├── DatabaseSchema.cs
    │   │   │   │   ├── Email/
    │   │   │   │   │   └── EmailModule.cs
    │   │   │   │   ├── EventsBus/
    │   │   │   │   │   ├── EventsBusModule.cs
    │   │   │   │   │   ├── EventsBusStartup.cs
    │   │   │   │   │   └── IntegrationEventGenericHandler.cs
    │   │   │   │   ├── Logging/
    │   │   │   │   │   └── LoggingModule.cs
    │   │   │   │   ├── Mediation/
    │   │   │   │   │   └── MediatorModule.cs
    │   │   │   │   ├── PaymentsCompositionRoot.cs
    │   │   │   │   ├── PaymentsStartup.cs
    │   │   │   │   ├── Processing/
    │   │   │   │   │   ├── CommandsExecutor.cs
    │   │   │   │   │   ├── Inbox/
    │   │   │   │   │   │   ├── InboxMessageDto.cs
    │   │   │   │   │   │   ├── ProcessInboxCommand.cs
    │   │   │   │   │   │   ├── ProcessInboxCommandHandler.cs
    │   │   │   │   │   │   └── ProcessInboxJob.cs
    │   │   │   │   │   ├── InternalCommands/
    │   │   │   │   │   │   ├── CommandsScheduler.cs
    │   │   │   │   │   │   ├── ProcessInternalCommandsCommand.cs
    │   │   │   │   │   │   ├── ProcessInternalCommandsCommandHandler.cs
    │   │   │   │   │   │   └── ProcessInternalCommandsJob.cs
    │   │   │   │   │   ├── LoggingCommandHandlerDecorator.cs
    │   │   │   │   │   ├── LoggingCommandHandlerWithResultDecorator.cs
    │   │   │   │   │   ├── Outbox/
    │   │   │   │   │   │   ├── OutboxMessageDto.cs
    │   │   │   │   │   │   ├── OutboxModule.cs
    │   │   │   │   │   │   ├── ProcessOutboxCommand.cs
    │   │   │   │   │   │   ├── ProcessOutboxCommandHandler.cs
    │   │   │   │   │   │   └── ProcessOutboxJob.cs
    │   │   │   │   │   ├── PaymentsUnitOfWork.cs
    │   │   │   │   │   ├── ProcessingModule.cs
    │   │   │   │   │   ├── UnitOfWorkCommandHandlerDecorator.cs
    │   │   │   │   │   ├── UnitOfWorkCommandHandlerWithResultDecorator.cs
    │   │   │   │   │   ├── ValidationCommandHandlerDecorator.cs
    │   │   │   │   │   └── ValidationCommandHandlerWithResultDecorator.cs
    │   │   │   │   └── Quartz/
    │   │   │   │       ├── Jobs/
    │   │   │   │       │   ├── ExpireSubscriptionPaymentsJob.cs
    │   │   │   │       │   └── ExpireSubscriptionsJob.cs
    │   │   │   │       ├── QuartzModule.cs
    │   │   │   │       ├── QuartzStartup.cs
    │   │   │   │       └── SerilogLogProvider.cs
    │   │   │   ├── InternalCommands/
    │   │   │   │   └── InternalCommandEntityTypeConfiguration.cs
    │   │   │   └── PaymentsModule.cs
    │   │   ├── IntegrationEvents/
    │   │   │   ├── CompanyName.MyMeetings.Modules.Payments.IntegrationEvents.csproj
    │   │   │   ├── MeetingFeePaidIntegrationEvent.cs
    │   │   │   └── SubscriptionExpirationDateChangedIntegrationEvent.cs
    │   │   └── Tests/
    │   │       ├── ArchTests/
    │   │       │   ├── Application/
    │   │       │   │   └── ApplicationTests.cs
    │   │       │   ├── CompanyName.MyMeetings.Modules.Payments.ArchTests.csproj
    │   │       │   ├── Domain/
    │   │       │   │   └── DomainTests.cs
    │   │       │   ├── Module/
    │   │       │   │   └── LayersTests.cs
    │   │       │   └── SeedWork/
    │   │       │       └── TestBase.cs
    │   │       ├── IntegrationTests/
    │   │       │   ├── AssemblyInfo.cs
    │   │       │   ├── CompanyName.MyMeetings.Modules.Payments.IntegrationTests.csproj
    │   │       │   ├── MeetingFees/
    │   │       │   │   └── MeetingFeesTests.cs
    │   │       │   ├── Payers/
    │   │       │   │   ├── PayerSampleData.cs
    │   │       │   │   └── PayerTests.cs
    │   │       │   ├── PriceList/
    │   │       │   │   └── PriceListHelper.cs
    │   │       │   ├── SeedWork/
    │   │       │   │   ├── EventsBusMock.cs
    │   │       │   │   ├── ExecutionContextMock.cs
    │   │       │   │   ├── OutboxMessagesHelper.cs
    │   │       │   │   └── TestBase.cs
    │   │       │   └── Subscriptions/
    │   │       │       ├── BuySubscriptionTests.cs
    │   │       │       ├── GetSubscriptionPaymentsProbe.cs
    │   │       │       ├── SubscriptionLifecycleTests.cs
    │   │       │       └── SubscriptionPaymentsTests.cs
    │   │       └── UnitTests/
    │   │           ├── CompanyName.MyMeetings.Modules.Payments.Domain.UnitTests.csproj
    │   │           ├── Payers/
    │   │           │   └── PayerTests.cs
    │   │           ├── PriceListItems/
    │   │           │   └── PriceListItemTests.cs
    │   │           ├── SeedWork/
    │   │           │   ├── DomainEventsTestHelper.cs
    │   │           │   └── TestBase.cs
    │   │           ├── SubscriptionPayments/
    │   │           │   ├── SubscriptionPaymentTests.cs
    │   │           │   └── SubscriptionPaymentTestsBase.cs
    │   │           ├── SubscriptionRenewalPayments/
    │   │           │   ├── SubscriptionRenewalPaymentTests.cs
    │   │           │   └── SubscriptionRenewalPaymentTestsBase.cs
    │   │           └── Subscriptions/
    │   │               ├── SubscriptionDateExpirationCalculatorTests.cs
    │   │               └── SubscriptionTests.cs
    │   ├── Registrations/
    │   │   ├── Application/
    │   │   │   ├── CompanyName.MyMeetings.Modules.Registrations.Application.csproj
    │   │   │   ├── Configuration/
    │   │   │   │   ├── Commands/
    │   │   │   │   │   ├── ICommandHandler.cs
    │   │   │   │   │   ├── ICommandsScheduler.cs
    │   │   │   │   │   └── InternalCommandBase.cs
    │   │   │   │   └── Queries/
    │   │   │   │       └── IQueryHandler.cs
    │   │   │   ├── Contracts/
    │   │   │   │   ├── CommandBase.cs
    │   │   │   │   ├── CustomClaimTypes.cs
    │   │   │   │   ├── ICommand.cs
    │   │   │   │   ├── IQuery.cs
    │   │   │   │   ├── IRecurringCommand.cs
    │   │   │   │   ├── IRegistrationsModule.cs
    │   │   │   │   ├── QueryBase.cs
    │   │   │   │   └── Roles.cs
    │   │   │   └── UserRegistrations/
    │   │   │       ├── ConfirmUserRegistration/
    │   │   │       │   ├── ConfirmUserRegistrationCommand.cs
    │   │   │       │   ├── ConfirmUserRegistrationCommandHandler.cs
    │   │   │       │   ├── IUserCreator.cs
    │   │   │       │   ├── UserRegistrationConfirmedNotification.cs
    │   │   │       │   └── UserRegistrationConfirmedNotificationHandler.cs
    │   │   │       ├── GetUserRegistration/
    │   │   │       │   ├── GetUserRegistrationQuery.cs
    │   │   │       │   ├── GetUserRegistrationQueryHandler.cs
    │   │   │       │   ├── UserRegistrationDto.cs
    │   │   │       │   └── UserRegistrationProvider.cs
    │   │   │       ├── RegisterNewUser/
    │   │   │       │   ├── NewUserRegisteredEnqueueEmailConfirmationHandler.cs
    │   │   │       │   ├── NewUserRegisteredNotification.cs
    │   │   │       │   ├── NewUserRegisteredPublishEventHandler.cs
    │   │   │       │   ├── PasswordManager.cs
    │   │   │       │   ├── RegisterNewUserCommand.cs
    │   │   │       │   └── RegisterNewUserCommandHandler.cs
    │   │   │       ├── SendUserRegistrationConfirmationEmail/
    │   │   │       │   ├── SendUserRegistrationConfirmationEmailCommand.cs
    │   │   │       │   └── SendUserRegistrationConfirmationEmailCommandHandler.cs
    │   │   │       └── UsersCounter.cs
    │   │   ├── Domain/
    │   │   │   ├── CompanyName.MyMeetings.Modules.Registrations.Domain.csproj
    │   │   │   └── UserRegistrations/
    │   │   │       ├── Events/
    │   │   │       │   ├── NewUserRegisteredDomainEvent.cs
    │   │   │       │   ├── UserRegistrationConfirmedDomainEvent.cs
    │   │   │       │   └── UserRegistrationExpiredDomainEvent.cs
    │   │   │       ├── IUserRegistrationRepository.cs
    │   │   │       ├── IUsersCounter.cs
    │   │   │       ├── Rules/
    │   │   │       │   ├── UserCannotBeCreatedWhenRegistrationIsNotConfirmedRule.cs
    │   │   │       │   ├── UserLoginMustBeUniqueRule.cs
    │   │   │       │   ├── UserRegistrationCannotBeConfirmedAfterExpirationRule.cs
    │   │   │       │   ├── UserRegistrationCannotBeConfirmedMoreThanOnceRule.cs
    │   │   │       │   └── UserRegistrationCannotBeExpiredMoreThanOnceRule.cs
    │   │   │       ├── UserRegistration.cs
    │   │   │       ├── UserRegistrationId.cs
    │   │   │       └── UserRegistrationStatus.cs
    │   │   ├── Infrastructure/
    │   │   │   ├── CompanyName.MyMeetings.Modules.Registrations.Infrastructure.csproj
    │   │   │   ├── Configuration/
    │   │   │   │   ├── AllConstructorFinder.cs
    │   │   │   │   ├── Assemblies.cs
    │   │   │   │   ├── Commands/
    │   │   │   │   │   ├── ICommandHandler.cs
    │   │   │   │   │   ├── ICommandsScheduler.cs
    │   │   │   │   │   └── InternalCommandBase.cs
    │   │   │   │   ├── DataAccess/
    │   │   │   │   │   └── DataAccessModule.cs
    │   │   │   │   ├── Domain/
    │   │   │   │   │   └── DomainModule.cs
    │   │   │   │   ├── Email/
    │   │   │   │   │   └── EmailModule.cs
    │   │   │   │   ├── EventsBus/
    │   │   │   │   │   ├── EventsBusModule.cs
    │   │   │   │   │   ├── EventsBusStartup.cs
    │   │   │   │   │   └── IntegrationEventGenericHandler.cs
    │   │   │   │   ├── Logging/
    │   │   │   │   │   └── LoggingModule.cs
    │   │   │   │   ├── Mediation/
    │   │   │   │   │   └── MediatorModule.cs
    │   │   │   │   ├── Processing/
    │   │   │   │   │   ├── CommandsExecutor.cs
    │   │   │   │   │   ├── IRecurringCommand.cs
    │   │   │   │   │   ├── Inbox/
    │   │   │   │   │   │   ├── InboxMessageDto.cs
    │   │   │   │   │   │   ├── ProcessInboxCommand.cs
    │   │   │   │   │   │   ├── ProcessInboxCommandHandler.cs
    │   │   │   │   │   │   └── ProcessInboxJob.cs
    │   │   │   │   │   ├── InternalCommands/
    │   │   │   │   │   │   ├── CommandsScheduler.cs
    │   │   │   │   │   │   ├── ProcessInternalCommandsCommand.cs
    │   │   │   │   │   │   ├── ProcessInternalCommandsCommandHandler.cs
    │   │   │   │   │   │   └── ProcessInternalCommandsJob.cs
    │   │   │   │   │   ├── LoggingCommandHandlerDecorator.cs
    │   │   │   │   │   ├── LoggingCommandHandlerWithResultDecorator.cs
    │   │   │   │   │   ├── Outbox/
    │   │   │   │   │   │   ├── OutboxMessageDto.cs
    │   │   │   │   │   │   ├── OutboxModule.cs
    │   │   │   │   │   │   ├── ProcessOutboxCommand.cs
    │   │   │   │   │   │   ├── ProcessOutboxCommandHandler.cs
    │   │   │   │   │   │   └── ProcessOutboxJob.cs
    │   │   │   │   │   ├── ProcessingModule.cs
    │   │   │   │   │   ├── UnitOfWorkCommandHandlerDecorator.cs
    │   │   │   │   │   ├── UnitOfWorkCommandHandlerWithResultDecorator.cs
    │   │   │   │   │   ├── ValidationCommandHandlerDecorator.cs
    │   │   │   │   │   └── ValidationCommandHandlerWithResultDecorator.cs
    │   │   │   │   ├── Quartz/
    │   │   │   │   │   ├── QuartzModule.cs
    │   │   │   │   │   ├── QuartzStartup.cs
    │   │   │   │   │   └── SerilogLogProvider.cs
    │   │   │   │   ├── RegistrationsCompositionRoot.cs
    │   │   │   │   ├── RegistrationsStartup.cs
    │   │   │   │   └── UserAccess/
    │   │   │   │       └── UserAccessAutofacModule.cs
    │   │   │   ├── Domain/
    │   │   │   │   └── UserRegistrations/
    │   │   │   │       ├── UserRegistrationEntityTypeConfiguration.cs
    │   │   │   │       └── UserRegistrationRepository.cs
    │   │   │   ├── InternalCommands/
    │   │   │   │   └── InternalCommandEntityTypeConfiguration.cs
    │   │   │   ├── Outbox/
    │   │   │   │   ├── OutboxAccessor.cs
    │   │   │   │   └── OutboxMessageEntityTypeConfiguration.cs
    │   │   │   ├── RegistrationsContext.cs
    │   │   │   ├── RegistrationsModule.cs
    │   │   │   └── Users/
    │   │   │       └── UserAccessGateway.cs
    │   │   ├── IntegrationEvents/
    │   │   │   ├── Class1.cs
    │   │   │   ├── CompanyName.MyMeetings.Modules.Registrations.IntegrationEvents.csproj
    │   │   │   └── NewUserRegisteredIntegrationEvent.cs
    │   │   └── Tests/
    │   │       ├── ArchTests/
    │   │       │   ├── Application/
    │   │       │   │   └── ApplicationTests.cs
    │   │       │   ├── CompanyName.MyMeetings.Modules.Registrations.ArchTests.csproj
    │   │       │   ├── Domain/
    │   │       │   │   └── DomainTests.cs
    │   │       │   ├── Module/
    │   │       │   │   └── LayersTests.cs
    │   │       │   └── SeedWork/
    │   │       │       └── TestBase.cs
    │   │       ├── IntegrationTests/
    │   │       │   ├── AssemblyInfo.cs
    │   │       │   ├── CompanyNames.MyMeetings.Modules.Registrations.IntegrationTests.csproj
    │   │       │   ├── SeedWork/
    │   │       │   │   ├── ExecutionContextMock.cs
    │   │       │   │   ├── OutboxMessagesHelper.cs
    │   │       │   │   └── TestBase.cs
    │   │       │   └── UserRegistrations/
    │   │       │       ├── ConfirmUserRegistrationTests.cs
    │   │       │       ├── SendUserRegistrationConfirmationEmailTests.cs
    │   │       │       ├── UserRegistrationSampleData.cs
    │   │       │       └── UserRegistrationTests.cs
    │   │       └── UnitTests/
    │   │           ├── CompanyName.MyMeetings.Modules.Registrations.Domain.UnitTests.csproj
    │   │           ├── SeedWork/
    │   │           │   ├── DomainEventsTestHelper.cs
    │   │           │   └── TestBase.cs
    │   │           └── UserRegistrations/
    │   │               └── UserRegistrationTests.cs
    │   └── UserAccess/
    │       ├── Application/
    │       │   ├── Authentication/
    │       │   │   └── Authenticate/
    │       │   │       ├── AuthenticateCommand.cs
    │       │   │       ├── AuthenticateCommandHandler.cs
    │       │   │       ├── AuthenticateCommandValidator.cs
    │       │   │       ├── AuthenticationResult.cs
    │       │   │       ├── PasswordManager.cs
    │       │   │       └── UserDto.cs
    │       │   ├── Authorization/
    │       │   │   ├── GetAuthenticatedUserPermissions/
    │       │   │   │   ├── GetAuthenticatedUserPermissionsQuery.cs
    │       │   │   │   └── GetAuthenticatedUserPermissionsQueryHandler.cs
    │       │   │   └── GetUserPermissions/
    │       │   │       ├── GetUserPermissionsQuery.cs
    │       │   │       ├── GetUserPermissionsQueryHandler.cs
    │       │   │       └── UserPermissionDto.cs
    │       │   ├── CompanyName.MyMeetings.Modules.UserAccess.Application.csproj
    │       │   ├── Configuration/
    │       │   │   ├── Commands/
    │       │   │   │   ├── ICommandHandler.cs
    │       │   │   │   ├── ICommandsScheduler.cs
    │       │   │   │   └── InternalCommandBase.cs
    │       │   │   └── Queries/
    │       │   │       └── IQueryHandler.cs
    │       │   ├── Contracts/
    │       │   │   ├── CommandBase.cs
    │       │   │   ├── CustomClaimTypes.cs
    │       │   │   ├── ICommand.cs
    │       │   │   ├── IQuery.cs
    │       │   │   ├── IRecurringCommand.cs
    │       │   │   ├── IUserAccessModule.cs
    │       │   │   ├── QueryBase.cs
    │       │   │   └── Roles.cs
    │       │   ├── Emails/
    │       │   │   ├── EmailDto.cs
    │       │   │   ├── GetAllEmailsQuery.cs
    │       │   │   └── GetAllEmailsQueryHandler.cs
    │       │   └── Users/
    │       │       ├── AddAdminUser/
    │       │       │   ├── AddAdminUserCommand.cs
    │       │       │   └── AddAdminUserCommandHandler.cs
    │       │       ├── CreateUser/
    │       │       │   ├── CreateUserCommand.cs
    │       │       │   └── CreateUserCommandHandler.cs
    │       │       ├── GetAuthenticatedUser/
    │       │       │   ├── GetAuthenticatedUserQuery.cs
    │       │       │   └── GetAuthenticatedUserQueryHandler.cs
    │       │       └── GetUser/
    │       │           ├── GetUserQuery.cs
    │       │           ├── GetUserQueryHandler.cs
    │       │           └── UserDto.cs
    │       ├── Domain/
    │       │   ├── CompanyName.MyMeetings.Modules.UserAccess.Domain.csproj
    │       │   └── Users/
    │       │       ├── Events/
    │       │       │   └── UserCreatedDomainEvent.cs
    │       │       ├── IUserRepository.cs
    │       │       ├── User.cs
    │       │       ├── UserId.cs
    │       │       └── UserRole.cs
    │       ├── Infrastructure/
    │       │   ├── CompanyName.MyMeetings.Modules.UserAccess.Infrastructure.csproj
    │       │   ├── Configuration/
    │       │   │   ├── AllConstructorFinder.cs
    │       │   │   ├── Assemblies.cs
    │       │   │   ├── DataAccess/
    │       │   │   │   └── DataAccessModule.cs
    │       │   │   ├── Email/
    │       │   │   │   └── EmailModule.cs
    │       │   │   ├── EventsBus/
    │       │   │   │   ├── EventsBusModule.cs
    │       │   │   │   ├── EventsBusStartup.cs
    │       │   │   │   └── IntegrationEventGenericHandler.cs
    │       │   │   ├── Identity/
    │       │   │   │   └── IdentityConfiguration.cs
    │       │   │   ├── Logging/
    │       │   │   │   └── LoggingModule.cs
    │       │   │   ├── Mediation/
    │       │   │   │   └── MediatorModule.cs
    │       │   │   ├── Processing/
    │       │   │   │   ├── CommandsExecutor.cs
    │       │   │   │   ├── IRecurringCommand.cs
    │       │   │   │   ├── Inbox/
    │       │   │   │   │   ├── InboxMessageDto.cs
    │       │   │   │   │   ├── ProcessInboxCommand.cs
    │       │   │   │   │   ├── ProcessInboxCommandHandler.cs
    │       │   │   │   │   └── ProcessInboxJob.cs
    │       │   │   │   ├── InternalCommands/
    │       │   │   │   │   ├── CommandsScheduler.cs
    │       │   │   │   │   ├── ProcessInternalCommandsCommand.cs
    │       │   │   │   │   ├── ProcessInternalCommandsCommandHandler.cs
    │       │   │   │   │   └── ProcessInternalCommandsJob.cs
    │       │   │   │   ├── LoggingCommandHandlerDecorator.cs
    │       │   │   │   ├── LoggingCommandHandlerWithResultDecorator.cs
    │       │   │   │   ├── Outbox/
    │       │   │   │   │   ├── OutboxMessageDto.cs
    │       │   │   │   │   ├── OutboxModule.cs
    │       │   │   │   │   ├── ProcessOutboxCommand.cs
    │       │   │   │   │   ├── ProcessOutboxCommandHandler.cs
    │       │   │   │   │   └── ProcessOutboxJob.cs
    │       │   │   │   ├── ProcessingModule.cs
    │       │   │   │   ├── UnitOfWorkCommandHandlerDecorator.cs
    │       │   │   │   ├── UnitOfWorkCommandHandlerWithResultDecorator.cs
    │       │   │   │   ├── ValidationCommandHandlerDecorator.cs
    │       │   │   │   └── ValidationCommandHandlerWithResultDecorator.cs
    │       │   │   ├── Quartz/
    │       │   │   │   ├── QuartzModule.cs
    │       │   │   │   ├── QuartzStartup.cs
    │       │   │   │   └── SerilogLogProvider.cs
    │       │   │   ├── Security/
    │       │   │   │   ├── AesDataProtector.cs
    │       │   │   │   ├── IDataProtector.cs
    │       │   │   │   └── SecurityModule.cs
    │       │   │   ├── UserAccessCompositionRoot.cs
    │       │   │   └── UserAccessStartup.cs
    │       │   ├── Domain/
    │       │   │   └── Users/
    │       │   │       ├── UserEntityTypeConfiguration.cs
    │       │   │       └── UserRepository.cs
    │       │   ├── IdentityServer/
    │       │   │   ├── IdentityServerConfig.cs
    │       │   │   ├── ProfileService.cs
    │       │   │   └── ResourceOwnerPasswordValidator.cs
    │       │   ├── InternalCommands/
    │       │   │   └── InternalCommandEntityTypeConfiguration.cs
    │       │   ├── Outbox/
    │       │   │   ├── OutboxAccessor.cs
    │       │   │   └── OutboxMessageEntityTypeConfiguration.cs
    │       │   ├── UserAccessContext.cs
    │       │   └── UserAccessModule.cs
    │       ├── IntegrationEvents/
    │       │   └── CompanyName.MyMeetings.Modules.UserAccess.IntegrationEvents.csproj
    │       └── Tests/
    │           ├── ArchTests/
    │           │   ├── Application/
    │           │   │   └── ApplicationTests.cs
    │           │   ├── CompanyName.MyMeetings.Modules.UserAccess.ArchTests.csproj
    │           │   ├── Domain/
    │           │   │   └── DomainTests.cs
    │           │   ├── Module/
    │           │   │   └── LayersTests.cs
    │           │   └── SeedWork/
    │           │       └── TestBase.cs
    │           ├── IntegrationTests/
    │           │   ├── AssemblyInfo.cs
    │           │   ├── CompanyNames.MyMeetings.Modules.UserAccess.IntegrationTests.csproj
    │           │   ├── SeedWork/
    │           │   │   ├── ExecutionContextMock.cs
    │           │   │   ├── OutboxMessagesHelper.cs
    │           │   │   └── TestBase.cs
    │           │   └── Users/
    │           │       └── CreateUserTests.cs
    │           └── UnitTests/
    │               ├── CompanyName.MyMeetings.Modules.UserAccess.Domain.UnitTests.csproj
    │               └── SeedWork/
    │                   ├── DomainEventsTestHelper.cs
    │                   └── TestBase.cs
    ├── Tests/
    │   ├── ArchTests/
    │   │   ├── Api/
    │   │   │   └── ApiTests.cs
    │   │   ├── CompanyName.MyMeetings.ArchTests.csproj
    │   │   ├── Modules/
    │   │   │   └── ModuleTests.cs
    │   │   └── SeedWork/
    │   │       └── TestBase.cs
    │   ├── IntegrationTests/
    │   │   ├── AssemblyInfo.cs
    │   │   ├── CompanyName.MyMeetings.IntegrationTests.csproj
    │   │   ├── CreateMeetingGroup/
    │   │   │   └── CreateMeetingGroupTests.cs
    │   │   └── SeedWork/
    │   │       ├── ExecutionContextMock.cs
    │   │       └── TestBase.cs
    │   └── SUT/
    │       ├── CompanyName.MyMeetings.SUT.csproj
    │       ├── Helpers/
    │       │   ├── MeetingGroupsFactory.cs
    │       │   ├── TestMeetingFactory.cs
    │       │   ├── TestMeetingGroupManager.cs
    │       │   ├── TestMeetingManager.cs
    │       │   ├── TestPaymentsManager.cs
    │       │   ├── TestPriceListManager.cs
    │       │   └── UsersFactory.cs
    │       ├── Scripts/
    │       │   └── SeedPermissions.sql
    │       ├── SeedWork/
    │       │   ├── AsyncOperationsHelper.cs
    │       │   ├── DatabaseCleaner.cs
    │       │   ├── ExecutionContextMock.cs
    │       │   ├── Probing/
    │       │   │   ├── AssertErrorException.cs
    │       │   │   ├── IProbe.cs
    │       │   │   ├── Poller.cs
    │       │   │   └── Timeout.cs
    │       │   └── TestBase.cs
    │       └── TestCases/
    │           ├── CleanDatabaseTestCase.cs
    │           ├── CreateMeeting.cs
    │           └── OnlyAdminTestCase.cs
    ├── entrypoint.sh
    ├── global.json
    └── stylecop.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/workflows/buildPipeline.yml
================================================
name: CI Pipeline

on:
  push:
    branches: [master]
  pull_request:
    branches: [master]

jobs:
  build:
    name: Build and run Unit and Architecture Tests
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4
      - name: Setup .NET
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: 8.0.x
      - name: Run build
        run: ./build.sh BuildAndUnitTests --configuration Release

  integration:
    name: Build and run Integration Tests
    needs: [build]
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4
      - name: Setup .NET
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: 8.0.x
      - name: Run build
        run: ./build.sh RunAllIntegrationTests


================================================
FILE: .gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.

# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates
.vscode/

# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/

# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
**/wwwroot/lib/
!/wwwroot/lib/signalr
!/wwwroot/lib/toastr

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# NUNIT
*.VisualState.xml
TestResult.xml

# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c

# DNX
project.lock.json
artifacts/

*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc

# Chutzpah Test files
_Chutzpah*

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb

# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap

# TFS 2012 Local Workspace
$tf/

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user

# JustCode is a .NET coding add-in
.JustCode

# TeamCity is a build add-in
_TeamCity*

# DotCover is a Code Coverage Tool
*.dotCover

# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*

# MightyMoose
*.mm.*
AutoTest.Net/

# Web workbench (sass)
.sass-cache/

# Installshield output folder
[Ee]xpress/

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Click-Once directory
publish/

# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# TODO: Comment the next line if you want to checkin your web deploy settings
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj

# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/

# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignoreable files
*.nuget.props
*.nuget.targets

# Microsoft Azure Build Output
csx/
*.build.csdef

# Microsoft Azure Emulator
ecf/
rcf/

# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt

# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/

# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.publishsettings
node_modules/
orleans.codegen.cs

# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/

# RIA/Silverlight projects
Generated_Code/

# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm

# SQL Server files
*.mdf
*.ldf

# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings

# Microsoft Fakes
FakesAssemblies/

# GhostDoc plugin setting file
*.GhostDoc.xml

# Node.js Tools for Visual Studio
.ntvs_analysis.dat

# Visual Studio 6 build log
*.plg

# Visual Studio 6 workspace options file
*.opt

# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions

# Paket dependency manager
.paket/paket.exe
paket-files/

# FAKE - F# Make
.fake/

# JetBrains Rider
.idea/
*.sln.iml
pub/
/src/Web/WebMVC/Properties/PublishProfiles/eShopOnContainersWebMVC2016 - Web Deploy-publish.ps1
/src/Web/WebMVC/Properties/PublishProfiles/publish-module.psm1
/src/Services/Identity/eShopOnContainers.Identity/Properties/launchSettings.json

#Ignore marker-file used to know which docker files we have.
.eshopdocker_*
/src/Web/WebMVC/wwwroot/lib
/src/Web/WebMVC/wwwroot/css/site.min.css
**/.kube/**
.mfractor

#Ignore logs folder
[Ll]ogs

#Ignore uploaded files folder
UploadedFiles
/src/CompanyName.MyMeetings.v3.ncrunchsolution

#Nuke working directory
.nuke-working-directory
/src/API/CompanyName.MyMeetings.API/tempkey.jwk


================================================
FILE: .nuke/build.schema.json
================================================
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "$ref": "#/definitions/build",
  "title": "Build Schema",
  "definitions": {
    "build": {
      "type": "object",
      "properties": {
        "Configuration": {
          "type": "string",
          "description": "Configuration to build - Default is 'Debug' (local) or 'Release' (server)",
          "enum": [
            "Debug",
            "Release"
          ]
        },
        "Continue": {
          "type": "boolean",
          "description": "Indicates to continue a previously failed build attempt"
        },
        "DatabaseConnectionString": {
          "type": "string",
          "description": "Modular Monolith database connection string"
        },
        "Help": {
          "type": "boolean",
          "description": "Shows the help text for this build assembly"
        },
        "Host": {
          "type": "string",
          "description": "Host for execution. Default is 'automatic'",
          "enum": [
            "AppVeyor",
            "AzurePipelines",
            "Bamboo",
            "Bitbucket",
            "Bitrise",
            "GitHubActions",
            "GitLab",
            "Jenkins",
            "Rider",
            "SpaceAutomation",
            "TeamCity",
            "Terminal",
            "TravisCI",
            "VisualStudio",
            "VSCode"
          ]
        },
        "NoLogo": {
          "type": "boolean",
          "description": "Disables displaying the NUKE logo"
        },
        "Partition": {
          "type": "string",
          "description": "Partition to use on CI"
        },
        "Plan": {
          "type": "boolean",
          "description": "Shows the execution plan (HTML)"
        },
        "Profile": {
          "type": "array",
          "description": "Defines the profiles to load",
          "items": {
            "type": "string"
          }
        },
        "Root": {
          "type": "string",
          "description": "Root directory during build execution"
        },
        "Skip": {
          "type": "array",
          "description": "List of targets to be skipped. Empty list skips all dependencies",
          "items": {
            "type": "string",
            "enum": [
              "ArchitectureTests",
              "BuildAdministrationModuleIntegrationTests",
              "BuildAndUnitTests",
              "BuildMeetingsModuleIntegrationTests",
              "BuildPaymentsModuleIntegrationTests",
              "BuildSystemIntegrationTests",
              "BuildUserAccessModuleIntegrationTests",
              "Clean",
              "Compile",
              "CompileDbUpMigrator",
              "CompileDbUpMigratorForIntegrationTests",
              "CreateDatabase",
              "MigrateDatabase",
              "PrepareInputFiles",
              "PrepareSqlServer",
              "PrepareSUT",
              "Restore",
              "RunAdministrationModuleIntegrationTests",
              "RunAllIntegrationTests",
              "RunDatabaseMigrations",
              "RunMeetingsModuleIntegrationTests",
              "RunPaymentsModuleIntegrationTests",
              "RunSystemIntegrationTests",
              "RunUserAccessModuleIntegrationTests",
              "UnitTests"
            ]
          }
        },
        "Solution": {
          "type": "string",
          "description": "Path to a solution file that is automatically loaded"
        },
        "SUTTestName": {
          "type": "string",
          "description": "SUT creator test name to execute"
        },
        "Target": {
          "type": "array",
          "description": "List of targets to be invoked. Default is '{default_target}'",
          "items": {
            "type": "string",
            "enum": [
              "ArchitectureTests",
              "BuildAdministrationModuleIntegrationTests",
              "BuildAndUnitTests",
              "BuildMeetingsModuleIntegrationTests",
              "BuildPaymentsModuleIntegrationTests",
              "BuildSystemIntegrationTests",
              "BuildUserAccessModuleIntegrationTests",
              "Clean",
              "Compile",
              "CompileDbUpMigrator",
              "CompileDbUpMigratorForIntegrationTests",
              "CreateDatabase",
              "MigrateDatabase",
              "PrepareInputFiles",
              "PrepareSqlServer",
              "PrepareSUT",
              "Restore",
              "RunAdministrationModuleIntegrationTests",
              "RunAllIntegrationTests",
              "RunDatabaseMigrations",
              "RunMeetingsModuleIntegrationTests",
              "RunPaymentsModuleIntegrationTests",
              "RunSystemIntegrationTests",
              "RunUserAccessModuleIntegrationTests",
              "UnitTests"
            ]
          }
        },
        "Verbosity": {
          "type": "string",
          "description": "Logging verbosity during build execution. Default is 'Normal'",
          "enum": [
            "Minimal",
            "Normal",
            "Quiet",
            "Verbose"
          ]
        }
      }
    }
  }
}


================================================
FILE: .nuke/parameters.json
================================================
{
  "$schema": "./build.schema.json",
  "Solution": "src/CompanyName.MyMeetings.sln"
}

================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2019 Kamil Grzybek

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
# Modular Monolith with DDD

Full Modular Monolith .NET application with Domain-Driven Design approach.

## Announcement

![](docs/Images/glory_to_ukraine.jpg)

Learn, use and benefit from this project only if:

- You **condemn Russia and its military aggression against Ukraine**
- You **recognize that Russia is an occupant that unlawfully invaded a sovereign state**
- You **support Ukraine's territorial integrity, including its claims over temporarily occupied territories of Crimea and Donbas**
- You **reject false narratives perpetuated by Russian state propaganda**

Otherwise, leave this project immediately and educate yourself.

Putin, idi nachuj.

## CI

![](https://github.com/kgrzybek/modular-monolith-with-ddd/workflows/Build%20Pipeline/badge.svg)

## FrontEnd application

FrontEnd application : [Modular Monolith With DDD: FrontEnd React application](https://github.com/kgrzybek/modular-monolith-with-ddd-fe-react)

## Table of contents

[1. Introduction](#1-introduction)

  [1.1 Purpose of this Repository](#11-purpose-of-this-repository)

  [1.2 Out of Scope](#12-out-of-scope)

  [1.3 Reason](#13-reason)

  [1.4 Disclaimer](#14-disclaimer)

  [1.5 Give a Star](#15-give-a-star)

  [1.6 Share It](#16-share-it)

[2. Domain](#2-domain)

  [2.1 Description](#21-description)

  [2.2 Conceptual Model](#22-conceptual-model)

  [2.3 Event Storming](#23-event-storming)

[3. Architecture](#3-architecture)

  [3.0 C4 Model](#30-c4-model)

  [3.1 High Level View](#31-high-level-view)

  [3.2 Module Level View](#32-module-level-view)

  [3.3 API and Module Communication](#33-api-and-module-communication)

  [3.4 Module Requests Processing via CQRS](#34-module-requests-processing-via-cqrs)

  [3.5 Domain Model Principles and Attributes](#35-domain-model-principles-and-attributes)

  [3.6 Cross-Cutting Concerns](#36-cross-cutting-concerns)

  [3.7 Modules Integration](#37-modules-integration)

  [3.8 Internal Processing](#38-internal-processing)

  [3.9 Security](#39-security)

  [3.10 Unit Tests](#310-unit-tests)

  [3.11 Architecture Decision Log](#311-architecture-decision-log)

  [3.12 Architecture Unit Tests](#312-architecture-unit-tests)

  [3.13 Integration Tests](#313-integration-tests)

  [3.14 System Integration Testing](#314-system-integration-testing)

  [3.15 Event Sourcing](#315-event-sourcing)

  [3.16 Database change management](#316-database-change-management)

  [3.17 Continuous Integration](#317-continuous-integration)

  [3.18 Static code analysis](#318-static-code-analysis)

  [3.19 System Under Test SUT](#319-system-under-test-sut)

  [3.20 Mutation Testing](#320-mutation-testing)

[4. Technology](#4-technology)

[5. How to Run](#5-how-to-run)

[6. Contribution](#6-contribution)

[7. Roadmap](#7-roadmap)

[8. Authors](#8-authors)

[9. License](#9-license)

[10. Inspirations and Recommendations](#10-inspirations-and-recommendations)

## 1. Introduction

### 1.1 Purpose of this Repository

This is a list of the main goals of this repository:

- Showing how you can implement a **monolith** application in a **modular** way
- Presentation of the **full implementation** of an application
  - This is not another simple application
  - This is not another proof of concept (PoC)
  - The goal is to present the implementation of an application that would be ready to run in production
- Showing the application of **best practices** and **object-oriented programming principles**
- Presentation of the use of **design patterns**. When, how and why they can be used
- Presentation of some **architectural** considerations, decisions, approaches
- Presentation of the implementation using **Domain-Driven Design** approach (**tactical** patterns)
- Presentation of the implementation of **Unit Tests** for Domain Model (Testable Design in mind)
- Presentation of the implementation of **Integration Tests**
- Presentation of the implementation of **Event Sourcing**
- Presentation of **C4 Model**
- Presentation of **diagram as text** approach

### 1.2 Out of Scope

This is a list of subjects which are out of scope for this repository:

- Business requirements gathering and analysis
- System analysis
- Domain exploration
- Domain distillation
- Domain-Driven Design **strategic** patterns
- Architecture evaluation, quality attributes analysis
- Integration, system tests
- Project management
- Infrastructure
- Containerization
- Software engineering process
- Deployment process
- Maintenance
- Documentation

### 1.3 Reason

The reason for creating this repository is the lack of something similar. Most sample applications on GitHub have at least one of the following issues:

- Very, very simple - few entities and use cases implemented
- Not finished (for example there is no authentication, logging, etc..)
- Poorly designed (in my opinion)
- Poorly implemented (in my opinion)
- Not well described
- Assumptions and decisions are not clearly explained
- Implements "Orders" domain - yes, everyone knows this domain, but something different is needed
- Implemented in old technology
- Not maintained

To sum up, there are some very good examples, but there are far too few of them. This repository has the task of filling this gap at some level.

### 1.4 Disclaimer

Software architecture should always be created to resolve specific **business problems**. Software architecture always supports some quality attributes and at the same time does not support others. A lot of other factors influence your software architecture - your team, opinions, preferences, experiences, technical constraints, time, budget, etc.

Always functional requirements, quality attributes, technical constraints and other factors should be considered before an architectural decision is made.

Because of the above, the architecture and implementation presented in this repository is **one of the many ways** to solve some problems. Take from this repository as much as you want, use it as you like but remember to **always pick the best solution which is appropriate to the problem class you have**.

### 1.5 Give a Star

My primary focus in this project is on quality. Creating a good quality product involves a lot of analysis, research and work. It takes a lot of time. If you like this project, learned something or you are using it in your applications, please give it a star :star:.  This is the best motivation for me to continue this work. Thanks!

### 1.6 Share It

There are very few really good examples of this type of application. If you think this repository makes a difference and is worth it, please share it with your friends and on social networks. I will be extremely grateful.

## 2. Domain

### 2.1 Description

**Definition:**

> Domain - A sphere of knowledge, influence, or activity. The subject area to which the user applies a program is the domain of the software. [Domain-Driven Design Reference](http://domainlanguage.com/ddd/reference/), Eric Evans

The **Meeting Groups** domain was selected for the purposes of this project based on the [Meetup.com](https://www.meetup.com/) system.

**Main reasons for selecting this domain:**

- It is common, a lot of people use the Meetup site to organize or attend meetings
- There is a system for it, so everyone can check this implementation against a working site which supports this domain
- It is not complex so it is easy to understand
- It is not trivial - there are some business rules and logic and it is not just CRUD operations
- You don't need much specific domain knowledge unlike other domains like financing, banking, medical
- It is not big so it is easier to implement

**Meetings**

The main business entities are `Member`, `Meeting Group` and `Meeting`. A `Member` can create a `Meeting Group`, be part of a `Meeting Group` or can attend a `Meeting`.

A `Meeting Group Member` can be an `Organizer` of this group or a normal `Member`.

Only an `Organizer` of a `Meeting Group` can create a new `Meeting`.

A `Meeting` has attendees, not attendees (`Members` which declare they will not attend the `Meeting`) and `Members` on the `Waitlist`.

A `Meeting` can have an attendee limit. If the limit is reached, `Members` can only sign up to the `Waitlist`.

A `Meeting Attendee` can bring guests to the `Meeting`. The number of guests allowed is an attribute of the `Meeting`. Bringing guests can be unallowed.

A `Meeting Attendee` can have one of two roles: `Attendee` or `Host`. A `Meeting` must have at least one `Host`. The `Host` is a special role which grants permission to edit `Meeting` information or change the attendees list.

A `Member` can comment `Meetings`. A `Member` can reply to, like other `Comments`. `Organizer` manages commenting of `Meeting` by `Meeting Commenting Configuration`. `Organizer` can delete any `Comment`.

Each `Meeting Group` must have an organizer with active `Subscription`. One organizer can cover 3 `Meeting Groups` by his `Subscription`.

Additionally, Meeting organizer can set an `Event Fee`. Each `Meeting Attendee` is obliged to pay the fee. All guests should be paid by `Meeting Attendee` too.

**Administration**

To create a new `Meeting Group`, a `Member` needs to propose the group. A `Meeting Group Proposal` is sent to `Administrators`. An `Administrator` can accept or reject a `Meeting Group Proposal`. If a `Meeting Group Proposal` is accepted, a `Meeting Group` is created.

**Payments**

Each `Member` who is the `Payer` can buy the `Subscription`. He needs to pay the `Subscription Payment`. `Subscription` can expire so `Subscription Renewal` is required (by `Subscription Renewal Payment` payment to keep `Subscription` active).

When the `Meeting` fee is required, the `Payer` needs to pay `Meeting Fee` (through `Meeting Fee Payment`).

**Users**

Each `Administrator`, `Member` and `Payer` is a `User`. To be a `User`, `User Registration` is required and confirmed.

Each `User` is assigned one or more `User Role`.

Each `User Role` has set of `Permissions`. A `Permission` defines whether `User` can invoke a particular action.

### 2.2 Conceptual Model

**Definition:**

> Conceptual Model - A conceptual model is a representation of a system, made of the composition of concepts that are used to help people know, understand, or simulate a subject the model represents. [Wikipedia - Conceptual model](https://en.wikipedia.org/wiki/Conceptual_model)

**Conceptual Model**

PlantUML version:
![](https://www.plantuml.com/plantuml/proxy?cache=no&src=https://raw.githubusercontent.com/kgrzybek/modular-monolith-with-ddd/master/docs/PlantUML/Conceptual_Model.puml)

VisualParadigm version (not maintained, only for demonstration):
![](docs/Images/Conceptual_Model.png)

**Conceptual Model of commenting feature**
![](https://www.plantuml.com/plantuml/proxy?src=https://raw.githubusercontent.com/kgrzybek/modular-monolith-with-ddd/master/docs/PlantUML/Commenting_Conceptual_Model.puml)

### 2.3 Event Storming

While a Conceptual Model focuses on structures and relationships between them, **behavior** and **events** that occur in our domain are more important.

There are many ways to show behavior and events. One of them is a light technique called [Event Storming](https://www.eventstorming.com/) which is becoming more popular. Below are presented 3 main business processes using this technique: user registration, meeting group creation and meeting organization.

Note: Event Storming is a light, live workshop. One of the possible outputs of this workshop is presented here. Even if you are not doing Event Storming workshops, this type of process presentation can be very valuable to you and your stakeholders.

**User Registration process**

------

![](docs/Images/User_Registration.jpg)

------

**Meeting Group creation**
![](docs/Images/Meeting_Group_Creation.jpg)

------

**Meeting organization**
![](docs/Images/Meeting_Organization.jpg)

------

**Payments**
![](docs/Images/Payments_EventStorming_Design.jpg)
[Download high resolution file](docs/Images/Payments_EventStorming_Design_HighRes.jpg)

------

## 3. Architecture

### 3.0 C4 Model

[C4 model](https://c4model.com/) is a lean graphical notation technique for modelling the architecture of software systems. <br>

As can be found on the website of the author of this model ([Simon Brown](https://simonbrown.je/)): *The C4 model was created as a way to help software development teams describe and communicate software architecture, both during up-front design sessions and when retrospectively documenting an existing codebase* <br>

*Model C4* defines 4 levels (views) of the system architecture: *System Context*, *Container*, *Component* and *Code*. Below are examples of each of these levels that describe the architecture of this system. <br>

*Note: The [PlantUML](https://plantuml.com/) (diagram as text) component was used to describe all C4 model levels. Additionally, for levels C1-C3, a [C4-PlantUML](https://github.com/plantuml-stdlib/C4-PlantUML) plug-in connecting PlantUML with the C4 model was used*.

#### 3.0.1 C1 System Context

![](http://www.plantuml.com/plantuml/png/7OrDgeD048JtxnGl1z0ca5LMGWuYutIZulIqz0_6d3vZDbLG5Dytc2VruF9tMsikWHHQ_XVttPu0cev-Nds9AOmqItMgtcTXs6Rzd1Djm89HadOiLKgxTiSLY0YSp4a19Hky7f3levrjuV77UNk_Nzg1AhR-0W00)

#### 3.0.2 C2 Container

![](docs/C4/C2_Containers.png)

#### 3.0.3 C3 Component (high-level)

![](docs/C4/C3_Components.png)

#### 3.0.4 C3 Component (module-level)

![](http://www.plantuml.com/plantuml/png/jLHFRzCm5B_dKsI1GojjBOKn5QH9wxeTAgrem7QUdEGrjHJRaVqCgX3V7QVUl7XkbnA2BusUVt_y_7xrXK8YKRCoEi8rC8Yhab0U7L6UbJg7U8rOgS_ZiIG_HmN5jKwr0fa9Zi1nb0asDWHU2vmep4kQZkUd9xTrwNvvCsP48KXJUfWBLWbUSwhQB9hbkIlTaMAGC02al539SVmsBUQY5F8yUNEQmRkpZyamn9ESKKuLIe9KS9y57zBfsNGN2twOBtMfNzYy_pIPJ4bTMmcEJzNLTXcPwFj68R27Iw5vJkHca4sEusIvYPUFXuuj81d6lwBOB0TacoV8hA8lEBFRXIFKovrqGBROUj_yZBvStvaz2PRWuFR3CtjKNefSbs2epifMd5lWwAWBlf94eTGPQjcK6Faxxc0tD9N6kxuw98KwVvxZiCLgLbKbpRRJQ_eqoZsON0b6gATlApr8BpX2OTDtlKrLqoNOx6vubJvtGv0qnveJ9BMmojR0oAkIlwCmB_vVoALcvfNRi-FB10dovGxEaQ-Q30yoRsOgS6vizcnhCnKwsdhFPc7k0jy0qlq8BeC-i4vYu1laiSN4fTBp-gf1my0zr4REzX3RLpjPy9W14yqc7DXA6raZ77s3qhwaUn-tUmM64W8RIV5HkvLw8Be4XHnVj3CXZCtV7P0WEOpXXk7WZL7uIMWTY0_VUxklg_u7aLstlzUcLt8unkvD42JjxFR1-gn_2L-tlY-0vvgLVm00)

#### 3.0.5 C4 Code (meeting group aggregate)

![](http://www.plantuml.com/plantuml/png/5OqxheD0303xTugN0x1kg58XvI3HObk0yAwHFqB9wGFDJ3FIJ1xL8flyFRQEaiHfyhz67Fu4i7gMPOirvtGsr1xSew0ss1VxVcRUeIcbL1kQTfKh7SuRH0IjUh01AJgyHi3nZLBTot7V9kvq-GS0)

### 3.1 High Level View

![](docs/Images/Architecture_high_level.png)

**Module descriptions:**

- **API** - Very thin ASP.NET MVC Core REST API application. Main responsibilities are:
  1. Accept request
  2. Authenticate and authorize request (using User Access module)
  3. Delegate work to specific module sending Command or Query
  4. Return response
- **User Access** - responsible for user authentication and authorization
- **Registrations** - responsible for user registration
- **Meetings** - implements Meetings Bounded Context: creating meeting groups, meetings
- **Administration** - implements Administration Bounded Context: implements administrative tasks like meeting group proposal verification
- **Payments** - implements Payments Bounded Context: implements all functionalities associated with payments
- **In Memory Events Bus** - Publish/Subscribe implementation to asynchronously integrate all modules using events ([Event Driven Architecture](https://en.wikipedia.org/wiki/Event-driven_architecture)).

**Key assumptions:**

1. API contains no application logic
2. API communicates with Modules using a small interface to send Queries and Commands
3. Each Module has its own interface which is used by API
4. **Modules communicate each other only asynchronously using Events Bus** - direct method calls are not allowed
5. Each Module **has it's own data** in a separate schema - shared data is not allowed
   - Module data could be moved into separate databases if desired
6. Modules can only have a dependency on the integration events assembly of other Module (see [Module level view](#32-module-level-view))
7. Each Module has its own [Composition Root](https://freecontent.manning.com/dependency-injection-in-net-2nd-edition-understanding-the-composition-root/), which implies that each Module has its own Inversion-of-Control container
8. API as a host needs to initialize each module and each module has an initialization method
9. Each Module is **highly encapsulated** - only required types and members are public, the rest are internal or private

### 3.2 Module Level View

![](docs/Images/Module_level_diagram.png)

Each Module has [Clean Architecture](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html) and consists of the following submodules (assemblies):

- **Application** - the application logic submodule which is responsible for requests processing: use cases, domain events, integration events, internal commands.
- **Domain** - Domain Model in Domain-Driven Design terms implements the applicable [Bounded Context](https://martinfowler.com/bliki/BoundedContext.html)
- **Infrastructure** - infrastructural code responsible for module initialization, background processing, data access, communication with Events Bus and other external components or systems
- **IntegrationEvents** - **Contracts** published to the Events Bus; only this assembly can be called by other modules

![](docs/Images/VSSolution.png)

**Note:** Application, Domain and Infrastructure assemblies could be merged into one assembly. Some people like horizontal layering or more decomposition, some don't. Implementing the Domain Model or Infrastructure in separate assembly allows encapsulation using the [`internal`](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/internal) keyword. Sometimes Bounded Context logic is not worth it because it is too simple. As always, be pragmatic and take whatever approach you like.

### 3.3 API and Module Communication

The API only communicates with Modules in two ways: during module initialization and request processing.

**Module initialization**

Each module has a static ``Initialize`` method which is invoked in the API ``Startup`` class. All configuration needed by this module should be provided as arguments to this method. All services are configured during initialization and the Composition Root is created using the Inversion-of-Control Container.

```csharp
public static void Initialize(
    string connectionString,
    IExecutionContextAccessor executionContextAccessor,
    ILogger logger,
    EmailsConfiguration emailsConfiguration)
{
    var moduleLogger = logger.ForContext("Module", "Meetings");

    ConfigureCompositionRoot(connectionString, executionContextAccessor, moduleLogger, emailsConfiguration);

    QuartzStartup.Initialize(moduleLogger);

    EventsBusStartup.Initialize(moduleLogger);
}
```

**Request processing**

Each module has the same interface signature exposed to the API. It contains 3 methods: command with result, command without result and query.

```csharp
public interface IMeetingsModule
{
    Task<TResult> ExecuteCommandAsync<TResult>(ICommand<TResult> command);

    Task ExecuteCommandAsync(ICommand command);

    Task<TResult> ExecuteQueryAsync<TResult>(IQuery<TResult> query);
}
```

**Note:** Some people say that processing a command should not return a result. This is an understandable approach but sometimes impractical, especially when you want to immediately return the ID of a newly created resource. Sometimes the boundary between Command and Query is blurry. One example is ``AuthenticateCommand`` - it returns a token but it is not a query because it has a side effect.

### 3.4 Module Requests Processing via CQRS

Processing of Commands and Queries is separated by applying the architectural style/pattern [Command Query Responsibility Segregation (CQRS)](https://docs.microsoft.com/en-us/azure/architecture/patterns/cqrs).

![](docs/Images/CQRS.jpg)

Commands are processed using *Write Model* which is implemented using DDD tactical patterns:

```csharp
internal class CreateNewMeetingGroupCommandHandler : ICommandHandler<CreateNewMeetingGroupCommand>
{
    private readonly IMeetingGroupRepository _meetingGroupRepository;
    private readonly IMeetingGroupProposalRepository _meetingGroupProposalRepository;

    internal CreateNewMeetingGroupCommandHandler(
        IMeetingGroupRepository meetingGroupRepository,
        IMeetingGroupProposalRepository meetingGroupProposalRepository)
    {
        _meetingGroupRepository = meetingGroupRepository;
        _meetingGroupProposalRepository = meetingGroupProposalRepository;
    }

    public async Task Handle(CreateNewMeetingGroupCommand request, CancellationToken cancellationToken)
    {
        var meetingGroupProposal = await _meetingGroupProposalRepository.GetByIdAsync(request.MeetingGroupProposalId);

        var meetingGroup = meetingGroupProposal.CreateMeetingGroup();

        await _meetingGroupRepository.AddAsync(meetingGroup);

        
    }
}
```

Queries are processed using *Read Model* which is implemented by executing raw SQL statements on database views:

```csharp
internal class GetAllMeetingGroupsQueryHandler : IQueryHandler<GetAllMeetingGroupsQuery, List<MeetingGroupDto>>
{
    private readonly ISqlConnectionFactory _sqlConnectionFactory;

    internal GetAllMeetingGroupsQueryHandler(ISqlConnectionFactory sqlConnectionFactory)
    {
        _sqlConnectionFactory = sqlConnectionFactory;
    }

    public async Task<List<MeetingGroupDto>> Handle(GetAllMeetingGroupsQuery request, CancellationToken cancellationToken)
    {
        var connection = _sqlConnectionFactory.GetOpenConnection();

        const string sql = $"""
                           SELECT 
                                [MeetingGroup].[Id] as [{nameof(MeetingGroupDto.Id)}] , 
                                [MeetingGroup].[Name] as [{nameof(MeetingGroupDto.Name)}], 
                                [MeetingGroup].[Description] as [{nameof(MeetingGroupDto.Description)}] 
                                [MeetingGroup].[LocationCountryCode] as [{nameof(MeetingGroupDto.LocationCountryCode)}],
                                [MeetingGroup].[LocationCity] as [{nameof(MeetingGroupDto.LocationCity)}]
                           FROM [meetings].[v_MeetingGroups] AS [MeetingGroup]
                           """;
        var meetingGroups = await connection.QueryAsync<MeetingGroupDto>(sql);

        return meetingGroups.AsList();
    }
}
```

**Key advantages:**

- Solution is appropriate to the problem - reading and writing needs are usually different
- Supports [Single Responsibility Principle](https://en.wikipedia.org/wiki/Single_responsibility_principle) (SRP) - one handler does one thing
- Supports [Interface Segregation Principle](https://en.wikipedia.org/wiki/Interface_segregation_principle) (ISP) - each handler implements interface with exactly one method
- Supports [Parameter Object pattern](https://refactoring.com/catalog/introduceParameterObject.html) - Commands and Queries are objects which are easy to serialize/deserialize
- Easy way to apply [Decorator pattern](https://en.wikipedia.org/wiki/Decorator_pattern) to handle cross-cutting concerns
- Supports Loose Coupling by use of the [Mediator pattern](https://en.wikipedia.org/wiki/Mediator_pattern) - separates invoker of request from handler of request

**Disadvantage:**

- Mediator pattern introduces extra indirection and is harder to reason about which class handles the request

For more information: [Simple CQRS implementation with raw SQL and DDD](https://www.kamilgrzybek.com/design/simple-cqrs-implementation-with-raw-sql-and-ddd/)

### 3.5 Domain Model Principles and Attributes

The Domain Model, which is the central and most critical part in the system, should be designed with special attention. Here are some key principles and attributes which are applied to Domain Models of each module:

1. **High level of encapsulation**

    All members are ``private`` by default, then ``internal`` - only ``public`` at the very edge.

2. **High level of PI (Persistence Ignorance)**

    No dependencies to infrastructure, databases, etc. All classes are [POCOs](https://en.wikipedia.org/wiki/Plain_old_CLR_object).

3. **Rich in behavior**

    All business logic is located in the Domain Model. No leaks to the application layer or elsewhere.

4. **Low level of Primitive Obsession**

    Primitive attributes of Entites grouped together using ValueObjects.

5. **Business language**

    All classes, methods and other members are named in business language used in this Bounded Context.

6. **Testable**

    The Domain Model is a critical part of the system so it should be easy to test (Testable Design).

```csharp
public class MeetingGroup : Entity, IAggregateRoot
{
    public MeetingGroupId Id { get; private set; }

    private string _name;

    private string _description;

    private MeetingGroupLocation _location;

    private MemberId _creatorId;

    private List<MeetingGroupMember> _members;

    private DateTime _createDate;

    private DateTime? _paymentDateTo;

    internal static MeetingGroup CreateBasedOnProposal(
        MeetingGroupProposalId meetingGroupProposalId,
        string name,
        string description,
        MeetingGroupLocation location, MemberId creatorId)
    {
        return new MeetingGroup(meetingGroupProposalId, name, description, location, creatorId);
    }

     public Meeting CreateMeeting(
            string title,
            MeetingTerm term,
            string description,
            MeetingLocation location,
            int? attendeesLimit,
            int guestsLimit,
            Term rsvpTerm,
            MoneyValue eventFee,
            List<MemberId> hostsMembersIds,
            MemberId creatorId)
        {
            this.CheckRule(new MeetingCanBeOrganizedOnlyByPayedGroupRule(_paymentDateTo));

            this.CheckRule(new MeetingHostMustBeAMeetingGroupMemberRule(creatorId, hostsMembersIds, _members));

            return new Meeting(this.Id,
                title,
                term,
                description,
                location,
                attendeesLimit,
                guestsLimit,
                rsvpTerm,
                eventFee,
                hostsMembersIds,
                creatorId);
        }
```

### 3.6 Cross-Cutting Concerns

To support [Single Responsibility Principle](https://en.wikipedia.org/wiki/Single_responsibility_principle) and [Don't Repeat Yourself](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself) principles, the implementation of cross-cutting concerns is done using the [Decorator Pattern](https://en.wikipedia.org/wiki/Decorator_pattern). Each Command processor is decorated by 3 decorators: logging, validation and unit of work.

![](docs/Images/Decorator.jpg)

**Logging**

The Logging decorator logs execution, arguments and processing of each Command. This way each log inside a processor has the log context of the processing command.

```csharp
internal class LoggingCommandHandlerDecorator<T> : ICommandHandler<T> where T:ICommand
{
    private readonly ILogger _logger;
    private readonly IExecutionContextAccessor _executionContextAccessor;
    private readonly ICommandHandler<T> _decorated;

    public LoggingCommandHandlerDecorator(
        ILogger logger,
        IExecutionContextAccessor executionContextAccessor,
        ICommandHandler<T> decorated)
    {
        _logger = logger;
        _executionContextAccessor = executionContextAccessor;
        _decorated = decorated;
    }
    public async Task Handle(T command, CancellationToken cancellationToken)
    {
        if (command is IRecurringCommand)
        {
            return await _decorated.Handle(command, cancellationToken);
        }
        using (
            LogContext.Push(
                new RequestLogEnricher(_executionContextAccessor),
                new CommandLogEnricher(command)))
        {
            try
            {
                this._logger.Information(
                    "Executing command {Command}",
                    command.GetType().Name);

                var result = await _decorated.Handle(command, cancellationToken);

                this._logger.Information("Command {Command} processed successful", command.GetType().Name);

                return result;
            }
            catch (Exception exception)
            {
                this._logger.Error(exception, "Command {Command} processing failed", command.GetType().Name);
                throw;
            }
        }
    }

    private class CommandLogEnricher : ILogEventEnricher
    {
        private readonly ICommand _command;

        public CommandLogEnricher(ICommand command)
        {
            _command = command;
        }
        public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
        {
            logEvent.AddOrUpdateProperty(new LogEventProperty("Context", new ScalarValue($"Command:{_command.Id.ToString()}")));
        }
    }

    private class RequestLogEnricher : ILogEventEnricher
    {
        private readonly IExecutionContextAccessor _executionContextAccessor;
        public RequestLogEnricher(IExecutionContextAccessor executionContextAccessor)
        {
            _executionContextAccessor = executionContextAccessor;
        }
        public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
        {
            if (_executionContextAccessor.IsAvailable)
            {
                logEvent.AddOrUpdateProperty(new LogEventProperty("CorrelationId", new ScalarValue(_executionContextAccessor.CorrelationId)));
            }
        }
    }
}
```

**Validation**

The Validation decorator performs Command data validation. It checks rules against Command arguments using the FluentValidation library.

```csharp
internal class ValidationCommandHandlerDecorator<T> : ICommandHandler<T> where T:ICommand
{
    private readonly IList<IValidator<T>> _validators;
    private readonly ICommandHandler<T> _decorated;

    public ValidationCommandHandlerDecorator(
        IList<IValidator<T>> validators,
        ICommandHandler<T> decorated)
    {
        this._validators = validators;
        _decorated = decorated;
    }

    public Task<Unit> Handle(T command, CancellationToken cancellationToken)
    {
        var errors = _validators
            .Select(v => v.Validate(command))
            .SelectMany(result => result.Errors)
            .Where(error => error != null)
            .ToList();

        if (errors.Any())
        {
            var errorBuilder = new StringBuilder();

            errorBuilder.AppendLine("Invalid command, reason: ");

            foreach (var error in errors)
            {
                errorBuilder.AppendLine(error.ErrorMessage);
            }

            throw new InvalidCommandException(errorBuilder.ToString(), null);
        }

        return _decorated.Handle(command, cancellationToken);
    }
}
```

**Unit Of Work**

All Command processing has side effects. To avoid calling commit on every handler, `UnitOfWorkCommandHandlerDecorator` is used. It additionally marks `InternalCommand` as processed (if it is Internal Command) and dispatches all Domain Events (as part of [Unit Of Work](https://martinfowler.com/eaaCatalog/unitOfWork.html)).

```csharp
public class UnitOfWorkCommandHandlerDecorator<T> : ICommandHandler<T> where T:ICommand
{
    private readonly ICommandHandler<T> _decorated;
    private readonly IUnitOfWork _unitOfWork;
    private readonly MeetingsContext _meetingContext;

    public UnitOfWorkCommandHandlerDecorator(
        ICommandHandler<T> decorated,
        IUnitOfWork unitOfWork,
        MeetingsContext meetingContext)
    {
        _decorated = decorated;
        _unitOfWork = unitOfWork;
        _meetingContext = meetingContext;
    }

    public async Task Handle(T command, CancellationToken cancellationToken)
    {
        await this._decorated.Handle(command, cancellationToken);

        if (command is InternalCommandBase)
        {
            var internalCommand =
                await _meetingContext.InternalCommands.FirstOrDefaultAsync(x => x.Id == command.Id,
                    cancellationToken: cancellationToken);

            if (internalCommand != null)
            {
                internalCommand.ProcessedDate = DateTime.UtcNow;
            }
        }

        await this._unitOfWork.CommitAsync(cancellationToken);

        
    }
}
```

### 3.7 Modules Integration

Integration between modules is strictly **asynchronous** using Integration Events and the In Memory Event Bus as broker. In this way coupling between modules is minimal and exists only on the structure of Integration Events.

**Modules don't share data** so it is not possible nor desirable to create a transaction which spans more than one module. To ensure maximum reliability, the [Outbox / Inbox pattern](http://www.kamilgrzybek.com/design/the-outbox-pattern/) is used. This pattern provides accordingly *"At-Least-Once delivery"* and *"At-Least-Once processing"*.

![](docs/Images/OutboxInbox.jpg)

The Outbox and Inbox is implemented using two SQL tables and a background worker for each module. The background worker is implemented using the Quartz.NET library.

**Saving to Outbox:**

![](docs/Images/OutboxSave.png)

**Processing Outbox:**

![](docs/Images/OutboxProcessing.png)

### 3.8 Internal Processing

The main principle of this system is that you can change its state only by calling a specific Command.

Commands can be called not only by the API, but by the processing module itself. The main use case which implements this mechanism is data processing in eventual consistency mode when we want to process something in a different process and transaction. This applies, for example, to Inbox processing because we want to do something (calling a Command) based on an Integration Event from the Inbox.

This idea is taken from Alberto's Brandolini's Event Storming picture called "The picture that explains “almost” everything" which shows that every side effect (domain event) is created by invoking a Command on Aggregate. See [EventStorming cheat sheet](https://xebia.com/blog/eventstorming-cheat-sheet/) article for more details.

Implementation of internal processing is very similar to implementation of the Outbox and Inbox. One SQL table and one background worker for processing. Each internally processing Command must inherit from `InternalCommandBase` class:

```csharp
internal abstract class InternalCommandBase : ICommand
{
    public Guid Id { get; }

    protected InternalCommandBase(Guid id)
    {
        this.Id = id;
    }
}
```

This is important because the `UnitOfWorkCommandHandlerDecorator` must mark an internal Command as processed during committing:

```csharp
public async Task Handle(T command, CancellationToken cancellationToken)
{
    await this._decorated.Handle(command, cancellationToken);

    if (command is InternalCommandBase)
    {
        var internalCommand =
            await _meetingContext.InternalCommands.FirstOrDefaultAsync(x => x.Id == command.Id,
                cancellationToken: cancellationToken);

        if (internalCommand != null)
        {
            internalCommand.ProcessedDate = DateTime.UtcNow;
        }
    }

    await this._unitOfWork.CommitAsync(cancellationToken);

    
}
```

### 3.9 Security

**Authentication**

Authentication is implemented using JWT Token and Bearer scheme using IdentityServer. For now, only one authentication method is implemented: forms style authentication (username and password) via the OAuth2 [Resource Owner Password Grant Type](https://www.oauth.com/oauth2-servers/access-tokens/password-grant/). It requires implementation of the `IResourceOwnerPasswordValidator` interface:

```csharp
public class ResourceOwnerPasswordValidator : IResourceOwnerPasswordValidator
{
    private readonly IUserAccessModule _userAccessModule;

    public ResourceOwnerPasswordValidator(IUserAccessModule userAccessModule)
    {
        _userAccessModule = userAccessModule;
    }

    public async Task ValidateAsync(ResourceOwnerPasswordValidationContext context)
    {
        var authenticationResult = await _userAccessModule.ExecuteCommandAsync(new AuthenticateCommand(context.UserName, context.Password));
        if (!authenticationResult.IsAuthenticated)
        {
            context.Result = new GrantValidationResult(
                TokenRequestErrors.InvalidGrant,
                authenticationResult.AuthenticationError);
            return;
        }
        context.Result = new GrantValidationResult(
            authenticationResult.User.Id.ToString(),
            "forms",
            authenticationResult.User.Claims);
    }
}
```

**Authorization**

Authorization is achieved by implementing [RBAC (Role Based Access Control)](https://en.wikipedia.org/wiki/Role-based_access_control) using Permissions. Permissions are more granular and a much better way to secure your application than Roles alone. Each User has a set of Roles and each Role contains one or more Permission. The User's set of Permissions is extracted from all Roles the User belongs to. Permissions are always checked on `Controller` level - never Roles:

```csharp
[HttpPost]
[Route("")]
[HasPermission(MeetingsPermissions.ProposeMeetingGroup)]
public async Task<IActionResult> ProposeMeetingGroup(ProposeMeetingGroupRequest request)
{
    await _meetingsModule.ExecuteCommandAsync(
        new ProposeMeetingGroupCommand(
            request.Name,
            request.Description,
            request.LocationCity,
            request.LocationCountryCode));

    return Ok();
}
```

### 3.10 Unit Tests

**Definition:**

>A unit test is an automated piece of code that invokes the unit of work being tested, and then checks some assumptions about a single end result of that unit. A unit test is almost always written using a unit testing framework. It can be written easily and runs quickly. It’s trustworthy, readable, and maintainable. It’s consistent in its results as long as production code hasn’t changed. [Art of Unit Testing 2nd Edition](https://www.manning.com/books/the-art-of-unit-testing-second-edition) Roy Osherove

**Attributes of good unit test**

- Automated
- Maintainable
- Runs very fast (in ms)
- Consistent, Deterministic (always the same result)
- Isolated from other tests
- Readable
- Can be executed by anyone
- Testing public API, not internal behavior (overspecification)
- Looks like production code
- Treated as production code

**Implementation**

Unit tests should mainly test business logic (domain model): </br>
![](docs/Images/unit_tests.jpg)

Each unit test has 3 standard sections: Arrange, Act and Assert:

![](docs/Images/UnitTestsGeneral.jpg)

**1\. Arrange**

The Arrange section is responsible for preparing the Aggregate for testing the public method that we want to test. This public method is often called (from the unit tests perspective) the SUT (system under test).

Creating an Aggregate ready for testing involves **calling one or more other public constructors/methods** on the Domain Model. At first it may seem that we are testing too many things at the same time, but this is not true. We need to be one hundred percent sure that the Aggregate is in a state exactly as it will be in production. This can only be ensured when we:

- **Use only public API of Domain Model**
- Don't use [InternalsVisibleToAttribute](https://docs.microsoft.com/en-us/dotnet/api/system.runtime.compilerservices.internalsvisibletoattribute?view=netframework-4.8) class
  - This exposes the Domain Model to the Unit Tests library, removing encapsulation so our tests and production code are treated differently and it is a very bad thing
- Don't use [ConditionalAttribute](https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.conditionalattribute?view=netframework-4.8) classes - it reduces readability and increases complexity
- Don't create any special constructors/factory methods for tests (even with conditional compilation symbols)
  - Special constructor/factory method only for unit tests causes duplication of business logic in the test itself and focuses on state - this kind of approach causes the test to be very sensitive to changes and hard to maintain
- Don't remove encapsulation from Domain Model (for example: change keywords from `internal`/`private` to `public`)
- Don't make methods `protected` to inherit from tested class and in this way provide access to internal methods/properties

**Isolation of external dependencies**

There are 2 main concepts - stubs and mocks:

> A stub is a controllable replacement for an existing dependency (or collaborator) in the system. By using a stub, you can test your code without dealing with the dependency directly.

>A mock object is a fake object in the system that decides whether the unit test has passed or failed. It does so by verifying whether the object under test called the fake object as expected. There’s usually no more than one mock per test.
>[Art of Unit Testing 2nd Edition](https://www.manning.com/books/the-art-of-unit-testing-second-edition) Roy Osherove

Good advice: use stubs if you need to, but try to avoid mocks. Mocking causes us to test too many internal things and leads to overspecification.

**2\. Act**

This section is very easy - we execute **exactly one** public method on aggregate (SUT).

**3\. Assert**

In this section we check expectations. There are only 2 possible outcomes:

- Method completed and Domain Event(s) published
- Business rule was broken

Simple example:

```csharp
[Test]
public void NewUserRegistration_WithUniqueLogin_IsSuccessful()
{
    // Arrange
    var usersCounter = Substitute.For<IUsersCounter>();

    // Act
    var userRegistration =
        UserRegistration.RegisterNewUser(
            "login", "password", "test@email",
            "firstName", "lastName", usersCounter);

    // Assert
    var newUserRegisteredDomainEvent = AssertPublishedDomainEvent<NewUserRegisteredDomainEvent>(userRegistration);
    Assert.That(newUserRegisteredDomainEvent.UserRegistrationId, Is.EqualTo(userRegistration.Id));
}

[Test]
public void NewUserRegistration_WithoutUniqueLogin_BreaksUserLoginMustBeUniqueRule()
{
    // Arrange
    var usersCounter = Substitute.For<IUsersCounter>();
    usersCounter.CountUsersWithLogin("login").Returns(x => 1);

    // Assert
    AssertBrokenRule<UserLoginMustBeUniqueRule>(() =>
    {
        // Act
        UserRegistration.RegisterNewUser(
            "login", "password", "test@email",
            "firstName", "lastName", usersCounter);
    });
}
```

Advanced example:

```csharp
[Test]
public void AddAttendee_WhenMemberIsAlreadyAttendeeOfMeeting_IsNotPossible()
{
    // Arrange
    var creatorId = new MemberId(Guid.NewGuid());
    var meetingTestData = CreateMeetingTestData(new MeetingTestDataOptions
    {
        CreatorId = creatorId
    });
    var newMemberId = new MemberId(Guid.NewGuid());
    meetingTestData.MeetingGroup.JoinToGroupMember(newMemberId);
    meetingTestData.Meeting.AddAttendee(meetingTestData.MeetingGroup, newMemberId, 0);

    // Assert
    AssertBrokenRule<MemberCannotBeAnAttendeeOfMeetingMoreThanOnceRule>(() =>
    {
        // Act
        meetingTestData.Meeting.AddAttendee(meetingTestData.MeetingGroup, newMemberId, 0);
    });
}
```

`CreateMeetingTestData` method is an implementation of [SUT Factory](https://blog.ploeh.dk/2009/02/13/SUTFactory/) described by Mark Seemann which allows keeping common creation logic in one place:

```csharp
protected MeetingTestData CreateMeetingTestData(MeetingTestDataOptions options)
{
    var proposalMemberId = options.CreatorId ?? new MemberId(Guid.NewGuid());
    var meetingProposal = MeetingGroupProposal.ProposeNew(
        "name", "description",
        new MeetingGroupLocation("Warsaw", "PL"), proposalMemberId);

    meetingProposal.Accept();

    var meetingGroup = meetingProposal.CreateMeetingGroup();

    meetingGroup.UpdatePaymentInfo(DateTime.Now.AddDays(1));

    var meetingTerm = options.MeetingTerm ??
                      new MeetingTerm(DateTime.UtcNow.AddDays(1), DateTime.UtcNow.AddDays(2));

    var rsvpTerm = options.RvspTerm ?? Term.NoTerm;
    var meeting = meetingGroup.CreateMeeting("title",
        meetingTerm,
        "description",
        new MeetingLocation("Name", "Address", "PostalCode", "City"),
        options.AttendeesLimit,
        options.GuestsLimit,
        rsvpTerm,
        MoneyValue.Zero,
        new List<MemberId>(),
        proposalMemberId);

    DomainEventsTestHelper.ClearAllDomainEvents(meetingGroup);

    return new MeetingTestData(meetingGroup, meeting);
}
```

### 3.11 Architecture Decision Log

All Architectural Decisions (AD) are documented in the [Architecture Decision Log (ADL)](docs/architecture-decision-log).

More information about documenting architecture-related decisions in this way : [https://github.com/joelparkerhenderson/architecture_decision_record](https://github.com/joelparkerhenderson/architecture_decision_record)

### 3.12 Architecture Unit Tests

In some cases it is not possible to enforce the application architecture, design or established conventions using compiler (compile-time). For this reason, code implementations can diverge from the original design and architecture. We want to minimize this behavior, not only by code review.</br>

To do this, unit tests of system architecture, design, major conventions and assumptions  have been written. In .NET there is special library for this task: [NetArchTest](https://github.com/BenMorris/NetArchTest). This library has been written based on the very popular JAVA architecture unit tests library - [ArchUnit](https://www.archunit.org/).</br>

Using this kind of tests we can test proper layering of our application, dependencies, encapsulation, immutability, DDD correct implementation, naming, conventions and so on - everything what we need to test. Example:</br>

![](docs/Images/architecture_unit_tests.png)

More information about architecture unit tests here: [https://blogs.oracle.com/javamagazine/unit-test-your-architecture-with-archunit](https://blogs.oracle.com/javamagazine/unit-test-your-architecture-with-archunit)

### 3.13 Integration Tests

#### Definition

"Integration Test" term is blurred. It can mean test between classes, modules, services, even systems - see [this](https://martinfowler.com/bliki/IntegrationTest.html) article (by Martin Fowler). </br>

For this reason, the definition of integration test in this project is as follows:</br>

- it verifies how system works in integration with "out-of-process" dependencies - database, messaging system, file system or external API
- it tests particular use case
- it can be slow (as opposed to Unit Test)

#### Approach

- **Do not mock dependencies over which you have full control** (like database). Full control dependency means you can always revert all changes (remove side-effects) and no one can notice it. They are not visible to others. See next point, please.
- **Use "production", normal, real database version**. Some use e.g. in memory repository, some use light databases instead "production" version. This is still mocking. Testing makes sense if we have full confidence in testing. You can't trust the test if you know that the infrastructure in the production environment will vary. Be always as close to production environment as possible.
- **Mock dependencies over which you don't have control**. No control dependency means you can't remove side-effects after interaction with this dependency (external API, messaging system, SMTP server etc.). They can be visible to others.

#### Implementation

Integration test should test exactly one use case. One use case is represented by one Command/Query processing so CommandHandler/QueryHandler in Application layer is perfect starting point for running the Integration Test:</br>

![](docs/Images/integration_tests.jpg)
For each test, the following preparation steps must be performed:</br>

1. Clear database
2. Prepare mocks
3. Initialize testing module

```csharp
[SetUp]
public async Task BeforeEachTest()
{
    const string connectionStringEnvironmentVariable =
        "ASPNETCORE_MyMeetings_IntegrationTests_ConnectionString";
    ConnectionString = Environment.GetEnvironmentVariable(connectionStringEnvironmentVariable, EnvironmentVariableTarget.Machine);
    if (ConnectionString == null)
    {
        throw new ApplicationException(
            $"Define connection string to integration tests database using environment variable: {connectionStringEnvironmentVariable}");
    }

    using (var sqlConnection = new SqlConnection(ConnectionString))
    {
        await ClearDatabase(sqlConnection);
    }

    Logger = Substitute.For<ILogger>();
    EmailSender = Substitute.For<IEmailSender>();
    EventsBus = new EventsBusMock();
    ExecutionContext = new ExecutionContextMock(Guid.NewGuid());
    
    PaymentsStartup.Initialize(
        ConnectionString,
        ExecutionContext,
        Logger,
        EventsBus,
        false);

    PaymentsModule = new PaymentsModule();
}
```

After preparation, test is performed on clear database. Usually, it is the execution of some (or many) Commands and: </br>
a) running a Query or/and  </br>
b) verifying mocks </br>
to check the result.

```csharp
[TestFixture]
public class MeetingPaymentTests : TestBase
{
    [Test]
    public async Task CreateMeetingPayment_Test()
    {
        PayerId payerId = new PayerId(Guid.NewGuid());
        MeetingId meetingId = new MeetingId(Guid.NewGuid());
        decimal value = 100;
        string currency = "EUR";
        await PaymentsModule.ExecuteCommandAsync(new CreateMeetingPaymentCommand(Guid.NewGuid(),
            payerId, meetingId, value, currency));

        var payment = await PaymentsModule.ExecuteQueryAsync(new GetMeetingPaymentQuery(meetingId.Value, payerId.Value));

        Assert.That(payment.PayerId, Is.EqualTo(payerId.Value));
        Assert.That(payment.MeetingId, Is.EqualTo(meetingId.Value));
        Assert.That(payment.FeeValue, Is.EqualTo(value));
        Assert.That(payment.FeeCurrency, Is.EqualTo(currency));
    }
}
```

Each Command/Query processing is a separate execution (with different object graph resolution, context, database connection etc.) thanks to Composition Root of each module. This behavior is important and desirable.

### 3.14 System Integration Testing

#### Definition

[System Integration Testing (SIT)](https://en.wikipedia.org/wiki/System_integration_testing) is performed to verify the interactions between the modules of a software system. It involves the overall testing of a complete system of many subsystem components or elements.

#### Implementation

Implementation of system integration tests is based on approach of integration testing of modules in isolation (invoking commands and queries) described in the previous section.

The problem is that in this case we are dealing with **asynchronous communication**. Due to asynchrony, our **test must wait for the result** at certain times.

To correctly implement such tests, the **Sampling** technique and implementation described in the [Growing Object-Oriented Software, Guided by Tests](https://www.amazon.com/Growing-Object-Oriented-Software-Guided-Tests/dp/0321503627) book was used:

>An asynchronous test must wait for success and use timeouts to detect failure. This implies that every tested activity must have an observable effect: a test must affect the system so that its observable state becomes different. This sounds obvious but it drives how we think about writing asynchronous tests. If an activity has no observable effect, there is nothing the test can wait for, and therefore no way for the test to synchronize with the system it is testing. There are two ways a test can observe the system: by sampling its observable state or by listening for events that it sends out.

![](docs/Images/SystemIntegrationTests.jpg)

Test below:

1. Creates Meeting Group Proposal in Meetings module
2. Waits until Meeting Group Proposal to verification will be available in Administration module with 10 seconds timeout
3. Accepts Meeting Group Proposal in Administration module
4. Waits until Meeting Group is created in Meetings module with 15 seconds timeout

```csharp
public class CreateMeetingGroupTests : TestBase
{
    [Test]
    public async Task CreateMeetingGroupScenario_WhenProposalIsAccepted()
    {
        var meetingGroupId = await MeetingsModule.ExecuteCommandAsync(
            new ProposeMeetingGroupCommand("Name",
            "Description",
            "Location",
            "PL"));

        AssertEventually(
            new GetMeetingGroupProposalFromAdministrationProbe(meetingGroupId, AdministrationModule), 
            10000);

        await AdministrationModule.ExecuteCommandAsync(new AcceptMeetingGroupProposalCommand(meetingGroupId));

        AssertEventually(
            new GetCreatedMeetingGroupFromMeetingsProbe(meetingGroupId, MeetingsModule),
            15000);
    }

    private class GetCreatedMeetingGroupFromMeetingsProbe : IProbe
    {
        private readonly Guid _expectedMeetingGroupId;

        private readonly IMeetingsModule _meetingsModule;

        private List<MeetingGroupDto> _allMeetingGroups;

        public GetCreatedMeetingGroupFromMeetingsProbe(
            Guid expectedMeetingGroupId, 
            IMeetingsModule meetingsModule)
        {
            _expectedMeetingGroupId = expectedMeetingGroupId;
            _meetingsModule = meetingsModule;
        }

        public bool IsSatisfied()
        {
            return _allMeetingGroups != null && 
                   _allMeetingGroups.Any(x => x.Id == _expectedMeetingGroupId);
        }

        public async Task SampleAsync()
        {
            _allMeetingGroups = await _meetingsModule.ExecuteQueryAsync(new GetAllMeetingGroupsQuery());
        }

        public string DescribeFailureTo() 
            => $"Meeting group with ID: {_expectedMeetingGroupId} is not created";
    }

    private class GetMeetingGroupProposalFromAdministrationProbe : IProbe
    {
        private readonly Guid _expectedMeetingGroupProposalId;

        private MeetingGroupProposalDto _meetingGroupProposal;

        private readonly IAdministrationModule _administrationModule;

        public GetMeetingGroupProposalFromAdministrationProbe(Guid expectedMeetingGroupProposalId, IAdministrationModule administrationModule)
        {
            _expectedMeetingGroupProposalId = expectedMeetingGroupProposalId;
            _administrationModule = administrationModule;
        }

        public bool IsSatisfied()
        {
            if (_meetingGroupProposal == null)
            {
                return false;
            }

            if (_meetingGroupProposal.Id == _expectedMeetingGroupProposalId &&
                _meetingGroupProposal.StatusCode == MeetingGroupProposalStatus.ToVerify.Value)
            {
                return true;
            }

            return false;
        }

        public async Task SampleAsync()
        {
            try
            {
                _meetingGroupProposal =
                    await _administrationModule.ExecuteQueryAsync(
                        new GetMeetingGroupProposalQuery(_expectedMeetingGroupProposalId));
            }
            catch
            {
                // ignored
            }
        }

        public string DescribeFailureTo()
            => $"Meeting group proposal with ID: {_expectedMeetingGroupProposalId} to verification not created";
    }
}
```

Poller class implementation (based on example in the book):

```csharp
public class Poller
{
    private readonly int _timeoutMillis;

    private readonly int _pollDelayMillis;

    public Poller(int timeoutMillis)
    {
        _timeoutMillis = timeoutMillis;
        _pollDelayMillis = 1000;
    }

    public void Check(IProbe probe)
    {
        var timeout = new Timeout(_timeoutMillis);
        while (!probe.IsSatisfied())
        {
            if (timeout.HasTimedOut())
            {
                throw new AssertErrorException(DescribeFailureOf(probe));
            }

            Thread.Sleep(_pollDelayMillis);
            probe.SampleAsync();
        }
    }

    private static string DescribeFailureOf(IProbe probe)
    {
        return probe.DescribeFailureTo();
    }
}
```

### 3.15 Event Sourcing

#### Theory

During the implementation of the Payment module, *Event Sourcing* was used. *Event Sourcing* is a way of preserving the state of our system by recording a sequence of events. No less, no more.

It is important here to really restore the state of our application from events. If we collect events only for auditing purposes, it is an [Audit Log/Trail](https://en.wikipedia.org/wiki/Audit_trail) - not the *Event Sourcing*.

The main elements of *Event Sourcing* are as follows:

- Events Stream
- Objects that are restored based on events. There are 2 types of such objects depending on the purpose:
-- Objects responsible for the change of state. In Domain-Driven Design they will be *Aggregates*.
-- *Projections*: read models prepared for a specific purpose
- *Subscriptions* : a way to receive information about new events
- *Snapshots*: from time to time, objects saved in the traditional way for performance purposes. Mainly used if there are many events to restore the object from the entire event history. (Note: there is currently no snapshot implementation in the project)

![](docs/Images/ES_elements.jpg)

#### Tool

In order not to reinvent the wheel, the *SQL Stream Store* library was used. As the [documentation](https://sqlstreamstore.readthedocs.io/en/latest/) says:

*SQL Stream Store is a .NET library to assist with developing applications that use event sourcing or wish to use stream based patterns over a relational database and existing operational infrastructure.*

Like every library, it has its limitations and assumptions (I recommend the linked documentation chapter "Things you need to know before adopting"). For me, the most important 2 points from this chapter are:

1. *"Subscriptions (and thus projections) are **eventually consistent** and always will be."* This means that there will always be an inconsistency time from saving the event to the stream and processing the event by the projector(s).
2. *"No support for ambient System.Transaction scopes enforcing the concept of the stream as the consistency and transactional boundary."* This means that if we save the event to a events stream and want to save something **in the same transaction**, we must use [TransactionScope](https://learn.microsoft.com/en-us/dotnet/api/system.transactions.transactionscope?view=net-8.0). If we cannot use *TransactionScope* for some reason, we must accept the Eventual Consistency also in this case.

Other popular tools:

- [EventStore](https://eventstore.com/) *"An industrial-strength database solution built from the ground up for event sourcing."*
- [Marten](https://martendb.io/) *".NET Transactional Document DB and Event Store on PostgreSQL"*

#### Implementation

There are 2 main "flows" to handle:

- Command handling: change of state - adding new events to stream (writing)
- Projection of events to create read models

##### Command Handling

The whole process looks like this:

![](docs/Images/ES_command_handling.png)

1. We create / update an aggregate by creating an event
2. We add changes to the Aggregate Store. This is the class responsible for writing / loading our aggregates. We are not saving changes yet.
3. As part of Unit Of Work  a) Aggregate Store adds events to the stream b) messages are added to the Outbox

Command Handler:

```csharp
public class BuySubscriptionCommandHandler : ICommandHandler<BuySubscriptionCommand, Guid>
{
    private readonly IAggregateStore _aggregateStore;

    private readonly IPayerContext _payerContext;

    private readonly ISqlConnectionFactory _sqlConnectionFactory;

    public BuySubscriptionCommandHandler(
        IAggregateStore aggregateStore, 
        IPayerContext payerContext, 
        ISqlConnectionFactory sqlConnectionFactory)
    {
        _aggregateStore = aggregateStore;
        _payerContext = payerContext;
        _sqlConnectionFactory = sqlConnectionFactory;
    }

    public async Task<Guid> Handle(BuySubscriptionCommand command, CancellationToken cancellationToken)
    {
        var priceList = await PriceListProvider.GetPriceList(_sqlConnectionFactory.GetOpenConnection());

        var subscriptionPayment = SubscriptionPayment.Buy(
            _payerContext.PayerId,
            SubscriptionPeriod.Of(command.SubscriptionTypeCode),
            command.CountryCode,
            MoneyValue.Of(command.Value, command.Currency),
            priceList);
        
        _aggregateStore.AppendChanges(subscriptionPayment);

        return subscriptionPayment.Id;
    }
}
```

`SubscriptionPayment` Aggregate:

```csharp
public class SubscriptionPayment : AggregateRoot
{
    private PayerId _payerId;

    private SubscriptionPeriod _subscriptionPeriod;

    private string _countryCode;

    private SubscriptionPaymentStatus _subscriptionPaymentStatus;

    private MoneyValue _value;

    protected override void Apply(IDomainEvent @event)
    {
        this.When((dynamic)@event);
    }

    public static SubscriptionPayment Buy(
        PayerId payerId,
        SubscriptionPeriod period,
        string countryCode,
        MoneyValue priceOffer,
        PriceList priceList)
    {
        var priceInPriceList = priceList.GetPrice(countryCode, period, PriceListItemCategory.New);
        CheckRule(new PriceOfferMustMatchPriceInPriceListRule(priceOffer, priceInPriceList));

        var subscriptionPayment = new SubscriptionPayment();

        var subscriptionPaymentCreated = new SubscriptionPaymentCreatedDomainEvent(
            Guid.NewGuid(),
            payerId.Value,
            period.Code,
            countryCode,
            SubscriptionPaymentStatus.WaitingForPayment.Code,
            priceOffer.Value,
            priceOffer.Currency);

        subscriptionPayment.Apply(subscriptionPaymentCreated);
        subscriptionPayment.AddDomainEvent(subscriptionPaymentCreated);

        return subscriptionPayment;
    }

    private void When(SubscriptionPaymentCreatedDomainEvent @event)
    {
        this.Id = @event.SubscriptionPaymentId;
        _payerId = new PayerId(@event.PayerId);
        _subscriptionPeriod = SubscriptionPeriod.Of(@event.SubscriptionPeriodCode);
        _countryCode = @event.CountryCode;
        _subscriptionPaymentStatus = SubscriptionPaymentStatus.Of(@event.Status);
        _value = MoneyValue.Of(@event.Value, @event.Currency);
    }
```

`AggregateRoot` base class:

```csharp
public abstract class AggregateRoot
{
    public Guid Id { get; protected set; }

    public int Version { get; private set; }

    private readonly List<IDomainEvent> _domainEvents;

    protected AggregateRoot()
    {
        _domainEvents = new List<IDomainEvent>();

        Version = -1;
    }

    protected void AddDomainEvent(IDomainEvent @event)
    {
        _domainEvents.Add(@event);
    }

    public IReadOnlyCollection<IDomainEvent> GetDomainEvents() => _domainEvents.AsReadOnly();

    public void Load(IEnumerable<IDomainEvent> history)
    {
        foreach (var e in history)
        {
            Apply(e);
            Version++;
        }
    }

    protected abstract void Apply(IDomainEvent @event);

    protected static void CheckRule(IBusinessRule rule)
    {
        if (rule.IsBroken())
        {
            throw new BusinessRuleValidationException(rule);
        }
    }
}

```

Aggregate Store implementation with SQL Stream Store library usage:

```csharp
public class SqlStreamAggregateStore : IAggregateStore
{
    private readonly IStreamStore _streamStore;

    private readonly List<IDomainEvent> _appendedChanges;

    private readonly List<AggregateToSave> _aggregatesToSave;

    public SqlStreamAggregateStore(
        ISqlConnectionFactory sqlConnectionFactory)
    {
        _appendedChanges = new List<IDomainEvent>();

        _streamStore =
            new MsSqlStreamStore(
                new MsSqlStreamStoreSettings(sqlConnectionFactory.GetConnectionString())
                    {
                        Schema = DatabaseSchema.Name
                });

        _aggregatesToSave = new List<AggregateToSave>();
    }

    public async Task Save()
    {
        foreach (var aggregateToSave in _aggregatesToSave)
        {
            await _streamStore.AppendToStream(
                GetStreamId(aggregateToSave.Aggregate),
                aggregateToSave.Aggregate.Version,
                aggregateToSave.Messages.ToArray());
        }

        _aggregatesToSave.Clear();
    }

    public async Task<T> Load<T>(AggregateId<T> aggregateId) where T : AggregateRoot
    {
        var streamId = GetStreamId(aggregateId);

        IList<IDomainEvent> domainEvents = new List<IDomainEvent>();
        ReadStreamPage readStreamPage;
        do
        {
            readStreamPage = await _streamStore.ReadStreamForwards(streamId, StreamVersion.Start, maxCount: 100);
            var messages = readStreamPage.Messages;
            foreach (var streamMessage in messages)
            {
                Type type = DomainEventTypeMappings.Dictionary[streamMessage.Type];
                var jsonData = await streamMessage.GetJsonData();
                var domainEvent = JsonConvert.DeserializeObject(jsonData, type) as IDomainEvent;

                domainEvents.Add(domainEvent);
            }
        } while (!readStreamPage.IsEnd);

        var aggregate = (T)Activator.CreateInstance(typeof(T), true);

        aggregate.Load(domainEvents);

        return aggregate;
    }

```

##### Events Projection

The whole process looks like this:

![](docs/Images/ES_events_projection.png)

1. Special class `Subscriptions Manager` subscribes to Events Store (using SQL Store Stream library)
2. Events Store raises `StreamMessageRecievedEvent`
3. `Subscriptions Manager` invokes all projectors
4. If projector know how to handle given event, it updates particular read model. In current implementation it updates special table in SQL database.

`SubscriptionsManager` class implementation:

```csharp
public class SubscriptionsManager
{
    private readonly IStreamStore _streamStore;

    public SubscriptionsManager(
        IStreamStore streamStore)
    {
        _streamStore = streamStore;
    }

    public void Start()
    {
        long? actualPosition;

        using (var scope = PaymentsCompositionRoot.BeginLifetimeScope())
        {
            var checkpointStore = scope.Resolve<ICheckpointStore>();

            actualPosition = checkpointStore.GetCheckpoint(SubscriptionCode.All);
        }

        _streamStore.SubscribeToAll(actualPosition, StreamMessageReceived);
    }

    public void Stop()
    {
        _streamStore.Dispose();
    }

    private static async Task StreamMessageReceived(
        IAllStreamSubscription subscription, StreamMessage streamMessage, CancellationToken cancellationToken)
    {
        var type = DomainEventTypeMappings.Dictionary[streamMessage.Type];
        var jsonData = await streamMessage.GetJsonData(cancellationToken);
        var domainEvent = JsonConvert.DeserializeObject(jsonData, type) as IDomainEvent;

        using var scope = PaymentsCompositionRoot.BeginLifetimeScope();

        var projectors = scope.Resolve<IList<IProjector>>();

        var tasks = projectors
            .Select(async projector =>
            {
                await projector.Project(domainEvent);
            });

        await Task.WhenAll(tasks);

        var checkpointStore = scope.Resolve<ICheckpointStore>();
        await checkpointStore.StoreCheckpoint(SubscriptionCode.All, streamMessage.Position);
    }
}

```

Example projector:

```csharp
internal class SubscriptionDetailsProjector : ProjectorBase, IProjector
{
    private readonly IDbConnection _connection;

    public SubscriptionDetailsProjector(ISqlConnectionFactory sqlConnectionFactory)
    {
        _connection = sqlConnectionFactory.GetOpenConnection();
    }

    public async Task Project(IDomainEvent @event)
    {
        await When((dynamic) @event);
    }

    private async Task When(SubscriptionRenewedDomainEvent subscriptionRenewed)
    {
        var period = SubscriptionPeriod.GetName(subscriptionRenewed.SubscriptionPeriodCode);
        
        await _connection.ExecuteScalarAsync("UPDATE payments.SubscriptionDetails " +
                                                "SET " +
                                                    "[Status] = @Status, " +
                                                    "[ExpirationDate] = @ExpirationDate, " +
                                                    "[Period] = @Period " +
                                                "WHERE [Id] = @SubscriptionId",
            new
            {
                subscriptionRenewed.SubscriptionId,
                subscriptionRenewed.Status,
                subscriptionRenewed.ExpirationDate,
                period
            });
    }

    private async Task When(SubscriptionExpiredDomainEvent subscriptionExpired)
    {
        await _connection.ExecuteScalarAsync("UPDATE payments.SubscriptionDetails " +
                                             "SET " +
                                             "[Status] = @Status " +
                                             "WHERE [Id] = @SubscriptionId",
            new
            {
                subscriptionExpired.SubscriptionId,
                subscriptionExpired.Status
            });
    }

    private async Task When(SubscriptionCreatedDomainEvent subscriptionCreated)
    {
        var period = SubscriptionPeriod.GetName(subscriptionCreated.SubscriptionPeriodCode);
        
        await _connection.ExecuteScalarAsync("INSERT INTO payments.SubscriptionDetails " +
                                       "([Id], [Period], [Status], [CountryCode], [ExpirationDate]) " +
                                       "VALUES (@SubscriptionId, @Period, @Status, @CountryCode, @ExpirationDate)",
            new
            {
                subscriptionCreated.SubscriptionId,
                period,
                subscriptionCreated.Status,
                subscriptionCreated.CountryCode,
                subscriptionCreated.ExpirationDate
            });
    }
}

```

#### Sample view of Event Store

Sample *Event Store* view after execution of SubscriptionLifecycleTests Integration Test which includes following steps:

1. Creating Price List
2. Buying Subscription
3. Renewing Subscription
4. Expiring Subscription

looks like this (*SQL Stream Store* table - *payments.Messages*):

![](docs/Images/ES_event_store_db_sample.png)

### 3.16 Database Change Management

Database change management is accomplished by *migrations/transitions* versioning. Additionally, the current state of the database structure is also versioned.

Migrations are applied using a simple [DatabaseMigrator](src/Database/DatabaseMigrator) console application that uses the [DbUp](https://dbup.readthedocs.io/en/latest/) library. The current state of the database structure is kept in the [SSDT Database Project](https://docs.microsoft.com/en-us/sql/ssdt/how-to-create-a-new-database-project).

The database update is performed by running the following command:

```shell
dotnet DatabaseMigrator.dll "connection_string" "scripts_directory_path"
```

The entire solution is described in detail in the following articles:

1. [Database change management](https://www.kamilgrzybek.com/database/database-change-management/) (theory)
2. [Using database project and DbUp for database management](https://www.kamilgrzybek.com/database/using-database-project-and-dbup-for-database-management/) (implementation)

### 3.17 Continuous Integration

#### Definition

As defined on [Martin Fowler's website](https://martinfowler.com/articles/continuousIntegration.html):
> *Continuous Integration is a software development practice where members of a team integrate their work frequently, usually each person integrates at least daily - leading to multiple integrations per day. Each integration is verified by an automated build (including test) to detect integration errors as quickly as possible.*

#### YAML Implementation [OBSOLETE]

*Originally the build was implemented using yaml and GitHub Actions functionality. Currently, the build is implemented with NUKE (see next section). See [buildPipeline.yml](.github/workflows/buildPipeline.yml)* file history.

##### Pipeline description

CI was implemented using [GitHub Actions](https://docs.github.com/en/actions/getting-started-with-github-actions/about-github-actions). For this purpose, one workflow, which triggers on Pull Request to *master* branch or Push to *master* branch was created. It contains 2 jobs:

- build test, execute Unit Tests and Architecture Tests
- execute Integration Tests

![](docs/Images/ci.jpg)

**Steps description**<br/>
a) Checkout repository - clean checkout of git repository <br/>
b) Setup .NET - install .NET 8.0 SDK<br/>
c) Install dependencies - resolve NuGet packages<br/>
d) Build - build solution<br/>
e) Run Unit Tests - run automated Unit Tests (see section 3.10)<br/>
f) Run Architecture Tests - run automated Architecture Tests (see section 3.12)<br/>
g) Initialize containers - setup Docker container for MS SQL Server<br/>
h) Wait for SQL Server initialization - after container initialization MS SQL Server is not ready, initialization of server itself takes some time so 30 seconds timeout before execution of next step is needed<br/>
i) Create Database - create and initialize database<br/>
j) Migrate Database - execute database upgrade using *DatabaseMigrator* application (see 3.16 section)<br/>
k) Run Integration Tests - perform Integration and System Integration Testing (see section 3.13 and 3.14)<br/>

##### Workflow definition

Workflow definition: [buildPipeline.yml](.github/workflows/buildPipeline.yml)

##### Example workflow execution

Example workflow output:

![](docs/Images/ci_job1.png)

![](docs/Images/ci_job2.png)

#### NUKE

[Nuke](https://nuke.build/) is *the cross-platform build automation solution for .NET with C# DSL.*

The 2 main advantages of its use over pure yaml defined in GitHub actions are as follows:

- You run the same code on local machine and in the build server. See [buildPipeline.yml](.github/workflows/buildPipeline.yml)
- You use C# with all the goodness (debugging, compilation, packages, refactoring and so on)

This is how one of the stage definition looks like (execute Build, Unit Tests, Architecture Tests) [Build.cs](build/Build.cs):

```csharp
partial class Build : NukeBuild
{
    /// Support plugins are available for:
    ///   - JetBrains ReSharper        https://nuke.build/resharper
    ///   - JetBrains Rider            https://nuke.build/rider
    ///   - Microsoft VisualStudio     https://nuke.build/visualstudio
    ///   - Microsoft VSCode           https://nuke.build/vscode

    public static int Main () => Execute<Build>(x => x.Compile);

    [Parameter("Configuration to build - Default is 'Debug' (local) or 'Release' (server)")]
    readonly Configuration Configuration = IsLocalBuild ? Configuration.Debug : Configuration.Release;

    [Solution] readonly Solution Solution;

    Target Clean => _ => _
        .Before(Restore)
        .Executes(() =>
        {
            EnsureCleanDirectory(WorkingDirectory);
        });

    Target Restore => _ => _
        .Executes(() =>
        {
            DotNetRestore(s => s
                .SetProjectFile(Solution));
        });

    Target Compile => _ => _
        .DependsOn(Restore)
        .Executes(() =>
        {
            DotNetBuild(s => s
                .SetProjectFile(Solution)
                .SetConfiguration(Configuration)
                .EnableNoRestore());
        });

    Target UnitTests => _ => _
        .DependsOn(Compile)
        .Executes(() =>
        {
            DotNetTest(s => s
                .SetProjectFile(Solution)
                .SetFilter("UnitTests")
                .SetConfiguration(Configuration)
                .EnableNoRestore()
                .EnableNoBuild());
        });

    Target ArchitectureTests => _ => _
        .DependsOn(UnitTests)
        .Executes(() =>
        {
            DotNetTest(s => s
                .SetProjectFile(Solution)
                .SetFilter("ArchTests")
                .SetConfiguration(Configuration)
                .EnableNoRestore()
                .EnableNoBuild());
        });

    Target BuildAndUnitTests => _ => _
        .Triggers(ArchitectureTests)
        .Executes(() =>
        {
        });
}

```

If you want to see more complex scenario when integration tests are executed (with SQL Server database creation using docker) see [BuildIntegrationTests.cs](build/BuildIntegrationTests.cs) file.

#### SQL Server database project build

Currently, compilation of database projects is not supported by the .NET Core and dotnet tool. For this reason, the [MSBuild.Sdk.SqlProj](https://github.com/rr-wfm/MSBuild.Sdk.SqlProj/) library was used. In order to do that, you need to create .NET standard library, change SDK and create links to scripts folders. Final [database project](src/Database/CompanyName.MyMeetings.Database.Build/CompanyName.MyMeetings.Database.Build.csproj) looks as follows:

```xml
<Project Sdk="MSBuild.Sdk.SqlProj/1.6.0">
    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
    </PropertyGroup>
    <ItemGroup>
        <Content Include="..\CompanyName.MyMeetings.Database\administration\**\*.sql" />
        <Content Include="..\CompanyName.MyMeetings.Database\app\**\*.sql" />
        <Content Include="..\CompanyName.MyMeetings.Database\meetings\**\*.sql" />
        <Content Include="..\CompanyName.MyMeetings.Database\payments\**\*.sql" />
        <Content Include="..\CompanyName.MyMeetings.Database\users\**\*.sql" />
        <Content Include="..\CompanyName.MyMeetings.Database\Security\**\*.sql" />
    </ItemGroup>
</Project>
```

### 3.18 Static code analysis

In order to standardize the appearance of the code and increase its readability, the [StyleCopAnalyzers](https://github.com/DotNetAnalyzers/StyleCopAnalyzers) library was used. This library implements StyleCop rules using the .NET Compiler Platform and is responsible for the static code analysis.<br/>

Using this library is trivial - it is just added as a NuGet package to all projects. There are many ways to configure rules, but currently the best way to do this is to edit the [.editorconfig](src/.editorconfig) file. More information can be found at the link above.<br/>

**Note! Static code analysis works best when the following points are met:**<br/>

1. Each developer has an IDE that respects the rules and helps to follow them
2. The rules are checked during the project build process as part of Continuous Integration
3. The rules are set to *help your system grow*. **Static analysis is not a value in itself.** Some rules may not make complete sense and should be turned off. Other rules may have higher priority. It all depends on the project, company standards and people involved in the project. Be pragmatic.

### 3.19 System Under Test SUT

There is always a need to prepare the entire system in a specific state, e.g. for manual, exploratory, UX / UI tests. The fact that the tests are performed manually does not mean that we cannot automate the preparation phase (Given / Arrange). Thanks to the automation of system state preparation ([System Under Test](https://en.wikipedia.org/wiki/System_under_test)), we are able to recreate exactly the same state in any environment. In addition, such automation can be used later to automate the entire test (e.g. through an [3.13 Integration Tests](#313-integration-tests)).<br/>

The implementation of such automation based on the use of NUKE and the test framework is presented below. As in the case of integration testing, we use the public API of modules.

![](docs/Images/sut-preparation.jpg)

Below is a SUT whose task is to go through the whole process - from setting up a *Meeting Group*, through its *Payment*, adding a new *Meeting* and signing up for it by another user.

```csharp
public class CreateMeeting : TestBase
{
    protected override bool PerformDatabaseCleanup => true;

    [Test]
    public async Task Prepare()
    {
        await UsersFactory.GivenAdmin(
            UserAccessModule,
            "testAdmin@mail.com",
            "testAdminPass",
            "Jane Doe",
            "Jane",
            "Doe",
            "testAdmin@mail.com");

        var userId = await UsersFactory.GivenUser(
            UserAccessModule,
            ConnectionString,
            "adamSmith@mail.com",
            "adamSmithPass",
            "Adam",
            "Smith",
            "adamSmith@mail.com");

        ExecutionContextAccessor.SetUserId(userId);

        var meetingGroupId = await MeetingGroupsFactory.GivenMeetingGroup(
            MeetingsModule,
            AdministrationModule,
            ConnectionString,
            "Software Craft",
            "Group for software craft passionates",
            "Warsaw",
            "PL");

        await TestPriceListManager.AddPriceListItems(PaymentsModule, ConnectionString);

        await TestPaymentsManager.BuySubscription(
            PaymentsModule,
            ExecutionContextAccessor);
        
        SetDate(new DateTime(2022, 7, 1, 10, 0, 0));

        var meetingId = await TestMeetingFactory.GivenMeeting(
            MeetingsModule,
            meetingGroupId,
            "Tactical DDD",
            new DateTime(2022, 7, 10, 18, 0, 0),
            new DateTime(2022, 7, 10, 20, 0, 0),
            "Meeting about Tactical DDD patterns",
            "Location Name",
            "Location Address",
            "01-755",
            "Warsaw",
            50,
            0,
            null,
            null,
            0,
            null,
            new List<Guid>()
        );
        
        var attendeeUserId = await UsersFactory.GivenUser(
            UserAccessModule,
            ConnectionString,
            "rickmorty@mail.com",
            "rickmortyPass",
            "Rick",
            "Morty",
            "rickmorty@mail.com");
        
        ExecutionContextAccessor.SetUserId(attendeeUserId);

        await TestMeetingGroupManager.JoinToGroup(MeetingsModule, meetingGroupId);

        await TestMeetingManager.AddAttendee(MeetingsModule, meetingId, guestsNumber: 1);
    }
}
```

You can create this SUT using following *NUKE* target providing connection string and particular test name:

```shell
 .\build PrepareSUT --DatabaseConnectionString "connection_string" --SUTTestName CreateMeeting
```

### 3.20 Mutation Testing

#### Description

Mutation testing is an approach to test and evaluate our existing tests. During mutation testing a special framework modifies pieces of our code and runs our tests. These modifications are called *mutations* or *mutants*. If a given *mutation* does not cause a failure of at least once test, it means that the mutant has *survived* so our tests are probably not sufficient.

#### Example

In this repository, the [Stryker.NET](https://stryker-mutator.io/docs/stryker-net/Introduction) framework was used for mutation testing. In the simplest use, after installation, all you need to do is enter the directory of tests that you want to mutate and run the following command:

```shell
dotnet stryker
```

The result of this command is the *mutation report file*. Assuming we want to test the unit tests of the Meetings module, such a [report](docs/mutation-tests-reports/mutation-report.html) has been generated. This is its first page:

![](docs/Images/mutation_testing_report.png)

Let us analyze one of the places where the mutant survived. This is the *AddNotAttendee* method of the *Meeting* class. This method is used to add a *Member* to the list of people who have decided not to attend the meeting. According to the logic, if the same person previously indicated that he was going to the *Meeting* and later changed his mind, then if there is someone on the *Waiting List*, he should be added to the attendees. Based on requirements, this should be the person who signed up on the *Waiting List* **first** (based on **SignUpDate**).

![](docs/Images/mutation_testing_example.png)

As you can see, the mutation framework changed our sorting in linq query (from default ascending to descending). However, each test was successful, so it means that mutant survived so we don't have a test that checks the correct sort based on *SignUpDate*.

From the example above, one more important thing can be deduced - **code coverage is insufficient**. In the given example, this code is covered, but our tests do not check the given requirement, therefore our code may have errors. Mutation testing allow to detect such situations. Of course, as with any tool, we should use it wisely, as not every case requires our attention.

## 4. Technology

List of technologies, frameworks and libraries used for implementation:

- [.NET 8.0](https://dotnet.microsoft.com/download) (platform). Note for Visual Studio users: **VS 2019** is required.
- [MS SQL Server Express](https://www.microsoft.com/en-us/sql-server/sql-server-editions-express) (database)
- [Entity Framework Core 8.0](https://docs.microsoft.com/en-us/ef/core/) (ORM Write Model implementation for DDD)
- [Autofac](https://autofac.org/) (Inversion of Control Container)
- [IdentityServer4](http://docs.identityserver.io) (Authentication and Authorization)
- [Serilog](https://serilog.net/) (structured logging)
- [Hellang.Middleware.ProblemDetails](https://github.com/khellang/Middleware/tree/master/src/ProblemDetails) (API Problem Details support)
- [Swashbuckle](https://github.com/domaindrivendev/Swashbuckle) (Swagger automated documentation)
- [Dapper](https://github.com/StackExchange/Dapper) (micro ORM for Read Model)
- [Newtonsoft.Json](https://www.newtonsoft.com/json) (serialization/deserialization to/from JSON)
- [Quartz.NET](https://www.quartz-scheduler.net/) (background processing)
- [FluentValidation](https://fluentvalidation.net/) (data validation)
- [MediatR](https://github.com/jbogard/MediatR) (mediator implementation)
- [Postman](https://www.getpostman.com/) (API tests)
- [NUnit](https://nunit.org/) (Testing framework)
- [NSubstitute](https://nsubstitute.github.io/) (Testing isolation framework)
- [Visual Paradigm Community Edition](https://www.visual-paradigm.com/download/community.jsp) (CASE tool for modeling and documentation)
- [NetArchTest](https://github.com/BenMorris/NetArchTest) (Architecture Unit Tests library)
- [Polly](https://github.com/App-vNext/Polly) (Resilience and transient-fault-handling library)
- [SQL Stream Store](https://github.com/SQLStreamStore) (Library to assist with Event Sourcing)
- [DbUp](https://dbup.readthedocs.io/en/latest/) (Database migrations deployment)
- [SSDT Database Project](https://docs.microsoft.com/en-us/sql/ssdt/how-to-create-a-new-database-project) (Database structure versioning)
- [GitHub Actions](https://docs.github.com/en/actions) (Continuous Integration workflows implementation)
- [StyleCopAnalyzers](https://github.com/DotNetAnalyzers/StyleCopAnalyzers) (Static code analysis library)
- [PlantUML](https://plantuml.com) (UML diagrams from textual description, diagrams as text)
- [C4 Model](https://c4model.com/) (Model for visualising software architecture)
- [C4-PlantUML](https://github.com/plantuml-stdlib/C4-PlantUML) (C4 Model for PlantUML plugin)
- [NUKE](https://nuke.build/) (Build automation system)
- [MSBuild.Sdk.SqlProj](https://github.com/rr-wfm/MSBuild.Sdk.SqlProj/) (Database project compilation)
- [Stryker.NET](https://stryker-mutator.io/docs/stryker-net/Introduction) (Mutation Testing framework)

## 5. How to Run

### Install .NET 8.0 SDK

- [Download](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) and install .NET 8.0 SDK

### Create database

- Download and install MS SQL Server Express or other
- Create an empty database using [CreateDatabase_Windows.sql](src/Database/CompanyName.MyMeetings.Database/Scripts/CreateDatabase_Windows.sql) or [CreateDatabase_Linux.sql](src/Database/CompanyName.MyMeetings.Database/Scripts/CreateDatabase_Linux.sql). Script adds **app** schema which is needed for migrations journal table. Change database file path if needed.
- Run database migrations using **MigrateDatabase** NUKE target by executing the build.sh script present in the root folder:

```shell
.\build MigrateDatabase --DatabaseConnectionString "connection_string"
```

*"connection_string"* - connection string to your database

### Seed database

- Execute [SeedDatabase.sql](src/Database/CompanyName.MyMeetings.Database/Scripts/SeedDatabase.sql) script
- 2 test users will be created - check the script for usernames and passwords

### Configure connection string

Set a database connection string called `MeetingsConnectionString` in the root of the API project's appsettings.json or use [Secrets](https://blogs.msdn.microsoft.com/mihansen/2017/09/10/managing-secrets-in-net-core-2-0-apps/)

Example config setting in appsettings.json for a database called `MyMeetings`:

```json
{
 "MeetingsConnectionString": "Server=(localdb)\\mssqllocaldb;Database=MyMeetings;Trusted_Connection=True;"
}
```

### Configure startup in IDE

- Set the Startup Item in your IDE to the API Project, not IIS Express

### Authenticate

- Once it is running you'll need a token to make API calls. This is done via OAuth2 [Resource Owner Password Grant Type](https://www.oauth.com/oauth2-servers/access-tokens/password-grant/). By default IdentityServer is configured with the following:
- `client_id = ro.client`
- `client_secret = secret` **(this is literally the value - not a statement that this value is secret!)**
- `scope = myMeetingsAPI openid profile`
- `grant_type = password`

Include the credentials of a test user created in the [SeedDatabase.sql](src/Database/CompanyName.MyMeetings.Database/Scripts/SeedDatabase.sql) script - for example:

- `username = testMember@mail.com`
- `password = testMemberPass`

**Example HTTP Request for an Access Token:**

```http
POST /connect/token HTTP/1.1
Host: localhost:5000
 
grant_type=password
&username=testMember@mail.com
&password=testMemberPass
&client_id=ro.client
&client_secret=secret
```

This will fetch an access token for this user to make authorized API requests using the HTTP request header `Authorization: Bearer <access_token>`

If you use a tool such as Postman to test your API, the token can be fetched and stored within the tool itself and appended to all API calls. Check your tool documentation for instructions.

### Run using Docker Compose

You can run whole application using [docker compose](https://docs.docker.com/compose/) from root folder:

```shell
docker-compose up
```

It will create following services: <br/>

- MS SQL Server Database
- Database Migrator
- Application

### Run Integration Tests in Docker

You can run all Integration Tests in Docker (exactly the same process is executed on CI) using **RunAllIntegrationTests** NUKE target:

```shell
.\build RunAllIntegrationTests
```

## 6. Contribution

This project is still under analysis and development. I assume its maintenance for a long time and I would appreciate your contribution to it. Please let me know by creating an Issue or Pull Request.

## 7. Roadmap

List of features/tasks/approaches to add:

| Name                               | Status | Release date |
|------------------------------------| -------- |--------------|
| Domain Model Unit Tests            |Completed | 2019-09-10   |
| Architecture Decision Log update   |  Completed | 2019-11-09   |
| Integration automated tests        | Completed | 2020-02-24   |
| Migration to .NET Core 3.1         |Completed  | 2020-03-04   |
| System Integration Testing         | Completed  | 2020-03-28   |
| More advanced Payments module      | Completed  | 2020-07-11   |
| Event Sourcing implementation      | Completed  | 2020-07-11   |
| Database Change Management         | Completed  | 2020-08-23   |
| Continuous Integration             | Completed  | 2020-09-01   |
| StyleCop Static Code Analysis      | Completed  | 2020-09-05   |
| FrontEnd SPA application           | Completed | 2020-11-08   |
| Docker support                     | Completed | 2020-11-26   |
| PlantUML Conceptual Model          | Completed | 2021-03-22   |
| C4 Model                           | Completed | 2021-03-29   |
| Meeting comments feature           | Completed | 2021-03-30   |
| NUKE build automation              | Completed | 2021-06-15   |
| Database project compilation on CI | Completed | 2021-06-15   |
| System Under Test implementation   | Completed | 2022-07-17   |
| Mutation Testing                   | Completed | 2022-08-23   |
| Migration to .NET 8.0              | Completed | 2023-12-09   |

NOTE: Please don't hesitate to suggest something else or a change to the existing code. All proposals will be considered.

## 8. Authors

Kamil Grzybek

Blog: [https://kamilgrzybek.com](https://kamilgrzybek.com)

Twitter: [https://twitter.com/kamgrzybek](https://twitter.com/kamgrzybek)

LinkedIn: [https://www.linkedin.com/in/kamilgrzybek/](https://www.linkedin.com/in/kamilgrzybek/)

GitHub: [https://github.com/kgrzybek](https://github.com/kgrzybek)

### 8.1 Main contributors

- [Andrei Ganichev](https://github.com/AndreiGanichev)
- [Bela Istok](https://github.com/bistok)
- [Almar Aubel](https://github.com/AlmarAubel)

## 9. License

The project is under [MIT license](https://opensource.org/licenses/MIT).

## 10. Inspirations and Recommendations

### Modular Monolith

- ["Modular Monolith: A Primer"](https://www.kamilgrzybek.com/design/modular-monolith-primer/) Modular Monolith architecture article series, Kamil Grzybek
- ["Modular Monolith Architecture: One to rule them all"](https://www.youtube.com/watch?v=njDSXUWeik0) presentation, Kamil Grzybek
- ["Modular Monoliths"](https://www.youtube.com/watch?v=5OjqD-ow8GE) presentation, Simon Brown
- ["Majestic Modular Monoliths"](https://www.youtube.com/watch?v=BOvxJaklcr0) presentation, Axel Fontaine
- ["Building Better Monoliths – Modulithic Applications with Spring Boot"](https://speakerdeck.com/olivergierke/building-better-monoliths-modulithic-applications-with-spring-boot-cd16e6ec-d334-497d-b9f6-3f92d5db035a) slides, Oliver Drotbohm
- ["MonolithFirst"](https://martinfowler.com/bliki/MonolithFirst.html) article, Martin Fowler
- ["Pattern: Monolithic Architecture"](https://microservices.io/patterns/monolithic.html) pattern description, Chris Richardson

### Domain-Driven Design

- ["Domain-Driven Design: Tackling Complexity in the Heart of Software"](https://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215) book, Eric Evans
- ["Implementing Domain-Driven Design"](https://www.amazon.com/Implementing-Domain-Driven-Design-Vaughn-Vernon/dp/0321834577) book, Vaughn Vernon
- ["Domain-Driven Design Distilled"](https://www.amazon.com/dp/0134434420) book, Vaughn Vernon
- ["Patterns, Principles, and Practices of Domain-Driven Design"](https://www.amazon.com/Patterns-Principles-Practices-Domain-Driven-Design-ebook/dp/B00XLYUA0W) book, Scott Millett, Nick Tune
- ["Secure By Design"](https://www.amazon.com/Secure-Design-Daniel-Deogun/dp/1617294357) book, Daniel Deogun, Dan Bergh Johnsson, Daniel Sawano
- ["Hands-On Domain-Driven Design with .NET Core: Tackling complexity in the heart of software by putting DDD principles into practice"](https://www.amazon.com/Hands-Domain-Driven-Design-NET-ebook/dp/B07C5WSR9B) book, Alexey Zimarev
- ["Domain Modeling Made Functional: Tackle Software Complexity with Domain-Driven Design and F#"](https://www.amazon.com/Domain-Modeling-Made-Functional-Domain-Driven-ebook/dp/B07B44BPFB) book, Scott Wlaschin
- ["DDD by examples - library"](https://github.com/ddd-by-examples/library) GH repository, Jakub Pilimon, Bartłomiej Słota
- ["IDDD_Samples"](https://github.com/VaughnVernon/IDDD_Samples) GH repository, Vaughn Vernon
- ["IDDD_Samples_NET"](https://github.com/VaughnVernon/IDDD_Samples_NET) GH repository, Vaughn Vernon
- ["Awesome Domain-Driven Design"](https://github.com/heynickc/awesome-ddd) GH repository, Nick Chamberlain

### Application Architecture

- ["Patterns of Enterprise Application Architecture"](https://martinfowler.com/books/eaa.html) book, Martin Fowler
- ["Dependency Injection Principles, Practices, and Patterns"](https://www.manning.com/books/dependency-injection-principles-practices-patterns) book, Steven van Deursen, Mark Seemann
- ["Clean Architecture: A Craftsman's Guide to Software Structure and Design (Robert C. Martin Series"](https://www.amazon.com/Clean-Architecture-Craftsmans-Software-Structure/dp/0134494164) book, Robert C. Martin
- ["The Clean Architecture"](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html) article, Robert C. Martin
- ["The Onion Architecture"](https://jeffreypalermo.com/2008/07/the-onion-architecture-part-1/) article series, Jeffrey Palermo
- ["Hexagonal/Ports & Adapters Architecture"](https://web.archive.org/web/20180822100852/http://alistair.cockburn.us/Hexagonal+architecture) article, Alistair Cockburn
- ["DDD, Hexagonal, Onion, Clean, CQRS, … How I put it all together"](https://herbertograca.com/2017/11/16/explicit-architecture-01-ddd-hexagonal-onion-clean-cqrs-how-i-put-it-all-together/) article, Herberto Graca

### Software Architecture

- ["Software Architecture in Practice (3rd Edition)"](https://www.amazon.com/Software-Architecture-Practice-3rd-Engineering/dp/0321815734) book, Len Bass, Paul Clements, Rick Kazman
- ["Software Architecture for Developers Vol 1 & 2"](https://softwarearchitecturefordevelopers.com/) book, Simon Brown
- ["Just Enough Software Architecture: A Risk-Driven Approach"](https://www.amazon.com/Just-Enough-Software-Architecture-Risk-Driven/dp/0984618104) book, George H. Fairbanks
- ["Software Systems Architecture: Working With Stakeholders Using Viewpoints and Perspectives (2nd Edition)"](https://www.amazon.com/Software-Systems-Architecture-Stakeholders-Perspectives/dp/032171833X/) book, Nick Rozanski, Eóin Woods
- ["Design It!: From Programmer to Software Architect (The Pragmatic Programmers)"](https://www.amazon.com/Design-Programmer-Architect-Pragmatic-Programmers/dp/1680502093) book, Michael Keeling

### System Architecture

- ["Enterprise Integration Patterns : Designing, Building, and Deploying Messaging Solutions"](https://www.enterpriseintegrationpatterns.com/) book and catalogue, Gregor Hohpe, Bobby Woolf
- ["Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems "](https://www.amazon.com/Designing-Data-Intensive-Applications-Reliable-Maintainable/dp/1449373321) book, Martin Kleppman
- ["Building Evolutionary Architectures: Support Constant Change"](https://www.amazon.com/Building-Evolutionary-Architectures-Support-Constant/dp/1491986360) book, Neal Ford
- ["Building Microservices: Designing Fine-Grained Systems"](https://www.amazon.com/Building-Microservices-Designing-Fine-Grained-Systems/dp/1491950358) book, Sam Newman

### Design

- ["Refactoring: Improving the Design of Existing Code"](https://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) book, Martin Fowler, Kent Beck, John Brant, William Opdyke, Don Roberts
- ["Clean Code: A Handbook of Agile Software Craftsmanship"](https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882) book, Robert C. Martin
- ["Agile Principles, Patterns, and Practices in C#"](https://www.amazon.com/Agile-Principles-Patterns-Practices-C/dp/0131857258) book, Robert C. Martin
- ["Applying UML and Patterns: An Introduction to Object-Oriented Analysis and Design and Iterative Development (3rd Edition)"](https://www.amazon.com/Applying-UML-Patterns-Introduction-Object-Oriented/dp/0131489062) book, Craig Larman
- ["Working Effectively with Legacy Code"](https://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052) book, Michael Feathers
- ["Code Complete: A Practical Handbook of Software Construction, Second Edition"](https://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670) book, Steve McConnell
- ["Design Patterns: Elements of Reusable Object-Oriented Software"](https://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612) book, Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides

### Craftsmanship

- ["The Clean Coder: A Code of Conduct for Professional Programmers"](https://www.amazon.com/Clean-Coder-Conduct-Professional-Programmers/dp/0137081073) book, Robert C. Martin
- ["The Pragmatic Programmer: From Journeyman to Master"](https://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X) book, Andrew Hunt

### Testing

- ["The Art of Unit Testing: with examples in C#"](https://www.amazon.com/Art-Unit-Testing-examples/dp/1617290890) book, Roy Osherove
- ["Unit Test Your Architecture with ArchUnit"](https://blogs.oracle.com/javamagazine/unit-test-your-architecture-with-archunit) article, Jonas Havers
- ["Unit Testing Principles, Practices, and Patterns"](https://www.amazon.com/Unit-Testing-Principles-Practices-Patterns/dp/1617296279) book, Vladimir Khorikov
- ["Growing Object-Oriented Software, Guided by Tests"](https://www.amazon.com/Growing-Object-Oriented-Software-Guided-Tests/dp/0321503627) book, Steve Freeman, Nat Pryce
- [Automated Tests](https://www.kamilgrzybek.com/blog/series/automated-tests) article series, Kamil Grzybek

### UML

- ["UML Distilled: A Brief Guide to the Standard Object Modeling Language (3rd Edition)"](https://www.amazon.com/UML-Distilled-Standard-Modeling-Language/dp/0321193687) book, Martin Fowler

### Event Storming

- ["Introducing EventStorming"](https://leanpub.com/introducing_eventstorming) book, Alberto Brandolini
- ["Awesome EventStorming"](https://github.com/mariuszgil/awesome-eventstorming) GH repository, Mariusz Gil

### Event Sourcing

- ["Hands-On Domain-Driven Design with .NET Core: Tackling complexity in the heart of software by putting DDD principles into practice"](https://www.amazon.com/Hands-Domain-Driven-Design-NET-ebook/dp/B07C5WSR9B) book, Alexey Zimarev
- ["Versioning in an Event Sourced System"](https://leanpub.com/esversioning) book, Greg Young
- [Hands-On-Domain-Driven-Design-with-.NET-Core](https://github.com/PacktPublishing/Hands-On-Domain-Driven-Design-with-.NET-Core) GH repository, Alexey Zimarev
- [EventSourcing.NetCore](https://github.com/oskardudycz/EventSourcing.NetCore) GH repository, Oskar Dudycz


================================================
FILE: azure-pipelines.yml
================================================
# ASP.NET Core (.NET Framework)
# Build and test ASP.NET Core projects targeting the full .NET Framework.
# Add steps that publish symbols, save build artifacts, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/dotnet-core

trigger:
- master

pool:
  vmImage: 'windows-latest'

variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'

steps:
- task: NuGetToolInstaller@1

- task: NuGetCommand@2
  inputs:
    restoreSolution: '$(solution)'

- task: VSBuild@1
  inputs:
    solution: '$(solution)'
    msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:DesktopBuildPackageLocation="$(build.artifactStagingDirectory)\WebApp.zip" /p:DeployIisAppPath="Default Web Site"'
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'

- task: VSTest@2
  inputs:
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'


================================================
FILE: build/.editorconfig
================================================
[*.cs]
dotnet_style_qualification_for_field = false:warning
dotnet_style_qualification_for_property = false:warning
dotnet_style_qualification_for_method = false:warning
dotnet_style_qualification_for_event = false:warning
dotnet_style_require_accessibility_modifiers = never:warning

csharp_style_expression_bodied_methods = true:silent
csharp_style_expression_bodied_properties = true:warning
csharp_style_expression_bodied_indexers = true:warning
csharp_style_expression_bodied_accessors = true:warning


================================================
FILE: build/Build.cs
================================================
using Nuke.Common;
using Nuke.Common.IO;
using Nuke.Common.ProjectModel;
using Nuke.Common.Tools.DotNet;
using static Nuke.Common.Tools.DotNet.DotNetTasks;


partial class Build : NukeBuild
{
    /// Support plugins are available for:
    ///   - JetBrains ReSharper        https://nuke.build/resharper
    ///   - JetBrains Rider            https://nuke.build/rider
    ///   - Microsoft VisualStudio     https://nuke.build/visualstudio
    ///   - Microsoft VSCode           https://nuke.build/vscode

    public static int Main () => Execute<Build>(x => x.Compile);

    [Parameter("Configuration to build - Default is 'Debug' (local) or 'Release' (server)")]
    readonly Configuration Configuration = IsLocalBuild ? Configuration.Debug : Configuration.Release;

    [Solution] readonly Solution Solution;

    Target Clean => _ => _
        .Before(Restore)
        .Executes(() =>
        {
            AbsolutePath.Create(WorkingDirectory).CreateOrCleanDirectory();
        });

    Target Restore => _ => _
        .Executes(() =>
        {
            DotNetRestore(s => s
                .SetProjectFile(Solution));
        });

    Target Compile => _ => _
        .DependsOn(Restore)
        .Executes(() =>
        {
            DotNetBuild(s => s
                .SetProjectFile(Solution)
                .SetConfiguration(Configuration)
                .EnableNoRestore());
        });

    Target UnitTests => _ => _
        .DependsOn(Compile)
        .Executes(() =>
        {
            DotNetTest(s => s
                .SetProjectFile(Solution)
                .SetFilter("UnitTests")
                .SetConfiguration(Configuration)
                .EnableNoRestore()
                .EnableNoBuild());
        });

    Target ArchitectureTests => _ => _
        .DependsOn(UnitTests)
        .Executes(() =>
        {
            DotNetTest(s => s
                .SetProjectFile(Solution)
                .SetFilter("ArchTests")
                .SetConfiguration(Configuration)
                .EnableNoRestore()
                .EnableNoBuild());
        });

    Target BuildAndUnitTests => _ => _
        .Triggers(ArchitectureTests)
        .Executes(() =>
        {
        });
}


================================================
FILE: build/BuildIntegrationTests.cs
================================================
using System;
using System.Linq;
using Nuke.Common;
using Nuke.Common.IO;
using Nuke.Common.Tools.Docker;
using Nuke.Common.Tools.DotNet;
using Utils;
using static Nuke.Common.IO.FileSystemTasks;
using static Nuke.Common.Tools.DotNet.DotNetTasks;

public partial class Build
{
    static AbsolutePath WorkingDirectory => RootDirectory / ".nuke-working-directory";

    static AbsolutePath OutputDirectory => WorkingDirectory / "output";

    static AbsolutePath OutputDbUbMigratorBuildDirectory => OutputDirectory / "dbUpMigrator";

    static AbsolutePath InputFilesDirectory => WorkingDirectory / "input-files";

    static AbsolutePath DatabaseDirectory =>
        RootDirectory / "src" / "Database" / "CompanyName.MyMeetings.Database" / "Scripts";

    const string CreateDatabaseScriptName = "CreateDatabase_Linux.sql";

    const string InputFilesDirectoryName = "input-files";

    Target PrepareInputFiles => _ => _
        .DependsOn(Clean)
        .Executes(() =>
        {
            string createDatabaseFile = DatabaseDirectory / CreateDatabaseScriptName;
            string createDatabaseFileTarget = InputFilesDirectory / CreateDatabaseScriptName;
            CopyFile(createDatabaseFile, createDatabaseFileTarget, FileExistsPolicy.Overwrite);
        });

    const string SqlServerPassword = "123qwe!@#QWE";

    const string SqlServerUser = "sa";

    const string SqlServerPort = "1401";

    Target PrepareSqlServer => _ => _
        .DependsOn(PrepareInputFiles)
        .Executes(() =>
        {
            DockerTasks.DockerRun(s => s
                .EnableRm()
                .SetName("sql-server-db")
                .SetImage("mcr.microsoft.com/mssql/server")
                .SetEnv(
                    $"SA_PASSWORD={SqlServerPassword}",
                    "ACCEPT_EULA=Y",
                    "MSSQL_PID=Express")
                .SetPublish($"{SqlServerPort}:1433")
                .SetMount($"type=bind,source=\"{InputFilesDirectory}\",target=/{InputFilesDirectoryName},readonly")
                .EnableDetach());

            SqlReadinessChecker.WaitForSqlSever(
                $"Server=127.0.0.1,{SqlServerPort};Database=master;User={SqlServerUser};Password={SqlServerPassword};Encrypt=False;");
        });

    Target CreateDatabase => _ => _
        .DependsOn(PrepareSqlServer)
        .Executes(() =>
        {
            DockerTasks.DockerExec(s => s
                .EnableInteractive()
                .SetContainer("sql-server-db")
                .SetCommand("/bin/sh")
                .SetArgs("-c", $"./opt/mssql-tools/bin/sqlcmd -d master -i ./{InputFilesDirectoryName}/{CreateDatabaseScriptName} -U {SqlServerUser} -P {SqlServerPassword}"));
        });

    Target CompileDbUpMigratorForIntegrationTests => _ => _
        .DependsOn(CreateDatabase)
        .Executes(() =>
        {
            var dbUpMigratorProject = Solution.GetAllProjects("DatabaseMigrator").First();
            DotNetBuild(s => s
                .SetProjectFile(dbUpMigratorProject)
                .SetConfiguration(Configuration)
                .SetOutputDirectory(OutputDbUbMigratorBuildDirectory)
            );
        });

    AbsolutePath DbUpMigratorPath => OutputDbUbMigratorBuildDirectory / "DatabaseMigrator.dll";

    readonly string MyMeetingsDatabaseConnectionString = $"Server=127.0.0.1,{SqlServerPort};Database=MyMeetings;User={SqlServerUser};Password={SqlServerPassword};Encrypt=False;";

    Target RunDatabaseMigrations => _ => _
        .DependsOn(CompileDbUpMigratorForIntegrationTests)
        .Executes(() =>
        {
            AbsolutePath migrationsPath = DatabaseDirectory / "Migrations";

            DotNet($"{DbUpMigratorPath} {MyMeetingsDatabaseConnectionString} {migrationsPath}");
        });

    const string MeetingsModuleIntegrationTestsAssemblyName = "CompanyName.MyMeetings.Modules.Meetings.IntegrationTests";

    Target BuildMeetingsModuleIntegrationTests => _ => _
        .DependsOn(RunDatabaseMigrations)
        .Executes(() =>
        {
            var integrationTest = Solution.GetAllProjects(MeetingsModuleIntegrationTestsAssemblyName).First();

            DotNetBuild(s => s
                .SetProjectFile(integrationTest)
                .DisableNoRestore());
        });

    const string MyMeetingsDatabaseEnvName = "ASPNETCORE_MyMeetings_IntegrationTests_ConnectionString";

    Target RunMeetingsModuleIntegrationTests => _ => _
        .DependsOn(BuildMeetingsModuleIntegrationTests)
        .Executes(() =>
        {
            var integrationTest = Solution.GetAllProjects(MeetingsModuleIntegrationTestsAssemblyName).First();
            Environment.SetEnvironmentVariable(
                MyMeetingsDatabaseEnvName,
                MyMeetingsDatabaseConnectionString);

            DotNetTest(s => s
                .EnableNoBuild()
                .SetProjectFile(integrationTest));
        });

    const string AdministrationModuleIntegrationTestsAssemblyName = "CompanyName.MyMeetings.Modules.Administration.IntegrationTests";

    Target BuildAdministrationModuleIntegrationTests => _ => _
        .DependsOn(RunDatabaseMigrations)
        .Executes(() =>
        {
            var integrationTest = Solution.GetAllProjects(AdministrationModuleIntegrationTestsAssemblyName).First();

            DotNetBuild(s => s
                .SetProjectFile(integrationTest)
                .DisableNoRestore());
        });

    Target RunAdministrationModuleIntegrationTests => _ => _
        .DependsOn(BuildAdministrationModuleIntegrationTests)
        .Executes(() =>
        {
            var integrationTest = Solution.GetAllProjects(AdministrationModuleIntegrationTestsAssemblyName).First();
            Environment.SetEnvironmentVariable(
                MyMeetingsDatabaseEnvName,
                MyMeetingsDatabaseConnectionString);

            DotNetTest(s => s
                .EnableNoBuild()
                .SetProjectFile(integrationTest));
        });

    const string UserAccessModuleIntegrationTestsAssemblyName = "CompanyNames.MyMeetings.Modules.UserAccess.IntegrationTests";

    Target BuildUserAccessModuleIntegrationTests => _ => _
        .DependsOn(RunDatabaseMigrations)
        .Executes(() =>
        {
            var integrationTest = Solution.GetAllProjects(UserAccessModuleIntegrationTestsAssemblyName).First();

            DotNetBuild(s => s
                .SetProjectFile(integrationTest)
                .DisableNoRestore());
        });

    Target RunUserAccessModuleIntegrationTests => _ => _
        .DependsOn(BuildUserAccessModuleIntegrationTests)
        .Executes(() =>
        {
            var integrationTest = Solution.GetAllProjects(UserAccessModuleIntegrationTestsAssemblyName).First();
            Environment.SetEnvironmentVariable(
                MyMeetingsDatabaseEnvName,
                MyMeetingsDatabaseConnectionString);

            DotNetTest(s => s
                .EnableNoBuild()
                .SetProjectFile(integrationTest));
        });

    const string PaymentsModuleIntegrationTestsAssemblyName = "CompanyName.MyMeetings.Modules.Payments.IntegrationTests";

    Target BuildPaymentsModuleIntegrationTests => _ => _
        .DependsOn(RunDatabaseMigrations)
        .Executes(() =>
        {
            var integrationTest = Solution.GetAllProjects(PaymentsModuleIntegrationTestsAssemblyName).First();

            DotNetBuild(s => s
                .SetProjectFile(integrationTest)
                .DisableNoRestore());
        });

    Target RunPaymentsModuleIntegrationTests => _ => _
        .DependsOn(BuildPaymentsModuleIntegrationTests)
        .Executes(() =>
        {
            var integrationTest = Solution.GetAllProjects(PaymentsModuleIntegrationTestsAssemblyName).First();
            Environment.SetEnvironmentVariable(
                MyMeetingsDatabaseEnvName,
                MyMeetingsDatabaseConnectionString);

            DotNetTest(s => s
                .EnableNoBuild()
                .SetProjectFile(integrationTest));
        });

    const string SystemIntegrationTestsAssemblyName = "CompanyName.MyMeetings.IntegrationTests";

    Target BuildSystemIntegrationTests => _ => _
        .DependsOn(RunDatabaseMigrations)
        .Executes(() =>
        {
            var integrationTest = Solution.GetAllProjects(SystemIntegrationTestsAssemblyName).First();

            DotNetBuild(s => s
                .SetProjectFile(integrationTest)
                .DisableNoRestore());
        });

    Target RunSystemIntegrationTests => _ => _
        .DependsOn(BuildSystemIntegrationTests)
        .Executes(() =>
        {
            var integrationTest = Solution.GetAllProjects(SystemIntegrationTestsAssemblyName).First();
            Environment.SetEnvironmentVariable(
                MyMeetingsDatabaseEnvName,
                MyMeetingsDatabaseConnectionString);

            DotNetTest(s => s
                .EnableNoBuild()
                .SetProjectFile(integrationTest));
        });

    Target RunAllIntegrationTests => _ => _
        .DependsOn(
            RunAdministrationModuleIntegrationTests,
            RunMeetingsModuleIntegrationTests,
            RunPaymentsModuleIntegrationTests,
            RunUserAccessModuleIntegrationTests,
            RunSystemIntegrationTests)
        .Executes(() =>
        {

        });
}

================================================
FILE: build/Configuration.cs
================================================
using System.ComponentModel;
using Nuke.Common.Tooling;

[TypeConverter(typeof(TypeConverter<Configuration>))]
public class Configuration : Enumeration
{
    public static Configuration Debug = new Configuration { Value = nameof(Debug) };
    public static Configuration Release = new Configuration { Value = nameof(Release) };

    public static implicit operator string(Configuration configuration)
    {
        return configuration.Value;
    }
}


================================================
FILE: build/Database.cs
================================================
using System.Linq;
using Nuke.Common;
using Nuke.Common.Tools.DotNet;
using static Nuke.Common.Tools.DotNet.DotNetTasks;

public partial class Build
{
    Target CompileDbUpMigrator => _ => _
        .Executes(() =>
        {
            var dbUpMigratorProject = Solution.GetAllProjects("DatabaseMigrator").First();
           
            DotNetBuild(s => s
                .SetProjectFile(dbUpMigratorProject)
                .SetConfiguration(Configuration)
                .SetOutputDirectory(OutputDbUbMigratorBuildDirectory)
            );
        });
    
    [Parameter("Modular Monolith database connection string")] readonly string DatabaseConnectionString;
    Target MigrateDatabase => _ => _
        .Requires(() => DatabaseConnectionString != null)
        .DependsOn(CompileDbUpMigrator)
        .Executes(() =>
        {
            var migrationsPath = DatabaseDirectory / "Migrations";

            DotNet($"{DbUpMigratorPath} {DatabaseConnectionString} {migrationsPath}");
        });
}

================================================
FILE: build/Directory.Build.props
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <!-- This file prevents unintended imports of unrelated MSBuild files -->
  <!-- Uncomment to include parent Directory.Build.props file -->
  <!--<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))" />-->

</Project>


================================================
FILE: build/Directory.Build.targets
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <!-- This file prevents unintended imports of unrelated MSBuild files -->
  <!-- Uncomment to include parent Directory.Build.targets file -->
  <!--<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.targets', '$(MSBuildThisFileDirectory)../'))" />-->

</Project>


================================================
FILE: build/SUTCreator.cs
================================================
using System;
using System.Collections.Generic;
using Nuke.Common;
using Nuke.Common.Tools.DotNet;
using static Nuke.Common.Tools.DotNet.DotNetTasks;


public partial class Build
{
    [Parameter("SUT creator test name to execute")] readonly string SUTTestName;

    readonly IDictionary<string, string> TestCasesMap = new Dictionary<string, string>
    {
        {"CleanDatabase", "CompanyName.MyMeetings.SUT.TestCases.CleanDatabaseTestCase.Prepare"},
        {"OnlyAdmin", "CompanyName.MyMeetings.SUT.TestCases.OnlyAdminTestCase.Prepare"},
        {"CreateMeeting", "CompanyName.MyMeetings.SUT.TestCases.CreateMeeting.Prepare"}
    };
    
    Target PrepareSUT => _ => _
        .Requires(() => SUTTestName != null)
        .Requires(() => DatabaseConnectionString != null)
        .Executes(() =>
        {
            Environment.SetEnvironmentVariable(
                "MyMeetings_SUTDatabaseConnectionString", 
                DatabaseConnectionString,
                EnvironmentVariableTarget.Process);
           
            var sutTestProject = Solution.GetProject("CompanyName.MyMeetings.SUT");

            var fullyQualifiedName = TestCasesMap[SUTTestName];
           
            DotNetTest(s => s
                .SetProjectFile(sutTestProject)
                
                .SetFilter($"FullyQualifiedName={fullyQualifiedName}"));
        });
}

================================================
FILE: build/Utils/SqlReadinessChecker.cs
================================================
using System;
using System.Threading;
using Dapper;
using System.Data.SqlClient;

namespace Utils
{
    public static class SqlReadinessChecker
    {
        public static void WaitForSqlSever(string connectionString)
        {
            using var connection = new SqlConnection(connectionString);

            const int maxTryCounts = 30;
            var tryCounts = 0;
            while (true)
            {
                tryCounts++;
                try
                {
                    connection.QuerySingle<string>("SELECT @@Version");
                    Serilog.Log.Information("Sql Server started");
                    break;
                }
                catch
                {
                    Serilog.Log.Information("Sql Server not ready");
                    if (tryCounts > maxTryCounts)
                    {
                        throw new Exception("Sql Server cannot start.");
                    }
                }

                Thread.Sleep(2000);
            }
        }
    }
}

================================================
FILE: build/_build.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <RootNamespace></RootNamespace>
    <NoWarn>CS0649;CS0169</NoWarn>
    <NukeRootDirectory>..</NukeRootDirectory>
    <NukeScriptDirectory>..</NukeScriptDirectory>
    <NukeTelemetryVersion>1</NukeTelemetryVersion>
    <EnableUnsafeBinaryFormatterSerialization>true</EnableUnsafeBinaryFormatterSerialization>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Dapper" Version="2.1.24" />
    <PackageReference Include="Nuke.Common" Version="7.0.6" />
    <PackageReference Include="System.Data.SqlClient" Version="4.8.6" />
  </ItemGroup>

</Project>


================================================
FILE: build/_build.csproj.DotSettings
================================================
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
	<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=HeapView_002EDelegateAllocation/@EntryIndexedValue">DO_NOT_SHOW</s:String>
	<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=VariableHidesOuterVariable/@EntryIndexedValue">DO_NOT_SHOW</s:String>
	<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ClassNeverInstantiated_002EGlobal/@EntryIndexedValue">DO_NOT_SHOW</s:String>
	<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=MemberCanBeMadeStatic_002ELocal/@EntryIndexedValue">DO_NOT_SHOW</s:String>
	<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/DEFAULT_INTERNAL_MODIFIER/@EntryValue">Implicit</s:String>
	<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/DEFAULT_PRIVATE_MODIFIER/@EntryValue">Implicit</s:String>
	<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/METHOD_OR_OPERATOR_BODY/@EntryValue">ExpressionBody</s:String>
	<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/ThisQualifier/INSTANCE_MEMBERS_QUALIFY_MEMBERS/@EntryValue">0</s:String>
	<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/ANONYMOUS_METHOD_DECLARATION_BRACES/@EntryValue">NEXT_LINE</s:String>
	<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/KEEP_USER_LINEBREAKS/@EntryValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/WRAP_AFTER_INVOCATION_LPAR/@EntryValue">False</s:Boolean>
	<s:Int64 x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/MAX_ATTRIBUTE_LENGTH_FOR_SAME_LINE/@EntryValue">120</s:Int64>
	<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_FIELD_ATTRIBUTE_ON_SAME_LINE_EX/@EntryValue">IF_OWNER_IS_SINGLE_LINE</s:String>
	<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/WRAP_ARGUMENTS_STYLE/@EntryValue">WRAP_IF_LONG</s:String>
	<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_SIMPLE_ANONYMOUSMETHOD_ON_SINGLE_LINE/@EntryValue">False</s:Boolean>
	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateInstanceFields/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;</s:String>
	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateStaticFields/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;</s:String>
	<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpAttributeForSingleLineMethodUpgrade/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpKeepExistingMigration/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpPlaceEmbeddedOnSameLineMigration/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpRenamePlacementToArrangementMigration/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpUseContinuousIndentInsideBracesMigration/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EAddAccessorOwnerDeclarationBracesMigration/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002ECSharpPlaceAttributeOnSameLineMigration/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateBlankLinesAroundFieldToBlankLinesAroundProperty/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateThisQualifierSettings/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>


================================================
FILE: build.cmd
================================================
:; set -eo pipefail
:; SCRIPT_DIR=$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd)
:; ${SCRIPT_DIR}/build.sh "$@"
:; exit $?

@ECHO OFF
powershell -ExecutionPolicy ByPass -NoProfile -File "%~dp0build.ps1" %*


================================================
FILE: build.ps1
================================================
[CmdletBinding()]
Param(
    [Parameter(Position=0,Mandatory=$false,ValueFromRemainingArguments=$true)]
    [string[]]$BuildArguments
)

Write-Output "PowerShell $($PSVersionTable.PSEdition) version $($PSVersionTable.PSVersion)"

Set-StrictMode -Version 2.0; $ErrorActionPreference = "Stop"; $ConfirmPreference = "None"; trap { Write-Error $_ -ErrorAction Continue; exit 1 }
$PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent

###########################################################################
# CONFIGURATION
###########################################################################

$BuildProjectFile = "$PSScriptRoot\build\_build.csproj"
$TempDirectory = "$PSScriptRoot\\.nuke\temp"

$DotNetGlobalFile = "$PSScriptRoot\\global.json"
$DotNetInstallUrl = "https://dot.net/v1/dotnet-install.ps1"
$DotNetChannel = "Current"

$env:DOTNET_SKIP_FIRST_TIME_EXPERIENCE = 1
$env:DOTNET_CLI_TELEMETRY_OPTOUT = 1
$env:DOTNET_MULTILEVEL_LOOKUP = 0

###########################################################################
# EXECUTION
###########################################################################

function ExecSafe([scriptblock] $cmd) {
    & $cmd
    if ($LASTEXITCODE) { exit $LASTEXITCODE }
}

# If dotnet CLI is installed globally and it matches requested version, use for execution
if ($null -ne (Get-Command "dotnet" -ErrorAction SilentlyContinue) -and `
     $(dotnet --version) -and $LASTEXITCODE -eq 0) {
    $env:DOTNET_EXE = (Get-Command "dotnet").Path
}
else {
    # Download install script
    $DotNetInstallFile = "$TempDirectory\dotnet-install.ps1"
    New-Item -ItemType Directory -Path $TempDirectory -Force | Out-Null
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    (New-Object System.Net.WebClient).DownloadFile($DotNetInstallUrl, $DotNetInstallFile)

    # If global.json exists, load expected version
    if (Test-Path $DotNetGlobalFile) {
        $DotNetGlobal = $(Get-Content $DotNetGlobalFile | Out-String | ConvertFrom-Json)
        if ($DotNetGlobal.PSObject.Properties["sdk"] -and $DotNetGlobal.sdk.PSObject.Properties["version"]) {
            $DotNetVersion = $DotNetGlobal.sdk.version
        }
    }

    # Install by channel or version
    $DotNetDirectory = "$TempDirectory\dotnet-win"
    if (!(Test-Path variable:DotNetVersion)) {
        ExecSafe { & $DotNetInstallFile -InstallDir $DotNetDirectory -Channel $DotNetChannel -NoPath }
    } else {
        ExecSafe { & $DotNetInstallFile -InstallDir $DotNetDirectory -Version $DotNetVersion -NoPath }
    }
    $env:DOTNET_EXE = "$DotNetDirectory\dotnet.exe"
}

Write-Output "Microsoft (R) .NET SDK version $(& $env:DOTNET_EXE --version)"

ExecSafe { & $env:DOTNET_EXE build $BuildProjectFile /nodeReuse:false /p:UseSharedCompilation=false -nologo -clp:NoSummary --verbosity quiet }
ExecSafe { & $env:DOTNET_EXE run --project $BuildProjectFile --no-build -- $BuildArguments }


================================================
FILE: build.sh
================================================
#!/usr/bin/env bash

bash --version 2>&1 | head -n 1

set -eo pipefail
SCRIPT_DIR=$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd)

###########################################################################
# CONFIGURATION
###########################################################################

BUILD_PROJECT_FILE="$SCRIPT_DIR/build/_build.csproj"
TEMP_DIRECTORY="$SCRIPT_DIR//.nuke/temp"

DOTNET_GLOBAL_FILE="$SCRIPT_DIR//global.json"
DOTNET_INSTALL_URL="https://dot.net/v1/dotnet-install.sh"
DOTNET_CHANNEL="Current"

export DOTNET_CLI_TELEMETRY_OPTOUT=1
export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1
export DOTNET_MULTILEVEL_LOOKUP=0

###########################################################################
# EXECUTION
###########################################################################

function FirstJsonValue {
    perl -nle 'print $1 if m{"'"$1"'": "([^"]+)",?}' <<< "${@:2}"
}

# If dotnet CLI is installed globally and it matches requested version, use for execution
if [ -x "$(command -v dotnet)" ] && dotnet --version &>/dev/null; then
    export DOTNET_EXE="$(command -v dotnet)"
else
    # Download install script
    DOTNET_INSTALL_FILE="$TEMP_DIRECTORY/dotnet-install.sh"
    mkdir -p "$TEMP_DIRECTORY"
    curl -Lsfo "$DOTNET_INSTALL_FILE" "$DOTNET_INSTALL_URL"
    chmod +x "$DOTNET_INSTALL_FILE"

    # If global.json exists, load expected version
    if [[ -f "$DOTNET_GLOBAL_FILE" ]]; then
        DOTNET_VERSION=$(FirstJsonValue "version" "$(cat "$DOTNET_GLOBAL_FILE")")
        if [[ "$DOTNET_VERSION" == ""  ]]; then
            unset DOTNET_VERSION
        fi
    fi

    # Install by channel or version
    DOTNET_DIRECTORY="$TEMP_DIRECTORY/dotnet-unix"
    if [[ -z ${DOTNET_VERSION+x} ]]; then
        "$DOTNET_INSTALL_FILE" --install-dir "$DOTNET_DIRECTORY" --channel "$DOTNET_CHANNEL" --no-path
    else
        "$DOTNET_INSTALL_FILE" --install-dir "$DOTNET_DIRECTORY" --version "$DOTNET_VERSION" --no-path
    fi
    export DOTNET_EXE="$DOTNET_DIRECTORY/dotnet"
fi

echo "Microsoft (R) .NET Core SDK version $("$DOTNET_EXE" --version)"

"$DOTNET_EXE" build "$BUILD_PROJECT_FILE" /nodeReuse:false /p:UseSharedCompilation=false -nologo -clp:NoSummary --verbosity quiet
"$DOTNET_EXE" run --project "$BUILD_PROJECT_FILE" --no-build -- "$@"


================================================
FILE: docker-compose.yml
================================================
version: '3.4'

services:

  backend:
    container_name: mymeetings_backend
    build:
      context: ./src/
    ports:
      - "5000:8080"
    networks:
      - starfish-crm-network
    environment:
      - Meetings_MeetingsConnectionString=Server=mymeetingsdb,1433;Database=MyMeetings;User=sa;Password=Test@12345;Encrypt=False;
    depends_on:
      - migrator
    restart: on-failure

  mymeetingsdb:
    build: ./src/Database/
    platform: linux/amd64
    ports:
      - 1445:1433
    networks:
      - starfish-crm-network

  migrator:
    container_name: mymeetings_db_migrator
    build:
      context: ./src/
      dockerfile: ./Database/Dockerfile_DatabaseMigrator
    networks:
      - starfish-crm-network
    environment:
      - ASPNETCORE_MyMeetings_IntegrationTests_ConnectionString=Server=mymeetingsdb,1433;Database=MyMeetings;User=sa;Password=Test@12345;Encrypt=False;
    command:
      [
        "./wait-for-it.sh",
        "mymeetingsdb:1433",
        "--timeout=60",
        "--",
        "/bin/bash",
        "/entrypoint_DatabaseMigrator.sh"
      ]
    restart: on-failure

networks:
  starfish-crm-network:


================================================
FILE: docs/C4/c1_system_context.puml
================================================
@startuml C1 System Context
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Context.puml

Person(memberPerson, "Member", "Organizer of meeting groups, meetings, member of group, meeting attendee")
Person(adminPerson, "Administrator", "Administrator of the system")

System(myMeetingsSystem, "My Meetings")
System_Ext(emailSystem, "Email Service")
System_Ext(paymentGatewaySystem, "Payment Gateway")

Rel(memberPerson, myMeetingsSystem, "Organize meeting groups and participate in meetings")
Rel(adminPerson, myMeetingsSystem, "Manage members, meeting groups, meetings")
Rel(myMeetingsSystem, emailSystem, "Request email send")
Rel(emailSystem, memberPerson, "Send email")
Rel(emailSystem, adminPerson, "Send email")
Rel(myMeetingsSystem, paymentGatewaySystem, "Delegate the payment")
Rel(paymentGatewaySystem, myMeetingsSystem , "Return info about payment")
Rel(memberPerson, paymentGatewaySystem , "Pay in")

LAYOUT_WITH_LEGEND()
@enduml

================================================
FILE: docs/C4/c2_container.puml
================================================
@startuml C2 Containers
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml

Person(memberPerson, "Member", "Organizer of meeting groups, meetings, member of group, meeting attendee")
Person(adminPerson, "Administrator", "Administrator of the system")

System_Boundary(c1, "My Meetings System") {
    Container(spa, "SPA", "ReactJS", "GUI for the application")
    Container(api, "My Meetings API", ".NET Core", "Backend")
    ContainerDb(database, "Database", "Microsoft SQL", "Data about meeting groups, members, meetings etc", "msql_server")
}
System_Ext(emailSystem, "Email System", "3rd party SMTP server")
System_Ext(paymentGateway, "Payment Gateway", "3rd party payment service")

Rel(memberPerson, spa, "Uses", "HTTP")
Rel(adminPerson, spa, "Uses", "HTTP")
Rel(spa, api, "Uses", "HTTP")
Rel_R(api, database, "Reads/Writes", "SQL")
Rel_L(api, emailSystem, "Sends email using", "SMTP")
Rel_D(api, paymentGateway, "Delegate the payment", "HTTP")
Rel(memberPerson, paymentGateway, "Make payment via", "HTTP")

LAYOUT_WITH_LEGEND()

@enduml

================================================
FILE: docs/C4/c3_components.puml
================================================
@startuml C3 Components
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml

System_Boundary(c1, "My Meetings System") {
    Container(spa, "SPA", "ReactJS", "GUI for the application")
    
    Boundary(myMeetingsApi, "My Meetings API") {
        Component(api, "API", ".NET Core API")
        Component(meetingsModule, "Meetings", ".NET Libraries")
        Component(administrationModule, "Administration", ".NET Libraries")
        Component(userAccessModule, "User Access", ".NET Libraries")
        Component(paymentsModule, "Payments", ".NET Libraries")
        Component(registrationsModule, "Registrations", ".NET Libraries")
        ComponentQueue(eventsBus, "Events Bus", "In memory")
        
        Boundary(database, "Database") {
            ComponentDb(meetingsModuleData, "Meetings data", "schema")
            ComponentDb(administrationData, "Administration data", "schema")
            ComponentDb(userAccessData, "User Access data", "schema")
            ComponentDb(paymentsData, "Payments data", "schema")
            ComponentDb(registrationsData, "Registrations data", "schema")
        }
    }
}

Rel(spa, api, "Uses", "HTTP")
Rel(api, meetingsModule, "Uses")
Rel(api, administrationModule, "Uses")
Rel(api, userAccessModule, "Uses")
Rel(api, paymentsModule, "Uses")
Rel(api, registrationsModule, "Uses")
Rel(meetingsModule, eventsBus, "Publishes event to / subscribes")
Rel(administrationModule, eventsBus, "Publishes event to / subscribes")
Rel(userAccessModule, eventsBus, "Publishes event to / subscribes")
Rel(paymentsModule, eventsBus, "Publishes event to / subscribes")
Rel(registrationsModule, eventsBus, "Publishes event to / subscribes")

Rel(meetingsModule, meetingsModuleData, "Store / retrieve")
Rel(administrationModule, administrationData, "Store / retrieve")
Rel(userAccessModule, userAccessData, "Store / retrieve")
Rel(paymentsModule, paymentsData, "Store / retrieve")
Rel(registrationsModule, registrationsData, "Store / retrieve")

Rel_R(registrationsModule, userAccessModule, "Uses")

LAYOUT_WITH_LEGEND()

@enduml

================================================
FILE: docs/C4/c3_components_module.puml
================================================
@startuml C3 Components Module (zoom-in)
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml

AddComponentTag("meetings", $bgColor="#4ce065")
AddComponentTag("administration", $bgColor="#e3b868")
AddComponentTag("eventsBus", $bgColor="#29118a", $fontColor="#ffffff")

System_Boundary(c1, "My Meetings System") {
    Boundary(myMeetingsApi, "My Meetings API") {
        Component(api, "API", ".NET Core API")
        
        Boundary(meetingsModule, "Meetings Module") {
            Component(meetingsInfrastructure, "Meetings.Infrastructure", ".NET Library", $tags="meetings")
            Component(meetingsApplication, "Meetings.Application", ".NET Library", $tags="meetings")
            Component(meetingsDomain, "Meetings.Domain", ".NET Library", $tags="meetings")
            Component(meetingsIntegrationEvents, "Meetings.IntegrationEvents", ".NET Library", $tags="meetings")
            ComponentDb(meetingsData, "Meetings data", "schema", $tags="meetings")
        }

        Boundary(administrationModule, "Administration Module") {
            Component(administrationInfrastructure, "Administration.Infrastructure", ".NET Library", $tags="administration")
            Component(administrationApplication, "Administration.Application", ".NET Library", $tags="administration")
            Component(administrationDomain, "Administration.Domain", ".NET Library", $tags="administration")
            Component(administrationIntegrationEvents, "Administration.IntegrationEvents", ".NET Library", $tags="administration")
            ComponentDb(administrationData, "Administration data", "schema", $tags="administration")
        }

        ComponentQueue(eventsBus, "Events Bus", "In memory", $tags="eventsBus")
    }
}


Rel(api, meetingsInfrastructure, "Uses")
Rel(api, meetingsApplication, "Uses")
Rel(meetingsInfrastructure, meetingsApplication, "Uses")
Rel(meetingsInfrastructure, meetingsDomain, "Uses")
Rel(meetingsApplication, meetingsDomain, "Uses")
Rel(meetingsApplication, meetingsIntegrationEvents, "Uses")
Rel(meetingsInfrastructure, meetingsData, "Uses")
Rel(meetingsInfrastructure, eventsBus, "Uses")

Rel(api, administrationInfrastructure, "Uses")
Rel(api, administrationApplication, "Uses")
Rel(administrationInfrastructure, administrationApplication, "Uses")
Rel(administrationInfrastructure, administrationDomain, "Uses")
Rel(administrationApplication, administrationDomain, "Uses")
Rel(administrationApplication, administrationIntegrationEvents, "Uses")
Rel(administrationInfrastructure, administrationData, "Uses")
Rel(administrationInfrastructure, eventsBus, "Uses")

Rel(administrationApplication, meetingsIntegrationEvents, "Uses")
Rel(meetingsApplication, administrationIntegrationEvents, "Uses")

@enduml

================================================
FILE: docs/C4/c4_class.puml
================================================
@startuml C4  Code

package "Meeting Groups Aggregate" <<Rectangle>> {

    class "MeetingGroupId" << VO >> {   

    }
    
    class "MeetingGroup" << Entity, AR >> {
        -string: _description
        -DateTime: _createDate
        -DateTime: _paymentDateTo
        {static} MeetingGroup CreateBasedOnProposal()
        Meeting CreateMeeting(..)
        void SetExpirationDate(DateTime dateTo)
        void JoinToGroupMember(MemberId memberId)
        void LeaveGroup(MemberId memberId)
        void EditGeneralAttributes(...)
        bool IsMemberOfGroup(MemberId attendeeId)
        bool IsOrganizer(MemberId memberId)
    }

    class "MeetingGroupLocation" << VO >> {
        string City
        string CountryCode
        {static} MeetingGroupLocation Create(...)

    }

    class "MeetingGroupMember" << Entity >> {
        ~DateTime JoinedDate
        -bool _isActive
        -DateTime? _leaveDate
        {static} MeetingGroupMember CreateNew(...)
        void Leave()
        ~bool IsMember(MemberId memberId)
        ~bool IsOrganizer(MemberId memberId)
    }

    class "MemberId" << VO >> {

    }

    class "MeetingGroupMemberRole" << VO >> {
        string Value
    }
}

class "Member" << Entity, AR >> {

}

"MeetingGroup" *-- "MeetingGroupId" : of
"MeetingGroup" *-- "MeetingGroupLocation" : for
"MeetingGroup" "1" *-- "0..*" "MeetingGroupMember" : member of
"MeetingGroupMember" *-- "MemberId" : assigned to
"MeetingGroupMemberRole" --* "MeetingGroupMember" : is assigned to

"Member" o-- "MemberId" : of

@enduml

================================================
FILE: docs/PlantUML/Commenting_Conceptual_Model.puml
================================================
@startuml

object "Meeting" as Meeting
object "Member" as Member
object "Meeting Commenting Configuration" as MeetingCommentingConfiguration
object "Meeting Comment" as MeetingComment
object "Meeting Member Comment Like" as MeetingMemberCommentLike

Meeting "1"-->"0..*" MeetingComment : has
MeetingCommentingConfiguration "1"-->"1" Meeting : enables\ncommenting\nof
MeetingComment "1"-->"0..*" MeetingMemberCommentLike : has
MeetingComment "1"-->"0..*" MeetingComment : is reply to
Member --> Meeting : comments
Member --> MeetingComment : replies to,\nlikes
Member --> MeetingCommentingConfiguration : configures

@enduml

================================================
FILE: docs/PlantUML/Conceptual_Model.puml
================================================
@startuml
scale max 2000 width

package "User Access" #f3e8f8 {
object Permission
object "User Role" as UserRole
object User
object "User Registration" as UserRegistration
enum "User Registration Status" as UserRegistrationStatus
{
  WaitingForConfirmation
  Confirmed
  Expired
}

User "1"-->"0..*" UserRole : has
User --> UserRegistration : created for
UserRole "1..*"-->"1..*" Permission : has
UserRegistration --> UserRegistrationStatus : is in

}

package "Administration" #ffeddb {

object Administrator
object "Meeting Group Proposal" as Administration.MeetingGroupProposal
enum "Meeting Group Proposal Decision" as MeetingGroupProposalDecision
{
  Accept
  Reject
}
enum "Meeting Group Proposal Status" as Administration.MeetingGroupProposalDecisionStatus
{
  Accepted
  InVerification
  Rejected
}

Administrator "1"-->"0..*" MeetingGroupProposalDecision : makes
MeetingGroupProposalDecision --> Administration.MeetingGroupProposal : for
Administration.MeetingGroupProposal --> Administration.MeetingGroupProposalDecisionStatus: is in


Administrator --> User : is a

}


package "Meetings" #e4f7e4 {

object "Meeting" as Meeting
object "Member" as Member
object "Meeting Group Proposal" as Meeting.MeetingGroupProposal
object "Meeting Attendee" as MeetingAttendee
object "Meeting Group" as MeetingGroup
object "Meeting Not Attendee" as MeetingNotAttendee
object "Meeting Waitlist Member" as MeetingWaitlistMember
object "Meeting Location" as MeetingLocation
object "Member Subscription" as Meeting.MemberSubscription
enum "Meeting Group Proposal Status" as Meeting.MeetingGroupProposalStatus
{
  InVerification
  Accepted
  Rejected
}

Member --> Meeting.MeetingGroupProposal : proposes
Member "1"-->"0..*" MeetingAttendee : is a
Member "1"-->"0..*" MeetingNotAttendee : is a
Member "1"-->"0..*" MeetingWaitlistMember : is a
Member --> Meeting.MemberSubscription : has

Meeting "1"-->"1..*" MeetingAttendee : attendees
Meeting "1"-->"0..*" MeetingNotAttendee : not attendees
Meeting --> MeetingLocation : has

Meeting.MeetingGroupProposal --> Meeting.MeetingGroupProposalStatus : is in
MeetingGroup "1"-->"0..*" Meetings : organizes
MeetingGroup "0..1"-->"1" Meeting.MeetingGroupProposal : created after acceptance of

MeetingWaitlistMember "0..*"-->"1" Meeting : waits for place for

Meeting.MemberSubscription --> MeetingGroup : covers


Member --> User: is a
Meeting.MeetingGroupProposal --> Administration.MeetingGroupProposal : sent to verification

}


package "Payments" #ffc1c1 {

object "Payer" as Payer
object "Meeting Fee" as MeetingFee
object "Meeting Fee Payment" as MeetingFeePayment
object "Subscription" as Payments.Subscription
object "Subscription Payment" as SubscriptionPayment
object "Subscription Renewal Payment" as SubscriptionRenewalPayment
object "Price List" as PriceList
object "Price List Item" as PriceListItem

enum "Subscription Status" as SubscriptionStatus
{
  Active
  Expired
}
enum "Subscription Payment Status" as SubscriptionPaymentStatus
{
  WaitingForPayment
  Paid
  Expired
}
enum "Subscription Renewal Payment Status" as SubscriptionRenewalPaymentStatus
{
  WaitingForPayment
  Paid
  Expired
}
enum "Meeting Fee Payment Status" as MeetingFeePaymentStatus
{
  WaitingForPayment
  Paid
  Expired
}
enum "Price List Item Category" as PriceListItemCategory
{
  New
  Renewal
}
enum "Subscription Period" as SubscriptionPeriod
{
  Month
  HalfYear
}



Payer "1"-->"0..*" MeetingFee : pays for
Payer "1"--> "0..*" Payments.Subscription : buys

MeetingFeePayment "0..*"-->"1" MeetingFee : for
MeetingFeePayment --> MeetingFeePaymentStatus : is in

Payments.Subscription "1"-->"0..*" SubscriptionRenewalPayment: extended by
Payments.Subscription --> SubscriptionStatus : is in
Payments.Subscription --> SubscriptionPeriod : is for

SubscriptionPayment "1..*"-->"1" Payments.Subscription : is for
SubscriptionPayment --> SubscriptionPaymentStatus : is in
SubscriptionPayment --> SubscriptionPeriod : is for

SubscriptionRenewalPayment --> SubscriptionRenewalPaymentStatus: is in
SubscriptionRenewalPayment --> SubscriptionPeriod : is for

PriceListItem --> SubscriptionPeriod : is for
PriceListItem "0..*"-->"1" Country: is for
PriceListItem --> PriceListItemCategory : is for

PriceList "1"-->"1..*" PriceListItem : contains


Payer --> Member: is a
Payer --> User: is a

Payments.Subscription -- Meeting.MemberSubscription
}
@enduml


================================================
FILE: docs/architecture-decision-log/0001-record-architecture-decisions.md
================================================
# 1.  Record architecture decisions

Date: 2019-10-28

## Status

Accepted

## Context

As the project is an example of a more advanced monolith architecture, it is necessary to save all architectural decisions in one place.

## Decision

For all architectural decisions Architecture Decision Log (ADL) is created. All decisions will be recorded as Architecture Decision Records (ADR). 

Each ADR will be recorded using [Michael Nygard template](http://thinkrelevance.com/blog/2011/11/15/documenting-architecture-decisions), which contains following sections: Status, Context, Decision and Consequences.

## Consequences

All architectural decisions should be recorded in log. Old decisions should be recorded as well with an approximate decision date. New decisions should be recorded on a regular basis.

================================================
FILE: docs/architecture-decision-log/0002-use_modular-monolith-system-architecture.md
================================================
# 2.  Use Modular Monolith System Architecture

Date: 2019-07-01

Log date: 2019-10-28

## Status

Accepted

## Context

An advanced example of Modular Monolith architecture and tactical DDD implementation in .NET is missing on the internet.

## Decision

I decided to create nontrivial application using Modular Monolith architecture and Domain-Driven Design tactical patterns.

## Consequences

- All modules must run in one single process as single application (Monolith)
- All modules should have maximum autonomy (Modular)
- DDD Bounded Contexts will be used to divide monolith into modules
- DDD tactical patterns will be used to implement most of modules

================================================
FILE: docs/architecture-decision-log/0003-use_dotnetcore_and_csharp.md
================================================
# 3.  Use .NET Core and C# language

Date: 2019-07-01

Log date: 2019-10-28

## Status

Accepted

## Context

As it is monolith, only one language (or platform) must be selected for implementation.

## Decision

I decided to use:

- .NET Core platform - it is new generation multi-platform, fully supported by Microsoft and open-source community, optimized and designed to replace old .NET Framework
- C# language - most popuplar language in .NET ecosystem, I have 12 years commercial experience
- F# will not be used, I don't have commercial experience with it

## Consequences

- Whole application will be implemented in C# object-oriented language in .NET Core framework
- .NET Core applications can be executed on Windows, MacOS, Linux

================================================
FILE: docs/architecture-decision-log/0004-divide-the-system-into-4-modules.md
================================================
# 4.   Divide the system into 4 modules 

Date: 2019-07-01

Log date: 2019-11-02

## Status

Accepted

## Context

The MyMeetings domain contains 4 main subdomains: Meetings (core domain), Administration (supporting subdomain), Payments (supporting subdomain) and User Access (generic domain).

We use Modular Monolith architecture so we need to implement one application which solves all requirements from all domains listed above.

We need to modularize our system.

## Possible solutions
1. Create one "MyMeetings" module and divide it into sub-modules. This solution is simpler to implement at the beginning. We do not have to set module boundaries and think how to communicate between them. On the other hand, this causes a lack of autonomy and can lead to Big Ball Of Mud anti-pattern.
2. Create 4 modules based on Bounded Contexts which in this scenario maps 1:1 to domains. This solution is more difficult at the beginning. We need to set modules boundaries, communication strategy between modules and have more advanced infrastructure code. It is a more complex solution. On the other hand, it supports autonomy, maintainability, readability. We can develop our Domain Models in all of the Bounded Contexts independently.

## Decision

Solution 2.

We created 4 modules: Meetings, Administration, Payments, User Access. The key factor here is module autonomy and maintainability. We want to develop each module independently. This is more cleaner solution. It involves more work at the beginning but we want to invest.

## Consequences
- We can implement each module/Bounded Context independently.
- We need to set clear boundaries between modules and communication strategy between modules (and implement them)
- We need to define the API of each module
- The API/GUI layer needs to know about all of the modules
- We need to create shared libraries/classes to limit boilerplate code which will be the same in all modules
- Complexity of the whole solution will increase
- Complexity of each module will decrease
- We will have clear separation of concerns
- In addition to the application, we must divide the data
- We will have business concepts modeled in a proper way - without "godclasses" which do everything
- We can delegate development of particular module to defined team, work should be done without any conflicts on codebase

================================================
FILE: docs/architecture-decision-log/0005-create-one-rest-api-module.md
================================================
# 5.   Create one REST API module

Date: 2019-07-01

Log date: 2019-11-04

## Status

Accepted

## Context

We need to expose the API of our application to the outside world. For now, we expect one client of our application - FrontEnd SPA application.

## Possible solutions
1. Create one .NET Core MVC host application which contains all endpoints. This host application will have references to all business modules and communicates with them directly:</br>

Host/API references:</br>
Administration module</br>
Meetings module</br>
Payments module</br>
User Access module</br>

2. Create one .NET Core MVC host application and multiple APIs projects per module. Each API project should have endpoints which are handled by particular business module:</br> 

Host references:</br>
Administration API references Administration module</br>
Meetings API references Meetings module</br>
Payments API references Payments module</br>
User Access API references User Access module</br>

## Decision

Solution 1.

Creating separate API projects for each module will add complexity and little value. Grouping endpoints for a particular business module in a special directory is enough. Another layer on top of the module is unnecessary.

## Consequences
- We will have only one API layer/module
- Each controller has responsibility to delegate Command/Query processing to appropriate module
- We don't need to scan other projects than host for controllers, routes and other MVC mechanisms
- API configuration is easier
- Overall complexity of API layer is lower
- Complexity of each controller is a little bit higher
- Build time will be shorter (less projects)

================================================
FILE: docs/architecture-decision-log/0006-create-facade-between-api-and-business-module.md
================================================
# 6. Create façade between API and business module

Date: 2019-07-01

Log date: 2019-11-04

## Status

Accepted

## Context

Our API layer should communicate with business modules to fulfill client requests. To support the maximum level of autonomy, each module should expose a minimal set of operations (the module API/contract/interface).

## Decision

Each module will provide implementation for one interface with 3 methods:</br>

```csharp
Task<TResult> ExecuteCommandAsync<TResult>(ICommand<TResult> command);

Task ExecuteCommandAsync(ICommand command);

Task<TResult> ExecuteQueryAsync<TResult>(IQuery<TResult> query);
```

This interface will act as a façade (Façade pattern) between API and module. Only Commands, Queries and returned objects (which are part of this interface) should be visible to the API. Everything else should be hidden behind the façade (module encapsulation).

## Consequences
- API can communicate with the module only by façade (the interface).
- Implementation of API is simpler
- We can change module implementation and API does not require change if the interface is not changed
- We need to focus on module encapsulation, sometimes it involves additional work (like instantiation using internal constructors)

================================================
FILE: docs/architecture-decision-log/0007-use-cqrs-architectural-style.md
================================================
# 7. Use CQRS architectural style

Date: 2019-07-01

Log date: 2019-11-04

## Status

Accepted

## Context

Our application should handle 2 types of requests - reading and writing. </br>

For now, it looks like:</br>

- for reading, we need data model in relational form to return data in tabular/flattened way (tables, lists, dictionaries).
- for writing, we need to have a graph of objects to perform more sophisticated work like validations, business rules checks, calculations.

## Decision

We applied the CQRS architectural style/pattern for each business module. Each module will have a separate model for reading and writing. For now, it will be the simplest CQRS implementation when the read model is immediate consistent. This kind of separation is useful even in simple modules like User Access.

## Consequences
- Façade method of each module should take as parameter only Command or Query object
- We have optimized models for writes and reads (SRP principle).
- We can process Commands and Queries in different ways
- As Command or Query is an object, we can easily serialize them and save/log them.

================================================
FILE: docs/architecture-decision-log/0008-allow-return-result-after-command-processing.md
================================================
# 8. Allow return result after command processing

Date: 2019-07-01

Log date: 2019-11-04

## Status

Accepted

## Context

The theory of the CQRS and the CQS principle says that we should not return any information as the result of Command processing. The result should be always "void". However, sometimes we need to return some data immediately as part of the same request.

## Decision

We decided to allow in some cases return results after command processing. Especially, when we create something and we need to return the ID of created object or don't know if request is Command or Query (like Authentication).

## Consequences
- We will have two definitions of Commands and CommandHandlers - with and without result
- It will add some complexity to processing commands (like implementation of decorators)
- We can immediately return the ID of created object/resource. We don't need a second call (query) to retrieve this ID.
- We should be careful to not overuse this approach (sticking as much as possible to the CQRS)

================================================
FILE: docs/architecture-decision-log/0009-use-2-layered-architectural-style-for-reads.md
================================================
# 9. Use 2 layered architectural style for reads

Date: 2019-07-01

Log date: 2019-11-04

## Status

Accepted

## Context

We applied the CQRS style (see [ADR 7. Use CQRS architectural style](007-use-cqrs-architectural-style.md)), now we need to decide how to handle reading (querying) requests.

## Decision

We will use 2 layered architecture to handle queries: API layer and Application Service layer. As we applied the CQRS and created a separated read model, querying should be straightforward so 2 layers are enough. The API layer is responsible for Query creation based on HTTP request and the module Application layer is responsible for query handling.

## Consequences
- Whole query handling logic is in Application Service layer
- Application Service layer is coupled to the database and querying framework
- Solution is simple, easy to understand
- We don't abstract over database
- Performance is better (no object mapping between layers, querying database almost immediately)

================================================
FILE: docs/architecture-decision-log/0010-use-clean-architecture-for-writes.md
================================================
# 10. Use Clean Architecture for writes

Date: 2019-07-01

Log date: 2019-11-05

## Status

Accepted

## Context

We applied the CQRS style (see [ADR #7](0007-use-cqrs-architectural-style.md)), now we need to decide how to handle writing operations (Commands).

## Decision

We will use **Clean Architecture** to handle commands with 4 layers: **API layer**, **Application Service layer**, **Infrastructure layer** and **Domain layer**. </br>
We need to add Domain layer because domain logic will be complex and we want to isolate this logic from other stuff like infrastructure or API. Isolation of domain logic supports testing, maintainability and readability.

## Consequences
- Complexity of the whole solution is higher - we need to add two more layers - domain and infrastructure
- Complexity of implementation of business logic will be smaller - we can focus only on business concerns on this layer
- Complexity of implementation of infrastructure will be smaller - we can focus only on infrastructure concerns on this layer
- Business logic will be testable (no references to other layers)
- Business logic will be independent of persistence (to some level)
- In the Domain layer, we will have the same level of abstraction (close to business)
- Application layer will have louse coupling to the Domain layer and Infrastructure layer (depend  on abstractions only)
- We use one of the most popular application architecture - developers are familiar with it


================================================
FILE: docs/architecture-decision-log/0011-create-rich-domain-models.md
================================================
# 11. Create rich Domain Models

Date: 2019-07-01

Log date: 2019-11-05

## Status

Accepted

## Context

We need to create Domain Models for all of the modules. Each Domain Model should represent a solution that solves a particular set of Domain problems (implements business logic).

## Possible solutions
1. Create Anemic Domain Model (Data Model) and implement *Transaction Script* pattern together with *Active Record* pattern
2. Put all business logic to database in stored procedures
3. Create a Rich Domain Model

## Decision

Solution number 3 - Rich Domain Model</br>

1 - no, because the procedural style of coding will not be enough. We want to focus on behavior, not on the data.</br>
2 - no, keeping business logic in the database is not a good idea in that case, object-oriented programming is better than T-SQL to model our domain and we don't have performance architectural drivers to resign from OOD.</br>

We expect complex business logic with different rules, calculations and processing so we want to get as much as possible from Object-Oriented Design principles like abstraction, encapsulation, polymorphism. We want to mutate the state of our objects only through methods (abstraction) to encapsulate all logic and hide implementation details from the client (the Application Service Layer and Unit Tests).</br>

## Consequences
- All objects should be encapsulated (private by default principle) 
- Encapsulation of objects implies more work in infrastructure (mapping to private fields, collections is harder)
- Encapsulation of objects decreases to some level testability of these objects (Object-Oriented Design vs Testable Design)
- All public methods of domain objects create Domain Model API
- Implementation details of business logic are hidden
- Clients of Domain Model are easier to implement
- Better object-oriented programming skills are required to implement Rich Domain Model
- Is easier to protect business rules/invariants using Rich Domain Model

================================================
FILE: docs/architecture-decision-log/0012-use-domain-driven-design-tactical-patterns.md
================================================
# 12. Use Domain-Driven Design tactical patterns

Date: 2019-07-01

Log date: 2019-11-05

## Status

Accepted

## Context

We decided to use the Clean Architecture ([ADR #10](0010-use-clean-architecture-for-writes.md)) and create Rich Domain Models ([ADR #11](0011-create-rich-domain-models.md)) for each module. We need to define or use some construction elements / building blocks to implement our architecture and business logic.

## Decision

We decided to use **Domain-Driven Design** tactical patterns. They focus on the Domain Model implementation. Especially we will use the following building blocks:

- Command - public method on Aggregate (behavior)
- Domain Event - the immutable class which represents important fact occurred on a special point of time (behavior)
- Entity - class with identity (identity cannot change) with mutable attributes which represents concept from domain
- Value Object - immutable class without an identity which represents concept from domain
- Aggregate - cluster of domain objects (Entities, Value Objects) with one class entry point (Entity as Aggregate Root) which defines the boundary of transaction/consistency and protects business rules and invariants
- Repository - collection-like abstraction to persist and load particular Aggregate
- Domain Service - stateless service to execute some business logic which does not belong to any of Entity/Value Object

## Consequences
- We need to define entities and value objects
- We need to define aggregates boundaries
- We need to add repositories for each aggregate
- We can invoke only public methods on Aggregate Roots, everything else should be hidden
- Developers need to be familiar with DDD tactical patterns

================================================
FILE: docs/architecture-decision-log/0013-protect-business-invariants-using-exceptions.md
================================================
# 13. Protect business invariants using exceptions

Date: 2019-07-01

Log date: 2019-11-05

## Status

Accepted

## Context

Aggregates should check business invariants. When the invariant is broken, we should stop processing and return an error immediately to the client.

## Possible solutions

### 1. Use exceptions
#### Pros
- we can stop processing immediately (fail-fast)
-  popular approach in C# 
-  we don't need to check the result of each method (if-else statements)
-   we can catch all Business Exceptions in one place and translate them (for example in the API layer to some HTTP response code). 
#### Cons
- indirection 
- little performance impact 
- for special cases, we need to add a specific catch.
### 2. Return Result object
#### Pros 
- no indirection
- no performance impact
- signature method is more descriptive. 
### Cons 
- we need to add checks result of each method (if-else statements)
- approach is less-known in the C# world 
- it needs a library or more coding to support Results

## Decision

Solution number 1 - Use exceptions. </br>

Performance cost of throwing an exception is irrelevant, we don't want too many if/else statements in entities, more familiar with exceptions approach.

## Consequences
- We need to add special *BusinessException* class to separate business rules validation exceptions from other exceptions
- We need to create different business exceptions for each business rule
- We will have a small performance impact (throwing exceptions)
- We will have generic mechanism which catches *BusinessException*
- We will not have a lot of if/else statements in Entities/Value Objects to check method results
- Some monitoring tools logs automatically each exception. If we want to use one of this tool we should be aware of this and figure it out proper solution

================================================
FILE: docs/architecture-decision-log/0014-event-driven-communication-between-modules.md
================================================
# 14. Event-driven communication between modules

Date: 2019-07-15

Log date: 2019-11-09

## Status

Accepted

## Context

Each module should be autonomous. However, communication between them must take place. We have to decide what will be the preferred way of communication and integration between modules.

## Possible solutions

### 1. Direct method call (synchronous)

Each Module will expose a set of methods (interface, module API) which can be called by other modules directly.

#### Pros
- easier implementation
- no indirection
- more natural in the monolith architecture
- supports immediate consistency
#### Cons
- less autonomy
- strong coupling between modules
- direct method call is blocking
- module has a dependency on another module

### 2. Event-driven (asynchronous)

Each module will publish a specific set of events. Other modules can subscribe to specific events. It is the implementation of _Publish/Subscribe_ pattern.

#### Pros
- more autonomy
- coupling is only to middleware/broker of events
- no blocking communication
- stronger modules boundaries
- module does not have a dependency on another module
#### Cons
- indirection
- more complex solution
- middleware/broker is needed
- does not support immediate consistency

## Decision

Solution number 2 - Event-driven (asynchronous)</br>

We want to achieve the maximum level of autonomy and loose coupling between modules. Moreover, we don't want dependencies between modules. We allow direct calls in the future, but this should be an exception, not a rule.

## Consequences
- We need to implement the Publish/Subscribe pattern
- Solution will be more complex
- Modules will have more autonomy
- Modules will have coupling to broker/middleware
- During modules integration, eventual consistency will occur (asynchronous communication)
- Events become Published Language of our Bounded Contexts (modules)
- Events structure should be stable as much as possible

================================================
FILE: docs/architecture-decision-log/0015-use-in-memory-events-bus.md
================================================
# 15. Use In-Memory Events Bus

Date: 2019-07-15

Log date: 2019-11-09

## Status

Accepted

## Context

As we want to base inter-modular communication on asynchronous communication in the form of event-driven architecture, we need some "events bus" to do that.

## Possible solutions

### 1. In Memory Events Bus

In memory Publish/Subscribe implementation without any external component.

#### Pros
- very easy to implement
- no network communication needed
- performance (it depends)
- no need to learn anything
- simple solution
#### Cons
- does not support more advanced integration scenarios, everything needs to be implemented
- does not have configuration
- does not have other features (who have messaging brokers)

### 2. Message Broker

External middleware component. It could be a low-level broker (like RabbitMQ) or a high-level broker (like MassTransit, NServiceBus). 

#### Pros
- only integration with platform code needed
- more advanced integration scenarios
- richness of configuration
- a lot of features
#### Cons
- complex solution
- network communication
- new platform learning needed
- performance (it depends)

## Decision

Solution number 1 - In Memory Events Bus</br>

At that moment we don't see more advanced integration scenarios in our system than simple publish/subscribe scenario. We decided to follow the simplest scenario and if it will be necessary - move to more advanced.

## Consequences
- We need to implement Publish/Subscribe in memory
- All modules will have dependency to In Memory Events Bus to publish events/subscribe to events
- if we ever want to separate a module to another process (microservices architecture), we will need to switch to middleware

================================================
FILE: docs/architecture-decision-log/0016-create-ioc-container-per-module.md
================================================
# 16. Create an IoC Container per module

Date: 2019-07-15

Log date: 2019-11-09

## Status

Accepted

## Context

For each module, when we process particular Command or Query, we need to resolve a graph of objects. We need to decide how dependencies of objects will be resolved.

## Possible solutions

### 1. One IoC Container for whole application

One IoC container located in the host project.

#### Pros
- standard approach
- dependencies configured in one place
#### Cons
- couples host application with all of projects, libraries
- modules autonomy decreases
- strong coupling

### 2. IoC Container per module

Multiple IoC containers per modules.

#### Pros
- module autonomy
- loose coupling 
- host application has dependency only to Application Service Layer
#### Cons
- duplicated code
- non-standard approach

## Decision

Solution number 2 - IoC Container per module</br>

IoC Container per module supports the autonomy of the module and louse coupling so this is a more important aspect for us than duplicated code in some places.

## Consequences
- Create and maintain an IoC Container for each module
- Implementation is not standard, but still acceptable easy
- We can add dependencies to module and other modules are intact

================================================
FILE: docs/architecture-decision-log/0017-implement-archictecture-tests.md
================================================
# 17. Implement Architecture Tests

Date: 2019-11-16

## Status

Accepted

## Context

In some cases it is not possible to enforce the application architecture, design or established conventions using compiler (compile-time). For this reason, code implementations can diverge from the original design and architecture. We want to minimize this behavior, not only by code review.

## Decision

We decided to implement Unit Tests for our architecture. </br>
We will implement tests for each module separately and one tests library for general architecture. We will use _NetArchTest_ library which was created exactly for this purpose.

## Consequences
- We will have quick feedback about breaking the design rules
- Unit tests for architecture are documenting our architecture to some level
- We will have dependency to external library
- We need to implement some _"reflection-based"_ code to check some rules, because library does not provide everything what we need
- This kind of tests are a bit slower than normal unit tests (because of reflection)
- More tests to maintain

================================================
FILE: docs/catalog-of-terms/Aggregate-DDD/README.md
================================================
# Aggregate (DDD)

## Definition

*Cluster ENTITES and VALUE OBJECTS into AGGREGATES and define boundaries around each. Choose one ENTITY to be the root of each AGGREGATE, and control all access to the objects inside the boundary through the root. Transient references to internal members can be passed out for use within a single operation only. Because the root controls access, it cannot be blindsided by changes to the internals. This arrangement makes it practical to enforce all invariants for objects in the AGGREGATE and for the AGGREGATE as a whole in any state change.*

Source: [Domain-Driven Design: Tackling Complexity in the Heart of Software, Eric Evans](https://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215)

## Example

### Model

![](http://www.plantuml.com/plantuml/png/FOx13i8m34FlV0LyG9Sxfo7rHx8cTDFQPaeJJV3rT1SkjcpPqfkxePhNSdjiBHKdTYttrUpeJm35SygRhRvuPqtIZ9jDIIhiMR-VXNUeGbvGGvKcPKp3UGaHGSLkh42IEYGqB9A3lCFeQeTNpiePZKEC4V2Vnd4wBfoP6mt_0G00)

### Code

```csharp

public class MeetingGroup : Entity, IAggregateRoot
{
    public MeetingGroupId Id { get; private set; }

    private string _name;

    private string _description;

    private MeetingGroupLocation _location;

    private MemberId _creatorId;

    private List<MeetingGroupMember> _members;

    private DateTime _createDate;

    private DateTime? _paymentDateTo;

    internal static MeetingGroup CreateBasedOnProposal(
        MeetingGroupProposalId meetingGroupProposalId,
        string name,
        string description,
        MeetingGroupLocation location,
        MemberId creatorId)
    {
        return new MeetingGroup(meetingGroupProposalId, name, description, location, creatorId);
    }

    private MeetingGroup()
    {
        // Only for EF.
    }

    private MeetingGroup(MeetingGroupProposalId meetingGroupProposalId, string name, string description, MeetingGroupLocation location, MemberId creatorId)
    {
        this.Id = new MeetingGroupId(meetingGroupProposalId.Value);
        this._name = name;
        this._description = description;
        this._creatorId = creatorId;
        this._location = location;
        this._createDate = SystemClock.Now;

        this.AddDomainEvent(new MeetingGroupCreatedDomainEvent(this.Id, creatorId));

        this._members = new List<MeetingGroupMember>();
        this._members.Add(MeetingGroupMember.CreateNew(this.Id, this._creatorId, MeetingGroupMemberRole.Organizer));
    }

    public void EditGeneralAttributes(string name, string description, MeetingGroupLocation location)
    {
        this._name = name;
        this._description = description;
        this._location = location;

        this.AddDomainEvent(new MeetingGroupGeneralAttributesEditedDomainEvent(this._name, this._description, this._location));
    }

    public void JoinToGroupMember(MemberId memberId)
    {
        this.CheckRule(new MeetingGroupMemberCannotBeAddedTwiceRule(_members, memberId));

        this._members.Add(MeetingGroupMember.CreateNew(this.Id, memberId, MeetingGroupMemberRole.Member));
    }

    public void LeaveGroup(MemberId memberId)
    {
        this.CheckRule(new NotActualGroupMemberCannotLeaveGroupRule(_members, memberId));

        var member = this._members.Single(x => x.IsMember(memberId));

        member.Leave();
    }

    public void SetExpirationDate(DateTime dateTo)
    {
        _paymentDateTo = dateTo;

        this.AddDomainEvent(new MeetingGroupPaymentInfoUpdatedDomainEvent(this.Id, _paymentDateTo.Value));
    }

    public Meeting CreateMeeting(
        string title,
        MeetingTerm term,
        string description,
        MeetingLocation location,
        int? attendeesLimit,
        int guestsLimit,
        Term rsvpTerm,
        MoneyValue eventFee,
        List<MemberId> hostsMembersIds,
        MemberId creatorId)
    {
        this.CheckRule(new MeetingCanBeOrganizedOnlyByPayedGroupRule(_paymentDateTo));

        this.CheckRule(new MeetingHostMustBeAMeetingGroupMemberRule(creatorId, hostsMembersIds, _members));

        return Meeting.CreateNew(
            this.Id,
            title,
            term,
            description,
            location,
            MeetingLimits.Create(attendeesLimit, guestsLimit),
            rsvpTerm,
            eventFee,
            hostsMembersIds,
            creatorId);
    }

    internal bool IsMemberOfGroup(MemberId attendeeId)
    {
        return _members.Any(x => x.IsMember(attendeeId));
    }

    internal bool IsOrganizer(MemberId memberId)
    {
        return _members.Any(x => x.IsOrganizer(memberId));
    }
}

```

### Description

Classes `MeetingGroup`, `MeetingGroupLocation`, `MeetingGroupId`, `MeetingGroupMember', 'MeetingGroupMemberRole` form the **Aggregate**. `MeetingGroup` acts as the **AggregateRoot** (*Choose one ENTITY to be the root of each AGGREGATE*). AggregateRoot has a global identifier (`Id`) and public methods to change state of the *Aggregate*. The rest is encapsulated (*Because the root controls access, it cannot be blindsided by changes to the internals*). For each public method, the invariants are checked first (`CheckRule`) (*This arrangement makes it practical to enforce all invariants for objects in the AGGREGATE and for the AGGREGATE as a whole in any state change*).

## Additional References

- [DDD_Aggregate (Martin Fowler)](https://martinfowler.com/bliki/DDD_Aggregate.html)

================================================
FILE: docs/catalog-of-terms/Aggregate-DDD/aggregate-ddd.puml
================================================
@startuml Aggregate

package "Meeting Groups Aggregate" <<Rectangle>> {

    class "MeetingGroupId" << VO >> {   

    }
    
    class "MeetingGroup" << Entity, AR >> {
        -string: _description
        -DateTime: _createDate
        -DateTime: _paymentDateTo
        {static} MeetingGroup CreateBasedOnProposal()
        Meeting CreateMeeting(..)
        void SetExpirationDate(DateTime dateTo)
        void JoinToGroupMember(MemberId memberId)
        void LeaveGroup(MemberId memberId)
        void EditGeneralAttributes(...)
        bool IsMemberOfGroup(MemberId attendeeId)
        bool IsOrganizer(MemberId memberId)
    }

    class "MeetingGroupLocation" << VO >> {
        string City
        string CountryCode
        {static} MeetingGroupLocation Create(...)

    }

    class "MeetingGroupMember" << Entity >> {
        ~DateTime JoinedDate
        -bool _isActive
        -DateTime? _leaveDate
        {static} MeetingGroupMember CreateNew(...)
        void Leave()
        ~bool IsMember(MemberId memberId)
        ~bool IsOrganizer(MemberId memberId)
    }

    class "MemberId" << VO >> {

    }

    class "MeetingGroupMemberRole" << VO >> {
        string Value
    }
}

class "Member" << Entity, AR >> {

}

"MeetingGroup" *-- "MeetingGroupId" : of
"MeetingGroup" *-- "MeetingGroupLocation" : for
"MeetingGroup" "1" *-- "0..*" "MeetingGroupMember" : member of
"MeetingGroupMember" *-- "MemberId" : assigned to
"MeetingGroupMemberRole" --* "MeetingGroupMember" : is assigned to

"Member" o-- "MemberId" : of

@enduml

================================================
FILE: docs/catalog-of-terms/Command/README.md
================================================
# Command

## Definition

*A command is a request made to do something. A command represents the intention of a system’s user regarding what the system will do to change its state.*

*Command characteristics:*

- *The result of a command can be either success or failure; the result is an [Event(s)](../Event/)*

- *In case of success, state change(s) must have occurred somewhere (otherwise nothing happened)*

- *Commands should be named with a verb, in the present tense or infinitive, and a nominal group coming from the domain (entity of aggregate type)*

Source: [Open Agile Architecture](https://pubs.opengroup.org/architecture/o-aa-standard/#KLP-EDA-event-command)


## Example

### Model

### Code

`Meeting` class in [Domain Model](../Domain-Model/):

```csharp

public void Cancel(MemberId cancelMemberId)
{
    this.CheckRule(new MeetingCannotBeChangedAfterStartRule(_term));

    if (!_isCanceled)
    {
        _isCanceled = true;
        _cancelDate = SystemClock.Now;
        _cancelMemberId = cancelMemberId;

        this.AddDomainEvent(new MeetingCanceledDomainEvent(this.Id, _cancelMemberId, _cancelDate.Value));
    }
}

```

`CancelMeetingCommand` class in [Application Layer](../Application-Layer/)

```csharp

public class CancelMeetingCommand : CommandBase
{
    public CancelMeetingCommand(Guid meetingId)
    {
        MeetingId = meetingId;
    }

    public Guid MeetingId { get; }
}

internal class CancelMeetingCommandHandler : ICommandHandler<CancelMeetingCommand>
{
    private readonly IMeetingRepository _meetingRepository;
    private readonly IMemberContext _memberContext;

    internal CancelMeetingCommandHandler(IMeetingRepository meetingRepository, IMemberContext memberContext)
    {
        _meetingRepository = meetingRepository;
        _memberContext = memberContext;
    }

    public async Task<Unit> Handle(CancelMeetingCommand request, CancellationToken cancellationToken)
    {
        var meeting = await _meetingRepository.GetByIdAsync(new MeetingId(request.MeetingId));

        meeting.Cancel(_memberContext.MemberId);

        return Unit.Value;
    }
}

```

### Description

In the example above, we can distinguish between 2 types of Commands:
- as an object in the application layer [Parameter Object Pattern](../Parameter-Object-Pattern/)
- in the form of a method on the object (in DDD on the [Aggregate](../Aggregate-DDD/)

The most important thing is that the Command can be rejected until the state changes. In both the `CommandHandler` (invalid MeetingId) and the `Cancel` method (business rule broken), an exception can be thrown and the Command is then rejected and all uncomitted changes are rolled back (state does not change). 

================================================
FILE: docs/catalog-of-terms/Command/command.puml
================================================
@startuml Command

class CancelMeetingCommand {
    MeetingGroupId: Id
}

note top of CancelMeetingCommand : Command as part of Application Layer

class Meeting {
    void Cancel(MemberId cancelMemberId)
}

note top of Meeting : Command defined in Domain Model (on an Aggregate)

@enduml

================================================
FILE: docs/catalog-of-terms/Decorator-Pattern/README.md
================================================
# Decorator Pattern

## Definition

*In object-oriented programming, the decorator pattern is a design pattern that allows behavior to be added to an individual object, dynamically, without affecting the behavior of other objects from the same class. The decorator pattern is often useful for adhering to the [Single Responsibility Principle](../Single-Responsibility-Principle/), as it allows functionality to be 
Download .txt
gitextract_sty9z65e/

├── .github/
│   └── workflows/
│       └── buildPipeline.yml
├── .gitignore
├── .nuke/
│   ├── build.schema.json
│   └── parameters.json
├── LICENSE
├── README.md
├── azure-pipelines.yml
├── build/
│   ├── .editorconfig
│   ├── Build.cs
│   ├── BuildIntegrationTests.cs
│   ├── Configuration.cs
│   ├── Database.cs
│   ├── Directory.Build.props
│   ├── Directory.Build.targets
│   ├── SUTCreator.cs
│   ├── Utils/
│   │   └── SqlReadinessChecker.cs
│   ├── _build.csproj
│   └── _build.csproj.DotSettings
├── build.cmd
├── build.ps1
├── build.sh
├── docker-compose.yml
├── docs/
│   ├── C4/
│   │   ├── c1_system_context.puml
│   │   ├── c2_container.puml
│   │   ├── c3_components.puml
│   │   ├── c3_components_module.puml
│   │   └── c4_class.puml
│   ├── PlantUML/
│   │   ├── Commenting_Conceptual_Model.puml
│   │   └── Conceptual_Model.puml
│   ├── Project/
│   │   └── MyMeetings.vpp
│   ├── architecture-decision-log/
│   │   ├── 0001-record-architecture-decisions.md
│   │   ├── 0002-use_modular-monolith-system-architecture.md
│   │   ├── 0003-use_dotnetcore_and_csharp.md
│   │   ├── 0004-divide-the-system-into-4-modules.md
│   │   ├── 0005-create-one-rest-api-module.md
│   │   ├── 0006-create-facade-between-api-and-business-module.md
│   │   ├── 0007-use-cqrs-architectural-style.md
│   │   ├── 0008-allow-return-result-after-command-processing.md
│   │   ├── 0009-use-2-layered-architectural-style-for-reads.md
│   │   ├── 0010-use-clean-architecture-for-writes.md
│   │   ├── 0011-create-rich-domain-models.md
│   │   ├── 0012-use-domain-driven-design-tactical-patterns.md
│   │   ├── 0013-protect-business-invariants-using-exceptions.md
│   │   ├── 0014-event-driven-communication-between-modules.md
│   │   ├── 0015-use-in-memory-events-bus.md
│   │   ├── 0016-create-ioc-container-per-module.md
│   │   └── 0017-implement-archictecture-tests.md
│   ├── catalog-of-terms/
│   │   ├── Aggregate-DDD/
│   │   │   ├── README.md
│   │   │   └── aggregate-ddd.puml
│   │   ├── Command/
│   │   │   ├── README.md
│   │   │   └── command.puml
│   │   ├── Decorator-Pattern/
│   │   │   ├── README.md
│   │   │   └── decorator-pattern.puml
│   │   ├── Dependency-Injection/
│   │   │   ├── README.md
│   │   │   └── dependency-injection.puml
│   │   ├── Domain-Event/
│   │   │   ├── README.md
│   │   │   └── domain-event.puml
│   │   ├── Entity-DDD/
│   │   │   ├── README.md
│   │   │   └── entity-ddd.puml
│   │   ├── Event/
│   │   │   └── README.md
│   │   ├── Event-Driven-Architecture/
│   │   │   └── README.md
│   │   ├── Event-Sourcing/
│   │   │   └── README.md
│   │   ├── Event-Storming/
│   │   │   └── README.md
│   │   ├── Integration-Event/
│   │   │   └── README.md
│   │   ├── README.md
│   │   ├── Strategy-Pattern/
│   │   │   ├── README.md
│   │   │   └── strategy-pattern.puml
│   │   └── ValueObject-DDD/
│   │       ├── README.md
│   │       └── value-object-ddd.puml
│   └── mutation-tests-reports/
│       └── mutation-report.html
├── runIntegrationTests.cmd
└── src/
    ├── .dockerignore
    ├── .editorconfig
    ├── API/
    │   ├── CompanyName.MyMeetings.API/
    │   │   ├── CompanyName.MyMeetings.API.csproj
    │   │   ├── Configuration/
    │   │   │   ├── Authorization/
    │   │   │   │   ├── AttributeAuthorizationHandler.cs
    │   │   │   │   ├── AuthorizationChecker.cs
    │   │   │   │   ├── HasPermissionAttribute.cs
    │   │   │   │   ├── HasPermissionAuthorizationHandler.cs
    │   │   │   │   ├── HasPermissionAuthorizationRequirement.cs
    │   │   │   │   └── NoPermissionRequiredAttribute.cs
    │   │   │   ├── ExecutionContext/
    │   │   │   │   ├── CorrelationMiddleware.cs
    │   │   │   │   └── ExecutionContextAccessor.cs
    │   │   │   ├── Extensions/
    │   │   │   │   └── SwaggerExtensions.cs
    │   │   │   └── Validation/
    │   │   │       ├── BusinessRuleValidationExceptionProblemDetails.cs
    │   │   │       └── InvalidCommandProblemDetails.cs
    │   │   ├── Modules/
    │   │   │   ├── Administration/
    │   │   │   │   ├── AdministrationAutofacModule.cs
    │   │   │   │   ├── AdministrationPermissions.cs
    │   │   │   │   └── MeetingGroupProposals/
    │   │   │   │       └── MeetingGroupProposalsController.cs
    │   │   │   ├── Meetings/
    │   │   │   │   ├── Countries/
    │   │   │   │   │   └── CountriesController.cs
    │   │   │   │   ├── MeetingCommentingConfiguration/
    │   │   │   │   │   └── MeetingCommentingConfigurationController.cs
    │   │   │   │   ├── MeetingComments/
    │   │   │   │   │   ├── AddMeetingCommentRequest.cs
    │   │   │   │   │   ├── EditMeetingCommentRequest.cs
    │   │   │   │   │   └── MeetingCommentsController.cs
    │   │   │   │   ├── MeetingGroupProposals/
    │   │   │   │   │   ├── MeetingGroupProposalsController.cs
    │   │   │   │   │   └── ProposeMeetingGroupRequest.cs
    │   │   │   │   ├── MeetingGroups/
    │   │   │   │   │   ├── CreateNewMeetingGroupRequest.cs
    │   │   │   │   │   ├── EditMeetingGroupGeneralAttributesRequest.cs
    │   │   │   │   │   └── MeetingGroupsController.cs
    │   │   │   │   ├── Meetings/
    │   │   │   │   │   ├── AddMeetingAttendeeRequest.cs
    │   │   │   │   │   ├── ChangeMeetingMainAttributesRequest.cs
    │   │   │   │   │   ├── CreateMeetingRequest.cs
    │   │   │   │   │   ├── MeetingsController.cs
    │   │   │   │   │   ├── RemoveMeetingAttendeeRequest.cs
    │   │   │   │   │   ├── SetMeetingAttendeeRequest.cs
    │   │   │   │   │   └── SetMeetingHostRequest.cs
    │   │   │   │   ├── MeetingsAutofacModule.cs
    │   │   │   │   └── MeetingsPermissions.cs
    │   │   │   ├── Payments/
    │   │   │   │   ├── MeetingFees/
    │   │   │   │   │   ├── CreateMeetingFeePaymentRequest.cs
    │   │   │   │   │   ├── MeetingFeePaymentsController.cs
    │   │   │   │   │   └── RegisterMeetingFeePaymentRequest.cs
    │   │   │   │   ├── Payers/
    │   │   │   │   │   └── PayersController.cs
    │   │   │   │   ├── PaymentsAutofacModule.cs
    │   │   │   │   ├── PaymentsPermissions.cs
    │   │   │   │   ├── PriceListItems/
    │   │   │   │   │   ├── ChangePriceListItemAttributesRequest.cs
    │   │   │   │   │   ├── CreatePriceListItemRequest.cs
    │   │   │   │   │   ├── GetPriceListItemRequest.cs
    │   │   │   │   │   └── PriceListItemsController.cs
    │   │   │   │   ├── RegisterSubscriptionRenewalPaymentRequest.cs
    │   │   │   │   ├── SubscriptionRenewalsController.cs
    │   │   │   │   └── Subscriptions/
    │   │   │   │       ├── BuySubscriptionRequest.cs
    │   │   │   │       ├── RegisterSubscriptionPaymentRequest.cs
    │   │   │   │       ├── RenewSubscriptionRequest.cs
    │   │   │   │       ├── SubscriptionPaymentsController.cs
    │   │   │   │       └── SubscriptionsController.cs
    │   │   │   └── UserAccess/
    │   │   │       ├── AuthenticatedUserController.cs
    │   │   │       ├── EmailsController.cs
    │   │   │       ├── RegisterNewUserRequest.cs
    │   │   │       ├── UserAccessAutofacModule.cs
    │   │   │       └── UserRegistrationsController.cs
    │   │   ├── Program.cs
    │   │   ├── Properties/
    │   │   │   └── launchSettings.json
    │   │   ├── Startup.cs
    │   │   ├── appsettings.Development.json
    │   │   ├── appsettings.Production.json
    │   │   ├── appsettings.json
    │   │   ├── entrypoint.sh
    │   │   └── tempkey.rsa
    │   └── RequestExamples/
    │       ├── Authentication.http
    │       ├── Users.http
    │       └── http-client.env.json
    ├── BuildingBlocks/
    │   ├── Application/
    │   │   ├── CompanyName.MyMeetings.BuildingBlocks.Application.csproj
    │   │   ├── Data/
    │   │   │   └── ISqlConnectionFactory.cs
    │   │   ├── Emails/
    │   │   │   ├── EmailMessage.cs
    │   │   │   └── IEmailSender.cs
    │   │   ├── Events/
    │   │   │   ├── DomainNotificationBase.cs
    │   │   │   └── IDomainEventNotification.cs
    │   │   ├── IExecutionContextAccessor.cs
    │   │   ├── InvalidCommandException.cs
    │   │   ├── Outbox/
    │   │   │   ├── IOutbox.cs
    │   │   │   └── OutboxMessage.cs
    │   │   └── Queries/
    │   │       ├── IPagedQuery.cs
    │   │       ├── PageData.cs
    │   │       └── PagedQueryHelper.cs
    │   ├── Domain/
    │   │   ├── BusinessRuleValidationException.cs
    │   │   ├── CompanyName.MyMeetings.BuildingBlocks.Domain.csproj
    │   │   ├── DomainEventBase.cs
    │   │   ├── Entity.cs
    │   │   ├── IAggregateRoot.cs
    │   │   ├── IBusinessRule.cs
    │   │   ├── IDomainEvent.cs
    │   │   ├── IgnoreMemberAttribute.cs
    │   │   ├── TypedIdValueBase.cs
    │   │   └── ValueObject.cs
    │   ├── Infrastructure/
    │   │   ├── BiDictionary.cs
    │   │   ├── CompanyName.MyMeetings.BuildingBlocks.Infrastructure.csproj
    │   │   ├── DomainEventsDispatching/
    │   │   │   ├── DomainEventsAccessor.cs
    │   │   │   ├── DomainEventsDispatcher.cs
    │   │   │   ├── DomainEventsDispatcherNotificationHandlerDecorator.cs
    │   │   │   ├── DomainNotificationsMapper.cs
    │   │   │   ├── IDomainEventsAccessor.cs
    │   │   │   ├── IDomainEventsDispatcher.cs
    │   │   │   ├── IDomainNotificationsMapper.cs
    │   │   │   └── UnitOfWorkCommandHandlerDecorator.cs
    │   │   ├── Emails/
    │   │   │   ├── EmailSender.cs
    │   │   │   └── EmailsConfiguration.cs
    │   │   ├── EventBus/
    │   │   │   ├── IEventsBus.cs
    │   │   │   ├── IIntegrationEventHandler.cs
    │   │   │   ├── InMemoryEventBus.cs
    │   │   │   ├── InMemoryEventBusClient.cs
    │   │   │   └── IntegrationEvent.cs
    │   │   ├── IUnitOfWork.cs
    │   │   ├── Inbox/
    │   │   │   └── InboxMessage.cs
    │   │   ├── InternalCommands/
    │   │   │   ├── IInternalCommandsMapper.cs
    │   │   │   ├── InternalCommand.cs
    │   │   │   └── InternalCommandsMapper.cs
    │   │   ├── Serialization/
    │   │   │   └── AllPropertiesContractResolver.cs
    │   │   ├── ServiceProviderWrapper.cs
    │   │   ├── SqlConnectionFactory.cs
    │   │   ├── StronglyTypedIdValueConverterSelector.cs
    │   │   ├── TypedIdValueConverter.cs
    │   │   └── UnitOfWork.cs
    │   └── Tests/
    │       ├── Application.UnitTests/
    │       │   ├── CompanyName.MyMeetings.BuildingBlocks.Application.UnitTests.csproj
    │       │   └── Queries/
    │       │       └── PagedQueryHelperTests.cs
    │       └── IntegrationTests/
    │           ├── CompanyName.MyMeetings.BuildingBlocks.IntegrationTests.csproj
    │           ├── EnvironmentVariablesProvider.cs
    │           └── Probing/
    │               ├── AssertErrorException.cs
    │               ├── IProbe.cs
    │               ├── Poller.cs
    │               └── Timeout.cs
    ├── CompanyName.MyMeetings.sln
    ├── Database/
    │   ├── .dockerignore
    │   ├── ClearDatabase.sql
    │   ├── CompanyName.MyMeetings.Database/
    │   │   ├── CompanyName.MyMeetings.Database.sqlproj
    │   │   ├── Scripts/
    │   │   │   ├── ClearDatabase.sql
    │   │   │   ├── CreateDatabase.sql
    │   │   │   ├── CreateDatabase_Linux.sql
    │   │   │   ├── CreateDatabase_Windows.sql
    │   │   │   ├── CreateStructure.sql
    │   │   │   ├── Migrations/
    │   │   │   │   └── 1_0_0_0/
    │   │   │   │       ├── 0001_initial_structure.sql
    │   │   │   │       ├── 0002_change_meeting_comments_edit_date_type_and_add_meeting_comments_view.sql
    │   │   │   │       ├── 0003_add_meetings_countries_table.sql
    │   │   │   │       ├── 0004_add_meeting_commenting_configurations_table.sql
    │   │   │   │       ├── 0005_add_payer_id_to_subcription_details_view.sql
    │   │   │   │       ├── 0006_add_member_meeting_groups_view.sql
    │   │   │   │       ├── 0007_add_meeting_attendees_view.sql
    │   │   │   │       ├── 0008_add_meeting_details_view.sql
    │   │   │   │       ├── 0009_add_mock_emails_table.sql
    │   │   │   │       ├── 0010_add_member_meetings_view.sql
    │   │   │   │       ├── 0011_add_likes_count_to_meeting_comments_table.sql
    │   │   │   │       ├── 0012_add_likes_count_to_meeting_comments_view.sql
    │   │   │   │       ├── 0013_add_meeting_member_comment_likes_table.sql
    │   │   │   │       └── 0014_add_missing_tables_for_registrations.sql
    │   │   │   ├── SeedDatabase.sql
    │   │   │   └── Seeds/
    │   │   │       └── 0001_SeedCountries.sql
    │   │   └── Structure/
    │   │       ├── Security/
    │   │       │   └── Schemas.sql
    │   │       ├── administration/
    │   │       │   ├── Tables/
    │   │       │   │   ├── InboxMessages.sql
    │   │       │   │   ├── InternalCommands.sql
    │   │       │   │   ├── MeetingGroupProposals.sql
    │   │       │   │   ├── Members.sql
    │   │       │   │   └── OutboxMessages.sql
    │   │       │   └── Views/
    │   │       │       ├── v_MeetingGroupProposals.sql
    │   │       │       └── v_Members.sql
    │   │       ├── app/
    │   │       │   └── Tables/
    │   │       │       ├── Emails.sql
    │   │       │       └── MigrationsJournal.sql
    │   │       ├── meetings/
    │   │       │   ├── Tables/
    │   │       │   │   ├── Countries.sql
    │   │       │   │   ├── InboxMessages.sql
    │   │       │   │   ├── InternalCommands.sql
    │   │       │   │   ├── MeetingAttendees.sql
    │   │       │   │   ├── MeetingCommentingConfigurations.sql
    │   │       │   │   ├── MeetingComments.sql
    │   │       │   │   ├── MeetingGroupMembers.sql
    │   │       │   │   ├── MeetingGroupProposals.sql
    │   │       │   │   ├── MeetingGroups.sql
    │   │       │   │   ├── MeetingMemberCommentLikes.sql
    │   │       │   │   ├── MeetingNotAttendees.sql
    │   │       │   │   ├── MeetingWaitlistMembers.sql
    │   │       │   │   ├── Meetings.sql
    │   │       │   │   ├── MemberSubscriptions.sql
    │   │       │   │   ├── Members.sql
    │   │       │   │   └── OutboxMessages.sql
    │   │       │   └── Views/
    │   │       │       ├── v_Countries.sql
    │   │       │       ├── v_MeetingAttendees.sql
    │   │       │       ├── v_MeetingComments.sql
    │   │       │       ├── v_MeetingDetails.sql
    │   │       │       ├── v_MeetingGroupMembers.sql
    │   │       │       ├── v_MeetingGroupProposals.sql
    │   │       │       ├── v_MeetingGroups.sql
    │   │       │       ├── v_Meetings.sql
    │   │       │       ├── v_MemberMeetingGroups.sql
    │   │       │       ├── v_MemberMeetings.sql
    │   │       │       └── v_Members.sql
    │   │       ├── payments/
    │   │       │   ├── Tables/
    │   │       │   │   ├── InboxMessages.sql
    │   │       │   │   ├── InternalCommands.sql
    │   │       │   │   ├── MeetingFees.sql
    │   │       │   │   ├── Messages.sql
    │   │       │   │   ├── OutboxMessages.sql
    │   │       │   │   ├── Payers.sql
    │   │       │   │   ├── PriceListItems.sql
    │   │       │   │   ├── Streams.sql
    │   │       │   │   ├── SubscriptionCheckpoints.sql
    │   │       │   │   ├── SubscriptionDetails.sql
    │   │       │   │   └── SubscriptionPayments.sql
    │   │       │   └── Types/
    │   │       │       └── NewStreamMessages.sql
    │   │       ├── registrations/
    │   │       │   ├── Tables/
    │   │       │   │   ├── InboxMessages.sql
    │   │       │   │   ├── InternalCommands.sql
    │   │       │   │   ├── OutboxMessages.sql
    │   │       │   │   └── UserRegistrations.sql
    │   │       │   └── Views/
    │   │       │       └── v_UserRegistrations.sql
    │   │       └── users/
    │   │           ├── Tables/
    │   │           │   ├── InboxMessages.sql
    │   │           │   ├── InternalCommands.sql
    │   │           │   ├── OutboxMessages.sql
    │   │           │   ├── Permissions.sql
    │   │           │   ├── RolesToPermissions.sql
    │   │           │   ├── UserRoles.sql
    │   │           │   └── Users.sql
    │   │           └── Views/
    │   │               ├── v_UserPermissions.sql
    │   │               ├── v_UserRoles.sql
    │   │               └── v_Users.sql
    │   ├── CompanyName.MyMeetings.Database.Build/
    │   │   └── CompanyName.MyMeetings.Database.Build.csproj
    │   ├── DatabaseMigrator/
    │   │   ├── .dockerignore
    │   │   ├── DatabaseMigrator.csproj
    │   │   ├── Program.cs
    │   │   └── SerilogUpgradeLog.cs
    │   ├── Dockerfile
    │   ├── Dockerfile_DatabaseMigrator
    │   ├── InitializeDatabase.sql
    │   ├── entrypoint.sh
    │   ├── entrypoint_DatabaseMigrator.sh
    │   └── wait-for-it.sh
    ├── Directory.Build.props
    ├── Directory.Build.targets
    ├── Directory.Packages.props
    ├── Dockerfile
    ├── Modules/
    │   ├── Administration/
    │   │   ├── Application/
    │   │   │   ├── CompanyName.MyMeetings.Modules.Administration.Application.csproj
    │   │   │   ├── Configuration/
    │   │   │   │   ├── Commands/
    │   │   │   │   │   ├── ICommandHandler.cs
    │   │   │   │   │   ├── ICommandsScheduler.cs
    │   │   │   │   │   └── InternalCommandBase.cs
    │   │   │   │   └── Queries/
    │   │   │   │       └── IQueryHandler.cs
    │   │   │   ├── Contracts/
    │   │   │   │   ├── CommandBase.cs
    │   │   │   │   ├── IAdministrationModule.cs
    │   │   │   │   ├── ICommand.cs
    │   │   │   │   ├── IQuery.cs
    │   │   │   │   ├── IRecurringCommand.cs
    │   │   │   │   └── QueryBase.cs
    │   │   │   ├── MeetingGroupProposals/
    │   │   │   │   ├── AcceptMeetingGroupProposal/
    │   │   │   │   │   ├── AcceptMeetingGroupProposalCommand.cs
    │   │   │   │   │   ├── AcceptMeetingGroupProposalCommandHandler.cs
    │   │   │   │   │   ├── MeetingGroupProposalAcceptedNotification.cs
    │   │   │   │   │   └── MeetingGroupProposalAcceptedNotificationHandler.cs
    │   │   │   │   ├── GetMeetingGroupProposal/
    │   │   │   │   │   ├── GetMeetingGroupProposalQuery.cs
    │   │   │   │   │   ├── GetMeetingGroupProposalQueryHandler.cs
    │   │   │   │   │   └── MeetingGroupProposalDto.cs
    │   │   │   │   ├── GetMeetingGroupProposals/
    │   │   │   │   │   ├── GetMeetingGroupProposalsQuery.cs
    │   │   │   │   │   └── GetMeetingGroupProposalsQueryHandler.cs
    │   │   │   │   ├── MeetingGroupProposedIntegrationEventHandler.cs
    │   │   │   │   └── RequestMeetingGroupProposalVerification/
    │   │   │   │       ├── RequestMeetingGroupProposalVerificationCommand.cs
    │   │   │   │       └── RequestMeetingGroupProposalVerificationCommandHandler.cs
    │   │   │   └── Members/
    │   │   │       ├── CreateMember/
    │   │   │       │   ├── CreateMemberCommand.cs
    │   │   │       │   └── CreateMemberCommandHandler.cs
    │   │   │       ├── GetMember/
    │   │   │       │   ├── GetMemberQuery.cs
    │   │   │       │   ├── GetMemberQueryHandler.cs
    │   │   │       │   └── MemberDto.cs
    │   │   │       └── NewUserRegisteredIntegrationEventHandler.cs
    │   │   ├── Domain/
    │   │   │   ├── CompanyName.MyMeetings.Modules.Administration.Domain.csproj
    │   │   │   ├── MeetingGroupProposals/
    │   │   │   │   ├── Events/
    │   │   │   │   │   ├── MeetingGroupProposalAcceptedDomainEvent.cs
    │   │   │   │   │   ├── MeetingGroupProposalRejectedDomainEvent.cs
    │   │   │   │   │   └── MeetingGroupProposalVerificationRequestedDomainEvent.cs
    │   │   │   │   ├── IMeetingGroupProposalRepository.cs
    │   │   │   │   ├── MeetingGroupLocation.cs
    │   │   │   │   ├── MeetingGroupProposal.cs
    │   │   │   │   ├── MeetingGroupProposalDecision.cs
    │   │   │   │   ├── MeetingGroupProposalId.cs
    │   │   │   │   ├── MeetingGroupProposalStatus.cs
    │   │   │   │   └── Rules/
    │   │   │   │       ├── MeetingGroupProposalCanBeVerifiedOnceRule.cs
    │   │   │   │       └── MeetingGroupProposalRejectionMustHaveAReasonRule.cs
    │   │   │   ├── Members/
    │   │   │   │   ├── Events/
    │   │   │   │   │   └── MemberCreatedDomainEvent.cs
    │   │   │   │   ├── IMemberRepository.cs
    │   │   │   │   ├── Member.cs
    │   │   │   │   └── MemberId.cs
    │   │   │   └── Users/
    │   │   │       ├── IUserContext.cs
    │   │   │       └── UserId.cs
    │   │   ├── Infrastructure/
    │   │   │   ├── AdministrationContext.cs
    │   │   │   ├── AdministrationModule.cs
    │   │   │   ├── CompanyName.MyMeetings.Modules.Administration.Infrastructure.csproj
    │   │   │   ├── Configuration/
    │   │   │   │   ├── AdministrationCompositionRoot.cs
    │   │   │   │   ├── AdministrationStartup.cs
    │   │   │   │   ├── AllConstructorFinder.cs
    │   │   │   │   ├── Assemblies.cs
    │   │   │   │   ├── Authentication/
    │   │   │   │   │   └── AuthenticationModule.cs
    │   │   │   │   ├── DataAccess/
    │   │   │   │   │   └── DataAccessModule.cs
    │   │   │   │   ├── EventsBus/
    │   │   │   │   │   ├── EventsBusModule.cs
    │   │   │   │   │   ├── EventsBusStartup.cs
    │   │   │   │   │   └── IntegrationEventGenericHandler.cs
    │   │   │   │   ├── Logging/
    │   │   │   │   │   └── LoggingModule.cs
    │   │   │   │   ├── Mediation/
    │   │   │   │   │   └── MediatorModule.cs
    │   │   │   │   ├── Processing/
    │   │   │   │   │   ├── CommandsExecutor.cs
    │   │   │   │   │   ├── IRecurringCommand.cs
    │   │   │   │   │   ├── Inbox/
    │   │   │   │   │   │   ├── InboxMessageDto.cs
    │   │   │   │   │   │   ├── ProcessInboxCommand.cs
    │   │   │   │   │   │   ├── ProcessInboxCommandHandler.cs
    │   │   │   │   │   │   └── ProcessInboxJob.cs
    │   │   │   │   │   ├── InternalCommands/
    │   │   │   │   │   │   ├── CommandsScheduler.cs
    │   │   │   │   │   │   ├── InternalCommandsModule.cs
    │   │   │   │   │   │   ├── ProcessInternalCommandsCommand.cs
    │   │   │   │   │   │   ├── ProcessInternalCommandsCommandHandler.cs
    │   │   │   │   │   │   └── ProcessInternalCommandsJob.cs
    │   │   │   │   │   ├── LoggingCommandHandlerDecorator.cs
    │   │   │   │   │   ├── LoggingCommandHandlerWithResultDecorator.cs
    │   │   │   │   │   ├── Outbox/
    │   │   │   │   │   │   ├── OutboxMessageDto.cs
    │   │   │   │   │   │   ├── OutboxModule.cs
    │   │   │   │   │   │   ├── ProcessOutboxCommand.cs
    │   │   │   │   │   │   ├── ProcessOutboxCommandHandler.cs
    │   │   │   │   │   │   └── ProcessOutboxJob.cs
    │   │   │   │   │   ├── ProcessingModule.cs
    │   │   │   │   │   ├── UnitOfWorkCommandHandlerDecorator.cs
    │   │   │   │   │   ├── UnitOfWorkCommandHandlerWithResultDecorator.cs
    │   │   │   │   │   ├── ValidationCommandHandlerDecorator.cs
    │   │   │   │   │   └── ValidationCommandHandlerWithResultDecorator.cs
    │   │   │   │   ├── Quartz/
    │   │   │   │   │   ├── QuartzModule.cs
    │   │   │   │   │   ├── QuartzStartup.cs
    │   │   │   │   │   └── SerilogLogProvider.cs
    │   │   │   │   └── Users/
    │   │   │   │       └── UserContext.cs
    │   │   │   ├── Domain/
    │   │   │   │   ├── MeetingGroupProposals/
    │   │   │   │   │   ├── MeetingGroupProposalEntityTypeConfiguration.cs
    │   │   │   │   │   └── MeetingGroupProposalRepository.cs
    │   │   │   │   └── Members/
    │   │   │   │       ├── MemberEntityTypeConfiguration.cs
    │   │   │   │       └── MemberRepository.cs
    │   │   │   ├── InternalCommands/
    │   │   │   │   └── InternalCommandEntityTypeConfiguration.cs
    │   │   │   └── Outbox/
    │   │   │       ├── OutboxAccessor.cs
    │   │   │       └── OutboxMessageEntityTypeConfiguration.cs
    │   │   ├── IntegrationEvents/
    │   │   │   ├── CompanyName.MyMeetings.Modules.Administration.IntegrationEvents.csproj
    │   │   │   └── MeetingGroupProposals/
    │   │   │       └── MeetingGroupProposalAcceptedIntegrationEvent.cs
    │   │   └── Tests/
    │   │       ├── ArchTests/
    │   │       │   ├── Application/
    │   │       │   │   └── ApplicationTests.cs
    │   │       │   ├── CompanyName.MyMeetings.Modules.Administration.ArchTests.csproj
    │   │       │   ├── Domain/
    │   │       │   │   └── DomainTests.cs
    │   │       │   ├── Module/
    │   │       │   │   └── LayersTests.cs
    │   │       │   └── SeedWork/
    │   │       │       └── TestBase.cs
    │   │       ├── IntegrationTests/
    │   │       │   ├── AssemblyInfo.cs
    │   │       │   ├── CompanyName.MyMeetings.Modules.Administration.IntegrationTests.csproj
    │   │       │   ├── MeetingGroupProposals/
    │   │       │   │   ├── MeetingGroupProposalSampleData.cs
    │   │       │   │   └── MeetingGroupProposalTests.cs
    │   │       │   ├── Members/
    │   │       │   │   ├── CreateMemberTests.cs
    │   │       │   │   └── MemberSampleData.cs
    │   │       │   └── SeedWork/
    │   │       │       ├── ExecutionContextMock.cs
    │   │       │       ├── OutboxMessagesHelper.cs
    │   │       │       └── TestBase.cs
    │   │       └── UnitTests/
    │   │           ├── CompanyName.MyMeetings.Modules.Administration.Domain.UnitTests.csproj
    │   │           ├── MeetingGroupProposals/
    │   │           │   └── MeetingGroupProposalTests.cs
    │   │           ├── Members/
    │   │           │   └── MemberTests.cs
    │   │           └── SeedWork/
    │   │               ├── DomainEventsTestHelper.cs
    │   │               └── TestBase.cs
    │   ├── Meetings/
    │   │   ├── Application/
    │   │   │   ├── CompanyName.MyMeetings.Modules.Meetings.Application.csproj
    │   │   │   ├── Configuration/
    │   │   │   │   ├── Commands/
    │   │   │   │   │   ├── ICommandHandler.cs
    │   │   │   │   │   ├── ICommandsScheduler.cs
    │   │   │   │   │   └── InternalCommandBase.cs
    │   │   │   │   └── Queries/
    │   │   │   │       └── IQueryHandler.cs
    │   │   │   ├── Contracts/
    │   │   │   │   ├── CommandBase.cs
    │   │   │   │   ├── ICommand.cs
    │   │   │   │   ├── IMeetingsModule.cs
    │   │   │   │   ├── IQuery.cs
    │   │   │   │   ├── IRecurringCommand.cs
    │   │   │   │   └── QueryBase.cs
    │   │   │   ├── Countries/
    │   │   │   │   ├── CountryDto.cs
    │   │   │   │   ├── GetAllCountriesQuery.cs
    │   │   │   │   └── GetAllCountriesQueryHandler.cs
    │   │   │   ├── MeetingCommentingConfigurations/
    │   │   │   │   ├── DisableMeetingCommentingConfiguration/
    │   │   │   │   │   ├── DisableMeetingCommentingConfigurationCommand.cs
    │   │   │   │   │   └── DisableMeetingCommentingConfigurationCommandHandler.cs
    │   │   │   │   ├── EnableMeetingCommentingConfiguration/
    │   │   │   │   │   ├── EnableMeetingCommentingConfigurationCommand.cs
    │   │   │   │   │   └── EnableMeetingCommentingConfigurationCommandHandler.cs
    │   │   │   │   ├── GetMeetingCommentingConfiguration/
    │   │   │   │   │   ├── GetMeetingCommentingConfigurationQuery.cs
    │   │   │   │   │   ├── GetMeetingCommentingConfigurationQueryHandler.cs
    │   │   │   │   │   └── MeetingCommentingConfigurationDto.cs
    │   │   │   │   └── MeetingCreatedEventHandler.cs
    │   │   │   ├── MeetingComments/
    │   │   │   │   ├── AddMeetingComment/
    │   │   │   │   │   ├── AddMeetingCommentCommand.cs
    │   │   │   │   │   ├── AddMeetingCommentCommandHandler.cs
    │   │   │   │   │   └── AddMeetingCommentCommandValidator.cs
    │   │   │   │   ├── AddMeetingCommentLike/
    │   │   │   │   │   ├── AddMeetingCommentLikeCommand.cs
    │   │   │   │   │   └── AddMeetingCommentLikeCommandHandler.cs
    │   │   │   │   ├── AddMeetingCommentReply/
    │   │   │   │   │   ├── AddReplyToMeetingCommentCommand.cs
    │   │   │   │   │   └── AddReplyToMeetingCommentCommandHandler.cs
    │   │   │   │   ├── EditMeetingComment/
    │   │   │   │   │   ├── EditMeetingCommentCommand.cs
    │   │   │   │   │   ├── EditMeetingCommentCommandHandler.cs
    │   │   │   │   │   └── EditMeetingCommentCommandValidator.cs
    │   │   │   │   ├── GetMeetingCommentLikers/
    │   │   │   │   │   ├── GetMeetingCommentLikersQuery.cs
    │   │   │   │   │   ├── GetMeetingCommentLikersQueryHandler.cs
    │   │   │   │   │   └── MeetingCommentLikerDto.cs
    │   │   │   │   ├── GetMeetingComments/
    │   │   │   │   │   ├── GetMeetingCommentsQuery.cs
    │   │   │   │   │   ├── GetMeetingCommentsQueryHandler.cs
    │   │   │   │   │   └── MeetingCommentDto.cs
    │   │   │   │   ├── MeetingCommentLikedNotification.cs
    │   │   │   │   ├── MeetingCommentLikedNotificationHandler.cs
    │   │   │   │   ├── MeetingCommentUnlikeNotificationHandler.cs
    │   │   │   │   ├── MeetingCommentUnlikedNotification.cs
    │   │   │   │   ├── RemoveMeetingComment/
    │   │   │   │   │   ├── RemoveMeetingCommentCommand.cs
    │   │   │   │   │   └── RemoveMeetingCommentCommandHandler.cs
    │   │   │   │   └── RemoveMeetingCommentLike/
    │   │   │   │       ├── RemoveMeetingCommentLikeCommand.cs
    │   │   │   │       └── RemoveMeetingCommentLikeCommandHandler.cs
    │   │   │   ├── MeetingGroupProposals/
    │   │   │   │   ├── AcceptMeetingGroupProposal/
    │   │   │   │   │   ├── AcceptMeetingGroupProposalCommand.cs
    │   │   │   │   │   ├── AcceptMeetingGroupProposalCommandHandler.cs
    │   │   │   │   │   ├── AcceptMeetingGroupProposalCommandValidator.cs
    │   │   │   │   │   ├── MeetingGroupProposalAcceptedNotification.cs
    │   │   │   │   │   └── MeetingGroupProposalAcceptedNotificationHandler.cs
    │   │   │   │   ├── GetAllMeetingGroupProposals/
    │   │   │   │   │   ├── GetAllMeetingGroupProposalsQuery.cs
    │   │   │   │   │   └── GetAllMeetingGroupProposalsQueryHandler.cs
    │   │   │   │   ├── GetMeetingGroupProposal/
    │   │   │   │   │   ├── GetMeetingGroupProposalQuery.cs
    │   │   │   │   │   ├── GetMeetingGroupProposalQueryHandler.cs
    │   │   │   │   │   └── MeetingGroupProposalDto.cs
    │   │   │   │   ├── GetMemberMeetingGroupProposals/
    │   │   │   │   │   ├── GetMemberMeetingGroupProposalsQuery.cs
    │   │   │   │   │   └── GetMemberMeetingGroupProposalsQueryHandler.cs
    │   │   │   │   ├── MeetingGroupProposalAcceptedIntegrationEventHandler.cs
    │   │   │   │   ├── MeetingGroupProposedNotification.cs
    │   │   │   │   ├── MeetingGroupProposedNotificationHandler.cs
    │   │   │   │   └── ProposeMeetingGroup/
    │   │   │   │       ├── ProposeMeetingGroupCommand.cs
    │   │   │   │       ├── ProposeMeetingGroupCommandHandler.cs
    │   │   │   │       └── ProposeMeetingGroupCommandValidator.cs
    │   │   │   ├── MeetingGroups/
    │   │   │   │   ├── CreateNewMeetingGroup/
    │   │   │   │   │   ├── CreateNewMeetingGroupCommand.cs
    │   │   │   │   │   └── CreateNewMeetingGroupCommandHandler.cs
    │   │   │   │   ├── EditMeetingGroupGeneralAttributes/
    │   │   │   │   │   ├── EditMeetingGroupGeneralAttributesCommand.cs
    │   │   │   │   │   └── EditMeetingGroupGeneralAttributesCommandHandler.cs
    │   │   │   │   ├── GetAllMeetingGroups/
    │   │   │   │   │   ├── GetAllMeetingGroupsQuery.cs
    │   │   │   │   │   ├── GetAllMeetingGroupsQueryHandler.cs
    │   │   │   │   │   └── MeetingGroupDto.cs
    │   │   │   │   ├── GetAuthenticationMemberMeetingGroups/
    │   │   │   │   │   ├── GetAuthenticationMemberMeetingGroupsQuery.cs
    │   │   │   │   │   ├── GetAuthenticationMemberMeetingGroupsQueryHandler.cs
    │   │   │   │   │   └── MemberMeetingGroupDto.cs
    │   │   │   │   ├── GetMeetingGroupDetails/
    │   │   │   │   │   ├── GetMeetingGroupDetailsQuery.cs
    │   │   │   │   │   ├── GetMeetingGroupDetailsQueryHandler.cs
    │   │   │   │   │   └── MeetingGroupDetailsDto.cs
    │   │   │   │   ├── JoinToGroup/
    │   │   │   │   │   ├── JoinToGroupCommand.cs
    │   │   │   │   │   └── JoinToGroupCommandHandler.cs
    │   │   │   │   ├── LeaveMeetingGroup/
    │   │   │   │   │   ├── LeaveMeetingGroupCommand.cs
    │   │   │   │   │   └── LeaveMeetingGroupCommandHandler.cs
    │   │   │   │   ├── MeetingGroupCreatedNotification.cs
    │   │   │   │   ├── MeetingGroupCreatedSendEmailHandler.cs
    │   │   │   │   ├── SendMeetingGroupCreatedEmail/
    │   │   │   │   │   ├── SendMeetingGroupCreatedEmailCommand.cs
    │   │   │   │   │   └── SendMeetingGroupCreatedEmailCommandHandler.cs
    │   │   │   │   └── SetMeetingGroupExpirationDate/
    │   │   │   │       ├── SetMeetingGroupExpirationDateCommand.cs
    │   │   │   │       └── SetMeetingGroupExpirationDateCommandHandler.cs
    │   │   │   ├── Meetings/
    │   │   │   │   ├── AddMeetingAttendee/
    │   │   │   │   │   ├── AddMeetingAttendeeCommand.cs
    │   │   │   │   │   └── AddMeetingAttendeeCommandHandler.cs
    │   │   │   │   ├── AddMeetingNotAttendee/
    │   │   │   │   │   ├── AddMeetingNotAttendeeCommand.cs
    │   │   │   │   │   └── AddMeetingNotAttendeeCommandHandler.cs
    │   │   │   │   ├── CancelMeeting/
    │   │   │   │   │   ├── CancelMeetingCommand.cs
    │   │   │   │   │   └── CancelMeetingCommandHandler.cs
    │   │   │   │   ├── ChangeMeetingMainAttributes/
    │   │   │   │   │   ├── ChangeMeetingMainAttributesCommand.cs
    │   │   │   │   │   └── ChangeMeetingMainAttributesCommandHandler.cs
    │   │   │   │   ├── ChangeNotAttendeeDecision/
    │   │   │   │   │   ├── ChangeNotAttendeeDecisionCommand.cs
    │   │   │   │   │   └── ChangeNotAttendeeDecisionCommandHandler.cs
    │   │   │   │   ├── CreateMeeting/
    │   │   │   │   │   ├── CreateMeetingCommand.cs
    │   │   │   │   │   └── CreateMeetingCommandHandler.cs
    │   │   │   │   ├── GetAuthenticatedMemberMeetings/
    │   │   │   │   │   ├── GetAuthenticatedMemberMeetingsQuery.cs
    │   │   │   │   │   ├── GetAuthenticatedMemberMeetingsQueryHandler.cs
    │   │   │   │   │   └── MemberMeetingDto.cs
    │   │   │   │   ├── GetMeetingAttendees/
    │   │   │   │   │   ├── GetMeetingAttendeesQuery.cs
    │   │   │   │   │   ├── GetMeetingAttendeesQueryHandler.cs
    │   │   │   │   │   └── MeetingAttendeeDto.cs
    │   │   │   │   ├── GetMeetingDetails/
    │   │   │   │   │   ├── GetMeetingDetailsQuery.cs
    │   │   │   │   │   ├── GetMeetingDetailsQueryHandler.cs
    │   │   │   │   │   └── MeetingDetailsDto.cs
    │   │   │   │   ├── MarkMeetingAttendeeFeeAsPayedCommand.cs
    │   │   │   │   ├── MarkMeetingAttendeeFeeAsPayedCommandHandler.cs
    │   │   │   │   ├── MeetingDto.cs
    │   │   │   │   ├── MeetingFeePaidIntegrationEventHandler.cs
    │   │   │   │   ├── MeetingsQueryHelper.cs
    │   │   │   │   ├── RemoveMeetingAttendee/
    │   │   │   │   │   ├── RemoveMeetingAttendeeCommand.cs
    │   │   │   │   │   └── RemoveMeetingAttendeeCommandHandler.cs
    │   │   │   │   ├── SendMeetingAttendeeAddedEmail/
    │   │   │   │   │   ├── MeetingAttendeeAddedNotification.cs
    │   │   │   │   │   ├── MeetingAttendeeAddedNotificationHandler.cs
    │   │   │   │   │   ├── MeetingAttendeeAddedPublishEventNotificationHandler.cs
    │   │   │   │   │   ├── SendMeetingAttendeeAddedEmailCommand.cs
    │   │   │   │   │   └── SendMeetingAttendeeAddedEmailCommandHandler.cs
    │   │   │   │   ├── SetMeetingAttendeeRole/
    │   │   │   │   │   ├── SetMeetingAttendeeRoleCommand.cs
    │   │   │   │   │   └── SetMeetingAttendeeRoleCommandHandler.cs
    │   │   │   │   ├── SetMeetingHostRole/
    │   │   │   │   │   ├── SetMeetingHostRoleCommand.cs
    │   │   │   │   │   └── SetMeetingHostRoleCommandHandler.cs
    │   │   │   │   ├── SignOffMemberFromWaitlist/
    │   │   │   │   │   ├── SignOffMemberFromWaitlistCommand.cs
    │   │   │   │   │   └── SignOffMemberFromWaitlistCommandHandler.cs
    │   │   │   │   └── SignUpMemberToWaitlist/
    │   │   │   │       ├── SignUpMemberToWaitlistCommand.cs
    │   │   │   │       └── SignUpMemberToWaitlistCommandHandler.cs
    │   │   │   ├── MemberSubscriptions/
    │   │   │   │   ├── ChangeSubscriptionExpirationDateForMember/
    │   │   │   │   │   ├── ChangeSubscriptionExpirationDateForMemberCommand.cs
    │   │   │   │   │   └── ChangeSubscriptionExpirationDateForMemberCommandHandler.cs
    │   │   │   │   ├── MemberSubscriptionExpirationDateChangedNotification.cs
    │   │   │   │   ├── MemberSubscriptionExpirationDateChangedNotificationHandler.cs
    │   │   │   │   └── SubscriptionExpirationDateChangedIntegrationEventHandler.cs
    │   │   │   └── Members/
    │   │   │       ├── CreateMember/
    │   │   │       │   ├── CreateMemberCommand.cs
    │   │   │       │   ├── CreateMemberCommandHandler.cs
    │   │   │       │   ├── MemberCratedNotificationHandler.cs
    │   │   │       │   ├── MemberCreatedNotification.cs
    │   │   │       │   └── NewUserRegisteredIntegrationEventHandler.cs
    │   │   │       ├── MemberContext.cs
    │   │   │       ├── MemberDto.cs
    │   │   │       └── MembersQueryHelper.cs
    │   │   ├── Domain/
    │   │   │   ├── CompanyName.MyMeetings.Modules.Meetings.Domain.csproj
    │   │   │   ├── MeetingCommentingConfigurations/
    │   │   │   │   ├── Events/
    │   │   │   │   │   ├── MeetingCommentingConfigurationCreatedDomainEvent.cs
    │   │   │   │   │   ├── MeetingCommentingDisabledDomainEvent.cs
    │   │   │   │   │   └── MeetingCommentingEnabledDomainEvent.cs
    │   │   │   │   ├── IMeetingCommentingConfigurationRepository.cs
    │   │   │   │   ├── MeetingCommentingConfiguration.cs
    │   │   │   │   ├── MeetingCommentingConfigurationId.cs
    │   │   │   │   └── Rules/
    │   │   │   │       ├── MeetingCommentingCanBeDisabledOnlyByGroupOrganizerRule.cs
    │   │   │   │       └── MeetingCommentingCanBeEnabledOnlyByGroupOrganizerRule.cs
    │   │   │   ├── MeetingComments/
    │   │   │   │   ├── Events/
    │   │   │   │   │   ├── MeetingCommentAddedDomainEvent.cs
    │   │   │   │   │   ├── MeetingCommentEditedDomainEvent.cs
    │   │   │   │   │   ├── MeetingCommentRemovedDomainEvent.cs
    │   │   │   │   │   └── ReplyToMeetingCommentAddedDomainEvent.cs
    │   │   │   │   ├── IMeetingCommentRepository.cs
    │   │   │   │   ├── MeetingComment.cs
    │   │   │   │   ├── MeetingCommentId.cs
    │   │   │   │   └── Rules/
    │   │   │   │       ├── CommentCanBeAddedOnlyByMeetingGroupMemberRule.cs
    │   │   │   │       ├── CommentCanBeCreatedOnlyIfCommentingForMeetingEnabledRule.cs
    │   │   │   │       ├── CommentCanBeEditedOnlyIfCommentingForMeetingEnabledRule.cs
    │   │   │   │       ├── CommentCanBeLikedOnlyByMeetingGroupMemberRule.cs
    │   │   │   │       ├── CommentCannotBeLikedByTheSameMemberMoreThanOnceRule.cs
    │   │   │   │       ├── CommentTextMustBeProvidedRule.cs
    │   │   │   │       ├── MeetingCommentCanBeEditedOnlyByAuthorRule.cs
    │   │   │   │       ├── MeetingCommentCanBeRemovedOnlyByAuthorOrGroupOrganizerRule.cs
    │   │   │   │       └── RemovingReasonCanBeProvidedOnlyByGroupOrganizerRule.cs
    │   │   │   ├── MeetingGroupProposals/
    │   │   │   │   ├── Events/
    │   │   │   │   │   ├── MeetingGroupProposalAcceptedDomainEvent.cs
    │   │   │   │   │   └── MeetingGroupProposedDomainEvent.cs
    │   │   │   │   ├── IMeetingGroupProposalRepository.cs
    │   │   │   │   ├── MeetingGroupProposal.cs
    │   │   │   │   ├── MeetingGroupProposalId.cs
    │   │   │   │   ├── MeetingGroupProposalStatus.cs
    │   │   │   │   └── Rules/
    │   │   │   │       └── MeetingGroupProposalCannotBeAcceptedMoreThanOnceRule.cs
    │   │   │   ├── MeetingGroups/
    │   │   │   │   ├── Events/
    │   │   │   │   │   ├── MeetingAttendeeChangedDecisionDomainEvent.cs
    │   │   │   │   │   ├── MeetingGroupCreatedDomainEvent.cs
    │   │   │   │   │   ├── MeetingGroupGeneralAttributesEditedDomainEvent.cs
    │   │   │   │   │   ├── MeetingGroupMemberLeftGroupDomainEvent.cs
    │   │   │   │   │   ├── MeetingGroupPaymentInfoUpdatedDomainEvent.cs
    │   │   │   │   │   ├── MeetingNotAttendeeChangedDecisionDomainEvent.cs
    │   │   │   │   │   └── NewMeetingGroupMemberJoinedDomainEvent.cs
    │   │   │   │   ├── IMeetingGroupRepository.cs
    │   │   │   │   ├── MeetingGroup.cs
    │   │   │   │   ├── MeetingGroupId.cs
    │   │   │   │   ├── MeetingGroupLocation.cs
    │   │   │   │   ├── MeetingGroupMember.cs
    │   │   │   │   ├── MeetingGroupMemberRole.cs
    │   │   │   │   ├── Policies/
    │   │   │   │   │   ├── MeetingGroupExpirationDatePolicy.cs
    │   │   │   │   │   └── MeetingGroupMemberData.cs
    │   │   │   │   └── Rules/
    │   │   │   │       ├── MeetingCanBeOrganizedOnlyByPayedGroupRule.cs
    │   │   │   │       ├── MeetingGroupMemberCannotBeAddedTwiceRule.cs
    │   │   │   │       ├── MeetingHostMustBeAMeetingGroupMemberRule.cs
    │   │   │   │       └── NotActualGroupMemberCannotLeaveGroupRule.cs
    │   │   │   ├── MeetingMemberCommentLikes/
    │   │   │   │   ├── Events/
    │   │   │   │   │   ├── MeetingCommentLikedDomainEvent.cs
    │   │   │   │   │   └── MeetingCommentUnlikedDomainEvent.cs
    │   │   │   │   ├── IMeetingMemberCommentLikesRepository.cs
    │   │   │   │   ├── MeetingMemberCommentLike.cs
    │   │   │   │   └── MeetingMemberCommentLikeId.cs
    │   │   │   ├── Meetings/
    │   │   │   │   ├── Events/
    │   │   │   │   │   ├── MeetingAttendeeAddedDomainEvent.cs
    │   │   │   │   │   ├── MeetingAttendeeFeePaidDomainEvent.cs
    │   │   │   │   │   ├── MeetingAttendeeRemovedDomainEvent.cs
    │   │   │   │   │   ├── MeetingCanceledDomainEvent.cs
    │   │   │   │   │   ├── MeetingCreatedDomainEvent.cs
    │   │   │   │   │   ├── MeetingEditedDomainEvent.cs
    │   │   │   │   │   ├── MeetingMainAttributesChangedDomainEvent.cs
    │   │   │   │   │   ├── MeetingNotAttendeeAddedDomainEvent.cs
    │   │   │   │   │   ├── MeetingWaitlistMemberAddedDomainEvent.cs
    │   │   │   │   │   ├── MemberSetAsAttendeeDomainEvent.cs
    │   │   │   │   │   ├── MemberSignedOffFromMeetingWaitlistDomainEvent.cs
    │   │   │   │   │   └── NewMeetingHostSetDomainEvent.cs
    │   │   │   │   ├── IMeetingRepository.cs
    │   │   │   │   ├── Meeting.cs
    │   │   │   │   ├── MeetingAttendee.cs
    │   │   │   │   ├── MeetingAttendeeRole.cs
    │   │   │   │   ├── MeetingId.cs
    │   │   │   │   ├── MeetingLimits.cs
    │   │   │   │   ├── MeetingLocation.cs
    │   │   │   │   ├── MeetingNotAttendee.cs
    │   │   │   │   ├── MeetingTerm.cs
    │   │   │   │   ├── MeetingWaitlistMember.cs
    │   │   │   │   ├── MoneyValue.cs
    │   │   │   │   ├── Rules/
    │   │   │   │   │   ├── AttendeeCanBeAddedOnlyInRsvpTermRule.cs
    │   │   │   │   │   ├── AttendeesLimitCannotBeChangedToSmallerThanActiveAttendeesRule.cs
    │   │   │   │   │   ├── MeetingAttendeeMustBeAMemberOfGroupRule.cs
    │   │   │   │   │   ├── MeetingAttendeesLimitCannotBeNegativeRule.cs
    │   │   │   │   │   ├── MeetingAttendeesLimitMustBeGreaterThanGuestsLimitRule.cs
    │   │   │   │   │   ├── MeetingAttendeesNumberIsAboveLimitRule.cs
    │   │   │   │   │   ├── MeetingCannotBeChangedAfterStartRule.cs
    │   │   │   │   │   ├── MeetingGuestsLimitCannotBeNegativeRule.cs
    │   │   │   │   │   ├── MeetingGuestsNumberIsAboveLimitRule.cs
    │   │   │   │   │   ├── MeetingMustHaveAtLeastOneHostRule.cs
    │   │   │   │   │   ├── MemberCannotBeAnAttendeeOfMeetingMoreThanOnceRule.cs
    │   │   │   │   │   ├── MemberCannotBeMoreThanOnceOnMeetingWaitlistRule.cs
    │   │   │   │   │   ├── MemberCannotBeNotAttendeeTwiceRule.cs
    │   │   │   │   │   ├── MemberCannotHaveSetAttendeeRoleMoreThanOnceRule.cs
    │   │   │   │   │   ├── MemberOnWaitlistMustBeAMemberOfGroupRule.cs
    │   │   │   │   │   ├── NotActiveMemberOfWaitlistCannotBeSignedOffRule.cs
    │   │   │   │   │   ├── NotActiveNotAttendeeCannotChangeDecisionRule.cs
    │   │   │   │   │   ├── OnlyActiveAttendeeCanBeRemovedFromMeetingRule.cs
    │   │   │   │   │   ├── OnlyMeetingAttendeeCanHaveChangedRoleRule.cs
    │   │   │   │   │   ├── OnlyMeetingOrGroupOrganizerCanSetMeetingMemberRolesRule.cs
    │   │   │   │   │   └── ReasonOfRemovingAttendeeFromMeetingMustBeProvidedRule.cs
    │   │   │   │   └── Term.cs
    │   │   │   ├── Members/
    │   │   │   │   ├── Events/
    │   │   │   │   │   └── MemberCreatedDomainEvent.cs
    │   │   │   │   ├── IMemberContext.cs
    │   │   │   │   ├── IMemberRepository.cs
    │   │   │   │   ├── MeetingGroupMemberData.cs
    │   │   │   │   ├── Member.cs
    │   │   │   │   ├── MemberId.cs
    │   │   │   │   └── MemberSubscriptions/
    │   │   │   │       ├── Events/
    │   │   │   │       │   └── MemberSubscriptionExpirationDateChangedDomainEvent.cs
    │   │   │   │       ├── IMemberSubscriptionRepository.cs
    │   │   │   │       ├── MemberSubscription.cs
    │   │   │   │       └── MemberSubscriptionId.cs
    │   │   │   └── SharedKernel/
    │   │   │       └── SystemClock.cs
    │   │   ├── Infrastructure/
    │   │   │   ├── CompanyName.MyMeetings.Modules.Meetings.Infrastructure.csproj
    │   │   │   ├── Configuration/
    │   │   │   │   ├── AllConstructorFinder.cs
    │   │   │   │   ├── Assemblies.cs
    │   │   │   │   ├── Authentication/
    │   │   │   │   │   └── AuthenticationModule.cs
    │   │   │   │   ├── DataAccess/
    │   │   │   │   │   └── DataAccessModule.cs
    │   │   │   │   ├── Email/
    │   │   │   │   │   └── EmailModule.cs
    │   │   │   │   ├── EventsBus/
    │   │   │   │   │   ├── EventsBusModule.cs
    │   │   │   │   │   ├── EventsBusStartup.cs
    │   │   │   │   │   └── IntegrationEventGenericHandler.cs
    │   │   │   │   ├── Logging/
    │   │   │   │   │   └── LoggingModule.cs
    │   │   │   │   ├── Mediation/
    │   │   │   │   │   └── MediatorModule.cs
    │   │   │   │   ├── MeetingsCompositionRoot.cs
    │   │   │   │   ├── MeetingsStartup.cs
    │   │   │   │   ├── Processing/
    │   │   │   │   │   ├── CommandsExecutor.cs
    │   │   │   │   │   ├── IRecurringCommand.cs
    │   │   │   │   │   ├── Inbox/
    │   │   │   │   │   │   ├── InboxMessageDto.cs
    │   │   │   │   │   │   ├── ProcessInboxCommand.cs
    │   │   │   │   │   │   ├── ProcessInboxCommandHandler.cs
    │   │   │   │   │   │   └── ProcessInboxJob.cs
    │   │   │   │   │   ├── InternalCommands/
    │   │   │   │   │   │   ├── CommandsScheduler.cs
    │   │   │   │   │   │   ├── ProcessInternalCommandsCommand.cs
    │   │   │   │   │   │   ├── ProcessInternalCommandsCommandHandler.cs
    │   │   │   │   │   │   └── ProcessInternalCommandsJob.cs
    │   │   │   │   │   ├── LoggingCommandHandlerDecorator.cs
    │   │   │   │   │   ├── LoggingCommandHandlerWithResultDecorator.cs
    │   │   │   │   │   ├── Outbox/
    │   │   │   │   │   │   ├── OutboxMessageDto.cs
    │   │   │   │   │   │   ├── OutboxModule.cs
    │   │   │   │   │   │   ├── ProcessOutboxCommand.cs
    │   │   │   │   │   │   ├── ProcessOutboxCommandHandler.cs
    │   │   │   │   │   │   └── ProcessOutboxJob.cs
    │   │   │   │   │   ├── ProcessingModule.cs
    │   │   │   │   │   ├── UnitOfWorkCommandHandlerDecorator.cs
    │   │   │   │   │   ├── UnitOfWorkCommandHandlerWithResultDecorator.cs
    │   │   │   │   │   ├── ValidationCommandHandlerDecorator.cs
    │   │   │   │   │   └── ValidationCommandHandlerWithResultDecorator.cs
    │   │   │   │   └── Quartz/
    │   │   │   │       ├── QuartzModule.cs
    │   │   │   │       ├── QuartzStartup.cs
    │   │   │   │       └── SerilogLogProvider.cs
    │   │   │   ├── Domain/
    │   │   │   │   ├── MeetingCommentingConfigurations/
    │   │   │   │   │   ├── MeetingCommentingConfigurationEntityTypeConfiguration.cs
    │   │   │   │   │   └── MeetingCommentingConfigurationRepository.cs
    │   │   │   │   ├── MeetingComments/
    │   │   │   │   │   ├── MeetingCommentEntityTypeConfiguration.cs
    │   │   │   │   │   └── MeetingCommentRepository.cs
    │   │   │   │   ├── MeetingGroupProposals/
    │   │   │   │   │   ├── MeetingGroupProposalEntityTypeConfiguration.cs
    │   │   │   │   │   └── MeetingGroupProposalRepository.cs
    │   │   │   │   ├── MeetingGroups/
    │   │   │   │   │   ├── MeetingGroupRepository.cs
    │   │   │   │   │   └── MeetingGroupsEntityTypeConfiguration.cs
    │   │   │   │   ├── MeetingMemberCommentLikes/
    │   │   │   │   │   ├── MeetingMemberCommentLikeEntityTypeConfiguration.cs
    │   │   │   │   │   └── MeetingMemberCommentLikeRepository.cs
    │   │   │   │   ├── Meetings/
    │   │   │   │   │   ├── MeetingEntityTypeConfiguration.cs
    │   │   │   │   │   └── MeetingRepository.cs
    │   │   │   │   └── Members/
    │   │   │   │       ├── MemberEntityTypeConfiguration.cs
    │   │   │   │       ├── MemberRepository.cs
    │   │   │   │       └── MemberSubscriptions/
    │   │   │   │           ├── MemberSubscriptionEntityTypeConfiguration.cs
    │   │   │   │           └── MemberSubscriptionRepository.cs
    │   │   │   ├── InternalCommands/
    │   │   │   │   └── InternalCommandEntityTypeConfiguration.cs
    │   │   │   ├── MeetingsContext.cs
    │   │   │   ├── MeetingsModule.cs
    │   │   │   └── Outbox/
    │   │   │       ├── OutboxAccessor.cs
    │   │   │       └── OutboxMessageEntityTypeConfiguration.cs
    │   │   ├── IntegrationEvents/
    │   │   │   ├── CompanyName.MyMeetings.Modules.Meetings.IntegrationEvents.csproj
    │   │   │   ├── MeetingAttendeeAddedIntegrationEvent.cs
    │   │   │   ├── MeetingGroupProposedIntegrationEvent.cs
    │   │   │   └── MemberCreatedIntegrationEvent.cs
    │   │   └── Tests/
    │   │       ├── ArchTests/
    │   │       │   ├── Application/
    │   │       │   │   └── ApplicationTests.cs
    │   │       │   ├── CompanyName.MyMeetings.Modules.Meetings.ArchTests.csproj
    │   │       │   ├── Domain/
    │   │       │   │   └── DomainTests.cs
    │   │       │   ├── Module/
    │   │       │   │   └── LayersTests.cs
    │   │       │   └── SeedWork/
    │   │       │       └── TestBase.cs
    │   │       ├── IntegrationTests/
    │   │       │   ├── AssemblyInfo.cs
    │   │       │   ├── CompanyName.MyMeetings.Modules.Meetings.IntegrationTests.csproj
    │   │       │   ├── Countries/
    │   │       │   │   ├── 0001_SeedCountries.sql
    │   │       │   │   └── GetCountriesTests.cs
    │   │       │   ├── MeetingCommentLikes/
    │   │       │   │   ├── AddMeetingCommentLikeTests.cs
    │   │       │   │   ├── GetLikedMeetingCommentProbe.cs
    │   │       │   │   ├── GetMeetingCommentsProbe.cs
    │   │       │   │   └── RemoveMeetingCommentLikeTests.cs
    │   │       │   ├── MeetingCommentingConfigurations/
    │   │       │   │   ├── CreateMeetingCommentingConfigurationTests.cs
    │   │       │   │   ├── DisableMeetingCommentingConfigurationTests.cs
    │   │       │   │   └── EnableMeetingCommentingConfigurationTests.cs
    │   │       │   ├── MeetingComments/
    │   │       │   │   ├── AddMeetingCommentTests.cs
    │   │       │   │   ├── AddReplyToMeetingCommentTests.cs
    │   │       │   │   ├── EditMeetingCommentTests.cs
    │   │       │   │   ├── GetMeetingCommentsTests.cs
    │   │       │   │   └── RemoveMeetingCommentTests.cs
    │   │       │   ├── MeetingGroupProposals/
    │   │       │   │   ├── GetMeetingGroupProposalsTests.cs
    │   │       │   │   ├── MeetingGroupProposalSampleData.cs
    │   │       │   │   └── ProposeMeetingGroupTests.cs
    │   │       │   ├── MeetingGroups/
    │   │       │   │   └── CreateNewMeetingGroupTests.cs
    │   │       │   ├── Meetings/
    │   │       │   │   ├── MeetingCreateTests.cs
    │   │       │   │   └── MeetingHelper.cs
    │   │       │   └── SeedWork/
    │   │       │       ├── EventsBusMock.cs
    │   │       │       ├── ExecutionContextMock.cs
    │   │       │       ├── OutboxMessagesHelper.cs
    │   │       │       └── TestBase.cs
    │   │       └── UnitTests/
    │   │           ├── CompanyName.MyMeetings.Modules.Meetings.Domain.UnitTests.csproj
    │   │           ├── MeetingGroupProposals/
    │   │           │   └── MeetingGroupProposalTests.cs
    │   │           ├── MeetingGroups/
    │   │           │   └── MeetingGroupTests.cs
    │   │           ├── Meetings/
    │   │           │   ├── MeetingAddAttendeeTests.cs
    │   │           │   ├── MeetingAddNotAttendeeTests.cs
    │   │           │   ├── MeetingCommentTests.cs
    │   │           │   ├── MeetingCommentingConfigurationTests.cs
    │   │           │   ├── MeetingLimitsTests.cs
    │   │           │   ├── MeetingRolesTests.cs
    │   │           │   ├── MeetingTests.cs
    │   │           │   ├── MeetingTestsBase.cs
    │   │           │   └── MeetingWaitlistTests.cs
    │   │           ├── Members/
    │   │           │   └── MemberTests.cs
    │   │           └── SeedWork/
    │   │               ├── DomainEventsTestHelper.cs
    │   │               └── TestBase.cs
    │   ├── Payments/
    │   │   ├── Application/
    │   │   │   ├── CompanyName.MyMeetings.Modules.Payments.Application.csproj
    │   │   │   ├── Configuration/
    │   │   │   │   ├── Commands/
    │   │   │   │   │   ├── ICommandHandler.cs
    │   │   │   │   │   ├── ICommandsScheduler.cs
    │   │   │   │   │   └── InternalCommandBase.cs
    │   │   │   │   ├── Projections/
    │   │   │   │   │   ├── IProjector.cs
    │   │   │   │   │   └── ProjectorBase.cs
    │   │   │   │   └── Queries/
    │   │   │   │       └── IQueryHandler.cs
    │   │   │   ├── Contracts/
    │   │   │   │   ├── CommandBase.cs
    │   │   │   │   ├── ICommand.cs
    │   │   │   │   ├── IPaymentsModule.cs
    │   │   │   │   ├── IQuery.cs
    │   │   │   │   ├── IRecurringCommand.cs
    │   │   │   │   └── QueryBase.cs
    │   │   │   ├── MeetingFees/
    │   │   │   │   ├── CreateMeetingFee/
    │   │   │   │   │   ├── CreateMeetingFeeCommand.cs
    │   │   │   │   │   └── CreateMeetingFeeCommandHandler.cs
    │   │   │   │   ├── CreateMeetingFeePayment/
    │   │   │   │   │   ├── CreateMeetingFeePaymentCommand.cs
    │   │   │   │   │   └── CreateMeetingFeePaymentCommandHandler.cs
    │   │   │   │   ├── GetMeetingFees/
    │   │   │   │   │   ├── GetMeetingFeesQuery.cs
    │   │   │   │   │   ├── GetMeetingFeesQueryHandler.cs
    │   │   │   │   │   ├── MeetingFeeDto.cs
    │   │   │   │   │   └── MeetingFeesProjector.cs
    │   │   │   │   ├── MarkMeetingFeeAsPaid/
    │   │   │   │   │   ├── MarkMeetingFeeAsPaidCommand.cs
    │   │   │   │   │   ├── MarkMeetingFeeAsPaidCommandHandler.cs
    │   │   │   │   │   ├── MeetingFeePaidNotification.cs
    │   │   │   │   │   └── MeetingFeePaidNotificationHandler.cs
    │   │   │   │   ├── MarkMeetingFeePaymentAsPaid/
    │   │   │   │   │   ├── MarkMeetingFeePaymentAsPaidCommand.cs
    │   │   │   │   │   ├── MarkMeetingFeePaymentAsPaidCommandHandler.cs
    │   │   │   │   │   ├── MeetingFeePaymentPaidNotification.cs
    │   │   │   │   │   └── MeetingFeePaymentPaidNotificationHandler.cs
    │   │   │   │   └── MeetingAttendeeAddedIntegrationEventHandler.cs
    │   │   │   ├── Payers/
    │   │   │   │   ├── CreatePayer/
    │   │   │   │   │   ├── CreatePayerCommand.cs
    │   │   │   │   │   ├── CreatePayerCommandHandler.cs
    │   │   │   │   │   └── NewUserRegisteredIntegrationEventHandler.cs
    │   │   │   │   ├── GetPayer/
    │   │   │   │   │   ├── GetPayerQuery.cs
    │   │   │   │   │   ├── GetPayerQueryHandler.cs
    │   │   │   │   │   ├── PayerDetailsProjector.cs
    │   │   │   │   │   └── PayerDto.cs
    │   │   │   │   └── GetPayerEmail/
    │   │   │   │       └── PayerEmailProvider.cs
    │   │   │   ├── PriceListItems/
    │   │   │   │   ├── ActivatePriceListItem/
    │   │   │   │   │   ├── ActivatePriceListItemCommand.cs
    │   │   │   │   │   └── ActivatePriceListItemCommandHandler.cs
    │   │   │   │   ├── ChangePriceListItemAttributes/
    │   │   │   │   │   ├── ChangePriceListItemAttributesCommand.cs
    │   │   │   │   │   └── ChangePriceListItemAttributesCommandHandler.cs
    │   │   │   │   ├── CreatePriceListItem/
    │   │   │   │   │   ├── CreatePriceListItemCommand.cs
    │   │   │   │   │   └── CreatePriceListItemCommandHandler.cs
    │   │   │   │   ├── DeactivatePriceListItem/
    │   │   │   │   │   ├── DeactivatePriceListItemCommand.cs
    │   │   │   │   │   └── DeactivatePriceListItemCommandHandler.cs
    │   │   │   │   ├── GetPriceListItem/
    │   │   │   │   │   ├── GetPriceListItemQuery.cs
    │   │   │   │   │   ├── GetPriceListItemQueryHandler.cs
    │   │   │   │   │   ├── PriceListItemMoneyValueDto.cs
    │   │   │   │   │   └── PriceListItemsProjector.cs
    │   │   │   │   ├── GetPriceListItems/
    │   │   │   │   │   ├── GetPriceListItemsQuery.cs
    │   │   │   │   │   └── GetPriceListItemsQueryHandler.cs
    │   │   │   │   ├── PriceListFactory.cs
    │   │   │   │   └── PriceListItemDto.cs
    │   │   │   └── Subscriptions/
    │   │   │       ├── BuySubscription/
    │   │   │       │   ├── BuySubscriptionCommand.cs
    │   │   │       │   └── BuySubscriptionCommandHandler.cs
    │   │   │       ├── BuySubscriptionRenewal/
    │   │   │       │   ├── BuySubscriptionRenewalCommand.cs
    │   │   │       │   └── BuySubscriptionRenewalCommandHandler.cs
    │   │   │       ├── CreateSubscription/
    │   │   │       │   ├── CreateSubscriptionCommand.cs
    │   │   │       │   ├── CreateSubscriptionCommandHandler.cs
    │   │   │       │   ├── SubscriptionCreatedEnqueueEmailConfirmationHandler.cs
    │   │   │       │   ├── SubscriptionCreatedNotification.cs
    │   │   │       │   └── SubscriptionCreatedNotificationHandler.cs
    │   │   │       ├── ExpireSubscription/
    │   │   │       │   ├── ExpireSubscriptionCommand.cs
    │   │   │       │   └── ExpireSubscriptionCommandHandler.cs
    │   │   │       ├── ExpireSubscriptionPayment/
    │   │   │       │   ├── ExpireSubscriptionPaymentCommand.cs
    │   │   │       │   └── ExpireSubscriptionPaymentCommandHandler.cs
    │   │   │       ├── ExpireSubscriptionPayments/
    │   │   │       │   ├── ExpireSubscriptionPaymentsCommand.cs
    │   │   │       │   └── ExpireSubscriptionPaymentsCommandHandler.cs
    │   │   │       ├── ExpireSubscriptions/
    │   │   │       │   ├── ExpireSubscriptionsCommand.cs
    │   │   │       │   └── ExpireSubscriptionsCommandHandler.cs
    │   │   │       ├── GetPayerSubscription/
    │   │   │       │   ├── GetAuthenticatedPayerSubscriptionQuery.cs
    │   │   │       │   └── GetAuthenticatedPayerSubscriptionQueryHandler.cs
    │   │   │       ├── GetSubscriptionDetails/
    │   │   │       │   ├── GetSubscriptionDetailsQuery.cs
    │   │   │       │   ├── GetSubscriptionDetailsQueryHandler.cs
    │   │   │       │   ├── SubscriptionDetailsDto.cs
    │   │   │       │   └── SubscriptionDetailsProjector.cs
    │   │   │       ├── GetSubscriptionPayments/
    │   │   │       │   ├── GetSubscriptionPaymentsQuery.cs
    │   │   │       │   ├── GetSubscriptionPaymentsQueryHandler.cs
    │   │   │       │   ├── SubscriptionPaymentDto.cs
    │   │   │       │   └── SubscriptionPaymentsProjector.cs
    │   │   │       ├── MarkSubscriptionPaymentAsPaid/
    │   │   │       │   ├── MarkSubscriptionPaymentAsPaidCommand.cs
    │   │   │       │   ├── MarkSubscriptionPaymentAsPaidCommandHandler.cs
    │   │   │       │   ├── SubscriptionPaymentPaidNotification.cs
    │   │   │       │   └── SubscriptionPaymentPaidNotificationHandler.cs
    │   │   │       ├── MarkSubscriptionRenewalPaymentAsPaid/
    │   │   │       │   ├── MarkSubscriptionRenewalPaymentAsPaidCommand.cs
    │   │   │       │   ├── MarkSubscriptionRenewalPaymentAsPaidCommandHandler.cs
    │   │   │       │   ├── SubscriptionRenewalPaymentAsPaidNotificationHandler.cs
    │   │   │       │   └── SubscriptionRenewalPaymentPaidNotification.cs
    │   │   │       ├── RenewSubscription/
    │   │   │       │   ├── RenewSubscriptionCommand.cs
    │   │   │       │   ├── RenewSubscriptionCommandHandler.cs
    │   │   │       │   ├── SubscriptionRenewedEnqueueEmailConfirmationHandler.cs
    │   │   │       │   ├── SubscriptionRenewedNotification.cs
    │   │   │       │   └── SubscriptionRenewedNotificationHandler.cs
    │   │   │       ├── SendSubscriptionCreationConfirmationEmail/
    │   │   │       │   ├── SendSubscriptionCreationConfirmationEmailCommand.cs
    │   │   │       │   └── SendSubscriptionCreationConfirmationEmailCommandHandler.cs
    │   │   │       └── SendSubscriptionRenewalConfirmationEmail/
    │   │   │           ├── SendSubscriptionRenewalConfirmationEmailCommand.cs
    │   │   │           └── SendSubscriptionRenewalConfirmationEmailCommandHandler.cs
    │   │   ├── Domain/
    │   │   │   ├── CompanyName.MyMeetings.Modules.Payments.Domain.csproj
    │   │   │   ├── MeetingFeePayments/
    │   │   │   │   ├── Events/
    │   │   │   │   │   ├── MeetingFeePaymentCreatedDomainEvent.cs
    │   │   │   │   │   ├── MeetingFeePaymentExpiredDomainEvent.cs
    │   │   │   │   │   └── MeetingFeePaymentPaidDomainEvent.cs
    │   │   │   │   ├── MeetingFeePayment.cs
    │   │   │   │   ├── MeetingFeePaymentId.cs
    │   │   │   │   ├── MeetingFeePaymentSnapshot.cs
    │   │   │   │   └── MeetingFeePaymentStatus.cs
    │   │   │   ├── MeetingFees/
    │   │   │   │   ├── Events/
    │   │   │   │   │   ├── MeetingFeeCanceledDomainEvent.cs
    │   │   │   │   │   ├── MeetingFeeCreatedDomainEvent.cs
    │   │   │   │   │   ├── MeetingFeeExpiredDomainEvent.cs
    │   │   │   │   │   └── MeetingFeePaidDomainEvent.cs
    │   │   │   │   ├── MeetingFee.cs
    │   │   │   │   ├── MeetingFeeId.cs
    │   │   │   │   ├── MeetingFeeSnapshot.cs
    │   │   │   │   ├── MeetingFeeStatus.cs
    │   │   │   │   └── MeetingId.cs
    │   │   │   ├── Payers/
    │   │   │   │   ├── Events/
    │   │   │   │   │   └── PayerCreatedDomainEvent.cs
    │   │   │   │   ├── IPayerContext.cs
    │   │   │   │   ├── IPayerRepository.cs
    │   │   │   │   ├── Payer.cs
    │   │   │   │   └── PayerId.cs
    │   │   │   ├── PriceListItems/
    │   │   │   │   ├── Events/
    │   │   │   │   │   ├── PriceListItemActivatedDomainEvent.cs
    │   │   │   │   │   ├── PriceListItemAttributesChangedDomainEvent.cs
    │   │   │   │   │   ├── PriceListItemCreatedDomainEvent.cs
    │   │   │   │   │   └── PriceListItemDeactivatedDomainEvent.cs
    │   │   │   │   ├── PriceList.cs
    │   │   │   │   ├── PriceListItem.cs
    │   │   │   │   ├── PriceListItemCategory.cs
    │   │   │   │   ├── PriceListItemData.cs
    │   │   │   │   ├── PriceListItemId.cs
    │   │   │   │   └── PricingStrategies/
    │   │   │   │       ├── DirectValueFromPriceListPricingStrategy.cs
    │   │   │   │       ├── DirectValuePricingStrategy.cs
    │   │   │   │       ├── DiscountedValueFromPriceListPricingStrategy.cs
    │   │   │   │       └── IPricingStrategy.cs
    │   │   │   ├── SeedWork/
    │   │   │   │   ├── AggregateId.cs
    │   │   │   │   ├── AggregateRoot.cs
    │   │   │   │   ├── IAggregateStore.cs
    │   │   │   │   ├── MoneyValue.cs
    │   │   │   │   ├── Rules/
    │   │   │   │   │   ├── MoneyMustHaveTheSameCurrencyRule.cs
    │   │   │   │   │   └── ValueOfMoneyMustNotBeNegativeRule.cs
    │   │   │   │   └── SystemClock.cs
    │   │   │   ├── SubscriptionPayments/
    │   │   │   │   ├── Events/
    │   │   │   │   │   ├── SubscriptionPaymentCreatedDomainEvent.cs
    │   │   │   │   │   ├── SubscriptionPaymentExpiredDomainEvent.cs
    │   │   │   │   │   └── SubscriptionPaymentPaidDomainEvent.cs
    │   │   │   │   ├── Rules/
    │   │   │   │   │   ├── PriceForSubscriptionMustBeDefinedRule.cs
    │   │   │   │   │   └── PriceOfferMustMatchPriceInPriceListRule.cs
    │   │   │   │   ├── SubscriptionPayment.cs
    │   │   │   │   ├── SubscriptionPaymentId.cs
    │   │   │   │   ├── SubscriptionPaymentSnapshot.cs
    │   │   │   │   └── SubscriptionPaymentStatus.cs
    │   │   │   ├── SubscriptionRenewalPayments/
    │   │   │   │   ├── Events/
    │   │   │   │   │   ├── SubscriptionRenewalPaymentCreatedDomainEvent.cs
    │   │   │   │   │   └── SubscriptionRenewalPaymentPaidDomainEvent.cs
    │   │   │   │   ├── Rules/
    │   │   │   │   │   └── PriceOfferMustMatchPriceInPriceListRule.cs
    │   │   │   │   ├── SubscriptionRenewalPayment.cs
    │   │   │   │   ├── SubscriptionRenewalPaymentId.cs
    │   │   │   │   ├── SubscriptionRenewalPaymentSnapshot.cs
    │   │   │   │   └── SubscriptionRenewalPaymentStatus.cs
    │   │   │   ├── Subscriptions/
    │   │   │   │   ├── Events/
    │   │   │   │   │   ├── SubscriptionCreatedDomainEvent.cs
    │   │   │   │   │   ├── SubscriptionExpiredDomainEvent.cs
    │   │   │   │   │   └── SubscriptionRenewedDomainEvent.cs
    │   │   │   │   ├── SubscriberId.cs
    │   │   │   │   ├── Subscription.cs
    │   │   │   │   ├── SubscriptionDateExpirationCalculator.cs
    │   │   │   │   ├── SubscriptionId.cs
    │   │   │   │   ├── SubscriptionPeriod.cs
    │   │   │   │   └── SubscriptionStatus.cs
    │   │   │   └── Users/
    │   │   │       ├── IUserContext.cs
    │   │   │       └── UserId.cs
    │   │   ├── Infrastructure/
    │   │   │   ├── AggregateStore/
    │   │   │   │   ├── AggregateStoreDomainEventsAccessor.cs
    │   │   │   │   ├── DomainEventTypeMappings.cs
    │   │   │   │   ├── ICheckpointStore.cs
    │   │   │   │   ├── SqlOutboxAccessor.cs
    │   │   │   │   ├── SqlServerCheckpointStore.cs
    │   │   │   │   ├── SqlStreamAggregateStore.cs
    │   │   │   │   ├── SubscriptionCode.cs
    │   │   │   │   └── SubscriptionsManager.cs
    │   │   │   ├── CompanyName.MyMeetings.Modules.Payments.Infrastructure.csproj
    │   │   │   ├── Configuration/
    │   │   │   │   ├── AllConstructorFinder.cs
    │   │   │   │   ├── Assemblies.cs
    │   │   │   │   ├── Authentication/
    │   │   │   │   │   ├── AuthenticationModule.cs
    │   │   │   │   │   └── PayerContext.cs
    │   │   │   │   ├── DataAccess/
    │   │   │   │   │   └── DataAccessModule.cs
    │   │   │   │   ├── DatabaseSchema.cs
    │   │   │   │   ├── Email/
    │   │   │   │   │   └── EmailModule.cs
    │   │   │   │   ├── EventsBus/
    │   │   │   │   │   ├── EventsBusModule.cs
    │   │   │   │   │   ├── EventsBusStartup.cs
    │   │   │   │   │   └── IntegrationEventGenericHandler.cs
    │   │   │   │   ├── Logging/
    │   │   │   │   │   └── LoggingModule.cs
    │   │   │   │   ├── Mediation/
    │   │   │   │   │   └── MediatorModule.cs
    │   │   │   │   ├── PaymentsCompositionRoot.cs
    │   │   │   │   ├── PaymentsStartup.cs
    │   │   │   │   ├── Processing/
    │   │   │   │   │   ├── CommandsExecutor.cs
    │   │   │   │   │   ├── Inbox/
    │   │   │   │   │   │   ├── InboxMessageDto.cs
    │   │   │   │   │   │   ├── ProcessInboxCommand.cs
    │   │   │   │   │   │   ├── ProcessInboxCommandHandler.cs
    │   │   │   │   │   │   └── ProcessInboxJob.cs
    │   │   │   │   │   ├── InternalCommands/
    │   │   │   │   │   │   ├── CommandsScheduler.cs
    │   │   │   │   │   │   ├── ProcessInternalCommandsCommand.cs
    │   │   │   │   │   │   ├── ProcessInternalCommandsCommandHandler.cs
    │   │   │   │   │   │   └── ProcessInternalCommandsJob.cs
    │   │   │   │   │   ├── LoggingCommandHandlerDecorator.cs
    │   │   │   │   │   ├── LoggingCommandHandlerWithResultDecorator.cs
    │   │   │   │   │   ├── Outbox/
    │   │   │   │   │   │   ├── OutboxMessageDto.cs
    │   │   │   │   │   │   ├── OutboxModule.cs
    │   │   │   │   │   │   ├── ProcessOutboxCommand.cs
    │   │   │   │   │   │   ├── ProcessOutboxCommandHandler.cs
    │   │   │   │   │   │   └── ProcessOutboxJob.cs
    │   │   │   │   │   ├── PaymentsUnitOfWork.cs
    │   │   │   │   │   ├── ProcessingModule.cs
    │   │   │   │   │   ├── UnitOfWorkCommandHandlerDecorator.cs
    │   │   │   │   │   ├── UnitOfWorkCommandHandlerWithResultDecorator.cs
    │   │   │   │   │   ├── ValidationCommandHandlerDecorator.cs
    │   │   │   │   │   └── ValidationCommandHandlerWithResultDecorator.cs
    │   │   │   │   └── Quartz/
    │   │   │   │       ├── Jobs/
    │   │   │   │       │   ├── ExpireSubscriptionPaymentsJob.cs
    │   │   │   │       │   └── ExpireSubscriptionsJob.cs
    │   │   │   │       ├── QuartzModule.cs
    │   │   │   │       ├── QuartzStartup.cs
    │   │   │   │       └── SerilogLogProvider.cs
    │   │   │   ├── InternalCommands/
    │   │   │   │   └── InternalCommandEntityTypeConfiguration.cs
    │   │   │   └── PaymentsModule.cs
    │   │   ├── IntegrationEvents/
    │   │   │   ├── CompanyName.MyMeetings.Modules.Payments.IntegrationEvents.csproj
    │   │   │   ├── MeetingFeePaidIntegrationEvent.cs
    │   │   │   └── SubscriptionExpirationDateChangedIntegrationEvent.cs
    │   │   └── Tests/
    │   │       ├── ArchTests/
    │   │       │   ├── Application/
    │   │       │   │   └── ApplicationTests.cs
    │   │       │   ├── CompanyName.MyMeetings.Modules.Payments.ArchTests.csproj
    │   │       │   ├── Domain/
    │   │       │   │   └── DomainTests.cs
    │   │       │   ├── Module/
    │   │       │   │   └── LayersTests.cs
    │   │       │   └── SeedWork/
    │   │       │       └── TestBase.cs
    │   │       ├── IntegrationTests/
    │   │       │   ├── AssemblyInfo.cs
    │   │       │   ├── CompanyName.MyMeetings.Modules.Payments.IntegrationTests.csproj
    │   │       │   ├── MeetingFees/
    │   │       │   │   └── MeetingFeesTests.cs
    │   │       │   ├── Payers/
    │   │       │   │   ├── PayerSampleData.cs
    │   │       │   │   └── PayerTests.cs
    │   │       │   ├── PriceList/
    │   │       │   │   └── PriceListHelper.cs
    │   │       │   ├── SeedWork/
    │   │       │   │   ├── EventsBusMock.cs
    │   │       │   │   ├── ExecutionContextMock.cs
    │   │       │   │   ├── OutboxMessagesHelper.cs
    │   │       │   │   └── TestBase.cs
    │   │       │   └── Subscriptions/
    │   │       │       ├── BuySubscriptionTests.cs
    │   │       │       ├── GetSubscriptionPaymentsProbe.cs
    │   │       │       ├── SubscriptionLifecycleTests.cs
    │   │       │       └── SubscriptionPaymentsTests.cs
    │   │       └── UnitTests/
    │   │           ├── CompanyName.MyMeetings.Modules.Payments.Domain.UnitTests.csproj
    │   │           ├── Payers/
    │   │           │   └── PayerTests.cs
    │   │           ├── PriceListItems/
    │   │           │   └── PriceListItemTests.cs
    │   │           ├── SeedWork/
    │   │           │   ├── DomainEventsTestHelper.cs
    │   │           │   └── TestBase.cs
    │   │           ├── SubscriptionPayments/
    │   │           │   ├── SubscriptionPaymentTests.cs
    │   │           │   └── SubscriptionPaymentTestsBase.cs
    │   │           ├── SubscriptionRenewalPayments/
    │   │           │   ├── SubscriptionRenewalPaymentTests.cs
    │   │           │   └── SubscriptionRenewalPaymentTestsBase.cs
    │   │           └── Subscriptions/
    │   │               ├── SubscriptionDateExpirationCalculatorTests.cs
    │   │               └── SubscriptionTests.cs
    │   ├── Registrations/
    │   │   ├── Application/
    │   │   │   ├── CompanyName.MyMeetings.Modules.Registrations.Application.csproj
    │   │   │   ├── Configuration/
    │   │   │   │   ├── Commands/
    │   │   │   │   │   ├── ICommandHandler.cs
    │   │   │   │   │   ├── ICommandsScheduler.cs
    │   │   │   │   │   └── InternalCommandBase.cs
    │   │   │   │   └── Queries/
    │   │   │   │       └── IQueryHandler.cs
    │   │   │   ├── Contracts/
    │   │   │   │   ├── CommandBase.cs
    │   │   │   │   ├── CustomClaimTypes.cs
    │   │   │   │   ├── ICommand.cs
    │   │   │   │   ├── IQuery.cs
    │   │   │   │   ├── IRecurringCommand.cs
    │   │   │   │   ├── IRegistrationsModule.cs
    │   │   │   │   ├── QueryBase.cs
    │   │   │   │   └── Roles.cs
    │   │   │   └── UserRegistrations/
    │   │   │       ├── ConfirmUserRegistration/
    │   │   │       │   ├── ConfirmUserRegistrationCommand.cs
    │   │   │       │   ├── ConfirmUserRegistrationCommandHandler.cs
    │   │   │       │   ├── IUserCreator.cs
    │   │   │       │   ├── UserRegistrationConfirmedNotification.cs
    │   │   │       │   └── UserRegistrationConfirmedNotificationHandler.cs
    │   │   │       ├── GetUserRegistration/
    │   │   │       │   ├── GetUserRegistrationQuery.cs
    │   │   │       │   ├── GetUserRegistrationQueryHandler.cs
    │   │   │       │   ├── UserRegistrationDto.cs
    │   │   │       │   └── UserRegistrationProvider.cs
    │   │   │       ├── RegisterNewUser/
    │   │   │       │   ├── NewUserRegisteredEnqueueEmailConfirmationHandler.cs
    │   │   │       │   ├── NewUserRegisteredNotification.cs
    │   │   │       │   ├── NewUserRegisteredPublishEventHandler.cs
    │   │   │       │   ├── PasswordManager.cs
    │   │   │       │   ├── RegisterNewUserCommand.cs
    │   │   │       │   └── RegisterNewUserCommandHandler.cs
    │   │   │       ├── SendUserRegistrationConfirmationEmail/
    │   │   │       │   ├── SendUserRegistrationConfirmationEmailCommand.cs
    │   │   │       │   └── SendUserRegistrationConfirmationEmailCommandHandler.cs
    │   │   │       └── UsersCounter.cs
    │   │   ├── Domain/
    │   │   │   ├── CompanyName.MyMeetings.Modules.Registrations.Domain.csproj
    │   │   │   └── UserRegistrations/
    │   │   │       ├── Events/
    │   │   │       │   ├── NewUserRegisteredDomainEvent.cs
    │   │   │       │   ├── UserRegistrationConfirmedDomainEvent.cs
    │   │   │       │   └── UserRegistrationExpiredDomainEvent.cs
    │   │   │       ├── IUserRegistrationRepository.cs
    │   │   │       ├── IUsersCounter.cs
    │   │   │       ├── Rules/
    │   │   │       │   ├── UserCannotBeCreatedWhenRegistrationIsNotConfirmedRule.cs
    │   │   │       │   ├── UserLoginMustBeUniqueRule.cs
    │   │   │       │   ├── UserRegistrationCannotBeConfirmedAfterExpirationRule.cs
    │   │   │       │   ├── UserRegistrationCannotBeConfirmedMoreThanOnceRule.cs
    │   │   │       │   └── UserRegistrationCannotBeExpiredMoreThanOnceRule.cs
    │   │   │       ├── UserRegistration.cs
    │   │   │       ├── UserRegistrationId.cs
    │   │   │       └── UserRegistrationStatus.cs
    │   │   ├── Infrastructure/
    │   │   │   ├── CompanyName.MyMeetings.Modules.Registrations.Infrastructure.csproj
    │   │   │   ├── Configuration/
    │   │   │   │   ├── AllConstructorFinder.cs
    │   │   │   │   ├── Assemblies.cs
    │   │   │   │   ├── Commands/
    │   │   │   │   │   ├── ICommandHandler.cs
    │   │   │   │   │   ├── ICommandsScheduler.cs
    │   │   │   │   │   └── InternalCommandBase.cs
    │   │   │   │   ├── DataAccess/
    │   │   │   │   │   └── DataAccessModule.cs
    │   │   │   │   ├── Domain/
    │   │   │   │   │   └── DomainModule.cs
    │   │   │   │   ├── Email/
    │   │   │   │   │   └── EmailModule.cs
    │   │   │   │   ├── EventsBus/
    │   │   │   │   │   ├── EventsBusModule.cs
    │   │   │   │   │   ├── EventsBusStartup.cs
    │   │   │   │   │   └── IntegrationEventGenericHandler.cs
    │   │   │   │   ├── Logging/
    │   │   │   │   │   └── LoggingModule.cs
    │   │   │   │   ├── Mediation/
    │   │   │   │   │   └── MediatorModule.cs
    │   │   │   │   ├── Processing/
    │   │   │   │   │   ├── CommandsExecutor.cs
    │   │   │   │   │   ├── IRecurringCommand.cs
    │   │   │   │   │   ├── Inbox/
    │   │   │   │   │   │   ├── InboxMessageDto.cs
    │   │   │   │   │   │   ├── ProcessInboxCommand.cs
    │   │   │   │   │   │   ├── ProcessInboxCommandHandler.cs
    │   │   │   │   │   │   └── ProcessInboxJob.cs
    │   │   │   │   │   ├── InternalCommands/
    │   │   │   │   │   │   ├── CommandsScheduler.cs
    │   │   │   │   │   │   ├── ProcessInternalCommandsCommand.cs
    │   │   │   │   │   │   ├── ProcessInternalCommandsCommandHandler.cs
    │   │   │   │   │   │   └── ProcessInternalCommandsJob.cs
    │   │   │   │   │   ├── LoggingCommandHandlerDecorator.cs
    │   │   │   │   │   ├── LoggingCommandHandlerWithResultDecorator.cs
    │   │   │   │   │   ├── Outbox/
    │   │   │   │   │   │   ├── OutboxMessageDto.cs
    │   │   │   │   │   │   ├── OutboxModule.cs
    │   │   │   │   │   │   ├── ProcessOutboxCommand.cs
    │   │   │   │   │   │   ├── ProcessOutboxCommandHandler.cs
    │   │   │   │   │   │   └── ProcessOutboxJob.cs
    │   │   │   │   │   ├── ProcessingModule.cs
    │   │   │   │   │   ├── UnitOfWorkCommandHandlerDecorator.cs
    │   │   │   │   │   ├── UnitOfWorkCommandHandlerWithResultDecorator.cs
    │   │   │   │   │   ├── ValidationCommandHandlerDecorator.cs
    │   │   │   │   │   └── ValidationCommandHandlerWithResultDecorator.cs
    │   │   │   │   ├── Quartz/
    │   │   │   │   │   ├── QuartzModule.cs
    │   │   │   │   │   ├── QuartzStartup.cs
    │   │   │   │   │   └── SerilogLogProvider.cs
    │   │   │   │   ├── RegistrationsCompositionRoot.cs
    │   │   │   │   ├── RegistrationsStartup.cs
    │   │   │   │   └── UserAccess/
    │   │   │   │       └── UserAccessAutofacModule.cs
    │   │   │   ├── Domain/
    │   │   │   │   └── UserRegistrations/
    │   │   │   │       ├── UserRegistrationEntityTypeConfiguration.cs
    │   │   │   │       └── UserRegistrationRepository.cs
    │   │   │   ├── InternalCommands/
    │   │   │   │   └── InternalCommandEntityTypeConfiguration.cs
    │   │   │   ├── Outbox/
    │   │   │   │   ├── OutboxAccessor.cs
    │   │   │   │   └── OutboxMessageEntityTypeConfiguration.cs
    │   │   │   ├── RegistrationsContext.cs
    │   │   │   ├── RegistrationsModule.cs
    │   │   │   └── Users/
    │   │   │       └── UserAccessGateway.cs
    │   │   ├── IntegrationEvents/
    │   │   │   ├── Class1.cs
    │   │   │   ├── CompanyName.MyMeetings.Modules.Registrations.IntegrationEvents.csproj
    │   │   │   └── NewUserRegisteredIntegrationEvent.cs
    │   │   └── Tests/
    │   │       ├── ArchTests/
    │   │       │   ├── Application/
    │   │       │   │   └── ApplicationTests.cs
    │   │       │   ├── CompanyName.MyMeetings.Modules.Registrations.ArchTests.csproj
    │   │       │   ├── Domain/
    │   │       │   │   └── DomainTests.cs
    │   │       │   ├── Module/
    │   │       │   │   └── LayersTests.cs
    │   │       │   └── SeedWork/
    │   │       │       └── TestBase.cs
    │   │       ├── IntegrationTests/
    │   │       │   ├── AssemblyInfo.cs
    │   │       │   ├── CompanyNames.MyMeetings.Modules.Registrations.IntegrationTests.csproj
    │   │       │   ├── SeedWork/
    │   │       │   │   ├── ExecutionContextMock.cs
    │   │       │   │   ├── OutboxMessagesHelper.cs
    │   │       │   │   └── TestBase.cs
    │   │       │   └── UserRegistrations/
    │   │       │       ├── ConfirmUserRegistrationTests.cs
    │   │       │       ├── SendUserRegistrationConfirmationEmailTests.cs
    │   │       │       ├── UserRegistrationSampleData.cs
    │   │       │       └── UserRegistrationTests.cs
    │   │       └── UnitTests/
    │   │           ├── CompanyName.MyMeetings.Modules.Registrations.Domain.UnitTests.csproj
    │   │           ├── SeedWork/
    │   │           │   ├── DomainEventsTestHelper.cs
    │   │           │   └── TestBase.cs
    │   │           └── UserRegistrations/
    │   │               └── UserRegistrationTests.cs
    │   └── UserAccess/
    │       ├── Application/
    │       │   ├── Authentication/
    │       │   │   └── Authenticate/
    │       │   │       ├── AuthenticateCommand.cs
    │       │   │       ├── AuthenticateCommandHandler.cs
    │       │   │       ├── AuthenticateCommandValidator.cs
    │       │   │       ├── AuthenticationResult.cs
    │       │   │       ├── PasswordManager.cs
    │       │   │       └── UserDto.cs
    │       │   ├── Authorization/
    │       │   │   ├── GetAuthenticatedUserPermissions/
    │       │   │   │   ├── GetAuthenticatedUserPermissionsQuery.cs
    │       │   │   │   └── GetAuthenticatedUserPermissionsQueryHandler.cs
    │       │   │   └── GetUserPermissions/
    │       │   │       ├── GetUserPermissionsQuery.cs
    │       │   │       ├── GetUserPermissionsQueryHandler.cs
    │       │   │       └── UserPermissionDto.cs
    │       │   ├── CompanyName.MyMeetings.Modules.UserAccess.Application.csproj
    │       │   ├── Configuration/
    │       │   │   ├── Commands/
    │       │   │   │   ├── ICommandHandler.cs
    │       │   │   │   ├── ICommandsScheduler.cs
    │       │   │   │   └── InternalCommandBase.cs
    │       │   │   └── Queries/
    │       │   │       └── IQueryHandler.cs
    │       │   ├── Contracts/
    │       │   │   ├── CommandBase.cs
    │       │   │   ├── CustomClaimTypes.cs
    │       │   │   ├── ICommand.cs
    │       │   │   ├── IQuery.cs
    │       │   │   ├── IRecurringCommand.cs
    │       │   │   ├── IUserAccessModule.cs
    │       │   │   ├── QueryBase.cs
    │       │   │   └── Roles.cs
    │       │   ├── Emails/
    │       │   │   ├── EmailDto.cs
    │       │   │   ├── GetAllEmailsQuery.cs
    │       │   │   └── GetAllEmailsQueryHandler.cs
    │       │   └── Users/
    │       │       ├── AddAdminUser/
    │       │       │   ├── AddAdminUserCommand.cs
    │       │       │   └── AddAdminUserCommandHandler.cs
    │       │       ├── CreateUser/
    │       │       │   ├── CreateUserCommand.cs
    │       │       │   └── CreateUserCommandHandler.cs
    │       │       ├── GetAuthenticatedUser/
    │       │       │   ├── GetAuthenticatedUserQuery.cs
    │       │       │   └── GetAuthenticatedUserQueryHandler.cs
    │       │       └── GetUser/
    │       │           ├── GetUserQuery.cs
    │       │           ├── GetUserQueryHandler.cs
    │       │           └── UserDto.cs
    │       ├── Domain/
    │       │   ├── CompanyName.MyMeetings.Modules.UserAccess.Domain.csproj
    │       │   └── Users/
    │       │       ├── Events/
    │       │       │   └── UserCreatedDomainEvent.cs
    │       │       ├── IUserRepository.cs
    │       │       ├── User.cs
    │       │       ├── UserId.cs
    │       │       └── UserRole.cs
    │       ├── Infrastructure/
    │       │   ├── CompanyName.MyMeetings.Modules.UserAccess.Infrastructure.csproj
    │       │   ├── Configuration/
    │       │   │   ├── AllConstructorFinder.cs
    │       │   │   ├── Assemblies.cs
    │       │   │   ├── DataAccess/
    │       │   │   │   └── DataAccessModule.cs
    │       │   │   ├── Email/
    │       │   │   │   └── EmailModule.cs
    │       │   │   ├── EventsBus/
    │       │   │   │   ├── EventsBusModule.cs
    │       │   │   │   ├── EventsBusStartup.cs
    │       │   │   │   └── IntegrationEventGenericHandler.cs
    │       │   │   ├── Identity/
    │       │   │   │   └── IdentityConfiguration.cs
    │       │   │   ├── Logging/
    │       │   │   │   └── LoggingModule.cs
    │       │   │   ├── Mediation/
    │       │   │   │   └── MediatorModule.cs
    │       │   │   ├── Processing/
    │       │   │   │   ├── CommandsExecutor.cs
    │       │   │   │   ├── IRecurringCommand.cs
    │       │   │   │   ├── Inbox/
    │       │   │   │   │   ├── InboxMessageDto.cs
    │       │   │   │   │   ├── ProcessInboxCommand.cs
    │       │   │   │   │   ├── ProcessInboxCommandHandler.cs
    │       │   │   │   │   └── ProcessInboxJob.cs
    │       │   │   │   ├── InternalCommands/
    │       │   │   │   │   ├── CommandsScheduler.cs
    │       │   │   │   │   ├── ProcessInternalCommandsCommand.cs
    │       │   │   │   │   ├── ProcessInternalCommandsCommandHandler.cs
    │       │   │   │   │   └── ProcessInternalCommandsJob.cs
    │       │   │   │   ├── LoggingCommandHandlerDecorator.cs
    │       │   │   │   ├── LoggingCommandHandlerWithResultDecorator.cs
    │       │   │   │   ├── Outbox/
    │       │   │   │   │   ├── OutboxMessageDto.cs
    │       │   │   │   │   ├── OutboxModule.cs
    │       │   │   │   │   ├── ProcessOutboxCommand.cs
    │       │   │   │   │   ├── ProcessOutboxCommandHandler.cs
    │       │   │   │   │   └── ProcessOutboxJob.cs
    │       │   │   │   ├── ProcessingModule.cs
    │       │   │   │   ├── UnitOfWorkCommandHandlerDecorator.cs
    │       │   │   │   ├── UnitOfWorkCommandHandlerWithResultDecorator.cs
    │       │   │   │   ├── ValidationCommandHandlerDecorator.cs
    │       │   │   │   └── ValidationCommandHandlerWithResultDecorator.cs
    │       │   │   ├── Quartz/
    │       │   │   │   ├── QuartzModule.cs
    │       │   │   │   ├── QuartzStartup.cs
    │       │   │   │   └── SerilogLogProvider.cs
    │       │   │   ├── Security/
    │       │   │   │   ├── AesDataProtector.cs
    │       │   │   │   ├── IDataProtector.cs
    │       │   │   │   └── SecurityModule.cs
    │       │   │   ├── UserAccessCompositionRoot.cs
    │       │   │   └── UserAccessStartup.cs
    │       │   ├── Domain/
    │       │   │   └── Users/
    │       │   │       ├── UserEntityTypeConfiguration.cs
    │       │   │       └── UserRepository.cs
    │       │   ├── IdentityServer/
    │       │   │   ├── IdentityServerConfig.cs
    │       │   │   ├── ProfileService.cs
    │       │   │   └── ResourceOwnerPasswordValidator.cs
    │       │   ├── InternalCommands/
    │       │   │   └── InternalCommandEntityTypeConfiguration.cs
    │       │   ├── Outbox/
    │       │   │   ├── OutboxAccessor.cs
    │       │   │   └── OutboxMessageEntityTypeConfiguration.cs
    │       │   ├── UserAccessContext.cs
    │       │   └── UserAccessModule.cs
    │       ├── IntegrationEvents/
    │       │   └── CompanyName.MyMeetings.Modules.UserAccess.IntegrationEvents.csproj
    │       └── Tests/
    │           ├── ArchTests/
    │           │   ├── Application/
    │           │   │   └── ApplicationTests.cs
    │           │   ├── CompanyName.MyMeetings.Modules.UserAccess.ArchTests.csproj
    │           │   ├── Domain/
    │           │   │   └── DomainTests.cs
    │           │   ├── Module/
    │           │   │   └── LayersTests.cs
    │           │   └── SeedWork/
    │           │       └── TestBase.cs
    │           ├── IntegrationTests/
    │           │   ├── AssemblyInfo.cs
    │           │   ├── CompanyNames.MyMeetings.Modules.UserAccess.IntegrationTests.csproj
    │           │   ├── SeedWork/
    │           │   │   ├── ExecutionContextMock.cs
    │           │   │   ├── OutboxMessagesHelper.cs
    │           │   │   └── TestBase.cs
    │           │   └── Users/
    │           │       └── CreateUserTests.cs
    │           └── UnitTests/
    │               ├── CompanyName.MyMeetings.Modules.UserAccess.Domain.UnitTests.csproj
    │               └── SeedWork/
    │                   ├── DomainEventsTestHelper.cs
    │                   └── TestBase.cs
    ├── Tests/
    │   ├── ArchTests/
    │   │   ├── Api/
    │   │   │   └── ApiTests.cs
    │   │   ├── CompanyName.MyMeetings.ArchTests.csproj
    │   │   ├── Modules/
    │   │   │   └── ModuleTests.cs
    │   │   └── SeedWork/
    │   │       └── TestBase.cs
    │   ├── IntegrationTests/
    │   │   ├── AssemblyInfo.cs
    │   │   ├── CompanyName.MyMeetings.IntegrationTests.csproj
    │   │   ├── CreateMeetingGroup/
    │   │   │   └── CreateMeetingGroupTests.cs
    │   │   └── SeedWork/
    │   │       ├── ExecutionContextMock.cs
    │   │       └── TestBase.cs
    │   └── SUT/
    │       ├── CompanyName.MyMeetings.SUT.csproj
    │       ├── Helpers/
    │       │   ├── MeetingGroupsFactory.cs
    │       │   ├── TestMeetingFactory.cs
    │       │   ├── TestMeetingGroupManager.cs
    │       │   ├── TestMeetingManager.cs
    │       │   ├── TestPaymentsManager.cs
    │       │   ├── TestPriceListManager.cs
    │       │   └── UsersFactory.cs
    │       ├── Scripts/
    │       │   └── SeedPermissions.sql
    │       ├── SeedWork/
    │       │   ├── AsyncOperationsHelper.cs
    │       │   ├── DatabaseCleaner.cs
    │       │   ├── ExecutionContextMock.cs
    │       │   ├── Probing/
    │       │   │   ├── AssertErrorException.cs
    │       │   │   ├── IProbe.cs
    │       │   │   ├── Poller.cs
    │       │   │   └── Timeout.cs
    │       │   └── TestBase.cs
    │       └── TestCases/
    │           ├── CleanDatabaseTestCase.cs
    │           ├── CreateMeeting.cs
    │           └── OnlyAdminTestCase.cs
    ├── entrypoint.sh
    ├── global.json
    └── stylecop.json
Download .txt
Showing preview only (438K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3486 symbols across 1136 files)

FILE: build/Build.cs
  class Build (line 8) | partial class Build : NukeBuild
    method Main (line 16) | public static int Main () => Execute<Build>(x => x.Compile);

FILE: build/BuildIntegrationTests.cs
  class Build (line 11) | public partial class Build

FILE: build/Configuration.cs
  class Configuration (line 4) | [TypeConverter(typeof(TypeConverter<Configuration>))]

FILE: build/Database.cs
  class Build (line 6) | public partial class Build

FILE: build/SUTCreator.cs
  class Build (line 8) | public partial class Build

FILE: build/Utils/SqlReadinessChecker.cs
  class SqlReadinessChecker (line 8) | public static class SqlReadinessChecker
    method WaitForSqlSever (line 10) | public static void WaitForSqlSever(string connectionString)

FILE: src/API/CompanyName.MyMeetings.API/Configuration/Authorization/AttributeAuthorizationHandler.cs
  class AttributeAuthorizationHandler (line 5) | public abstract class AttributeAuthorizationHandler<TRequirement, TAttri...
    method HandleRequirementAsync (line 10) | protected override Task HandleRequirementAsync(AuthorizationHandlerCon...
    method HandleRequirementAsync (line 18) | protected abstract Task HandleRequirementAsync(

FILE: src/API/CompanyName.MyMeetings.API/Configuration/Authorization/AuthorizationChecker.cs
  class AuthorizationChecker (line 7) | public static class AuthorizationChecker
    method CheckAllEndpoints (line 9) | public static void CheckAllEndpoints()

FILE: src/API/CompanyName.MyMeetings.API/Configuration/Authorization/HasPermissionAttribute.cs
  class HasPermissionAttribute (line 5) | [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowM...
    method HasPermissionAttribute (line 10) | public HasPermissionAttribute(string name)

FILE: src/API/CompanyName.MyMeetings.API/Configuration/Authorization/HasPermissionAuthorizationHandler.cs
  class HasPermissionAuthorizationHandler (line 8) | internal class HasPermissionAuthorizationHandler : AttributeAuthorizatio...
    method HasPermissionAuthorizationHandler (line 14) | public HasPermissionAuthorizationHandler(
    method HandleRequirementAsync (line 22) | protected override async Task HandleRequirementAsync(
    method AuthorizeAsync (line 38) | private Task<bool> AuthorizeAsync(string permission, List<UserPermissi...

FILE: src/API/CompanyName.MyMeetings.API/Configuration/Authorization/HasPermissionAuthorizationRequirement.cs
  class HasPermissionAuthorizationRequirement (line 5) | public class HasPermissionAuthorizationRequirement : IAuthorizationRequi...

FILE: src/API/CompanyName.MyMeetings.API/Configuration/Authorization/NoPermissionRequiredAttribute.cs
  class NoPermissionRequiredAttribute (line 3) | [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]

FILE: src/API/CompanyName.MyMeetings.API/Configuration/ExecutionContext/CorrelationMiddleware.cs
  class CorrelationMiddleware (line 3) | internal class CorrelationMiddleware
    method CorrelationMiddleware (line 8) | public CorrelationMiddleware(RequestDelegate next)
    method Invoke (line 13) | public async Task Invoke(HttpContext context)

FILE: src/API/CompanyName.MyMeetings.API/Configuration/ExecutionContext/ExecutionContextAccessor.cs
  class ExecutionContextAccessor (line 5) | public class ExecutionContextAccessor : IExecutionContextAccessor
    method ExecutionContextAccessor (line 9) | public ExecutionContextAccessor(IHttpContextAccessor httpContextAccessor)

FILE: src/API/CompanyName.MyMeetings.API/Configuration/Extensions/SwaggerExtensions.cs
  class SwaggerExtensions (line 6) | internal static class SwaggerExtensions
    method AddSwaggerDocumentation (line 8) | internal static IServiceCollection AddSwaggerDocumentation(this IServi...
    method UseSwaggerDocumentation (line 56) | internal static IApplicationBuilder UseSwaggerDocumentation(this IAppl...

FILE: src/API/CompanyName.MyMeetings.API/Configuration/Validation/BusinessRuleValidationExceptionProblemDetails.cs
  class BusinessRuleValidationExceptionProblemDetails (line 6) | public class BusinessRuleValidationExceptionProblemDetails : ProblemDetails
    method BusinessRuleValidationExceptionProblemDetails (line 8) | public BusinessRuleValidationExceptionProblemDetails(BusinessRuleValid...

FILE: src/API/CompanyName.MyMeetings.API/Configuration/Validation/InvalidCommandProblemDetails.cs
  class InvalidCommandProblemDetails (line 6) | public class InvalidCommandProblemDetails : ProblemDetails
    method InvalidCommandProblemDetails (line 8) | public InvalidCommandProblemDetails(InvalidCommandException exception)

FILE: src/API/CompanyName.MyMeetings.API/Modules/Administration/AdministrationAutofacModule.cs
  class AdministrationAutofacModule (line 7) | internal class AdministrationAutofacModule : Module
    method Load (line 9) | protected override void Load(ContainerBuilder builder)

FILE: src/API/CompanyName.MyMeetings.API/Modules/Administration/AdministrationPermissions.cs
  class AdministrationPermissions (line 3) | public class AdministrationPermissions

FILE: src/API/CompanyName.MyMeetings.API/Modules/Administration/MeetingGroupProposals/MeetingGroupProposalsController.cs
  class MeetingGroupProposalsController (line 10) | [Route("api/administration/meetingGroupProposals")]
    method MeetingGroupProposalsController (line 16) | public MeetingGroupProposalsController(IAdministrationModule administr...
    method GetMeetingGroupProposals (line 21) | [HttpGet("")]
    method AcceptMeetingGroupProposal (line 32) | [HttpPatch("{meetingGroupProposalId}/accept")]

FILE: src/API/CompanyName.MyMeetings.API/Modules/Meetings/Countries/CountriesController.cs
  class CountriesController (line 8) | [Route("api/meetings/countries")]
    method CountriesController (line 14) | public CountriesController(IMeetingsModule meetingsModule)
    method GetAllCountries (line 19) | [HttpGet("")]

FILE: src/API/CompanyName.MyMeetings.API/Modules/Meetings/MeetingCommentingConfiguration/MeetingCommentingConfigurationController.cs
  class MeetingCommentingConfigurationController (line 9) | [Route("api/meetings/meetings/{meetingId}/configuration/commenting")]
    method MeetingCommentingConfigurationController (line 15) | public MeetingCommentingConfigurationController(IMeetingsModule meetin...
    method DisableCommenting (line 20) | [HttpPatch("disable")]
    method EnableCommenting (line 29) | [HttpPatch("enable")]

FILE: src/API/CompanyName.MyMeetings.API/Modules/Meetings/MeetingComments/AddMeetingCommentRequest.cs
  class AddMeetingCommentRequest (line 3) | public class AddMeetingCommentRequest

FILE: src/API/CompanyName.MyMeetings.API/Modules/Meetings/MeetingComments/EditMeetingCommentRequest.cs
  class EditMeetingCommentRequest (line 3) | public class EditMeetingCommentRequest

FILE: src/API/CompanyName.MyMeetings.API/Modules/Meetings/MeetingComments/MeetingCommentsController.cs
  class MeetingCommentsController (line 13) | [Route("api/meetings/[controller]")]
    method MeetingCommentsController (line 19) | public MeetingCommentsController(IMeetingsModule meetingModule)
    method AddComment (line 24) | [HttpPost]
    method EditComment (line 37) | [HttpPut("{meetingCommentId}")]
    method DeleteComment (line 51) | [HttpDelete("{meetingCommentId}")]
    method AddReply (line 62) | [HttpPost("{meetingCommentId}/replies")]
    method LikeComment (line 72) | [HttpPost("{meetingCommentId}/likes")]
    method UnlikeComment (line 83) | [HttpDelete("{meetingCommentId}/likes")]

FILE: src/API/CompanyName.MyMeetings.API/Modules/Meetings/MeetingGroupProposals/MeetingGroupProposalsController.cs
  class MeetingGroupProposalsController (line 11) | [Route("api/meetings/[controller]")]
    method MeetingGroupProposalsController (line 17) | public MeetingGroupProposalsController(IMeetingsModule meetingsModule)
    method GetMemberMeetingGroupProposals (line 22) | [HttpGet("")]
    method GetAllMeetingGroupProposals (line 33) | [HttpGet("all")]
    method ProposeMeetingGroup (line 44) | [HttpPost("")]

FILE: src/API/CompanyName.MyMeetings.API/Modules/Meetings/MeetingGroupProposals/ProposeMeetingGroupRequest.cs
  class ProposeMeetingGroupRequest (line 3) | public class ProposeMeetingGroupRequest

FILE: src/API/CompanyName.MyMeetings.API/Modules/Meetings/MeetingGroups/CreateNewMeetingGroupRequest.cs
  class CreateNewMeetingGroupRequest (line 3) | public class CreateNewMeetingGroupRequest

FILE: src/API/CompanyName.MyMeetings.API/Modules/Meetings/MeetingGroups/EditMeetingGroupGeneralAttributesRequest.cs
  class EditMeetingGroupGeneralAttributesRequest (line 3) | public class EditMeetingGroupGeneralAttributesRequest

FILE: src/API/CompanyName.MyMeetings.API/Modules/Meetings/MeetingGroups/MeetingGroupsController.cs
  class MeetingGroupsController (line 13) | [Route("api/meetings/[controller]")]
    method MeetingGroupsController (line 19) | public MeetingGroupsController(IMeetingsModule meetingsModule)
    method GetAuthenticatedMemberMeetingGroups (line 24) | [HttpGet("")]
    method GetMeetingGroupDetails (line 35) | [HttpGet("{meetingGroupId}")]
    method GetAllMeetingGroups (line 46) | [HttpGet("all")]
    method EditMeetingGroupGeneralAttributes (line 56) | [HttpPut("{meetingGroupId}")]
    method JoinToGroup (line 73) | [HttpPost("{meetingGroupId}/members")]
    method LeaveMeetingGroup (line 83) | [HttpDelete("{meetingGroupId}/members")]

FILE: src/API/CompanyName.MyMeetings.API/Modules/Meetings/Meetings/AddMeetingAttendeeRequest.cs
  class AddMeetingAttendeeRequest (line 3) | public class AddMeetingAttendeeRequest

FILE: src/API/CompanyName.MyMeetings.API/Modules/Meetings/Meetings/ChangeMeetingMainAttributesRequest.cs
  class ChangeMeetingMainAttributesRequest (line 3) | public class ChangeMeetingMainAttributesRequest

FILE: src/API/CompanyName.MyMeetings.API/Modules/Meetings/Meetings/CreateMeetingRequest.cs
  class CreateMeetingRequest (line 3) | public class CreateMeetingRequest

FILE: src/API/CompanyName.MyMeetings.API/Modules/Meetings/Meetings/MeetingsController.cs
  class MeetingsController (line 21) | [Route("api/meetings/meetings")]
    method MeetingsController (line 27) | public MeetingsController(IMeetingsModule meetingsModule)
    method GetAuthenticatedMemberMeetings (line 32) | [HttpGet("")]
    method GetMeetingDetails (line 42) | [HttpGet("{meetingId}")]
    method CreateNewMeeting (line 52) | [HttpPost("")]
    method EditMeeting (line 78) | [HttpPut("{meetingId}")]
    method GetMeetingAttendees (line 105) | [HttpGet("{meetingId}/attendees")]
    method AddMeetingAttendee (line 115) | [HttpPost("{meetingId}/attendees")]
    method RemoveMeetingAttendee (line 129) | [HttpDelete("{meetingId}/attendees/{attendeeId}")]
    method AddNotAttendee (line 143) | [HttpPost("{meetingId}/notAttendees")]
    method ChangeNotAttendeeDecision (line 153) | [HttpDelete("{meetingId}/notAttendees")]
    method SignUpMemberToWaitlist (line 163) | [HttpPost("{meetingId}/waitlistMembers")]
    method SignOffMemberFromWaitlist (line 173) | [HttpDelete("{meetingId}/waitlistMembers")]
    method SetMeetingHostRole (line 183) | [HttpPost("{meetingId}/hosts")]
    method SetMeetingAttendeeRole (line 193) | [HttpPost("{meetingId}/attendees/attendeeRole")]
    method CancelMeeting (line 203) | [HttpPatch("{meetingId}/cancel")]

FILE: src/API/CompanyName.MyMeetings.API/Modules/Meetings/Meetings/RemoveMeetingAttendeeRequest.cs
  class RemoveMeetingAttendeeRequest (line 3) | public class RemoveMeetingAttendeeRequest

FILE: src/API/CompanyName.MyMeetings.API/Modules/Meetings/Meetings/SetMeetingAttendeeRequest.cs
  class SetMeetingAttendeeRequest (line 3) | public class SetMeetingAttendeeRequest

FILE: src/API/CompanyName.MyMeetings.API/Modules/Meetings/Meetings/SetMeetingHostRequest.cs
  class SetMeetingHostRequest (line 3) | public class SetMeetingHostRequest

FILE: src/API/CompanyName.MyMeetings.API/Modules/Meetings/MeetingsAutofacModule.cs
  class MeetingsAutofacModule (line 7) | public class MeetingsAutofacModule : Module
    method Load (line 9) | protected override void Load(ContainerBuilder builder)

FILE: src/API/CompanyName.MyMeetings.API/Modules/Meetings/MeetingsPermissions.cs
  class MeetingsPermissions (line 3) | public class MeetingsPermissions

FILE: src/API/CompanyName.MyMeetings.API/Modules/Payments/MeetingFees/CreateMeetingFeePaymentRequest.cs
  class CreateMeetingFeePaymentRequest (line 3) | public class CreateMeetingFeePaymentRequest

FILE: src/API/CompanyName.MyMeetings.API/Modules/Payments/MeetingFees/MeetingFeePaymentsController.cs
  class MeetingFeePaymentsController (line 9) | [Route("api/payments/meetingFeePayments")]
    method MeetingFeePaymentsController (line 15) | public MeetingFeePaymentsController(IPaymentsModule meetingsModule)
    method CreateMeetingFeePayment (line 20) | [HttpPost]
    method RegisterMeetingFeePayment (line 30) | [HttpPut]

FILE: src/API/CompanyName.MyMeetings.API/Modules/Payments/MeetingFees/RegisterMeetingFeePaymentRequest.cs
  class RegisterMeetingFeePaymentRequest (line 3) | public class RegisterMeetingFeePaymentRequest

FILE: src/API/CompanyName.MyMeetings.API/Modules/Payments/Payers/PayersController.cs
  class PayersController (line 9) | [Route("api/payments/payers")]
    method PayersController (line 15) | public PayersController(IPaymentsModule paymentsModule)
    method GetAuthenticatedPayerSubscription (line 20) | [HttpGet("authenticated/subscription")]

FILE: src/API/CompanyName.MyMeetings.API/Modules/Payments/PaymentsAutofacModule.cs
  class PaymentsAutofacModule (line 7) | public class PaymentsAutofacModule : Module
    method Load (line 9) | protected override void Load(ContainerBuilder builder)

FILE: src/API/CompanyName.MyMeetings.API/Modules/Payments/PaymentsPermissions.cs
  class PaymentsPermissions (line 3) | public class PaymentsPermissions

FILE: src/API/CompanyName.MyMeetings.API/Modules/Payments/PriceListItems/ChangePriceListItemAttributesRequest.cs
  class ChangePriceListItemAttributesRequest (line 3) | public class ChangePriceListItemAttributesRequest

FILE: src/API/CompanyName.MyMeetings.API/Modules/Payments/PriceListItems/CreatePriceListItemRequest.cs
  class CreatePriceListItemRequest (line 3) | public class CreatePriceListItemRequest

FILE: src/API/CompanyName.MyMeetings.API/Modules/Payments/PriceListItems/GetPriceListItemRequest.cs
  class GetPriceListItemRequest (line 3) | public class GetPriceListItemRequest

FILE: src/API/CompanyName.MyMeetings.API/Modules/Payments/PriceListItems/PriceListItemsController.cs
  class PriceListItemsController (line 12) | [ApiController]
    method PriceListItemsController (line 18) | public PriceListItemsController(IPaymentsModule paymentsModule)
    method GetPriceListItem (line 23) | [HttpGet]
    method CreatePriceListItem (line 36) | [HttpPost]
    method ActivatePriceListItem (line 51) | [HttpPatch("{priceListItemId}/activate")]
    method DeactivatePriceListItem (line 61) | [HttpPatch("{priceListItemId}/deactivate")]
    method ChangePriceListItemAttributes (line 71) | [HttpPut]

FILE: src/API/CompanyName.MyMeetings.API/Modules/Payments/RegisterSubscriptionRenewalPaymentRequest.cs
  class RegisterSubscriptionRenewalPaymentRequest (line 3) | public class RegisterSubscriptionRenewalPaymentRequest

FILE: src/API/CompanyName.MyMeetings.API/Modules/Payments/SubscriptionRenewalsController.cs
  class SubscriptionRenewalsController (line 8) | [Route("api/payments/subscriptionRenewals")]
    method SubscriptionRenewalsController (line 14) | public SubscriptionRenewalsController(IPaymentsModule paymentsModule)
    method RegisterSubscriptionPayment (line 19) | [HttpPost]

FILE: src/API/CompanyName.MyMeetings.API/Modules/Payments/Subscriptions/BuySubscriptionRequest.cs
  class BuySubscriptionRequest (line 3) | public class BuySubscriptionRequest

FILE: src/API/CompanyName.MyMeetings.API/Modules/Payments/Subscriptions/RegisterSubscriptionPaymentRequest.cs
  class RegisterSubscriptionPaymentRequest (line 3) | public class RegisterSubscriptionPaymentRequest

FILE: src/API/CompanyName.MyMeetings.API/Modules/Payments/Subscriptions/RenewSubscriptionRequest.cs
  class RenewSubscriptionRequest (line 3) | public class RenewSubscriptionRequest

FILE: src/API/CompanyName.MyMeetings.API/Modules/Payments/Subscriptions/SubscriptionPaymentsController.cs
  class SubscriptionPaymentsController (line 8) | [Route("api/payments/subscriptionPayments")]
    method SubscriptionPaymentsController (line 14) | public SubscriptionPaymentsController(IPaymentsModule meetingsModule)
    method RegisterSubscriptionPayment (line 19) | [HttpPost]

FILE: src/API/CompanyName.MyMeetings.API/Modules/Payments/Subscriptions/SubscriptionsController.cs
  class SubscriptionsController (line 9) | [Route("api/payments/subscriptions")]
    method SubscriptionsController (line 15) | public SubscriptionsController(IPaymentsModule meetingsModule)
    method BuySubscription (line 20) | [HttpPost("")]
    method RenewSubscription (line 34) | [HttpPost("{subscriptionId}/renewals")]

FILE: src/API/CompanyName.MyMeetings.API/Modules/UserAccess/AuthenticatedUserController.cs
  class AuthenticatedUserController (line 11) | [Route("api/userAccess/authenticatedUser")]
    method AuthenticatedUserController (line 17) | public AuthenticatedUserController(IUserAccessModule userAccessModule)
    method GetAuthenticatedUser (line 22) | [NoPermissionRequired]
    method GetAuthenticatedUserPermissions (line 32) | [NoPermissionRequired]

FILE: src/API/CompanyName.MyMeetings.API/Modules/UserAccess/EmailsController.cs
  class EmailsController (line 9) | [Route("api/userAccess/emails")]
    method EmailsController (line 15) | public EmailsController(IUserAccessModule userAccessModule)
    method GetEmails (line 20) | [NoPermissionRequired]

FILE: src/API/CompanyName.MyMeetings.API/Modules/UserAccess/RegisterNewUserRequest.cs
  class RegisterNewUserRequest (line 3) | public class RegisterNewUserRequest

FILE: src/API/CompanyName.MyMeetings.API/Modules/UserAccess/UserAccessAutofacModule.cs
  class UserAccessAutofacModule (line 7) | public class UserAccessAutofacModule : Module
    method Load (line 9) | protected override void Load(ContainerBuilder builder)

FILE: src/API/CompanyName.MyMeetings.API/Modules/UserAccess/UserRegistrationsController.cs
  class UserRegistrationsController (line 11) | [Route("userAccess/[controller]")]
    method UserRegistrationsController (line 17) | public UserRegistrationsController(IRegistrationsModule registrationsM...
    method RegisterNewUser (line 22) | [NoPermissionRequired]
    method ConfirmRegistration (line 39) | [NoPermissionRequired]

FILE: src/API/CompanyName.MyMeetings.API/Program.cs
  class Program (line 5) | public class Program
    method Main (line 7) | public static void Main(string[] args)
    method CreateWebHostBuilder (line 12) | public static IHostBuilder CreateWebHostBuilder(string[] args)

FILE: src/API/CompanyName.MyMeetings.API/Startup.cs
  class Startup (line 30) | public class Startup
    method Startup (line 37) | public Startup(IWebHostEnvironment env)
    method ConfigureServices (line 53) | public void ConfigureServices(IServiceCollection services)
    method ConfigureContainer (line 82) | public void ConfigureContainer(ContainerBuilder containerBuilder)
    method Configure (line 91) | public void Configure(IApplicationBuilder app, IWebHostEnvironment env...
    method ConfigureLogger (line 126) | private static void ConfigureLogger()
    method InitializeModules (line 141) | private void InitializeModules(ILifetimeScope container)

FILE: src/BuildingBlocks/Application/Data/ISqlConnectionFactory.cs
  type ISqlConnectionFactory (line 5) | public interface ISqlConnectionFactory
    method GetOpenConnection (line 7) | IDbConnection GetOpenConnection();
    method CreateNewConnection (line 9) | IDbConnection CreateNewConnection();
    method GetConnectionString (line 11) | string GetConnectionString();

FILE: src/BuildingBlocks/Application/Emails/EmailMessage.cs
  type EmailMessage (line 3) | public struct EmailMessage
    method EmailMessage (line 11) | public EmailMessage(

FILE: src/BuildingBlocks/Application/Emails/IEmailSender.cs
  type IEmailSender (line 3) | public interface IEmailSender
    method SendEmail (line 5) | Task SendEmail(EmailMessage message);

FILE: src/BuildingBlocks/Application/Events/DomainNotificationBase.cs
  class DomainNotificationBase (line 5) | public class DomainNotificationBase<T> : IDomainEventNotification<T>
    method DomainNotificationBase (line 12) | public DomainNotificationBase(T domainEvent, Guid id)

FILE: src/BuildingBlocks/Application/Events/IDomainEventNotification.cs
  type IDomainEventNotification (line 5) | public interface IDomainEventNotification<out TEventType> : IDomainEvent...
  type IDomainEventNotification (line 10) | public interface IDomainEventNotification : INotification

FILE: src/BuildingBlocks/Application/IExecutionContextAccessor.cs
  type IExecutionContextAccessor (line 3) | public interface IExecutionContextAccessor

FILE: src/BuildingBlocks/Application/InvalidCommandException.cs
  class InvalidCommandException (line 3) | public class InvalidCommandException : Exception
    method InvalidCommandException (line 7) | public InvalidCommandException(List<string> errors)

FILE: src/BuildingBlocks/Application/Outbox/IOutbox.cs
  type IOutbox (line 3) | public interface IOutbox
    method Add (line 5) | void Add(OutboxMessage message);
    method Save (line 7) | Task Save();

FILE: src/BuildingBlocks/Application/Outbox/OutboxMessage.cs
  class OutboxMessage (line 3) | public class OutboxMessage
    method OutboxMessage (line 15) | public OutboxMessage(Guid id, DateTime occurredOn, string type, string...
    method OutboxMessage (line 23) | private OutboxMessage()

FILE: src/BuildingBlocks/Application/Queries/IPagedQuery.cs
  type IPagedQuery (line 3) | public interface IPagedQuery

FILE: src/BuildingBlocks/Application/Queries/PageData.cs
  type PageData (line 3) | public struct PageData
    method PageData (line 9) | public PageData(int offset, int next)

FILE: src/BuildingBlocks/Application/Queries/PagedQueryHelper.cs
  class PagedQueryHelper (line 3) | public static class PagedQueryHelper
    method GetPageData (line 9) | public static PageData GetPageData(IPagedQuery query)
    method AppendPageStatement (line 35) | public static string AppendPageStatement(string sql)

FILE: src/BuildingBlocks/Domain/BusinessRuleValidationException.cs
  class BusinessRuleValidationException (line 3) | public class BusinessRuleValidationException : Exception
    method BusinessRuleValidationException (line 9) | public BusinessRuleValidationException(IBusinessRule brokenRule)
    method ToString (line 16) | public override string ToString()

FILE: src/BuildingBlocks/Domain/DomainEventBase.cs
  class DomainEventBase (line 3) | public class DomainEventBase : IDomainEvent
    method DomainEventBase (line 9) | public DomainEventBase()

FILE: src/BuildingBlocks/Domain/Entity.cs
  class Entity (line 3) | public abstract class Entity
    method ClearDomainEvents (line 12) | public void ClearDomainEvents()
    method AddDomainEvent (line 21) | protected void AddDomainEvent(IDomainEvent domainEvent)
    method CheckRule (line 28) | protected void CheckRule(IBusinessRule rule)

FILE: src/BuildingBlocks/Domain/IAggregateRoot.cs
  type IAggregateRoot (line 3) | public interface IAggregateRoot

FILE: src/BuildingBlocks/Domain/IBusinessRule.cs
  type IBusinessRule (line 3) | public interface IBusinessRule
    method IsBroken (line 5) | bool IsBroken();

FILE: src/BuildingBlocks/Domain/IDomainEvent.cs
  type IDomainEvent (line 5) | public interface IDomainEvent : INotification

FILE: src/BuildingBlocks/Domain/IgnoreMemberAttribute.cs
  class IgnoreMemberAttribute (line 3) | [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]

FILE: src/BuildingBlocks/Domain/TypedIdValueBase.cs
  class TypedIdValueBase (line 3) | public abstract class TypedIdValueBase : IEquatable<TypedIdValueBase>
    method TypedIdValueBase (line 7) | protected TypedIdValueBase(Guid value)
    method Equals (line 17) | public override bool Equals(object obj)
    method GetHashCode (line 27) | public override int GetHashCode()
    method Equals (line 32) | public bool Equals(TypedIdValueBase other)

FILE: src/BuildingBlocks/Domain/ValueObject.cs
  class ValueObject (line 5) | public abstract class ValueObject : IEquatable<ValueObject>
    method Equals (line 31) | public bool Equals(ValueObject obj)
    method Equals (line 36) | public override bool Equals(object obj)
    method GetHashCode (line 47) | public override int GetHashCode()
    method CheckRule (line 68) | protected static void CheckRule(IBusinessRule rule)
    method PropertiesAreEqual (line 76) | private bool PropertiesAreEqual(object obj, PropertyInfo p)
    method FieldsAreEqual (line 81) | private bool FieldsAreEqual(object obj, FieldInfo f)
    method GetProperties (line 86) | private IEnumerable<PropertyInfo> GetProperties()
    method GetFields (line 102) | private IEnumerable<FieldInfo> GetFields()
    method HashValue (line 114) | private int HashValue(int seed, object value)

FILE: src/BuildingBlocks/Infrastructure/BiDictionary.cs
  class BiDictionary (line 3) | public class BiDictionary<TFirst, TSecond>
    method Add (line 9) | public void Add(TFirst first, TSecond second)
    method TryGetByFirst (line 21) | public bool TryGetByFirst(TFirst first, out TSecond second)
    method TryGetBySecond (line 26) | public bool TryGetBySecond(TSecond second, out TFirst first)

FILE: src/BuildingBlocks/Infrastructure/DomainEventsDispatching/DomainEventsAccessor.cs
  class DomainEventsAccessor (line 6) | public class DomainEventsAccessor : IDomainEventsAccessor
    method DomainEventsAccessor (line 10) | public DomainEventsAccessor(DbContext dbContext)
    method GetAllDomainEvents (line 15) | public IReadOnlyCollection<IDomainEvent> GetAllDomainEvents()
    method ClearAllDomainEvents (line 26) | public void ClearAllDomainEvents()

FILE: src/BuildingBlocks/Infrastructure/DomainEventsDispatching/DomainEventsDispatcher.cs
  class DomainEventsDispatcher (line 12) | public class DomainEventsDispatcher : IDomainEventsDispatcher
    method DomainEventsDispatcher (line 24) | public DomainEventsDispatcher(
    method DispatchEventsAsync (line 38) | public async Task DispatchEventsAsync()

FILE: src/BuildingBlocks/Infrastructure/DomainEventsDispatching/DomainEventsDispatcherNotificationHandlerDecorator.cs
  class DomainEventsDispatcherNotificationHandlerDecorator (line 5) | public class DomainEventsDispatcherNotificationHandlerDecorator<T> : INo...
    method DomainEventsDispatcherNotificationHandlerDecorator (line 11) | public DomainEventsDispatcherNotificationHandlerDecorator(
    method Handle (line 19) | public async Task Handle(T notification, CancellationToken cancellatio...

FILE: src/BuildingBlocks/Infrastructure/DomainEventsDispatching/DomainNotificationsMapper.cs
  class DomainNotificationsMapper (line 3) | public class DomainNotificationsMapper : IDomainNotificationsMapper
    method DomainNotificationsMapper (line 7) | public DomainNotificationsMapper(BiDictionary<string, Type> domainNoti...
    method GetName (line 12) | public string GetName(Type type)
    method GetType (line 17) | public Type GetType(string name)

FILE: src/BuildingBlocks/Infrastructure/DomainEventsDispatching/IDomainEventsAccessor.cs
  type IDomainEventsAccessor (line 5) | public interface IDomainEventsAccessor
    method GetAllDomainEvents (line 7) | IReadOnlyCollection<IDomainEvent> GetAllDomainEvents();
    method ClearAllDomainEvents (line 9) | void ClearAllDomainEvents();

FILE: src/BuildingBlocks/Infrastructure/DomainEventsDispatching/IDomainEventsDispatcher.cs
  type IDomainEventsDispatcher (line 3) | public interface IDomainEventsDispatcher
    method DispatchEventsAsync (line 5) | Task DispatchEventsAsync();

FILE: src/BuildingBlocks/Infrastructure/DomainEventsDispatching/IDomainNotificationsMapper.cs
  type IDomainNotificationsMapper (line 3) | public interface IDomainNotificationsMapper
    method GetName (line 5) | string GetName(Type type);
    method GetType (line 7) | Type GetType(string name);

FILE: src/BuildingBlocks/Infrastructure/DomainEventsDispatching/UnitOfWorkCommandHandlerDecorator.cs
  class UnitOfWorkCommandHandlerDecorator (line 5) | public class UnitOfWorkCommandHandlerDecorator<T> : IRequestHandler<T>
    method UnitOfWorkCommandHandlerDecorator (line 11) | public UnitOfWorkCommandHandlerDecorator(
    method Handle (line 19) | public async Task Handle(T command, CancellationToken cancellationToken)

FILE: src/BuildingBlocks/Infrastructure/Emails/EmailSender.cs
  class EmailSender (line 8) | public class EmailSender : IEmailSender
    method EmailSender (line 16) | public EmailSender(
    method SendEmail (line 26) | public async Task SendEmail(EmailMessage message)

FILE: src/BuildingBlocks/Infrastructure/Emails/EmailsConfiguration.cs
  class EmailsConfiguration (line 3) | public class EmailsConfiguration
    method EmailsConfiguration (line 5) | public EmailsConfiguration(string fromEmail)

FILE: src/BuildingBlocks/Infrastructure/EventBus/IEventsBus.cs
  type IEventsBus (line 3) | public interface IEventsBus : IDisposable
    method Publish (line 5) | Task Publish<T>(T @event)
    method Subscribe (line 8) | void Subscribe<T>(IIntegrationEventHandler<T> handler)
    method StartConsuming (line 11) | void StartConsuming();

FILE: src/BuildingBlocks/Infrastructure/EventBus/IIntegrationEventHandler.cs
  type IIntegrationEventHandler (line 3) | public interface IIntegrationEventHandler<in TIntegrationEvent> : IInteg...
    method Handle (line 6) | Task Handle(TIntegrationEvent @event);
  type IIntegrationEventHandler (line 9) | public interface IIntegrationEventHandler
    method Handle (line 6) | Task Handle(TIntegrationEvent @event);

FILE: src/BuildingBlocks/Infrastructure/EventBus/InMemoryEventBus.cs
  class InMemoryEventBus (line 3) | public sealed class InMemoryEventBus
    method InMemoryEventBus (line 5) | static InMemoryEventBus()
    method InMemoryEventBus (line 9) | private InMemoryEventBus()
    method Subscribe (line 18) | public void Subscribe<T>(IIntegrationEventHandler<T> handler)
    method Publish (line 36) | public async Task Publish<T>(T @event)

FILE: src/BuildingBlocks/Infrastructure/EventBus/InMemoryEventBusClient.cs
  class InMemoryEventBusClient (line 5) | public class InMemoryEventBusClient : IEventsBus
    method InMemoryEventBusClient (line 9) | public InMemoryEventBusClient(ILogger logger)
    method Dispose (line 14) | public void Dispose()
    method Publish (line 18) | public async Task Publish<T>(T @event)
    method Subscribe (line 25) | public void Subscribe<T>(IIntegrationEventHandler<T> handler)
    method StartConsuming (line 31) | public void StartConsuming()

FILE: src/BuildingBlocks/Infrastructure/EventBus/IntegrationEvent.cs
  class IntegrationEvent (line 5) | public abstract class IntegrationEvent : INotification
    method IntegrationEvent (line 11) | protected IntegrationEvent(Guid id, DateTime occurredOn)

FILE: src/BuildingBlocks/Infrastructure/IUnitOfWork.cs
  type IUnitOfWork (line 3) | public interface IUnitOfWork
    method CommitAsync (line 5) | Task<int> CommitAsync(

FILE: src/BuildingBlocks/Infrastructure/Inbox/InboxMessage.cs
  class InboxMessage (line 3) | public class InboxMessage
    method InboxMessage (line 15) | public InboxMessage(DateTime occurredOn, string type, string data)
    method InboxMessage (line 23) | private InboxMessage()

FILE: src/BuildingBlocks/Infrastructure/InternalCommands/IInternalCommandsMapper.cs
  type IInternalCommandsMapper (line 3) | public interface IInternalCommandsMapper
    method GetName (line 5) | string GetName(Type type);
    method GetType (line 7) | Type GetType(string name);

FILE: src/BuildingBlocks/Infrastructure/InternalCommands/InternalCommand.cs
  class InternalCommand (line 3) | public class InternalCommand

FILE: src/BuildingBlocks/Infrastructure/InternalCommands/InternalCommandsMapper.cs
  class InternalCommandsMapper (line 3) | public class InternalCommandsMapper : IInternalCommandsMapper
    method InternalCommandsMapper (line 7) | public InternalCommandsMapper(BiDictionary<string, Type> internalComma...
    method GetName (line 12) | public string GetName(Type type)
    method GetType (line 17) | public Type GetType(string name)

FILE: src/BuildingBlocks/Infrastructure/Serialization/AllPropertiesContractResolver.cs
  class AllPropertiesContractResolver (line 7) | public class AllPropertiesContractResolver : DefaultContractResolver
    method CreateProperties (line 9) | protected override IList<JsonProperty> CreateProperties(Type type, Mem...

FILE: src/BuildingBlocks/Infrastructure/ServiceProviderWrapper.cs
  class ServiceProviderWrapper (line 5) | public class ServiceProviderWrapper : IServiceProvider
    method ServiceProviderWrapper (line 9) | public ServiceProviderWrapper(ILifetimeScope lifeTimeScope)
    method GetService (line 15) | public object? GetService(Type serviceType) => this.lifeTimeScope.Reso...

FILE: src/BuildingBlocks/Infrastructure/SqlConnectionFactory.cs
  class SqlConnectionFactory (line 7) | public class SqlConnectionFactory : ISqlConnectionFactory, IDisposable
    method SqlConnectionFactory (line 12) | public SqlConnectionFactory(string connectionString)
    method GetOpenConnection (line 17) | public IDbConnection GetOpenConnection()
    method CreateNewConnection (line 28) | public IDbConnection CreateNewConnection()
    method GetConnectionString (line 36) | public string GetConnectionString()
    method Dispose (line 41) | public void Dispose()

FILE: src/BuildingBlocks/Infrastructure/StronglyTypedIdValueConverterSelector.cs
  class StronglyTypedIdValueConverterSelector (line 10) | public class StronglyTypedIdValueConverterSelector : ValueConverterSelector
    method StronglyTypedIdValueConverterSelector (line 15) | public StronglyTypedIdValueConverterSelector(ValueConverterSelectorDep...
    method Select (line 20) | public override IEnumerable<ValueConverterInfo> Select(Type modelClrTy...
    method UnwrapNullableType (line 49) | private static Type UnwrapNullableType(Type type)

FILE: src/BuildingBlocks/Infrastructure/TypedIdValueConverter.cs
  class TypedIdValueConverter (line 6) | public class TypedIdValueConverter<TTypedIdValue> : ValueConverter<TType...
    method TypedIdValueConverter (line 9) | public TypedIdValueConverter(ConverterMappingHints mappingHints = null)
    method Create (line 14) | private static TTypedIdValue Create(Guid id) => Activator.CreateInstan...

FILE: src/BuildingBlocks/Infrastructure/UnitOfWork.cs
  class UnitOfWork (line 6) | public class UnitOfWork : IUnitOfWork
    method UnitOfWork (line 11) | public UnitOfWork(
    method CommitAsync (line 19) | public async Task<int> CommitAsync(

FILE: src/BuildingBlocks/Tests/Application.UnitTests/Queries/PagedQueryHelperTests.cs
  class PagedQueryHelperTests (line 6) | [TestFixture]
    method PagedQueryHelper_GetPageData_Test (line 9) | [TestCase(1, 5, 0, 5)]
    class TestQuery (line 22) | private class TestQuery : IPagedQuery
      method TestQuery (line 24) | public TestQuery(int? page, int? perPage)

FILE: src/BuildingBlocks/Tests/IntegrationTests/EnvironmentVariablesProvider.cs
  class EnvironmentVariablesProvider (line 3) | public static class EnvironmentVariablesProvider
    method GetVariable (line 5) | public static string GetVariable(string variableName)

FILE: src/BuildingBlocks/Tests/IntegrationTests/Probing/AssertErrorException.cs
  class AssertErrorException (line 3) | public class AssertErrorException : Exception
    method AssertErrorException (line 5) | public AssertErrorException(string message)

FILE: src/BuildingBlocks/Tests/IntegrationTests/Probing/IProbe.cs
  type IProbe (line 3) | public interface IProbe
    method IsSatisfied (line 5) | bool IsSatisfied();
    method SampleAsync (line 7) | Task SampleAsync();
    method DescribeFailureTo (line 9) | string DescribeFailureTo();
    method IsSatisfied (line 14) | bool IsSatisfied(T sample);
    method GetSampleAsync (line 16) | Task<T> GetSampleAsync();
    method DescribeFailureTo (line 18) | string DescribeFailureTo();
  type IProbe (line 12) | public interface IProbe<T>
    method IsSatisfied (line 5) | bool IsSatisfied();
    method SampleAsync (line 7) | Task SampleAsync();
    method DescribeFailureTo (line 9) | string DescribeFailureTo();
    method IsSatisfied (line 14) | bool IsSatisfied(T sample);
    method GetSampleAsync (line 16) | Task<T> GetSampleAsync();
    method DescribeFailureTo (line 18) | string DescribeFailureTo();

FILE: src/BuildingBlocks/Tests/IntegrationTests/Probing/Poller.cs
  class Poller (line 3) | public class Poller
    method Poller (line 9) | public Poller(int timeoutMillis)
    method CheckAsync (line 15) | public async Task CheckAsync(IProbe probe)
    method GetAsync (line 30) | public async Task<T> GetAsync<T>(IProbe<T> probe)
    method DescribeFailureOf (line 49) | private static string DescribeFailureOf(IProbe probe)
    method DescribeFailureOf (line 54) | private static string DescribeFailureOf<T>(IProbe<T> probe)

FILE: src/BuildingBlocks/Tests/IntegrationTests/Probing/Timeout.cs
  class Timeout (line 3) | public class Timeout
    method Timeout (line 7) | public Timeout(int duration)
    method HasTimedOut (line 12) | public bool HasTimedOut()

FILE: src/Database/CompanyName.MyMeetings.Database/Scripts/CreateStructure.sql
  type administration (line 66) | CREATE TABLE [administration].[InternalCommands] (
  type administration (line 82) | CREATE TABLE [administration].[InboxMessages] (
  type administration (line 97) | CREATE TABLE [administration].[OutboxMessages] (
  type administration (line 112) | CREATE TABLE [administration].[Members] (
  type meetings (line 150) | CREATE TABLE [meetings].[MeetingWaitlistMembers] (
  type meetings (line 167) | CREATE TABLE [meetings].[MeetingNotAttendees] (
  type meetings (line 182) | CREATE TABLE [meetings].[Meetings] (
  type meetings (line 231) | CREATE TABLE [meetings].[MeetingGroups] (
  type meetings (line 249) | CREATE TABLE [meetings].[Members] (
  type meetings (line 283) | CREATE TABLE [meetings].[OutboxMessages] (
  type meetings (line 298) | CREATE TABLE [meetings].[InternalCommands] (
  type meetings (line 314) | CREATE TABLE [meetings].[InboxMessages] (
  type meetings (line 329) | CREATE TABLE [meetings].[MemberSubscriptions] (
  type meetings (line 341) | CREATE TABLE [meetings].[MeetingAttendees] (
  type meetings (line 365) | CREATE TABLE meetings.MeetingComments
  type meetings (line 384) | CREATE TABLE [meetings].[MeetingMemberCommentLikes]
  type payments (line 430) | CREATE TABLE [payments].[InternalCommands] (
  type payments (line 446) | CREATE TABLE [payments].[InboxMessages] (
  type payments (line 461) | CREATE TABLE [payments].[Messages] (
  type IX_Messages_Position (line 479) | CREATE UNIQUE NONCLUSTERED INDEX [IX_Messages_Position]
  type IX_Messages_StreamIdInternal_Id (line 488) | CREATE UNIQUE NONCLUSTERED INDEX [IX_Messages_StreamIdInternal_Id]
  type IX_Messages_StreamIdInternal_Revision (line 497) | CREATE UNIQUE NONCLUSTERED INDEX [IX_Messages_StreamIdInternal_Revision]
  type IX_Messages_StreamIdInternal_Created (line 506) | CREATE NONCLUSTERED INDEX [IX_Messages_StreamIdInternal_Created]
  type payments (line 515) | CREATE TABLE [payments].[MeetingFees] (
  type payments (line 531) | CREATE TABLE [payments].[PriceListItems] (
  type payments (line 547) | CREATE TABLE [payments].[SubscriptionPayments] (
  type payments (line 565) | CREATE TABLE [payments].[SubscriptionCheckpoints] (
  type payments (line 576) | CREATE TABLE [payments].[SubscriptionDetails] (
  type payments (line 591) | CREATE TABLE [payments].[Streams] (
  type users (line 615) | CREATE TABLE [users].[InboxMessages] (
  type registrations (line 628) | CREATE TABLE [registrations].[InboxMessages] (
  type users (line 643) | CREATE TABLE [users].[UserRoles] (
  type registrations (line 654) | CREATE TABLE [registrations].[UserRegistrations] (
  type users (line 674) | CREATE TABLE [users].[Users] (
  type users (line 692) | CREATE TABLE [users].[RolesToPermissions] (
  type users (line 704) | CREATE TABLE [users].[Permissions] (
  type users (line 717) | CREATE TABLE [users].[InternalCommands] (
  type registrations (line 734) | CREATE TABLE [registrations].[InternalCommands] (
  type users (line 751) | CREATE TABLE [users].[OutboxMessages] (
  type registrations (line 764) | CREATE TABLE [registrations].[OutboxMessages] (
  type administration (line 806) | CREATE VIEW [administration].[v_MeetingGroupProposals]
  type administration (line 827) | CREATE VIEW [administration].[v_Members]
  type meetings (line 843) | CREATE VIEW [meetings].[v_MeetingGroups]
  type meetings (line 858) | CREATE VIEW [meetings].[v_Meetings]
  type meetings (line 875) | CREATE VIEW [meetings].[v_Members]
  type meetings (line 888) | CREATE VIEW [meetings].[v_MeetingGroupMembers]
  type meetings (line 900) | CREATE VIEW [meetings].[v_MeetingGroupProposals]
  type users (line 917) | CREATE VIEW [users].[v_UserRoles]
  type users (line 928) | CREATE VIEW [users].[v_Users]
  type users (line 943) | CREATE VIEW [users].[v_UserRegistrations]
  type users (line 959) | CREATE VIEW [users].[v_UserPermissions]

FILE: src/Database/CompanyName.MyMeetings.Database/Scripts/Migrations/1_0_0_0/0001_initial_structure.sql
  type administration (line 65) | CREATE TABLE [administration].[InternalCommands] (
  type administration (line 81) | CREATE TABLE [administration].[InboxMessages] (
  type administration (line 96) | CREATE TABLE [administration].[OutboxMessages] (
  type administration (line 111) | CREATE TABLE [administration].[Members] (
  type meetings (line 149) | CREATE TABLE [meetings].[MeetingWaitlistMembers] (
  type meetings (line 166) | CREATE TABLE [meetings].[MeetingNotAttendees] (
  type meetings (line 181) | CREATE TABLE [meetings].[Meetings] (
  type meetings (line 230) | CREATE TABLE [meetings].[MeetingGroups] (
  type meetings (line 248) | CREATE TABLE [meetings].[Members] (
  type meetings (line 282) | CREATE TABLE [meetings].[OutboxMessages] (
  type meetings (line 297) | CREATE TABLE [meetings].[InternalCommands] (
  type meetings (line 313) | CREATE TABLE [meetings].[InboxMessages] (
  type meetings (line 328) | CREATE TABLE [meetings].[MemberSubscriptions] (
  type meetings (line 340) | CREATE TABLE [meetings].[MeetingAttendees] (
  type meetings (line 364) | CREATE TABLE meetings.MeetingComments
  type payments (line 399) | CREATE TABLE [payments].[OutboxMessages] (
  type payments (line 414) | CREATE TABLE [payments].[InternalCommands] (
  type payments (line 430) | CREATE TABLE [payments].[InboxMessages] (
  type payments (line 446) | CREATE TABLE [payments].[MeetingFees] (
  type payments (line 462) | CREATE TABLE [payments].[PriceListItems] (
  type payments (line 478) | CREATE TABLE [payments].[SubscriptionPayments] (
  type payments (line 496) | CREATE TABLE [payments].[SubscriptionCheckpoints] (
  type payments (line 505) | CREATE TABLE [payments].[SubscriptionDetails] (
  type payments (line 516) | CREATE TABLE [payments].[Streams] (
  type IX_Streams_IdOriginal (line 548) | CREATE NONCLUSTERED INDEX IX_Streams_IdOriginal
  type IX_Streams_IdOriginalReversed (line 551) | CREATE NONCLUSTERED INDEX IX_Streams_IdOriginalReversed
  type payments (line 558) | CREATE TABLE [payments].[Messages] (
  type users (line 627) | CREATE TABLE [users].[InboxMessages] (
  type users (line 642) | CREATE TABLE [users].[UserRoles] (
  type registrations (line 653) | CREATE TABLE [registrations].[UserRegistrations] (
  type users (line 673) | CREATE TABLE [users].[Users] (
  type users (line 691) | CREATE TABLE [users].[RolesToPermissions] (
  type users (line 703) | CREATE TABLE [users].[Permissions] (
  type users (line 716) | CREATE TABLE [users].[InternalCommands] (
  type users (line 732) | CREATE TABLE [users].[OutboxMessages] (
  type administration (line 748) | CREATE VIEW [administration].[v_MeetingGroupProposals]
  type administration (line 769) | CREATE VIEW [administration].[v_Members]
  type meetings (line 785) | CREATE VIEW [meetings].[v_MeetingGroups]
  type meetings (line 800) | CREATE VIEW [meetings].[v_Meetings]
  type meetings (line 817) | CREATE VIEW [meetings].[v_Members]
  type meetings (line 830) | CREATE VIEW [meetings].[v_MeetingGroupMembers]
  type meetings (line 842) | CREATE VIEW [meetings].[v_MeetingGroupProposals]
  type users (line 859) | CREATE VIEW [users].[v_UserRoles]
  type users (line 870) | CREATE VIEW [users].[v_Users]
  type users (line 885) | CREATE VIEW [users].[v_UserRegistrations]
  type users (line 901) | CREATE VIEW [users].[v_UserPermissions]

FILE: src/Database/CompanyName.MyMeetings.Database/Scripts/Migrations/1_0_0_0/0003_add_meetings_countries_table.sql
  type meetings (line 1) | CREATE TABLE [meetings].[Countries]

FILE: src/Database/CompanyName.MyMeetings.Database/Scripts/Migrations/1_0_0_0/0004_add_meeting_commenting_configurations_table.sql
  type meetings (line 1) | CREATE TABLE meetings.MeetingCommentingConfigurations

FILE: src/Database/CompanyName.MyMeetings.Database/Scripts/Migrations/1_0_0_0/0006_add_member_meeting_groups_view.sql
  type meetings (line 1) | CREATE VIEW [meetings].[v_MemberMeetingGroups]

FILE: src/Database/CompanyName.MyMeetings.Database/Scripts/Migrations/1_0_0_0/0007_add_meeting_attendees_view.sql
  type meetings (line 1) | CREATE VIEW [meetings].[v_MeetingAttendees]

FILE: src/Database/CompanyName.MyMeetings.Database/Scripts/Migrations/1_0_0_0/0008_add_meeting_details_view.sql
  type meetings (line 1) | CREATE VIEW [meetings].[v_MeetingDetails]

FILE: src/Database/CompanyName.MyMeetings.Database/Scripts/Migrations/1_0_0_0/0009_add_mock_emails_table.sql
  type app (line 1) | CREATE TABLE [app].[Emails]

FILE: src/Database/CompanyName.MyMeetings.Database/Scripts/Migrations/1_0_0_0/0010_add_member_meetings_view.sql
  type meetings (line 1) | CREATE VIEW [meetings].[v_MemberMeetings]

FILE: src/Database/CompanyName.MyMeetings.Database/Scripts/Migrations/1_0_0_0/0013_add_meeting_member_comment_likes_table.sql
  type meetings (line 1) | CREATE TABLE [meetings].[MeetingMemberCommentLikes]

FILE: src/Database/CompanyName.MyMeetings.Database/Scripts/Migrations/1_0_0_0/0014_add_missing_tables_for_registrations.sql
  type registrations (line 1) | CREATE TABLE [registrations].[OutboxMessages]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/administration/Tables/InboxMessages.sql
  type administration (line 1) | CREATE TABLE [administration].InboxMessages

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/administration/Tables/InternalCommands.sql
  type administration (line 1) | CREATE TABLE [administration].InternalCommands

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/administration/Tables/MeetingGroupProposals.sql
  type administration (line 1) | CREATE TABLE [administration].[MeetingGroupProposals]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/administration/Tables/Members.sql
  type administration (line 1) | CREATE TABLE [administration].[Members]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/administration/Tables/OutboxMessages.sql
  type administration (line 1) | CREATE TABLE [administration].OutboxMessages

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/administration/Views/v_MeetingGroupProposals.sql
  type administration (line 1) | CREATE VIEW [administration].[v_MeetingGroupProposals]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/administration/Views/v_Members.sql
  type administration (line 1) | CREATE VIEW [administration].[v_Members]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/app/Tables/Emails.sql
  type app (line 1) | CREATE TABLE [app].[Emails]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/app/Tables/MigrationsJournal.sql
  type app (line 1) | CREATE TABLE [app].[MigrationsJournal](

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/meetings/Tables/Countries.sql
  type meetings (line 1) | CREATE TABLE [meetings].[Countries]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/meetings/Tables/InboxMessages.sql
  type meetings (line 1) | CREATE TABLE [meetings].InboxMessages

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/meetings/Tables/InternalCommands.sql
  type meetings (line 1) | CREATE TABLE [meetings].InternalCommands

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/meetings/Tables/MeetingAttendees.sql
  type meetings (line 1) | CREATE TABLE meetings.MeetingAttendees

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/meetings/Tables/MeetingCommentingConfigurations.sql
  type meetings (line 1) | CREATE TABLE meetings.MeetingCommentingConfigurations

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/meetings/Tables/MeetingComments.sql
  type meetings (line 1) | CREATE TABLE meetings.MeetingComments

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/meetings/Tables/MeetingGroupMembers.sql
  type meetings (line 1) | CREATE TABLE meetings.MeetingGroupMembers

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/meetings/Tables/MeetingGroupProposals.sql
  type meetings (line 1) | CREATE TABLE [meetings].[MeetingGroupProposals]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/meetings/Tables/MeetingGroups.sql
  type meetings (line 1) | CREATE TABLE meetings.MeetingGroups

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/meetings/Tables/MeetingMemberCommentLikes.sql
  type meetings (line 1) | CREATE TABLE [meetings].[MeetingMemberCommentLikes]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/meetings/Tables/MeetingNotAttendees.sql
  type meetings (line 1) | CREATE TABLE meetings.MeetingNotAttendees

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/meetings/Tables/MeetingWaitlistMembers.sql
  type meetings (line 1) | CREATE TABLE meetings.MeetingWaitlistMembers

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/meetings/Tables/Meetings.sql
  type meetings (line 1) | CREATE TABLE meetings.Meetings

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/meetings/Tables/MemberSubscriptions.sql
  type meetings (line 1) | CREATE TABLE [meetings].[MemberSubscriptions]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/meetings/Tables/Members.sql
  type meetings (line 1) | CREATE TABLE [meetings].[Members]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/meetings/Tables/OutboxMessages.sql
  type meetings (line 1) | CREATE TABLE [meetings].OutboxMessages

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/meetings/Views/v_Countries.sql
  type meetings (line 1) | CREATE VIEW [meetings].[v_Countriess]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/meetings/Views/v_MeetingAttendees.sql
  type meetings (line 1) | CREATE VIEW [meetings].[v_MeetingAttendees]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/meetings/Views/v_MeetingComments.sql
  type meetings (line 1) | CREATE VIEW [meetings].[v_MeetingComments]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/meetings/Views/v_MeetingDetails.sql
  type meetings (line 1) | CREATE VIEW [meetings].[v_MeetingDetails]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/meetings/Views/v_MeetingGroupMembers.sql
  type meetings (line 1) | CREATE VIEW [meetings].[v_MeetingGroupMembers]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/meetings/Views/v_MeetingGroupProposals.sql
  type meetings (line 1) | CREATE VIEW [meetings].[v_MeetingGroupProposals]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/meetings/Views/v_MeetingGroups.sql
  type meetings (line 2) | CREATE VIEW [meetings].[v_MeetingGroups]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/meetings/Views/v_Meetings.sql
  type meetings (line 2) | CREATE VIEW [meetings].[v_Meetings]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/meetings/Views/v_MemberMeetingGroups.sql
  type meetings (line 1) | CREATE VIEW [meetings].[v_MemberMeetingGroups]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/meetings/Views/v_MemberMeetings.sql
  type meetings (line 1) | CREATE VIEW [meetings].[v_MemberMeetings]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/meetings/Views/v_Members.sql
  type meetings (line 1) | CREATE VIEW [meetings].[v_Members]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/payments/Tables/InboxMessages.sql
  type payments (line 1) | CREATE TABLE [payments].InboxMessages

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/payments/Tables/InternalCommands.sql
  type payments (line 1) | CREATE TABLE [payments].InternalCommands

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/payments/Tables/MeetingFees.sql
  type payments (line 1) | CREATE TABLE [payments].[MeetingFees]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/payments/Tables/Messages.sql
  type payments (line 1) | CREATE TABLE payments.[Messages]
  type IX_Messages_Position (line 16) | CREATE UNIQUE NONCLUSTERED INDEX IX_Messages_Position ON payments.Messag...
  type IX_Messages_StreamIdInternal_Id (line 19) | CREATE UNIQUE NONCLUSTERED INDEX IX_Messages_StreamIdInternal_Id ON paym...
  type IX_Messages_StreamIdInternal_Revision (line 22) | CREATE UNIQUE NONCLUSTERED INDEX IX_Messages_StreamIdInternal_Revision O...
  type IX_Messages_StreamIdInternal_Created (line 25) | CREATE NONCLUSTERED INDEX IX_Messages_StreamIdInternal_Created ON paymen...

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/payments/Tables/OutboxMessages.sql
  type payments (line 1) | CREATE TABLE [payments].OutboxMessages

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/payments/Tables/Payers.sql
  type payments (line 1) | CREATE TABLE [payments].[Payers]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/payments/Tables/PriceListItems.sql
  type payments (line 1) | CREATE TABLE payments.PriceListItems

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/payments/Tables/Streams.sql
  type payments (line 1) | CREATE TABLE payments.Streams
  type IX_Streams_Id (line 12) | CREATE UNIQUE NONCLUSTERED INDEX IX_Streams_Id ON payments.Streams (Id)

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/payments/Tables/SubscriptionCheckpoints.sql
  type payments (line 1) | CREATE TABLE payments.SubscriptionCheckpoints

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/payments/Tables/SubscriptionDetails.sql
  type payments (line 1) | CREATE TABLE payments.SubscriptionDetails

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/payments/Tables/SubscriptionPayments.sql
  type payments (line 1) | CREATE TABLE payments.SubscriptionPayments

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/registrations/Tables/InboxMessages.sql
  type registrations (line 1) | CREATE TABLE [registrations].InboxMessages

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/registrations/Tables/InternalCommands.sql
  type registrations (line 1) | CREATE TABLE [registrations].InternalCommands

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/registrations/Tables/OutboxMessages.sql
  type registrations (line 1) | CREATE TABLE [registrations].OutboxMessages

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/registrations/Tables/UserRegistrations.sql
  type registrations (line 1) | CREATE TABLE [registrations].[UserRegistrations]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/registrations/Views/v_UserRegistrations.sql
  type registrations (line 1) | CREATE VIEW [registrations].[v_UserRegistrations]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/users/Tables/InboxMessages.sql
  type users (line 1) | CREATE TABLE [users].InboxMessages

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/users/Tables/InternalCommands.sql
  type users (line 1) | CREATE TABLE [users].InternalCommands

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/users/Tables/OutboxMessages.sql
  type users (line 1) | CREATE TABLE [users].OutboxMessages

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/users/Tables/Permissions.sql
  type users (line 1) | CREATE TABLE [users].[Permissions]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/users/Tables/RolesToPermissions.sql
  type users (line 1) | CREATE TABLE [users].[RolesToPermissions]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/users/Tables/UserRoles.sql
  type users (line 1) | CREATE TABLE [users].[UserRoles]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/users/Tables/Users.sql
  type users (line 1) | CREATE TABLE [users].[Users]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/users/Views/v_UserPermissions.sql
  type users (line 1) | CREATE VIEW [users].[v_UserPermissions]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/users/Views/v_UserRoles.sql
  type users (line 1) | CREATE VIEW [users].[v_UserRoles]

FILE: src/Database/CompanyName.MyMeetings.Database/Structure/users/Views/v_Users.sql
  type users (line 1) | CREATE VIEW [users].[v_Users]

FILE: src/Database/DatabaseMigrator/Program.cs
  class Program (line 8) | public class Program
    method Main (line 10) | public static int Main(string[] args)

FILE: src/Database/DatabaseMigrator/SerilogUpgradeLog.cs
  class SerilogUpgradeLog (line 6) | internal class SerilogUpgradeLog : IUpgradeLog
    method SerilogUpgradeLog (line 10) | public SerilogUpgradeLog(ILogger logger)
    method WriteInformation (line 15) | public void WriteInformation(string format, params object[] args)
    method WriteError (line 20) | public void WriteError(string format, params object[] args)
    method WriteWarning (line 25) | public void WriteWarning(string format, params object[] args)

FILE: src/Database/InitializeDatabase.sql
  type administration (line 43) | CREATE TABLE [administration].[InternalCommands] (
  type administration (line 59) | CREATE TABLE [administration].[InboxMessages] (
  type administration (line 74) | CREATE TABLE [administration].[OutboxMessages] (
  type administration (line 89) | CREATE TABLE [administration].[MeetingGroupProposals] (
  type administration (line 111) | CREATE TABLE [administration].[Members] (
  type meetings (line 144) | CREATE TABLE [meetings].[MeetingNotAttendees] (
  type meetings (line 159) | CREATE TABLE meetings.MeetingAttendees
  type payments (line 350) | CREATE TABLE [payments].[OutboxMessages] (
  type payments (line 365) | CREATE TABLE [payments].[InternalCommands] (
  type payments (line 381) | CREATE TABLE [payments].[InboxMessages] (
  type users (line 396) | CREATE TABLE [users].[InboxMessages] (
  type users (line 411) | CREATE TABLE [users].[UserRoles] (
  type users (line 422) | CREATE TABLE [users].[UserRegistrations] (
  type users (line 442) | CREATE TABLE [users].[Users] (
  type users (line 460) | CREATE TABLE [users].[RolesToPermissions] (
  type users (line 472) | CREATE TABLE [users].[Permissions] (
  type users (line 485) | CREATE TABLE [users].[InternalCommands] (
  type users (line 501) | CREATE TABLE [users].[OutboxMessages] (
  type meetings (line 517) | CREATE VIEW [meetings].[v_MeetingGroups]
  type meetings (line 532) | CREATE VIEW [meetings].[v_Meetings]
  type meetings (line 549) | CREATE VIEW [meetings].[v_Members]
  type users (line 562) | CREATE VIEW [users].[v_UserRoles]
  type users (line 573) | CREATE VIEW [users].[v_Users]
  type users (line 588) | CREATE VIEW [users].[v_UserPermissions]
  type users (line 603) | CREATE VIEW [users].[v_UserRegistrations]
  type administration (line 616) | CREATE VIEW [administration].[v_Members]
  type administration (line 628) | CREATE VIEW [administration].[v_MeetingGroupProposals]
  type meetings (line 646) | CREATE VIEW [meetings].[v_MeetingGroupProposals]
  type payments (line 673) | CREATE TABLE payments.Streams(
  type payments (line 693) | CREATE TABLE payments.Messages(
  type payments (line 773) | CREATE TABLE payments.SubscriptionCheckpoints
  type payments (line 779) | CREATE TABLE payments.PriceListItems
  type payments (line 790) | CREATE TABLE payments.SubscriptionPayments
  type meetings (line 803) | CREATE TABLE [meetings].[MemberSubscriptions]

FILE: src/Modules/Administration/Application/Configuration/Commands/ICommandHandler.cs
  type ICommandHandler (line 6) | public interface ICommandHandler<in TCommand> : IRequestHandler<TCommand>
  type ICommandHandler (line 11) | public interface ICommandHandler<in TCommand, TResult> :

FILE: src/Modules/Administration/Application/Configuration/Commands/ICommandsScheduler.cs
  type ICommandsScheduler (line 5) | public interface ICommandsScheduler
    method EnqueueAsync (line 7) | Task EnqueueAsync(ICommand command);
    method EnqueueAsync (line 9) | Task EnqueueAsync<T>(ICommand<T> command);

FILE: src/Modules/Administration/Application/Configuration/Commands/InternalCommandBase.cs
  class InternalCommandBase (line 5) | public abstract class InternalCommandBase : ICommand
    method InternalCommandBase (line 7) | protected InternalCommandBase(Guid id)
    method InternalCommandBase (line 17) | protected InternalCommandBase()
    method InternalCommandBase (line 22) | protected InternalCommandBase(Guid id)
  class InternalCommandBase (line 15) | public abstract class InternalCommandBase<TResult> : ICommand<TResult>
    method InternalCommandBase (line 7) | protected InternalCommandBase(Guid id)
    method InternalCommandBase (line 17) | protected InternalCommandBase()
    method InternalCommandBase (line 22) | protected InternalCommandBase(Guid id)

FILE: src/Modules/Administration/Application/Configuration/Queries/IQueryHandler.cs
  type IQueryHandler (line 6) | public interface IQueryHandler<in TQuery, TResult> :

FILE: src/Modules/Administration/Application/Contracts/CommandBase.cs
  class CommandBase (line 3) | public abstract class CommandBase : ICommand
    method CommandBase (line 7) | protected CommandBase()
    method CommandBase (line 12) | protected CommandBase(Guid id)
    method CommandBase (line 20) | protected CommandBase()
    method CommandBase (line 25) | protected CommandBase(Guid id)
  class CommandBase (line 18) | public abstract class CommandBase<TResult> : ICommand<TResult>
    method CommandBase (line 7) | protected CommandBase()
    method CommandBase (line 12) | protected CommandBase(Guid id)
    method CommandBase (line 20) | protected CommandBase()
    method CommandBase (line 25) | protected CommandBase(Guid id)

FILE: src/Modules/Administration/Application/Contracts/IAdministrationModule.cs
  type IAdministrationModule (line 3) | public interface IAdministrationModule
    method ExecuteCommandAsync (line 5) | Task<TResult> ExecuteCommandAsync<TResult>(ICommand<TResult> command);
    method ExecuteCommandAsync (line 7) | Task ExecuteCommandAsync(ICommand command);
    method ExecuteQueryAsync (line 9) | Task<TResult> ExecuteQueryAsync<TResult>(IQuery<TResult> query);

FILE: src/Modules/Administration/Application/Contracts/ICommand.cs
  type ICommand (line 5) | public interface ICommand<out TResult> : IRequest<TResult>
  type ICommand (line 10) | public interface ICommand : IRequest

FILE: src/Modules/Administration/Application/Contracts/IQuery.cs
  type IQuery (line 5) | public interface IQuery<out TResult> : IRequest<TResult>

FILE: src/Modules/Administration/Application/Contracts/IRecurringCommand.cs
  type IRecurringCommand (line 3) | public interface IRecurringCommand

FILE: src/Modules/Administration/Application/Contracts/QueryBase.cs
  class QueryBase (line 3) | public abstract class QueryBase<TResult> : IQuery<TResult>
    method QueryBase (line 7) | protected QueryBase()
    method QueryBase (line 12) | protected QueryBase(Guid id)

FILE: src/Modules/Administration/Application/MeetingGroupProposals/AcceptMeetingGroupProposal/AcceptMeetingGroupProposalCommand.cs
  class AcceptMeetingGroupProposalCommand (line 5) | public class AcceptMeetingGroupProposalCommand : CommandBase
    method AcceptMeetingGroupProposalCommand (line 7) | public AcceptMeetingGroupProposalCommand(Guid meetingGroupProposalId)

FILE: src/Modules/Administration/Application/MeetingGroupProposals/AcceptMeetingGroupProposal/AcceptMeetingGroupProposalCommandHandler.cs
  class AcceptMeetingGroupProposalCommandHandler (line 7) | internal class AcceptMeetingGroupProposalCommandHandler : ICommandHandle...
    method AcceptMeetingGroupProposalCommandHandler (line 12) | internal AcceptMeetingGroupProposalCommandHandler(IMeetingGroupProposa...
    method Handle (line 18) | public async Task Handle(AcceptMeetingGroupProposalCommand request, Ca...

FILE: src/Modules/Administration/Application/MeetingGroupProposals/AcceptMeetingGroupProposal/MeetingGroupProposalAcceptedNotification.cs
  class MeetingGroupProposalAcceptedNotification (line 7) | public class MeetingGroupProposalAcceptedNotification : DomainNotificati...
    method MeetingGroupProposalAcceptedNotification (line 9) | [JsonConstructor]

FILE: src/Modules/Administration/Application/MeetingGroupProposals/AcceptMeetingGroupProposal/MeetingGroupProposalAcceptedNotificationHandler.cs
  class MeetingGroupProposalAcceptedNotificationHandler (line 7) | public class MeetingGroupProposalAcceptedNotificationHandler : INotifica...
    method MeetingGroupProposalAcceptedNotificationHandler (line 11) | public MeetingGroupProposalAcceptedNotificationHandler(IEventsBus even...
    method Handle (line 16) | public async Task Handle(MeetingGroupProposalAcceptedNotification noti...

FILE: src/Modules/Administration/Application/MeetingGroupProposals/GetMeetingGroupProposal/GetMeetingGroupProposalQuery.cs
  class GetMeetingGroupProposalQuery (line 5) | public class GetMeetingGroupProposalQuery : QueryBase<MeetingGroupPropos...
    method GetMeetingGroupProposalQuery (line 7) | public GetMeetingGroupProposalQuery(Guid meetingGroupProposalId)

FILE: src/Modules/Administration/Application/MeetingGroupProposals/GetMeetingGroupProposal/GetMeetingGroupProposalQueryHandler.cs
  class GetMeetingGroupProposalQueryHandler (line 7) | internal class GetMeetingGroupProposalQueryHandler : IQueryHandler<GetMe...
    method GetMeetingGroupProposalQueryHandler (line 11) | public GetMeetingGroupProposalQueryHandler(ISqlConnectionFactory sqlCo...
    method Handle (line 16) | public async Task<MeetingGroupProposalDto> Handle(GetMeetingGroupPropo...

FILE: src/Modules/Administration/Application/MeetingGroupProposals/GetMeetingGroupProposal/MeetingGroupProposalDto.cs
  class MeetingGroupProposalDto (line 3) | public class MeetingGroupProposalDto

FILE: src/Modules/Administration/Application/MeetingGroupProposals/GetMeetingGroupProposals/GetMeetingGroupProposalsQuery.cs
  class GetMeetingGroupProposalsQuery (line 6) | public class GetMeetingGroupProposalsQuery : QueryBase<List<MeetingGroup...
    method GetMeetingGroupProposalsQuery (line 8) | public GetMeetingGroupProposalsQuery()

FILE: src/Modules/Administration/Application/MeetingGroupProposals/GetMeetingGroupProposals/GetMeetingGroupProposalsQueryHandler.cs
  class GetMeetingGroupProposalsQueryHandler (line 8) | internal class GetMeetingGroupProposalsQueryHandler : IQueryHandler<GetM...
    method GetMeetingGroupProposalsQueryHandler (line 12) | public GetMeetingGroupProposalsQueryHandler(ISqlConnectionFactory sqlC...
    method Handle (line 17) | public async Task<List<MeetingGroupProposalDto>> Handle(GetMeetingGrou...

FILE: src/Modules/Administration/Application/MeetingGroupProposals/MeetingGroupProposedIntegrationEventHandler.cs
  class MeetingGroupProposedIntegrationEventHandler (line 8) | internal class MeetingGroupProposedIntegrationEventHandler : INotificati...
    method MeetingGroupProposedIntegrationEventHandler (line 12) | internal MeetingGroupProposedIntegrationEventHandler(ICommandsSchedule...
    method Handle (line 17) | public async Task Handle(MeetingGroupProposedIntegrationEvent notifica...

FILE: src/Modules/Administration/Application/MeetingGroupProposals/RequestMeetingGroupProposalVerification/RequestMeetingGroupProposalVerificationCommand.cs
  class RequestMeetingGroupProposalVerificationCommand (line 6) | public class RequestMeetingGroupProposalVerificationCommand : InternalCo...
    method RequestMeetingGroupProposalVerificationCommand (line 8) | [JsonConstructor]

FILE: src/Modules/Administration/Application/MeetingGroupProposals/RequestMeetingGroupProposalVerification/RequestMeetingGroupProposalVerificationCommandHandler.cs
  class RequestMeetingGroupProposalVerificationCommandHandler (line 7) | internal class RequestMeetingGroupProposalVerificationCommandHandler :
    method RequestMeetingGroupProposalVerificationCommandHandler (line 12) | public RequestMeetingGroupProposalVerificationCommandHandler(IMeetingG...
    method Handle (line 17) | public async Task<Guid> Handle(RequestMeetingGroupProposalVerification...

FILE: src/Modules/Administration/Application/Members/CreateMember/CreateMemberCommand.cs
  class CreateMemberCommand (line 6) | public class CreateMemberCommand : InternalCommandBase<Guid>
    method CreateMemberCommand (line 8) | [JsonConstructor]

FILE: src/Modules/Administration/Application/Members/CreateMember/CreateMemberCommandHandler.cs
  class CreateMemberCommandHandler (line 6) | internal class CreateMemberCommandHandler : ICommandHandler<CreateMember...
    method CreateMemberCommandHandler (line 10) | public CreateMemberCommandHandler(IMemberRepository memberRepository)
    method Handle (line 15) | public async Task<Guid> Handle(CreateMemberCommand request, Cancellati...

FILE: src/Modules/Administration/Application/Members/GetMember/GetMemberQuery.cs
  class GetMemberQuery (line 5) | public class GetMemberQuery : QueryBase<MemberDto>
    method GetMemberQuery (line 7) | public GetMemberQuery(Guid memberId)

FILE: src/Modules/Administration/Application/Members/GetMember/GetMemberQueryHandler.cs
  class GetMemberQueryHandler (line 7) | internal class GetMemberQueryHandler : IQueryHandler<GetMemberQuery, Mem...
    method GetMemberQueryHandler (line 11) | public GetMemberQueryHandler(ISqlConnectionFactory sqlConnectionFactory)
    method Handle (line 16) | public async Task<MemberDto> Handle(GetMemberQuery query, Cancellation...

FILE: src/Modules/Administration/Application/Members/GetMember/MemberDto.cs
  class MemberDto (line 3) | public class MemberDto

FILE: src/Modules/Administration/Application/Members/NewUserRegisteredIntegrationEventHandler.cs
  class NewUserRegisteredIntegrationEventHandler (line 8) | internal class NewUserRegisteredIntegrationEventHandler : INotificationH...
    method NewUserRegisteredIntegrationEventHandler (line 12) | internal NewUserRegisteredIntegrationEventHandler(ICommandsScheduler c...
    method Handle (line 17) | public async Task Handle(NewUserRegisteredIntegrationEvent notificatio...

FILE: src/Modules/Administration/Domain/MeetingGroupProposals/Events/MeetingGroupProposalAcceptedDomainEvent.cs
  class MeetingGroupProposalAcceptedDomainEvent (line 5) | public class MeetingGroupProposalAcceptedDomainEvent : DomainEventBase
    method MeetingGroupProposalAcceptedDomainEvent (line 7) | public MeetingGroupProposalAcceptedDomainEvent(MeetingGroupProposalId ...

FILE: src/Modules/Administration/Domain/MeetingGroupProposals/Events/MeetingGroupProposalRejectedDomainEvent.cs
  class MeetingGroupProposalRejectedDomainEvent (line 5) | internal class MeetingGroupProposalRejectedDomainEvent : DomainEventBase
    method MeetingGroupProposalRejectedDomainEvent (line 7) | internal MeetingGroupProposalRejectedDomainEvent(MeetingGroupProposalI...

FILE: src/Modules/Administration/Domain/MeetingGroupProposals/Events/MeetingGroupProposalVerificationRequestedDomainEvent.cs
  class MeetingGroupProposalVerificationRequestedDomainEvent (line 5) | public class MeetingGroupProposalVerificationRequestedDomainEvent : Doma...
    method MeetingGroupProposalVerificationRequestedDomainEvent (line 7) | internal MeetingGroupProposalVerificationRequestedDomainEvent(MeetingG...

FILE: src/Modules/Administration/Domain/MeetingGroupProposals/IMeetingGroupProposalRepository.cs
  type IMeetingGroupProposalRepository (line 3) | public interface IMeetingGroupProposalRepository
    method AddAsync (line 5) | Task AddAsync(MeetingGroupProposal meetingGroupProposal);
    method GetByIdAsync (line 7) | Task<MeetingGroupProposal> GetByIdAsync(MeetingGroupProposalId meeting...

FILE: src/Modules/Administration/Domain/MeetingGroupProposals/MeetingGroupLocation.cs
  class MeetingGroupLocation (line 5) | public class MeetingGroupLocation : ValueObject
    method MeetingGroupLocation (line 7) | private MeetingGroupLocation(string city, string countryCode)
    method Create (line 17) | public static MeetingGroupLocation Create(string city, string countryC...

FILE: src/Modules/Administration/Domain/MeetingGroupProposals/MeetingGroupProposal.cs
  class MeetingGroupProposal (line 8) | public class MeetingGroupProposal : Entity, IAggregateRoot
    method MeetingGroupProposal (line 24) | private MeetingGroupProposal(
    method MeetingGroupProposal (line 45) | private MeetingGroupProposal()
    method Accept (line 52) | public void Accept(UserId userId)
    method Reject (line 63) | public void Reject(UserId userId, string rejectReason)
    method CreateToVerify (line 75) | public static MeetingGroupProposal CreateToVerify(

FILE: src/Modules/Administration/Domain/MeetingGroupProposals/MeetingGroupProposalDecision.cs
  class MeetingGroupProposalDecision (line 6) | public class MeetingGroupProposalDecision : ValueObject
    method MeetingGroupProposalDecision (line 8) | private MeetingGroupProposalDecision(DateTime? date, UserId userId, st...
    method AcceptDecision (line 31) | internal static MeetingGroupProposalDecision AcceptDecision(DateTime d...
    method RejectDecision (line 36) | internal static MeetingGroupProposalDecision RejectDecision(DateTime d...
    method GetStatusForDecision (line 41) | internal MeetingGroupProposalStatus GetStatusForDecision()

FILE: src/Modules/Administration/Domain/MeetingGroupProposals/MeetingGroupProposalId.cs
  class MeetingGroupProposalId (line 5) | public class MeetingGroupProposalId : TypedIdValueBase
    method MeetingGroupProposalId (line 7) | public MeetingGroupProposalId(Guid value)

FILE: src/Modules/Administration/Domain/MeetingGroupProposals/MeetingGroupProposalStatus.cs
  class MeetingGroupProposalStatus (line 5) | public class MeetingGroupProposalStatus : ValueObject
    method MeetingGroupProposalStatus (line 7) | private MeetingGroupProposalStatus(string value)
    method Create (line 18) | internal static MeetingGroupProposalStatus Create(string value)

FILE: src/Modules/Administration/Domain/MeetingGroupProposals/Rules/MeetingGroupProposalCanBeVerifiedOnceRule.cs
  class MeetingGroupProposalCanBeVerifiedOnceRule (line 5) | public class MeetingGroupProposalCanBeVerifiedOnceRule : IBusinessRule
    method MeetingGroupProposalCanBeVerifiedOnceRule (line 9) | internal MeetingGroupProposalCanBeVerifiedOnceRule(MeetingGroupProposa...
    method IsBroken (line 16) | public bool IsBroken() => _actualDecision != MeetingGroupProposalDecis...

FILE: src/Modules/Administration/Domain/MeetingGroupProposals/Rules/MeetingGroupProposalRejectionMustHaveAReasonRule.cs
  class MeetingGroupProposalRejectionMustHaveAReasonRule (line 5) | public class MeetingGroupProposalRejectionMustHaveAReasonRule : IBusines...
    method MeetingGroupProposalRejectionMustHaveAReasonRule (line 9) | internal MeetingGroupProposalRejectionMustHaveAReasonRule(string reason)
    method IsBroken (line 16) | public bool IsBroken() => string.IsNullOrEmpty(_reason);

FILE: src/Modules/Administration/Domain/Members/Events/MemberCreatedDomainEvent.cs
  class MemberCreatedDomainEvent (line 5) | public class MemberCreatedDomainEvent : DomainEventBase
    method MemberCreatedDomainEvent (line 7) | public MemberCreatedDomainEvent(MemberId memberId)

FILE: src/Modules/Administration/Domain/Members/IMemberRepository.cs
  type IMemberRepository (line 3) | public interface IMemberRepository
    method AddAsync (line 5) | Task AddAsync(Member member);
    method GetByIdAsync (line 7) | Task<Member> GetByIdAsync(MemberId memberId);

FILE: src/Modules/Administration/Domain/Members/Member.cs
  class Member (line 6) | public class Member : Entity, IAggregateRoot
    method Member (line 22) | private Member()
    method Member (line 27) | private Member(Guid id, string login, string email, string firstName, ...
    method Create (line 40) | public static Member Create(Guid id, string login, string email, strin...

FILE: src/Modules/Administration/Domain/Members/MemberId.cs
  class MemberId (line 5) | public class MemberId : TypedIdValueBase
    method MemberId (line 7) | public MemberId(Guid value)

FILE: src/Modules/Administration/Domain/Users/IUserContext.cs
  type IUserContext (line 3) | public interface IUserContext

FILE: src/Modules/Administration/Domain/Users/UserId.cs
  class UserId (line 5) | public class UserId : TypedIdValueBase
    method UserId (line 7) | public UserId(Guid value)

FILE: src/Modules/Administration/Infrastructure/AdministrationContext.cs
  class AdministrationContext (line 14) | public class AdministrationContext : DbContext
    method AdministrationContext (line 26) | public AdministrationContext(DbContextOptions options, ILoggerFactory ...
    method OnModelCreating (line 32) | protected override void OnModelCreating(ModelBuilder modelBuilder)

FILE: src/Modules/Administration/Infrastructure/AdministrationModule.cs
  class AdministrationModule (line 9) | public class AdministrationModule : IAdministrationModule
    method ExecuteCommandAsync (line 11) | public async Task<TResult> ExecuteCommandAsync<TResult>(ICommand<TResu...
    method ExecuteCommandAsync (line 16) | public async Task ExecuteCommandAsync(ICommand command)
    method ExecuteQueryAsync (line 21) | public async Task<TResult> ExecuteQueryAsync<TResult>(IQuery<TResult> ...

FILE: src/Modules/Administration/Infrastructure/Configuration/AdministrationCompositionRoot.cs
  class AdministrationCompositionRoot (line 5) | internal static class AdministrationCompositionRoot
    method SetContainer (line 9) | public static void SetContainer(IContainer container)
    method BeginLifetimeScope (line 14) | public static ILifetimeScope BeginLifetimeScope()

FILE: src/Modules/Administration/Infrastructure/Configuration/AdministrationStartup.cs
  class AdministrationStartup (line 21) | public class AdministrationStartup
    method Initialize (line 25) | public static void Initialize(
    method Stop (line 41) | public static void Stop()
    method ConfigureContainer (line 46) | private static void ConfigureContainer(

FILE: src/Modules/Administration/Infrastructure/Configuration/AllConstructorFinder.cs
  class AllConstructorFinder (line 7) | internal class AllConstructorFinder : IConstructorFinder
    method FindConstructors (line 12) | public ConstructorInfo[] FindConstructors(Type targetType)

FILE: src/Modules/Administration/Infrastructure/Configuration/Assemblies.cs
  class Assemblies (line 6) | internal static class Assemblies

FILE: src/Modules/Administration/Infrastructure/Configuration/Authentication/AuthenticationModule.cs
  class AuthenticationModule (line 7) | internal class AuthenticationModule : Autofac.Module
    method Load (line 9) | protected override void Load(ContainerBuilder builder)

FILE: src/Modules/Administration/Infrastructure/Configuration/DataAccess/DataAccessModule.cs
  class DataAccessModule (line 10) | internal class DataAccessModule : Autofac.Module
    method DataAccessModule (line 15) | internal DataAccessModule(string databaseConnectionString, ILoggerFact...
    method Load (line 21) | protected override void Load(ContainerBuilder builder)

FILE: src/Modules/Administration/Infrastructure/Configuration/EventsBus/EventsBusModule.cs
  class EventsBusModule (line 6) | internal class EventsBusModule : Autofac.Module
    method EventsBusModule (line 10) | public EventsBusModule(IEventsBus eventsBus)
    method Load (line 15) | protected override void Load(ContainerBuilder builder)

FILE: src/Modules/Administration/Infrastructure/Configuration/EventsBus/EventsBusStartup.cs
  class EventsBusStartup (line 9) | internal static class EventsBusStartup
    method Initialize (line 11) | internal static void Initialize(
    method SubscribeToIntegrationEvents (line 17) | private static void SubscribeToIntegrationEvents(ILogger logger)
    method SubscribeToIntegrationEvent (line 25) | private static void SubscribeToIntegrationEvent<T>(IEventsBus eventBus...

FILE: src/Modules/Administration/Infrastructure/Configuration/EventsBus/IntegrationEventGenericHandler.cs
  class IntegrationEventGenericHandler (line 10) | internal class IntegrationEventGenericHandler<T> : IIntegrationEventHand...
    method Handle (line 13) | public async Task Handle(T @event)

FILE: src/Modules/Administration/Infrastructure/Configuration/Logging/LoggingModule.cs
  class LoggingModule (line 6) | internal class LoggingModule : Autofac.Module
    method LoggingModule (line 10) | internal LoggingModule(ILogger logger)
    method Load (line 15) | protected override void Load(ContainerBuilder builder)

FILE: src/Modules/Administration/Infrastructure/Configuration/Mediation/MediatorModule.cs
  class MediatorModule (line 14) | public class MediatorModule : Autofac.Module
    method Load (line 16) | protected override void Load(ContainerBuilder builder)
    class ScopedContravariantRegistrationSource (line 55) | private class ScopedContravariantRegistrationSource : IRegistrationSource
      method ScopedContravariantRegistrationSource (line 60) | public ScopedContravariantRegistrationSource(params Type[] types)
      method RegistrationsFor (line 72) | public IEnumerable<IComponentRegistration> RegistrationsFor(

FILE: src/Modules/Administration/Infrastructure/Configuration/Processing/CommandsExecutor.cs
  class CommandsExecutor (line 7) | internal static class CommandsExecutor
    method Execute (line 9) | internal static async Task Execute(ICommand command)
    method Execute (line 18) | internal static async Task<TResult> Execute<TResult>(ICommand<TResult>...

FILE: src/Modules/Administration/Infrastructure/Configuration/Processing/IRecurringCommand.cs
  type IRecurringCommand (line 3) | public interface IRecurringCommand

FILE: src/Modules/Administration/Infrastructure/Configuration/Processing/Inbox/InboxMessageDto.cs
  class InboxMessageDto (line 3) | public class InboxMessageDto

FILE: src/Modules/Administration/Infrastructure/Configuration/Processing/Inbox/ProcessInboxCommand.cs
  class ProcessInboxCommand (line 5) | public class ProcessInboxCommand : CommandBase, IRecurringCommand

FILE: src/Modules/Administration/Infrastructure/Configuration/Processing/Inbox/ProcessInboxCommandHandler.cs
  class ProcessInboxCommandHandler (line 9) | internal class ProcessInboxCommandHandler : ICommandHandler<ProcessInbox...
    method ProcessInboxCommandHandler (line 14) | public ProcessInboxCommandHandler(IMediator mediator, ISqlConnectionFa...
    method Handle (line 20) | public async Task Handle(ProcessInboxCommand command, CancellationToke...

FILE: src/Modules/Administration/Infrastructure/Configuration/Processing/Inbox/ProcessInboxJob.cs
  class ProcessInboxJob (line 5) | [DisallowConcurrentExecution]
    method Execute (line 8) | public async Task Execute(IJobExecutionContext context)

FILE: src/Modules/Administration/Infrastructure/Configuration/Processing/InternalCommands/CommandsScheduler.cs
  class CommandsScheduler (line 11) | public class CommandsScheduler : ICommandsScheduler
    method CommandsScheduler (line 17) | public CommandsScheduler(
    method EnqueueAsync (line 25) | public async Task EnqueueAsync(ICommand command)
    method EnqueueAsync (line 44) | public async Task EnqueueAsync<T>(ICommand<T> command)

FILE: src/Modules/Administration/Infrastructure/Configuration/Processing/InternalCommands/InternalCommandsModule.cs
  class InternalCommandsModule (line 9) | internal class InternalCommandsModule : Module
    method InternalCommandsModule (line 13) | public InternalCommandsModule(BiDictionary<string, Type> internalComma...
    method Load (line 18) | protected override void Load(ContainerBuilder builder)
    method CheckMappings (line 29) | private void CheckMappings()

FILE: src/Modules/Administration/Infrastructure/Configuration/Processing/InternalCommands/ProcessInternalCommandsCommand.cs
  class ProcessInternalCommandsCommand (line 5) | internal class ProcessInternalCommandsCommand : CommandBase, IRecurringC...

FILE: src/Modules/Administration/Infrastructure/Configuration/Processing/InternalCommands/ProcessInternalCommandsCommandHandler.cs
  class ProcessInternalCommandsCommandHandler (line 10) | internal class ProcessInternalCommandsCommandHandler : ICommandHandler<P...
    method ProcessInternalCommandsCommandHandler (line 16) | public ProcessInternalCommandsCommandHandler(
    method Handle (line 24) | public async Task Handle(ProcessInternalCommandsCommand command, Cance...
    method ProcessCommand (line 73) | private async Task ProcessCommand(
    class InternalCommandDto (line 82) | private class InternalCommandDto

FILE: src/Modules/Administration/Infrastructure/Configuration/Processing/InternalCommands/ProcessInternalCommandsJob.cs
  class ProcessInternalCommandsJob (line 5) | [DisallowConcurrentExecution]
    method Execute (line 8) | public async Task Execute(IJobExecutionContext context)

FILE: src/Modules/Administration/Infrastructure/Configuration/Processing/LoggingCommandHandlerDecorator.cs
  class LoggingCommandHandlerDecorator (line 11) | internal class LoggingCommandHandlerDecorator<T> : ICommandHandler<T>
    method LoggingCommandHandlerDecorator (line 18) | public LoggingCommandHandlerDecorator(
    method Handle (line 28) | public async Task Handle(T command, CancellationToken cancellationToken)
    class CommandLogEnricher (line 60) | private class CommandLogEnricher : ILogEventEnricher
      method CommandLogEnricher (line 64) | public CommandLogEnricher(ICommand command)
      method Enrich (line 69) | public void Enrich(LogEvent logEvent, ILogEventPropertyFactory prope...
    class RequestLogEnricher (line 75) | private class RequestLogEnricher : ILogEventEnricher
      method RequestLogEnricher (line 79) | public RequestLogEnricher(IExecutionContextAccessor executionContext...
      method Enrich (line 84) | public void Enrich(LogEvent logEvent, ILogEventPropertyFactory prope...

FILE: src/Modules/Administration/Infrastructure/Configuration/Processing/LoggingCommandHandlerWithResultDecorator.cs
  class LoggingCommandHandlerWithResultDecorator (line 11) | internal class LoggingCommandHandlerWithResultDecorator<T, TResult> : IC...
    method LoggingCommandHandlerWithResultDecorator (line 18) | public LoggingCommandHandlerWithResultDecorator(
    method Handle (line 28) | public async Task<TResult> Handle(T command, CancellationToken cancell...
    class CommandLogEnricher (line 60) | private class CommandLogEnricher : ILogEventEnricher
      method CommandLogEnricher (line 64) | public CommandLogEnricher(ICommand<TResult> command)
      method Enrich (line 69) | public void Enrich(LogEvent logEvent, ILogEventPropertyFactory prope...
    class RequestLogEnricher (line 75) | private class RequestLogEnricher : ILogEventEnricher
      method RequestLogEnricher (line 79) | public RequestLogEnricher(IExecutionContextAccessor executionContext...
      method Enrich (line 84) | public void Enrich(LogEvent logEvent, ILogEventPropertyFactory prope...

FILE: src/Modules/Administration/Infrastructure/Configuration/Processing/Outbox/OutboxMessageDto.cs
  class OutboxMessageDto (line 3) | public class OutboxMessageDto

FILE: src/Modules/Administration/Infrastructure/Configuration/Processing/Outbox/OutboxModule.cs
  class OutboxModule (line 11) | internal class OutboxModule : Module
    method OutboxModule (line 15) | public OutboxModule(BiDictionary<string, Type> domainNotificationsMap)
    method Load (line 20) | protected override void Load(ContainerBuilder builder)
    method CheckMappings (line 36) | private void CheckMappings()

FILE: src/Modules/Administration/Infrastructure/Configuration/Processing/Outbox/ProcessOutboxCommand.cs
  class ProcessOutboxCommand (line 5) | public class ProcessOutboxCommand : CommandBase, IRecurringCommand

FILE: src/Modules/Administration/Infrastructure/Configuration/Processing/Outbox/ProcessOutboxCommandHandler.cs
  class ProcessOutboxCommandHandler (line 14) | internal class ProcessOutboxCommandHandler : ICommandHandler<ProcessOutb...
    method ProcessOutboxCommandHandler (line 22) | public ProcessOutboxCommandHandler(
    method Handle (line 32) | public async Task Handle(ProcessOutboxCommand command, CancellationTok...
    class OutboxMessageContextEnricher (line 72) | private class OutboxMessageContextEnricher : ILogEventEnricher
      method OutboxMessageContextEnricher (line 76) | public OutboxMessageContextEnricher(IDomainEventNotification notific...
      method Enrich (line 81) | public void Enrich(LogEvent logEvent, ILogEventPropertyFactory prope...

FILE: src/Modules/Administration/Infrastructure/Configuration/Processing/Outbox/ProcessOutboxJob.cs
  class ProcessOutboxJob (line 5) | [DisallowConcurrentExecution]
    method Execute (line 8) | public async Task Execute(IJobExecutionContext context)

FILE: src/Modules/Administration/Infrastructure/Configuration/Processing/ProcessingModule.cs
  class ProcessingModule (line 11) | internal class ProcessingModule : Autofac.Module
    method Load (line 13) | protected override void Load(ContainerBuilder builder)

FILE: src/Modules/Administration/Infrastructure/Configuration/Processing/UnitOfWorkCommandHandlerDecorator.cs
  class UnitOfWorkCommandHandlerDecorator (line 9) | internal class UnitOfWorkCommandHandlerDecorator<T> : ICommandHandler<T>
    method UnitOfWorkCommandHandlerDecorator (line 16) | public UnitOfWorkCommandHandlerDecorator(
    method Handle (line 26) | public async Task Handle(T command, CancellationToken cancellationToken)

FILE: src/Modules/Administration/Infrastructure/Configuration/Processing/UnitOfWorkCommandHandlerWithResultDecorator.cs
  class UnitOfWorkCommandHandlerWithResultDecorator (line 8) | internal class UnitOfWorkCommandHandlerWithResultDecorator<T, TResult> :...
    method UnitOfWorkCommandHandlerWithResultDecorator (line 15) | public UnitOfWorkCommandHandlerWithResultDecorator(
    method Handle (line 25) | public async Task<TResult> Handle(T command, CancellationToken cancell...

FILE: src/Modules/Administration/Infrastructure/Configuration/Processing/ValidationCommandHandlerDecorator.cs
  class ValidationCommandHandlerDecorator (line 8) | internal class ValidationCommandHandlerDecorator<T> : ICommandHandler<T>
    method ValidationCommandHandlerDecorator (line 14) | public ValidationCommandHandlerDecorator(
    method Handle (line 22) | public async Task Handle(T command, CancellationToken cancellationToken)

FILE: src/Modules/Administration/Infrastructure/Configuration/Processing/ValidationCommandHandlerWithResultDecorator.cs
  class ValidationCommandHandlerWithResultDecorator (line 8) | internal class ValidationCommandHandlerWithResultDecorator<T, TResult> :...
    method ValidationCommandHandlerWithResultDecorator (line 14) | public ValidationCommandHandlerWithResultDecorator(
    method Handle (line 22) | public Task<TResult> Handle(T command, CancellationToken cancellationT...

FILE: src/Modules/Administration/Infrastructure/Configuration/Quartz/QuartzModule.cs
  class QuartzModule (line 6) | public class QuartzModule : Autofac.Module
    method Load (line 8) | protected override void Load(ContainerBuilder builder)

FILE: src/Modules/Administration/Infrastructure/Configuration/Quartz/QuartzStartup.cs
  class QuartzStartup (line 12) | internal static class QuartzStartup
    method Initialize (line 16) | internal static void Initialize(ILogger logger, long? internalProcessi...
    method StopQuartz (line 82) | internal static void StopQuartz()

FILE: src/Modules/Administration/Infrastructure/Configuration/Quartz/SerilogLogProvider.cs
  class SerilogLogProvider (line 6) | internal class SerilogLogProvider : ILogProvider
    method SerilogLogProvider (line 10) | internal SerilogLogProvider(ILogger logger)
    method GetLogger (line 15) | public Logger GetLogger(string name)
    method OpenNestedContext (line 53) | public IDisposable OpenNestedContext(string message)
    method OpenMappedContext (line 58) | public IDisposable OpenMappedContext(string key, string value)
    method OpenMappedContext (line 63) | public IDisposable OpenMappedContext(string key, object value, bool de...

FILE: src/Modules/Administration/Infrastructure/Configuration/Users/UserContext.cs
  class UserContext (line 6) | internal class UserContext : IUserContext
    method UserContext (line 10) | public UserContext(IExecutionContextAccessor executionContextAccessor)

FILE: src/Modules/Administration/Infrastructure/Domain/MeetingGroupProposals/MeetingGroupProposalEntityTypeConfiguration.cs
  class MeetingGroupProposalEntityTypeConfiguration (line 8) | internal class MeetingGroupProposalEntityTypeConfiguration : IEntityType...
    method Configure (line 10) | public void Configure(EntityTypeBuilder<MeetingGroupProposal> builder)

FILE: src/Modules/Administration/Infrastructure/Domain/MeetingGroupProposals/MeetingGroupProposalRepository.cs
  class MeetingGroupProposalRepository (line 6) | internal class MeetingGroupProposalRepository : IMeetingGroupProposalRep...
    method MeetingGroupProposalRepository (line 10) | internal MeetingGroupProposalRepository(AdministrationContext context)
    method AddAsync (line 15) | public async Task AddAsync(MeetingGroupProposal meetingGroupProposal)
    method GetByIdAsync (line 20) | public async Task<MeetingGroupProposal> GetByIdAsync(MeetingGroupPropo...

FILE: src/Modules/Administration/Infrastructure/Domain/Members/MemberEntityTypeConfiguration.cs
  class MemberEntityTypeConfiguration (line 7) | internal class MemberEntityTypeConfiguration : IEntityTypeConfiguration<...
    method Configure (line 9) | public void Configure(EntityTypeBuilder<Member> builder)

FILE: src/Modules/Administration/Infrastructure/Domain/Members/MemberRepository.cs
  class MemberRepository (line 6) | internal class MemberRepository : IMemberRepository
    method MemberRepository (line 10) | internal MemberRepository(AdministrationContext meetingsContext)
    method AddAsync (line 15) | public async Task AddAsync(Member member)
    method GetByIdAsync (line 20) | public async Task<Member> GetByIdAsync(MemberId memberId)

FILE: src/Modules/Administration/Infrastructure/InternalCommands/InternalCommandEntityTypeConfiguration.cs
  class InternalCommandEntityTypeConfiguration (line 7) | internal class InternalCommandEntityTypeConfiguration : IEntityTypeConfi...
    method Configure (line 9) | public void Configure(EntityTypeBuilder<InternalCommand> builder)

FILE: src/Modules/Administration/Infrastructure/Outbox/OutboxAccessor.cs
  class OutboxAccessor (line 5) | internal class OutboxAccessor : IOutbox
    method OutboxAccessor (line 9) | internal OutboxAccessor(AdministrationContext context)
    method Add (line 14) | public void Add(OutboxMessage message)
    method Save (line 19) | public Task Save()

FILE: src/Modules/Administration/Infrastructure/Outbox/OutboxMessageEntityTypeConfiguration.cs
  class OutboxMessageEntityTypeConfiguration (line 7) | internal class OutboxMessageEntityTypeConfiguration : IEntityTypeConfigu...
    method Configure (line 9) | public void Configure(EntityTypeBuilder<OutboxMessage> builder)

FILE: src/Modules/Administration/IntegrationEvents/MeetingGroupProposals/MeetingGroupProposalAcceptedIntegrationEvent.cs
  class MeetingGroupProposalAcceptedIntegrationEvent (line 5) | public class MeetingGroupProposalAcceptedIntegrationEvent : IntegrationE...
    method MeetingGroupProposalAcceptedIntegrationEvent (line 7) | public MeetingGroupProposalAcceptedIntegrationEvent(

FILE: src/Modules/Administration/Tests/ArchTests/Application/ApplicationTests.cs
  class ApplicationTests (line 14) | [TestFixture]
    method Command_Should_Be_Immutable (line 17) | [Test]
    method Query_Should_Be_Immutable (line 38) | [Test]
    method CommandHandler_Should_Have_Name_EndingWith_CommandHandler (line 47) | [Test]
    method QueryHandler_Should_Have_Name_EndingWith_QueryHandler (line 63) | [Test]
    method Command_And_Query_Handlers_Should_Not_Be_Public (line 76) | [Test]
    method Validator_Should_Have_Name_EndingWith_Validator (line 91) | [Test]
    method Validators_Should_Not_Be_Public (line 104) | [Test]
    method InternalCommand_Should_Have_JsonConstructorAttribute (line 115) | [Test]
    method MediatR_RequestHandler_Should_NotBe_Used_Directly (line 150) | [Test]
    method Command_With_Result_Should_Not_Return_Unit (line 179) | [Test]

FILE: src/Modules/Administration/Tests/ArchTests/Domain/DomainTests.cs
  class DomainTests (line 9) | public class DomainTests : TestBase
    method DomainEvent_Should_Be_Immutable (line 11) | [Test]
    method ValueObject_Should_Be_Immutable (line 24) | [Test]
    method Entity_Which_Is_Not_Aggregate_Root_Cannot_Have_Public_Members (line 35) | [Test]
    method Entity_Cannot_Have_Reference_To_Other_AggregateRoot (line 64) | [Test]
    method Entity_Should_Have_Parameterless_Private_Constructor (line 108) | [Test]
    method Domain_Object_Should_Have_Only_Private_Constructors (line 137) | [Test]
    method ValueObject_Should_Have_Private_Constructor_With_Parameters_For_His_State (line 163) | [Test]
    method DomainEvent_Should_Have_DomainEventPostfix (line 202) | [Test]
    method BusinessRule_Should_Have_RulePostfix (line 216) | [Test]

FILE: src/Modules/Administration/Tests/ArchTests/Module/LayersTests.cs
  class LayersTests (line 7) | [TestFixture]
    method DomainLayer_DoesNotHaveDependency_ToApplicationLayer (line 10) | [Test]
    method DomainLayer_DoesNotHaveDependency_ToInfrastructureLayer (line 21) | [Test]
    method ApplicationLayer_DoesNotHaveDependency_ToInfrastructureLayer (line 32) | [Test]

FILE: src/Modules/Administration/Tests/ArchTests/SeedWork/TestBase.cs
  class TestBase (line 10) | public abstract class TestBase
    method AssertAreImmutable (line 18) | protected static void AssertAreImmutable(IEnumerable<Type> types)
    method AssertFailingTypes (line 33) | protected static void AssertFailingTypes(IEnumerable<Type> types)
    method AssertArchTestResult (line 38) | protected static void AssertArchTestResult(TestResult result)

FILE: src/Modules/Administration/Tests/IntegrationTests/AssemblyInfo.cs
  class AssemblyInfo (line 8) | public class AssemblyInfo

FILE: src/Modules/Administration/Tests/IntegrationTests/MeetingGroupProposals/MeetingGroupProposalSampleData.cs
  type MeetingGroupProposalSampleData (line 3) | public struct MeetingGroupProposalSampleData

FILE: src/Modules/Administration/Tests/IntegrationTests/MeetingGroupProposals/MeetingGroupProposalTests.cs
  class MeetingGroupProposalTests (line 11) | [TestFixture]
    method RequestMeetingGroupProposalVerification_Test (line 14) | [Test]
    method AcceptMeetingGroupProposal_WhenProposalIsNotAccepted_IsSuccessful (line 39) | [Test]
    method AcceptMeetingGroupProposal_WhenProposalIsAlreadyAccepted_BreaksMeetingGroupProposalCanBeVerifiedOnceRule (line 64) | [Test]

FILE: src/Modules/Administration/Tests/IntegrationTests/Members/CreateMemberTests.cs
  class CreateMemberTests (line 8) | [TestFixture]
    method CreateMember_Test (line 11) | [Test]

FILE: src/Modules/Administration/Tests/IntegrationTests/Members/MemberSampleData.cs
  type MemberSampleData (line 3) | public struct MemberSampleData

FILE: src/Modules/Administration/Tests/IntegrationTests/SeedWork/ExecutionContextMock.cs
  class ExecutionContextMock (line 5) | public class ExecutionContextMock : IExecutionContextAccessor
    method ExecutionContextMock (line 7) | public ExecutionContextMock(Guid userId)

FILE: src/Modules/Administration/Tests/IntegrationTests/SeedWork/OutboxMessagesHelper.cs
  class OutboxMessagesHelper (line 11) | public class OutboxMessagesHelper
    method GetOutboxMessages (line 13) | public static async Task<List<OutboxMessageDto>> GetOutboxMessages(IDb...
    method Deserialize (line 28) | public static T Deserialize<T>(OutboxMessageDto message)

FILE: src/Modules/Administration/Tests/IntegrationTests/SeedWork/TestBase.cs
  class TestBase (line 17) | public class TestBase
    method BeforeEachTest (line 29) | [SetUp]
    method GetLastOutboxMessage (line 65) | protected async Task<T> GetLastOutboxMessage<T>()
    method AssertBrokenRule (line 76) | protected static void AssertBrokenRule<TRule>(AsyncTestDelegate testDe...
    method ClearDatabase (line 87) | private static async Task ClearDatabase(IDbConnection connection)

FILE: src/Modules/Administration/Tests/UnitTests/MeetingGroupProposals/MeetingGroupProposalTests.cs
  class MeetingGroupProposalTests (line 10) | [TestFixture]
    method CreateProposalToVerify_IsSuccessful (line 13) | [Test]
    method AcceptProposal_WhenDecisionIsNotMade_IsSuccessful (line 33) | [Test]
    method AcceptProposal_WhenDecisionIsMade_CanBeVerifiedOnlyOnce (line 55) | [Test]
    method RejectProposal_WhenDecisionIsMade_CanBeVerifiedOnlyOnce (line 79) | [Test]
    method RejectProposal_WithoutProvidedReason_CannotBeRejected (line 103) | [Test]

FILE: src/Modules/Administration/Tests/UnitTests/Members/MemberTests.cs
  class MemberTests (line 8) | [TestFixture]
    method CreateMember_IsSuccessful (line 11) | [Test]

FILE: src/Modules/Administration/Tests/UnitTests/SeedWork/DomainEventsTestHelper.cs
  class DomainEventsTestHelper (line 7) | public class DomainEventsTestHelper
    method GetAllDomainEvents (line 9) | public static List<IDomainEvent> GetAllDomainEvents(Entity aggregate)

FILE: src/Modules/Administration/Tests/UnitTests/SeedWork/TestBase.cs
  class TestBase (line 6) | public abstract class TestBase
    method AssertPublishedDomainEvent (line 8) | public static T AssertPublishedDomainEvent<T>(Entity aggregate)
    method AssertPublishedDomainEvents (line 21) | public static List<T> AssertPublishedDomainEvents<T>(Entity aggregate)
    method AssertBrokenRule (line 34) | public static void AssertBrokenRule<TRule>(TestDelegate testDelegate)

FILE: src/Modules/Meetings/Application/Configuration/Commands/ICommandHandler.cs
  type ICommandHandler (line 6) | public interface ICommandHandler<in TCommand> : IRequestHandler<TCommand>
  type ICommandHandler (line 11) | public interface ICommandHandler<in TCommand, TResult> :

FILE: src/Modules/Meetings/Application/Configuration/Commands/ICommandsScheduler.cs
  type ICommandsScheduler (line 5) | public interface ICommandsScheduler
    method EnqueueAsync (line 7) | Task EnqueueAsync(ICommand command);
    method EnqueueAsync (line 9) | Task EnqueueAsync<T>(ICommand<T> command);

FILE: src/Modules/Meetings/Application/Configuration/Commands/InternalCommandBase.cs
  class InternalCommandBase (line 5) | public abstract class InternalCommandBase : ICommand
    method InternalCommandBase (line 7) | protected InternalCommandBase(Guid id)
    method InternalCommandBase (line 17) | protected InternalCommandBase()
    method InternalCommandBase (line 22) | protected InternalCommandBase(Guid id)
  class InternalCommandBase (line 15) | public abstract class InternalCommandBase<TResult> : ICommand<TResult>
    method InternalCommandBase (line 7) | protected InternalCommandBase(Guid id)
    method InternalCommandBase (line 17) | protected InternalCommandBase()
    method InternalCommandBase (line 22) | protected InternalCommandBase(Guid id)

FILE: src/Modules/Meetings/Application/Configuration/Queries/IQueryHandler.cs
  type IQueryHandler (line 6) | public interface IQueryHandler<in TQuery, TResult> :

FILE: src/Modules/Meetings/Application/Contracts/CommandBase.cs
  class CommandBase (line 3) | public abstract class CommandBase : ICommand
    method CommandBase (line 7) | protected CommandBase()
    method CommandBase (line 12) | protected CommandBase(Guid id)
    method CommandBase (line 20) | protected CommandBase()
    method CommandBase (line 25) | protected CommandBase(Guid id)
  class CommandBase (line 18) | public abstract class CommandBase<TResult> : ICommand<TResult>
    method CommandBase (line 7) | protected CommandBase()
    method CommandBase (line 12) | protected CommandBase(Guid id)
    method CommandBase (line 20) | protected CommandBase()
    method CommandBase (line 25) | protected CommandBase(Guid id)

FILE: src/Modules/Meetings/Application/Contracts/ICommand.cs
  type ICommand (line 5) | public interface ICommand<out TResult> : IRequest<TResult>
  type ICommand (line 10) | public interface ICommand : IRequest

FILE: src/Modules/Meetings/Application/Contracts/IMeetingsModule.cs
  type IMeetingsModule (line 3) | public interface IMeetingsModule
    method ExecuteCommandAsync (line 5) | Task<TResult> ExecuteCommandAsync<TResult>(ICommand<TResult> command);
    method ExecuteCommandAsync (line 7) | Task ExecuteCommandAsync(ICommand command);
    method ExecuteQueryAsync (line 9) | Task<TResult> ExecuteQueryAsync<TResult>(IQuery<TResult> query);

FILE: src/Modules/Meetings/Application/Contracts/IQuery.cs
  type IQuery (line 5) | public interface IQuery<out TResult> : IRequest<TResult>

FILE: src/Modules/Meetings/Application/Contracts/IRecurringCommand.cs
  type IRecurringCommand (line 3) | public interface IRecurringCommand

FILE: src/Modules/Meetings/Application/Contracts/QueryBase.cs
  class QueryBase (line 3) | public abstract class QueryBase<TResult> : IQuery<TResult>
    method QueryBase (line 7) | protected QueryBase()
    method QueryBase (line 12) | protected QueryBase(Guid id)

FILE: src/Modules/Meetings/Application/Countries/CountryDto.cs
  class CountryDto (line 3) | public class CountryDto

FILE: src/Modules/Meetings/Application/Countries/GetAllCountriesQuery.cs
  class GetAllCountriesQuery (line 5) | public class GetAllCountriesQuery : QueryBase<List<CountryDto>>

FILE: src/Modules/Meetings/Application/Countries/GetAllCountriesQueryHandler.cs
  class GetAllCountriesQueryHandler (line 7) | internal class GetAllCountriesQueryHandler : IQueryHandler<GetAllCountri...
    method GetAllCountriesQueryHandler (line 11) | public GetAllCountriesQueryHandler(ISqlConnectionFactory sqlConnection...
    method Handle (line 16) | public async Task<List<CountryDto>> Handle(GetAllCountriesQuery query,...

FILE: src/Modules/Meetings/Application/MeetingCommentingConfigurations/DisableMeetingCommentingConfiguration/DisableMeetingCommentingConfigurationCommand.cs
  class DisableMeetingCommentingConfigurationCommand (line 5) | public class DisableMeetingCommentingConfigurationCommand : CommandBase
    method DisableMeetingCommentingConfigurationCommand (line 9) | public DisableMeetingCommentingConfigurationCommand(Guid meetingId)

FILE: src/Modules/Meetings/Application/MeetingCommentingConfigurations/DisableMeetingCommentingConfiguration/DisableMeetingCommentingConfigurationCommandHandler.cs
  class DisableMeetingCommentingConfigurationCommandHandler (line 10) | internal class DisableMeetingCommentingConfigurationCommandHandler : ICo...
    method DisableMeetingCommentingConfigurationCommandHandler (line 17) | public DisableMeetingCommentingConfigurationCommandHandler(
    method Handle (line 29) | public async Task Handle(DisableMeetingCommentingConfigurationCommand ...

FILE: src/Modules/Meetings/Application/MeetingCommentingConfigurations/EnableMeetingCommentingConfiguration/EnableMeetingCommentingConfigurationCommand.cs
  class EnableMeetingCommentingConfigurationCommand (line 5) | public class EnableMeetingCommentingConfigurationCommand : CommandBase
    method EnableMeetingCommentingConfigurationCommand (line 9) | public EnableMeetingCommentingConfigurationCommand(Guid meetingId)

FILE: src/Modules/Meetings/Application/MeetingCommentingConfigurations/EnableMeetingCommentingConfiguration/EnableMeetingCommentingConfigurationCommandHandler.cs
  class EnableMeetingCommentingConfigurationCommandHandler (line 10) | internal class EnableMeetingCommentingConfigurationCommandHandler : ICom...
    method EnableMeetingCommentingConfigurationCommandHandler (line 17) | public EnableMeetingCommentingConfigurationCommandHandler(
    method Handle (line 29) | public async Task Handle(EnableMeetingCommentingConfigurationCommand c...

FILE: src/Modules/Meetings/Application/MeetingCommentingConfigurations/GetMeetingCommentingConfiguration/GetMeetingCommentingConfigurationQuery.cs
  class GetMeetingCommentingConfigurationQuery (line 5) | public class GetMeetingCommentingConfigurationQuery : QueryBase<MeetingC...
    method GetMeetingCommentingConfigurationQuery (line 9) | public GetMeetingCommentingConfigurationQuery(Guid meetingId)

FILE: src/Modules/Meetings/Application/MeetingCommentingConfigurations/GetMeetingCommentingConfiguration/GetMeetingCommentingConfigurationQueryHandler.cs
  class GetMeetingCommentingConfigurationQueryHandler (line 7) | internal class GetMeetingCommentingConfigurationQueryHandler : IQueryHan...
    method GetMeetingCommentingConfigurationQueryHandler (line 11) | public GetMeetingCommentingConfigurationQueryHandler(ISqlConnectionFac...
    method Handle (line 16) | public async Task<MeetingCommentingConfigurationDto> Handle(GetMeeting...

FILE: src/Modules/Meetings/Application/MeetingCommentingConfigurations/GetMeetingCommentingConfiguration/MeetingCommentingConfigurationDto.cs
  class MeetingCommentingConfigurationDto (line 3) | public class MeetingCommentingConfigurationDto

FILE: src/Modules/Meetings/Application/MeetingCommentingConfigurations/MeetingCreatedEventHandler.cs
  class MeetingCreatedEventHandler (line 8) | internal class MeetingCreatedEventHandler : INotificationHandler<Meeting...
    method MeetingCreatedEventHandler (line 13) | public MeetingCreatedEventHandler(
    method Handle (line 21) | public async Task Handle(MeetingCreatedDomainEvent @event, Cancellatio...

FILE: src/Modules/Meetings/Application/MeetingComments/AddMeetingComment/AddMeetingCommentCommand.cs
  class AddMeetingCommentCommand (line 5) | public class AddMeetingCommentCommand : CommandBase<Guid>
    method AddMeetingCommentCommand (line 11) | public AddMeetingCommentCommand(Guid meetingId, string comment)

FILE: src/Modules/Meetings/Application/MeetingComments/AddMeetingComment/AddMeetingCommentCommandHandler.cs
  class AddMeetingCommentCommandHandler (line 11) | internal class AddMeetingCommentCommandHandler : ICommandHandler<AddMeet...
    method AddMeetingCommentCommandHandler (line 19) | public AddMeetingCommentCommandHandler(
    method Handle (line 33) | public async Task<Guid> Handle(AddMeetingCommentCommand command, Cance...

FILE: src/Modules/Meetings/Application/MeetingComments/AddMeetingComment/AddMeetingCommentCommandValidator.cs
  class AddMeetingCommentCommandValidator (line 5) | internal class AddMeetingCommentCommandValidator : AbstractValidator<Add...
    method AddMeetingCommentCommandValidator (line 7) | public AddMeetingCommentCommandValidator()

FILE: src/Modules/Meetings/Application/MeetingComments/AddMeetingCommentLike/AddMeetingCommentLikeCommand.cs
  class AddMeetingCommentLikeCommand (line 5) | public class AddMeetingCommentLikeCommand : CommandBase
    method AddMeetingCommentLikeCommand (line 9) | public AddMeetingCommentLikeCommand(Guid meetingCommentId)

FILE: src/Modules/Meetings/Application/MeetingComments/AddMeetingCommentLike/AddMeetingCommentLikeCommandHandler.cs
  class AddMeetingCommentLikeCommandHandler (line 11) | internal class AddMeetingCommentLikeCommandHandler : ICommandHandler<Add...
    method AddMeetingCommentLikeCommandHandler (line 18) | public AddMeetingCommentLikeCommandHandler(
    method Handle (line 30) | public async Task Handle(AddMeetingCommentLikeCommand request, Cancell...

FILE: src/Modules/Meetings/Application/MeetingComments/AddMeetingCommentReply/AddReplyToMeetingCommentCommand.cs
  class AddReplyToMeetingCommentCommand (line 5) | public class AddReplyToMeetingCommentCommand : CommandBase<Guid>
    method AddReplyToMeetingCommentCommand (line 11) | public AddReplyToMeetingCommentCommand(Guid inReplyToCommentId, string...

FILE: src/Modules/Meetings/Application/MeetingComments/AddMeetingCommentReply/AddReplyToMeetingCommentCommandHandler.cs
  class AddReplyToMeetingCommentCommandHandler (line 11) | internal class AddReplyToMeetingCommentCommandHandler : ICommandHandler<...
    method AddReplyToMeetingCommentCommandHandler (line 19) | internal AddReplyToMeetingCommentCommandHandler(IMeetingCommentReposit...
    method Handle (line 28) | public async Task<Guid> Handle(AddReplyToMeetingCommentCommand command...

FILE: src/Modules/Meetings/Application/MeetingComments/EditMeetingComment/EditMeetingCommentCommand.cs
  class EditMeetingCommentCommand (line 5) | public class EditMeetingCommentCommand : CommandBase
    method EditMeetingCommentCommand (line 11) | public EditMeetingCommentCommand(Guid meetingCommentId, string editedC...

FILE: src/Modules/Meetings/Application/MeetingComments/EditMeetingComment/EditMeetingCommentCommandHandler.cs
  class EditMeetingCommentCommandHandler (line 9) | internal class EditMeetingCommentCommandHandler : ICommandHandler<EditMe...
    method EditMeetingCommentCommandHandler (line 15) | internal EditMeetingCommentCommandHandler(
    method Handle (line 25) | public async Task Handle(EditMeetingCommentCommand command, Cancellati...

FILE: src/Modules/Meetings/Application/MeetingComments/EditMeetingComment/EditMeetingCommentCommandValidator.cs
  class EditMeetingCommentCommandValidator (line 5) | internal class EditMeetingCommentCommandValidator : AbstractValidator<Ed...
    method EditMeetingCommentCommandValidator (line 7) | public EditMeetingCommentCommandValidator()

FILE: src/Modules/Meetings/Application/MeetingComments/GetMeetingCommentLikers/GetMeetingCommentLikersQuery.cs
  class GetMeetingCommentLikersQuery (line 5) | public class GetMeetingCommentLikersQuery : IQuery<List<MeetingCommentLi...
    method GetMeetingCommentLikersQuery (line 9) | public GetMeetingCommentLikersQuery(Guid meetingCommentId)

FILE: src/Modules/Meetings/Application/MeetingComments/GetMeetingCommentLikers/GetMeetingCommentLikersQueryHandler.cs
  class GetMeetingCommentLikersQueryHandler (line 7) | internal class GetMeetingCommentLikersQueryHandler : IQueryHandler<GetMe...
    method GetMeetingCommentLikersQueryHandler (line 11) | public GetMeetingCommentLikersQueryHandler(ISqlConnectionFactory sqlCo...
    method Handle (line 16) | public async Task<List<MeetingCommentLikerDto>> Handle(GetMeetingComme...

FILE: src/Modules/Meetings/Application/MeetingComments/GetMeetingCommentLikers/MeetingCommentLikerDto.cs
  class MeetingCommentLikerDto (line 3) | public class MeetingCommentLikerDto

FILE: src/Modules/Meetings/Application/MeetingComments/GetMeetingComments/GetMeetingCommentsQuery.cs
  class GetMeetingCommentsQuery (line 5) | public class GetMeetingCommentsQuery : QueryBase<List<MeetingCommentDto>>
    method GetMeetingCommentsQuery (line 9) | public GetMeetingCommentsQuery(Guid meetingId)

FILE: src/Modules/Meetings/Application/MeetingComments/GetMeetingComments/GetMeetingCommentsQueryHandler.cs
  class GetMeetingCommentsQueryHandler (line 7) | internal class GetMeetingCommentsQueryHandler : IQueryHandler<GetMeeting...
    method GetMeetingCommentsQueryHandler (line 11) | public GetMeetingCommentsQueryHandler(ISqlConnectionFactory sqlConnect...
    method Handle (line 16) | public async Task<List<MeetingCommentDto>> Handle(GetMeetingCommentsQu...

FILE: src/Modules/Meetings/Application/MeetingComments/GetMeetingComments/MeetingCommentDto.cs
  class MeetingCommentDto (line 3) | public class MeetingCommentDto

FILE: src/Modules/Meetings/Application/MeetingComments/MeetingCommentLikedNotification.cs
  class MeetingCommentLikedNotification (line 6) | public class MeetingCommentLikedNotification : DomainNotificationBase<Me...
    method MeetingCommentLikedNotification (line 8) | public MeetingCommentLikedNotification(MeetingCommentLikedDomainEvent ...

FILE: src/Modules/Meetings/Application/MeetingComments/MeetingCommentLikedNotificationHandler.cs
  class MeetingCommentLikedNotificationHandler (line 7) | internal class MeetingCommentLikedNotificationHandler : INotificationHan...
    method MeetingCommentLikedNotificationHandler (line 11) | public MeetingCommentLikedNotificationHandler(ISqlConnectionFactory sq...
    method Handle (line 16) | public async Task Handle(MeetingCommentLikedNotification notification,...

FILE: src/Modules/Meetings/Application/MeetingComments/MeetingCommentUnlikeNotificationHandler.cs
  class MeetingCommentUnlikeNotificationHandler (line 7) | public class MeetingCommentUnlikeNotificationHandler : INotificationHand...
    method MeetingCommentUnlikeNotificationHandler (line 11) | public MeetingCommentUnlikeNotificationHandler(ISqlConnectionFactory s...
    method Handle (line 16) | public async Task Handle(MeetingCommentUnlikedNotification notificatio...

FILE: src/Modules/Meetings/Application/MeetingComments/MeetingCommentUnlikedNotification.cs
  class MeetingCommentUnlikedNotification (line 6) | public class MeetingCommentUnlikedNotification : DomainNotificationBase<...
    method MeetingCommentUnlikedNotification (line 8) | public MeetingCommentUnlikedNotification(MeetingCommentUnlikedDomainEv...

FILE: src/Modules/Meetings/Application/MeetingComments/RemoveMeetingComment/RemoveMeetingCommentCommand.cs
  class RemoveMeetingCommentCommand (line 5) | public class RemoveMeetingCommentCommand : CommandBase
    method RemoveMeetingCommentCommand (line 11) | public RemoveMeetingCommentCommand(Guid meetingCommentId, string reason)

FILE: src/Modules/Meetings/Application/MeetingComments/RemoveMeetingComment/RemoveMeetingCommentCommandHandler.cs
  class RemoveMeetingCommentCommandHandler (line 10) | internal class RemoveMeetingCommentCommandHandler : ICommandHandler<Remo...
    method RemoveMeetingCommentCommandHandler (line 17) | internal RemoveMeetingCommentCommandHandler(IMeetingCommentRepository ...
    method Handle (line 25) | public async Task Handle(RemoveMeetingCommentCommand command, Cancella...

FILE: src/Modules/Meetings/Application/MeetingComments/RemoveMeetingCommentLike/RemoveMeetingCommentLikeCommand.cs
  class RemoveMeetingCommentLikeCommand (line 5) | public class RemoveMeetingCommentLikeCommand : CommandBase
    method RemoveMeetingCommentLikeCommand (line 9) | public RemoveMeetingCommentLikeCommand(Guid meetingCommentId)

FILE: src/Modules/Meetings/Application/MeetingComments/RemoveMeetingCommentLike/RemoveMeetingCommentLikeCommandHandler.cs
  class RemoveMeetingCommentLikeCommandHandler (line 9) | internal class RemoveMeetingCommentLikeCommandHandler : ICommandHandler<...
    method RemoveMeetingCommentLikeCommandHandler (line 14) | internal RemoveMeetingCommentLikeCommandHandler(IMeetingMemberCommentL...
    method Handle (line 20) | public async Task Handle(RemoveMeetingCommentLikeCommand command, Canc...

FILE: src/Modules/Meetings/Application/MeetingGroupProposals/AcceptMeetingGroupProposal/AcceptMeetingGroupProposalCommand.cs
  class AcceptMeetingGroupProposalCommand (line 6) | public class AcceptMeetingGroupProposalCommand : InternalCommandBase
    method AcceptMeetingGroupProposalCommand (line 10) | [JsonConstructor]

FILE: src/Modules/Meetings/Application/MeetingGroupProposals/AcceptMeetingGroupProposal/AcceptMeetingGroupProposalCommandHandler.cs
  class AcceptMeetingGroupProposalCommandHandler (line 6) | internal class AcceptMeetingGroupProposalCommandHandler : ICommandHandle...
    method AcceptMeetingGroupProposalCommandHandler (line 10) | public AcceptMeetingGroupProposalCommandHandler(IMeetingGroupProposalR...
    method Handle (line 15) | public async Task Handle(AcceptMeetingGroupProposalCommand request, Ca...

FILE: src/Modules/Meetings/Application/MeetingGroupProposals/AcceptMeetingGroupProposal/AcceptMeetingGroupProposalCommandValidator.cs
  class AcceptMeetingGroupProposalCommandValidator (line 5) | internal class AcceptMeetingGroupProposalCommandValidator : AbstractVali...
    method AcceptMeetingGroupProposalCommandValidator (line 7) | public AcceptMeetingGroupProposalCommandValidator()

FILE: src/Modules/Meetings/Application/MeetingGroupProposals/AcceptMeetingGroupProposal/MeetingGroupProposalAcceptedNotification.cs
  class MeetingGroupProposalAcceptedNotification (line 6) | public class MeetingGroupProposalAcceptedNotification : DomainNotificati...
    method MeetingGroupProposalAcceptedNotification (line 8) | public MeetingGroupProposalAcceptedNotification(MeetingGroupProposalAc...

FILE: src/Modules/Meetings/Application/MeetingGroupProposals/AcceptMeetingGroupProposal/MeetingGroupProposalAcceptedNotificationHandler.cs
  class MeetingGroupProposalAcceptedNotificationHandler (line 7) | internal class MeetingGroupProposalAcceptedNotificationHandler : INotifi...
    method MeetingGroupProposalAcceptedNotificationHandler (line 11) | internal MeetingGroupProposalAcceptedNotificationHandler(ICommandsSche...
    method Handle (line 16) | public async Task Handle(MeetingGroupProposalAcceptedNotification noti...

FILE: src/Modules/Meetings/Application/MeetingGroupProposals/GetAllMeetingGroupProposals/GetAllMeetingGroupProposalsQuery.cs
  class GetAllMeetingGroupProposalsQuery (line 7) | public class GetAllMeetingGroupProposalsQuery : QueryBase<List<MeetingGr...
    method GetAllMeetingGroupProposalsQuery (line 9) | public GetAllMeetingGroupProposalsQuery(int? page, int? perPage)

FILE: src/Modules/Meetings/Application/MeetingGroupProposals/GetAllMeetingGroupProposals/GetAllMeetingGroupProposalsQueryHandler.cs
  class GetAllMeetingGroupProposalsQueryHandler (line 9) | internal class GetAllMeetingGroupProposalsQueryHandler : IQueryHandler<G...
    method GetAllMeetingGroupProposalsQueryHandler (line 13) | public GetAllMeetingGroupProposalsQueryHandler(ISqlConnectionFactory s...
    method Handle (line 18) | public async Task<List<MeetingGroupProposalDto>> Handle(GetAllMeetingG...

FILE: src/Modules/Meetings/Application/MeetingGroupProposals/GetMeetingGroupProposal/GetMeetingGroupProposalQuery.cs
  class GetMeetingGroupProposalQuery (line 5) | public class GetMeetingGroupProposalQuery : QueryBase<MeetingGroupPropos...
    method GetMeetingGroupProposalQuery (line 7) | public GetMeetingGroupProposalQuery(Guid meetingGroupProposalId)

FILE: src/Modules/Meetings/Application/MeetingGroupProposals/GetMeetingGroupProposal/GetMeetingGroupProposalQueryHandler.cs
  class GetMeetingGroupProposalQueryHandler (line 7) | internal class GetMeetingGroupProposalQueryHandler : IQueryHandler<GetMe...
    method GetMeetingGroupProposalQueryHandler (line 11) | public GetMeetingGroupProposalQueryHandler(ISqlConnectionFactory sqlCo...
    method Handle (line 16) | public async Task<MeetingGroupProposalDto> Handle(GetMeetingGroupPropo...

FILE: src/Modules/Meetings/Application/MeetingGroupProposals/GetMeetingGroupProposal/MeetingGroupProposalDto.cs
  class MeetingGroupProposalDto (line 3) | public class MeetingGroupProposalDto

FILE: src/Modules/Meetings/Application/MeetingGroupProposals/GetMemberMeetingGroupProposals/GetMemberMeetingGroupProposalsQuery.cs
  class GetMemberMeetingGroupProposalsQuery (line 6) | public class GetMemberMeetingGroupProposalsQuery : QueryBase<List<Meetin...
    method GetMemberMeetingGroupProposalsQuery (line 8) | public GetMemberMeetingGroupProposalsQuery()

FILE: src/Modules/Meetings/Application/MeetingGroupProposals/GetMemberMeetingGroupProposals/GetMemberMeetingGroupProposalsQueryHandler.cs
  class GetMemberMeetingGroupProposalsQueryHandler (line 9) | internal class GetMemberMeetingGroupProposalsQueryHandler : IQueryHandle...
    method GetMemberMeetingGroupProposalsQueryHandler (line 15) | public GetMemberMeetingGroupProposalsQueryHandler(
    method Handle (line 23) | public async Task<List<MeetingGroupProposalDto>> Handle(GetMemberMeeti...

FILE: src/Modules/Meetings/Application/MeetingGroupProposals/MeetingGroupProposalAcceptedIntegrationEventHandler.cs
  class MeetingGroupProposalAcceptedIntegrationEventHandler (line 8) | public class MeetingGroupProposalAcceptedIntegrationEventHandler :
    method MeetingGroupProposalAcceptedIntegrationEventHandler (line 13) | public MeetingGroupProposalAcceptedIntegrationEventHandler(ICommandsSc...
    method Handle (line 18) | public async Task Handle(MeetingGroupProposalAcceptedIntegrationEvent ...

FILE: src/Modules/Meetings/Application/MeetingGroupProposals/MeetingGroupProposedNotification.cs
  class MeetingGroupProposedNotification (line 7) | public class MeetingGroupProposedNotification : DomainNotificationBase<M...
    method MeetingGroupProposedNotification (line 9) | [JsonConstructor]

FILE: src/Modules/Meetings/Application/MeetingGroupProposals/MeetingGroupProposedNotificationHandler.cs
  class MeetingGroupProposedNotificationHandler (line 7) | public class MeetingGroupProposedNotificationHandler : INotificationHand...
    method MeetingGroupProposedNotificationHandler (line 11) | public MeetingGroupProposedNotificationHandler(IEventsBus eventsBus)
    method Handle (line 16) | public async Task Handle(MeetingGroupProposedNotification notification...

FILE: src/Modules/Meetings/Application/MeetingGroupProposals/ProposeMeetingGroup/ProposeMeetingGroupCommand.cs
  class ProposeMeetingGroupCommand (line 5) | public class ProposeMeetingGroupCommand : CommandBase<Guid>
    method ProposeMeetingGroupCommand (line 7) | public ProposeMeetingGroupCommand(string name, string description, str...

FILE: src/Modules/Meetings/Application/MeetingGroupProposals/ProposeMeetingGroup/ProposeMeetingGroupCommandHandler.cs
  class ProposeMeetingGroupCommandHandler (line 8) | internal class ProposeMeetingGroupCommandHandler : ICommandHandler<Propo...
    method ProposeMeetingGroupCommandHandler (line 13) | internal ProposeMeetingGroupCommandHandler(
    method Handle (line 21) | public async Task<Guid> Handle(ProposeMeetingGroupCommand request, Can...

FILE: src/Modules/Meetings/Application/MeetingGroupProposals/ProposeMeetingGroup/ProposeMeetingGroupCommandValidator.cs
  class ProposeMeetingGroupCommandValidator (line 5) | internal class ProposeMeetingGroupCommandValidator : AbstractValidator<P...
    method ProposeMeetingGroupCommandValidator (line 7) | public ProposeMeetingGroupCommandValidator()

FILE: src/Modules/Meetings/Application/MeetingGroups/CreateNewMeetingGroup/CreateNewMeetingGroupCommand.cs
  class CreateNewMeetingGroupCommand (line 7) | public class CreateNewMeetingGroupCommand : InternalCommandBase
    method CreateNewMeetingGroupCommand (line 9) | [JsonConstructor]

FILE: src/Modules/Meetings/Application/MeetingGroups/CreateNewMeetingGroup/CreateNewMeetingGroupCommandHandler.cs
  class CreateNewMeetingGroupCommandHandler (line 7) | internal class CreateNewMeetingGroupCommandHandler : ICommandHandler<Cre...
    method CreateNewMeetingGroupCommandHandler (line 12) | internal CreateNewMeetingGroupCommandHandler(
    method Handle (line 20) | public async Task Handle(CreateNewMeetingGroupCommand request, Cancell...

FILE: src/Modules/Meetings/Application/MeetingGroups/EditMeetingGroupGeneralAttributes/EditMeetingGroupGeneralAttributesCommand.cs
  class EditMeetingGroupGeneralAttributesCommand (line 5) | public class EditMeetingGroupGeneralAttributesCommand : CommandBase
    method EditMeetingGroupGeneralAttributesCommand (line 7) | public EditMeetingGroupGeneralAttributesCommand(Guid meetingGroupId, s...

FILE: src/Modules/Meetings/Application/MeetingGroups/EditMeetingGroupGeneralAttributes/EditMeetingGroupGeneralAttributesCommandHandler.cs
  class EditMeetingGroupGeneralAttributesCommandHandler (line 7) | internal class EditMeetingGroupGeneralAttributesCommandHandler : IComman...
    method EditMeetingGroupGeneralAttributesCommandHandler (line 12) | internal EditMeetingGroupGeneralAttributesCommandHandler(IMemberContex...
    method Handle (line 18) | public async Task Handle(EditMeetingGroupGeneralAttributesCommand requ...

FILE: src/Modules/Meetings/Application/MeetingGroups/GetAllMeetingGroups/GetAllMeetingGroupsQuery.cs
  class GetAllMeetingGroupsQuery (line 5) | public class GetAllMeetingGroupsQuery : IQuery<List<MeetingGroupDto>>

FILE: src/Modules/Meetings/Application/MeetingGroups/GetAllMeetingGroups/GetAllMeetingGroupsQueryHandler.cs
  class GetAllMeetingGroupsQueryHandler (line 7) | internal class GetAllMeetingGroupsQueryHandler : IQueryHandler<GetAllMee...
    method GetAllMeetingGroupsQueryHandler (line 11) | internal GetAllMeetingGroupsQueryHandler(ISqlConnectionFactory sqlConn...
    method Handle (line 16) | public async Task<List<MeetingGroupDto>> Handle(GetAllMeetingGroupsQue...

FILE: src/Modules/Meetings/Application/MeetingGroups/GetAllMeetingGroups/MeetingGroupDto.cs
  class MeetingGroupDto (line 3) | public class MeetingGroupDto

FILE: src/Modules/Meetings/Application/MeetingGroups/GetAuthenticationMemberMeetingGroups/GetAuthenticationMemberMeetingGroupsQuery.cs
  class GetAuthenticationMemberMeetingGroupsQuery (line 5) | public class GetAuthenticationMemberMeetingGroupsQuery : QueryBase<List<...

FILE: src/Modules/Meetings/Application/MeetingGroups/GetAuthenticationMemberMeetingGroups/GetAuthenticationMemberMeetingGroupsQueryHandler.cs
  class GetAuthenticationMemberMeetingGroupsQueryHandler (line 8) | internal class GetAuthenticationMemberMeetingGroupsQueryHandler :
    method GetAuthenticationMemberMeetingGroupsQueryHandler (line 15) | public GetAuthenticationMemberMeetingGroupsQueryHandler(
    method Handle (line 23) | public async Task<List<MemberMeetingGroupDto>> Handle(

FILE: src/Modules/Meetings/Application/MeetingGroups/GetAuthenticationMemberMeetingGroups/MemberMeetingGroupDto.cs
  class MemberMeetingGroupDto (line 3) | public class MemberMeetingGroupDto

FILE: src/Modules/Meetings/Application/MeetingGroups/GetMeetingGroupDetails/GetMeetingGroupDetailsQuery.cs
  class GetMeetingGroupDetailsQuery (line 5) | public class GetMeetingGroupDetailsQuery : QueryBase<MeetingGroupDetails...
    method GetMeetingGroupDetailsQuery (line 7) | public GetMeetingGroupDetailsQuery(Guid meetingGroupId)

FILE: src/Modules/Meetings/Application/MeetingGroups/GetMeetingGroupDetails/GetMeetingGroupDetailsQueryHandler.cs
  class GetMeetingGroupDetailsQueryHandler (line 8) | internal class GetMeetingGroupDetailsQueryHandler : IQueryHandler<GetMee...
    method GetMeetingGroupDetailsQueryHandler (line 12) | public GetMeetingGroupDetailsQueryHandler(ISqlConnectionFactory sqlCon...
    method Handle (line 17) | public async Task<MeetingGroupDetailsDto> Handle(GetMeetingGroupDetail...
    method GetMembersCount (line 43) | private static async Task<int> GetMembersCount(Guid meetingGroupId, ID...

FILE: src/Modules/Meetings/Application/MeetingGroups/GetMeetingGroupDetails/MeetingGroupDetailsDto.cs
  class MeetingGroupDetailsDto (line 3) | public class MeetingGroupDetailsDto

FILE: src/Modules/Meetings/Application/MeetingGroups/JoinToGroup/JoinToGroupCommand.cs
  class JoinToGroupCommand (line 5) | public class JoinToGroupCommand : CommandBase
    method JoinToGroupCommand (line 7) | public JoinToGroupCommand(Guid meetingGroupId)

FILE: src/Modules/Meetings/Application/MeetingGroups/JoinToGroup/JoinToGroupCommandHandler.cs
  class JoinToGroupCommandHandler (line 7) | internal class JoinToGroupCommandHandler : ICommandHandler<JoinToGroupCo...
    method JoinToGroupCommandHandler (line 12) | internal JoinToGroupCommandHandler(
    method Handle (line 20) | public async Task Handle(JoinToGroupCommand request, CancellationToken...

FILE: src/Modules/Meetings/Application/MeetingGroups/LeaveMeetingGroup/LeaveMeetingGroupCommand.cs
  class LeaveMeetingGroupCommand (line 5) | public class LeaveMeetingGroupCommand : CommandBase
    method LeaveMeetingGroupCommand (line 7) | public LeaveMeetingGroupCommand(Guid meetingGroupId)

FILE: src/Modules/Meetings/Application/MeetingGroups/LeaveMeetingGroup/LeaveMeetingGroupCommandHandler.cs
  class LeaveMeetingGroupCommandHandler (line 7) | internal class LeaveMeetingGroupCommandHandler : ICommandHandler<LeaveMe...
    method LeaveMeetingGroupCommandHandler (line 12) | internal LeaveMeetingGroupCommandHandler(
    method Handle (line 20) | public async Task Handle(LeaveMeetingGroupCommand request, Cancellatio...

FILE: src/Modules/Meetings/Application/MeetingGroups/MeetingGroupCreatedNotification.cs
  class MeetingGroupCreatedNotification (line 7) | public class MeetingGroupCreatedNotification : DomainNotificationBase<Me...
    method MeetingGroupCreatedNotification (line 9) | [JsonConstructor]

FILE: src/Modules/Meetings/Application/MeetingGroups/MeetingGroupCreatedSendEmailHandler.cs
  class MeetingGroupCreatedSendEmailHandler (line 7) | internal class MeetingGroupCreatedSendEmailHandler : INotificationHandle...
    method MeetingGroupCreatedSendEmailHandler (line 11) | public MeetingGroupCreatedSendEmailHandler(ICommandsScheduler commands...
    method Handle (line 16) | public async Task Handle(MeetingGroupCreatedNotification notification,...

FILE: src/Modules/Meetings/Application/MeetingGroups/SendMeetingGroupCreatedEmail/SendMeetingGroupCreatedEmailCommand.cs
  class SendMeetingGroupCreatedEmailCommand (line 8) | internal class SendMeetingGroupCreatedEmailCommand : InternalCommandBase
    method SendMeetingGroupCreatedEmailCommand (line 14) | [JsonConstructor]

FILE: src/Modules/Meetings/Application/MeetingGroups/SendMeetingGroupCreatedEmail/SendMeetingGroupCreatedEmailCommandHandler.cs
  class SendMeetingGroupCreatedEmailCommandHandler (line 10) | internal class SendMeetingGroupCreatedEmailCommandHandler : ICommandHand...
    method SendMeetingGroupCreatedEmailCommandHandler (line 15) | public SendMeetingGroupCreatedEmailCommandHandler(
    method Handle (line 23) | public async Task Handle(SendMeetingGroupCreatedEmailCommand request, ...

FILE: src/Modules/Meetings/Application/MeetingGroups/SetMeetingGroupExpirationDate/SetMeetingGroupExpirationDateCommand.cs
  class SetMeetingGroupExpirationDateCommand (line 6) | public class SetMeetingGroupExpirationDateCommand : InternalCommandBase
    method SetMeetingGroupExpirationDateCommand (line 8) | [JsonConstructor]

FILE: src/Modules/Meetings/Application/MeetingGroups/SetMeetingGroupExpirationDate/SetMeetingGroupExpirationDateCommandHandler.cs
  class SetMeetingGroupExpirationDateCommandHandler (line 6) | internal class SetMeetingGroupExpirationDateCommandHandler : ICommandHan...
    method SetMeetingGroupExpirationDateCommandHandler (line 10) | internal SetMeetingGroupExpirationDateCommandHandler(IMeetingGroupRepo...
    method Handle (line 15) | public async Task Handle(SetMeetingGroupExpirationDateCommand request,...

FILE: src/Modules/Meetings/Application/Meetings/AddMeetingAttendee/AddMeetingAttendeeCommand.cs
  class AddMeetingAttendeeCommand (line 5) | public class AddMeetingAttendeeCommand : CommandBase
    method AddMeetingAttendeeCommand (line 11) | public AddMeetingAttendeeCommand(Guid meetingId, int guestsNumber)

FILE: src/Modules/Meetings/Application/Meetings/AddMeetingAttendee/AddMeetingAttendeeCommandHandler.cs
  class AddMeetingAttendeeCommandHandler (line 8) | internal class AddMeetingAttendeeCommandHandler : ICommandHandler<AddMee...
    method AddMeetingAttendeeCommandHandler (line 14) | public AddMeetingAttendeeCommandHandler(
    method Handle (line 24) | public async Task Handle(AddMeetingAttendeeCommand request, Cancellati...

FILE: src/Modules/Meetings/Application/Meetings/AddMeetingNotAttendee/AddMeetingNotAttendeeCommand.cs
  class AddMeetingNotAttendeeCommand (line 5) | public class AddMeetingNotAttendeeCommand : CommandBase
    method AddMeetingNotAttendeeCommand (line 9) | public AddMeetingNotAttendeeCommand(Guid meetingId)

FILE: src/Modules/Meetings/Application/Meetings/AddMeetingNotAttendee/AddMeetingNotAttendeeCommandHandler.cs
  class AddMeetingNotAttendeeCommandHandler (line 7) | internal class AddMeetingNotAttendeeCommandHandler : ICommandHandler<Add...
    method AddMeetingNotAttendeeCommandHandler (line 12) | public AddMeetingNotAttendeeCommandHandler(IMemberContext memberContex...
    method Handle (line 18) | public async Task Handle(AddMeetingNotAttendeeCommand request, Cancell...

FILE: src/Modules/Meetings/Application/Meetings/CancelMeeting/CancelMeetingCommand.cs
  class CancelMeetingCommand (line 5) | public class CancelMeetingCommand : CommandBase
    method CancelMeetingCommand (line 7) | public CancelMeetingCommand(Guid meetingId)

FILE: src/Modules/Meetings/Application/Meetings/CancelMeeting/CancelMeetingCommandHandler.cs
  class CancelMeetingCommandHandler (line 7) | internal class CancelMeetingCommandHandler : ICommandHandler<CancelMeeti...
    method CancelMeetingCommandHandler (line 12) | internal CancelMeetingCommandHandler(IMeetingRepository meetingReposit...
    method Handle (line 18) | public async Task Handle(CancelMeetingCommand request, CancellationTok...

FILE: src/Modules/Meetings/Application/Meetings/ChangeMeetingMainAttributes/ChangeMeetingMainAttributesCommand.cs
  class ChangeMeetingMainAttributesCommand (line 5) | public class ChangeMeetingMainAttributesCommand : CommandBase
    method ChangeMeetingMainAttributesCommand (line 7) | public ChangeMeetingMainAttributesCommand(

FILE: src/Modules/Meetings/Application/Meetings/ChangeMeetingMainAttributes/ChangeMeetingMainAttributesCommandHandler.cs
  class ChangeMeetingMainAttributesCommandHandler (line 7) | internal class ChangeMeetingMainAttributesCommandHandler : ICommandHandl...
    method ChangeMeetingMainAttributesCommandHandler (line 12) | public ChangeMeetingMainAttributesCommandHandler(IMemberContext member...
    method Handle (line 18) | public async Task Handle(ChangeMeetingMainAttributesCommand request, C...

FILE: src/Modules/Meetings/Application/Meetings/ChangeNotAttendeeDecision/ChangeNotAttendeeDecisionCommand.cs
  class ChangeNotAttendeeDecisionCommand (line 5) | public class ChangeNotAttendeeDecisionCommand : CommandBase
    method ChangeNotAttendeeDecisionCommand (line 9) | public ChangeNotAttendeeDecisionCommand(Guid meetingId)

FILE: src/Modules/Meetings/Application/Meetings/ChangeNotAttendeeDecision/ChangeNotAttendeeDecisionCommandHandler.cs
  class ChangeNotAttendeeDecisionCommandHandler (line 7) | internal class ChangeNotAttendeeDecisionCommandHandler : ICommandHandler...
    method ChangeNotAttendeeDecisionCommandHandler (line 12) | public ChangeNotAttendeeDecisionCommandHandler(IMemberContext memberCo...
    method Handle (line 18) | public async Task Handle(ChangeNotAttendeeDecisionCommand request, Can...

FILE: src/Modules/Meetings/Application/Meetings/CreateMeeting/CreateMeetingCommand.cs
  class CreateMeetingCommand (line 5) | public class CreateMeetingCommand : CommandBase<Guid>
    method CreateMeetingCommand (line 7) | public CreateMeetingCommand(

FILE: src/Modules/Meetings/Application/Meetings/CreateMeeting/CreateMeetingCommandHandler.cs
  class CreateMeetingCommandHandler (line 8) | internal class CreateMeetingCommandHandler : ICommandHandler<CreateMeeti...
    method CreateMeetingCommandHandler (line 14) | internal CreateMeetingCommandHandler(
    method Handle (line 24) | public async Task<Guid> Handle(CreateMeetingCommand request, Cancellat...

FILE: src/Modules/Meetings/Application/Meetings/GetAuthenticatedMemberMeetings/GetAuthenticatedMemberMeetingsQuery.cs
  class GetAuthenticatedMemberMeetingsQuery (line 5) | public class GetAuthenticatedMemberMeetingsQuery : QueryBase<List<Member...

FILE: src/Modules/Meetings/Application/Meetings/GetAuthenticatedMemberMeetings/GetAuthenticatedMemberMeetingsQueryHandler.cs
  class GetAuthenticatedMemberMeetingsQueryHandler (line 8) | internal class GetAuthenticatedMemberMeetingsQueryHandler : IQueryHandle...
    method GetAuthenticatedMemberMeetingsQueryHandler (line 14) | public GetAuthenticatedMemberMeetingsQueryHandler(
    method Handle (line 22) | public async Task<List<MemberMeetingDto>> Handle(GetAuthenticatedMembe...

FILE: src/Modules/Meetings/Application/Meetings/GetAuthenticatedMemberMeetings/MemberMeetingDto.cs
  class MemberMeetingDto (line 3) | public class MemberMeetingDto

FILE: src/Modules/Meetings/Application/Meetings/GetMeetingAttendees/GetMeetingAttendeesQuery.cs
  class GetMeetingAttendeesQuery (line 5) | public class GetMeetingAttendeesQuery : QueryBase<List<MeetingAttendeeDto>>
    method GetMeetingAttendeesQuery (line 7) | public GetMeetingAttendeesQuery(Guid meetingId)

FILE: src/Modules/Meetings/Application/Meetings/GetMeetingAttendees/GetMeetingAttendeesQueryHandler.cs
  class GetMeetingAttendeesQueryHandler (line 7) | internal class GetMeetingAttendeesQueryHandler : IQueryHandler<GetMeetin...
    method GetMeetingAttendeesQueryHandler (line 11) | public GetMeetingAttendeesQueryHandler(ISqlConnectionFactory sqlConnec...
    method Handle (line 16) | public async Task<List<MeetingAttendeeDto>> Handle(GetMeetingAttendees...

FILE: src/Modules/Meetings/Application/Meetings/GetMeetingAttendees/MeetingAttendeeDto.cs
  class MeetingAttendeeDto (line 3) | public class MeetingAttendeeDto

FILE: src/Modules/Meetings/Application/Meetings/GetMeetingDetails/GetMeetingDetailsQuery.cs
  class GetMeetingDetailsQuery (line 5) | public class GetMeetingDetailsQuery : QueryBase<MeetingDetailsDto>
    method GetMeetingDetailsQuery (line 7) | public GetMeetingDetailsQuery(Guid meetingId)

FILE: src/Modules/Meetings/Application/Meetings/GetMeetingDetails/GetMeetingDetailsQueryHandler.cs
  class GetMeetingDetailsQueryHandler (line 7) | internal class GetMeetingDetailsQueryHandler : IQueryHandler<GetMeetingD...
    method GetMeetingDetailsQueryHandler (line 11) | public GetMeetingDetailsQueryHandler(ISqlConnectionFactory sqlConnecti...
    method Handle (line 16) | public async Task<MeetingDetailsDto> Handle(GetMeetingDetailsQuery que...

FILE: src/Modules/Meetings/Application/Meetings/GetMeetingDetails/MeetingDetailsDto.cs
  class MeetingDetailsDto (line 3) | public class MeetingDetailsDto

FILE: src/Modules/Meetings/Application/Meetings/MarkMeetingAttendeeFeeAsPayedCommand.cs
  class MarkMeetingAttendeeFeeAsPayedCommand (line 6) | public class MarkMeetingAttendeeFeeAsPayedCommand : InternalCommandBase
    method MarkMeetingAttendeeFeeAsPayedCommand (line 8) | [JsonConstructor]

FILE: src/Modules/Meetings/Application/Meetings/MarkMeetingAttendeeFeeAsPayedCommandHandler.cs
  class MarkMeetingAttendeeFeeAsPayedCommandHandler (line 7) | internal class MarkMeetingAttendeeFeeAsPayedCommandHandler : ICommandHan...
    method MarkMeetingAttendeeFeeAsPayedCommandHandler (line 11) | public MarkMeetingAttendeeFeeAsPayedCommandHandler(IMeetingRepository ...
    method Handle (line 16) | public async Task Handle(MarkMeetingAttendeeFeeAsPayedCommand command,...

FILE: src/Modules/Meetings/Application/Meetings/MeetingDto.cs
  class MeetingDto (line 3) | public class MeetingDto

FILE: src/Modules/Meetings/Application/Meetings/MeetingFeePaidIntegrationEventHandler.cs
  class MeetingFeePaidIntegrationEventHandler (line 7) | public class MeetingFeePaidIntegrationEventHandler : INotificationHandle...
    method MeetingFeePaidIntegrationEventHandler (line 11) | public MeetingFeePaidIntegrationEventHandler(ICommandsScheduler comman...
    method Handle (line 16) | public async Task Handle(MeetingFeePaidIntegrationEvent @event, Cancel...

FILE: src/Modules/Meetings/Application/Meetings/MeetingsQueryHelper.cs
  class MeetingsQueryHelper (line 7) | public class MeetingsQueryHelper
    method GetMeeting (line 9) | public static async Task<MeetingDto> GetMeeting(MeetingId meetingId, I...

FILE: src/Modules/Meetings/Application/Meetings/RemoveMeetingAttendee/RemoveMeetingAttendeeCommand.cs
  class RemoveMeetingAttendeeCommand (line 5) | public class RemoveMeetingAttendeeCommand : CommandBase
    method RemoveMeetingAttendeeCommand (line 7) | public RemoveMeetingAttendeeCommand(Guid meetingId, Guid attendeeId, s...

FILE: src/Modules/Meetings/Application/Meetings/RemoveMeetingAttendee/RemoveMeetingAttendeeCommandHandler.cs
  class RemoveMeetingAttendeeCommandHandler (line 7) | internal class RemoveMeetingAttendeeCommandHandler : ICommandHandler<Rem...
    method RemoveMeetingAttendeeCommandHandler (line 12) | internal RemoveMeetingAttendeeCommandHandler(IMeetingRepository meetin...
    method Handle (line 18) | public async Task Handle(RemoveMeetingAttendeeCommand request, Cancell...

FILE: src/Modules/Meetings/Application/Meetings/SendMeetingAttendeeAddedEmail/MeetingAttendeeAddedNotification.cs
  class MeetingAttendeeAddedNotification (line 7) | public class MeetingAttendeeAddedNotification : DomainNotificationBase<M...
    method MeetingAttendeeAddedNotification (line 9) | [JsonConstructor]

FILE: src/Modules/Meetings/Application/Meetings/SendMeetingAttendeeAddedEmail/MeetingAttendeeAddedNotificationHandler.cs
  class MeetingAttendeeAddedNotificationHandler (line 6) | internal class MeetingAttendeeAddedNotificationHandler : INotificationHa...
    method MeetingAttendeeAddedNotificationHandler (line 10) | internal MeetingAttendeeAddedNotificationHandler(ICommandsScheduler co...
    method Handle (line 15) | public async Task Handle(MeetingAttendeeAddedNotification notification...

FILE: src/Modules/Meetings/Application/Meetings/SendMeetingAttendeeAddedEmail/MeetingAttendeeAddedPublishEventNotificationHandler.cs
  class MeetingAttendeeAddedPublishEventNotificationHandler (line 7) | internal class MeetingAttendeeAddedPublishEventNotificationHandler : INo...
    method MeetingAttendeeAddedPublishEventNotificationHandler (line 11) | internal MeetingAttendeeAddedPublishEventNotificationHandler(IEventsBu...
    method Handle (line 16) | public async Task Handle(MeetingAttendeeAddedNotification notification...

FILE: src/Modules/Meetings/Application/Meetings/SendMeetingAttendeeAddedEmail/SendMeetingAttendeeAddedEmailCommand.cs
  class SendMeetingAttendeeAddedEmailCommand (line 8) | internal class SendMeetingAttendeeAddedEmailCommand : InternalCommandBase
    method SendMeetingAttendeeAddedEmailCommand (line 14) | [JsonConstructor]

FILE: src/Modules/Meetings/Application/Meetings/SendMeetingAttendeeAddedEmail/SendMeetingAttendeeAddedEmailCommandHandler.cs
  class SendMeetingAttendeeAddedEmailCommandHandler (line 8) | internal class SendMeetingAttendeeAddedEmailCommandHandler : ICommandHan...
    method SendMeetingAttendeeAddedEmailCommandHandler (line 13) | internal SendMeetingAttendeeAddedEmailCommandHandler(
    method Handle (line 21) | public async Task Handle(SendMeetingAttendeeAddedEmailCommand request,...

FILE: src/Modules/Meetings/Application/Meetings/SetMeetingAttendeeRole/SetMeetingAttendeeRoleCommand.cs
  class SetMeetingAttendeeRoleCommand (line 5) | public class SetMeetingAttendeeRoleCommand : CommandBase
    method SetMeetingAttendeeRoleCommand (line 11) | public SetMeetingAttendeeRoleCommand(Guid memberId, Guid meetingId)

FILE: src/Modules/Meetings/Application/Meetings/SetMeetingAttendeeRole/SetMeetingAttendeeRoleCommandHandler.cs
  class SetMeetingAttendeeRoleCommandHandler (line 8) | internal class SetMeetingAttendeeRoleCommandHandler : ICommandHandler<Se...
    method SetMeetingAttendeeRoleCommandHandler (line 14) | internal SetMeetingAttendeeRoleCommandHandler(
    method Handle (line 24) | public async Task Handle(SetMeetingAttendeeRoleCommand request, Cancel...

FILE: src/Modules/Meetings/Application/Meetings/SetMeetingHostRole/SetMeetingHostRoleCommand.cs
  class SetMeetingHostRoleCommand (line 5) | public class SetMeetingHostRoleCommand : CommandBase
    method SetMeetingHostRoleCommand (line 11) | public SetMeetingHostRoleCommand(Guid memberId, Guid meetingId)

FILE: src/Modules/Meetings/Application/Meetings/SetMeetingHostRole/SetMeetingHostRoleCommandHandler.cs
  class SetMeetingHostRoleCommandHandler (line 8) | internal class SetMeetingHostRoleCommandHandler : ICommandHandler<SetMee...
    method SetMeetingHostRoleCommandHandler (line 14) | internal SetMeetingHostRoleCommandHandler(
    method Handle (line 24) | public async Task Handle(SetMeetingHostRoleCommand request, Cancellati...

FILE: src/Modules/Meetings/Application/Meetings/SignOffMemberFromWaitlist/SignOffMemberFromWaitlistCommand.cs
  class SignOffMemberFromWaitlistCommand (line 5) | public class SignOffMemberFromWaitlistCommand : CommandBase
    method SignOffMemberFromWaitlistCommand (line 9) | public SignOffMemberFromWaitlistCommand(Guid meetingId)

FILE: src/Modules/Meetings/Application/Meetings/SignOffMemberFromWaitlist/SignOffMemberFromWaitlistCommandHandler.cs
  class SignOffMemberFromWaitlistCommandHandler (line 7) | internal class SignOffMemberFromWaitlistCommandHandler : ICommandHandler...
    method SignOffMemberFromWaitlistCommandHandler (line 12) | public SignOffMemberFromWaitlistCommandHandler(IMemberContext memberCo...
    method Handle (line 18) | public async Task Handle(SignOffMemberFromWaitlistCommand request, Can...

FILE: src/Modules/Meetings/Application/Meetings/SignUpMemberToWaitlist/SignUpMemberToWaitlistCommand.cs
  class SignUpMemberToWaitlistCommand (line 5) | public class SignUpMemberToWaitlistCommand : CommandBase
    method SignUpMemberToWaitlistCommand (line 9) | public SignUpMemberToWaitlistCommand(Guid meetingId)

FILE: src/Modules/Meetings/Application/Meetings/SignUpMemberToWaitlist/SignUpMemberToWaitlistCommandHandler.cs
  class SignUpMemberToWaitlistCommandHandler (line 8) | internal class SignUpMemberToWaitlistCommandHandler : ICommandHandler<Si...
    method SignUpMemberToWaitlistCommandHandler (line 14) | public SignUpMemberToWaitlistCommandHandler(
    method Handle (line 24) | public async Task Handle(SignUpMemberToWaitlistCommand request, Cancel...

FILE: src/Modules/Meetings/Application/MemberSubscriptions/ChangeSubscriptionExpirationDateForMember/ChangeSubscriptionExpirationDateForMemberCommand.cs
  class ChangeSubscriptionExpirationDateForMemberCommand (line 7) | public class ChangeSubscriptionExpirationDateForMemberCommand : Internal...
    method ChangeSubscriptionExpirationDateForMemberCommand (line 9) | [JsonConstructor]

FILE: src/Modules/Meetings/Application/MemberSubscriptions/ChangeSubscriptionExpirationDateForMember/ChangeSubscriptionExpirationDateForMemberCommandHandler.cs
  class ChangeSubscriptionExpirationDateForMemberCommandHandler (line 6) | internal class ChangeSubscriptionExpirationDateForMemberCommandHandler :...
    method ChangeSubscriptionExpirationDateForMemberCommandHandler (line 10) | public ChangeSubscriptionExpirationDateForMemberCommandHandler(IMember...
    method Handle (line 15) | public async Task Handle(ChangeSubscriptionExpirationDateForMemberComm...

FILE: src/Modules/Meetings/Application/MemberSubscriptions/MemberSubscriptionExpirationDateChangedNotification.cs
  class MemberSubscriptionExpirationDateChangedNotification (line 7) | public class MemberSubscriptionExpirationDateChangedNotification : Domai...
    method MemberSubscriptionExpirationDateChangedNotification (line 9) | [JsonConstructor]

FILE: src/Modules/Meetings/Application/MemberSubscriptions/MemberSubscriptionExpirationDateChangedNotificationHandler.cs
  class MemberSubscriptionExpirationDateChangedNotificationHandler (line 11) | public class MemberSubscriptionExpirationDateChangedNotificationHandler :
    method MemberSubscriptionExpirationDateChangedNotificationHandler (line 18) | public MemberSubscriptionExpirationDateChangedNotificationHandler(ISql...
    method Handle (line 24) | public async Task Handle(MemberSubscriptionExpirationDateChangedNotifi...
    class MeetingGroupMemberResponse (line 64) | private class MeetingGroupMemberResponse

FILE: src/Modules/Meetings/Application/MemberSubscriptions/SubscriptionExpirationDateChangedIntegrationEventHandler.cs
  class SubscriptionExpirationDateChangedIntegrationEventHandler (line 9) | public class SubscriptionExpirationDateChangedIntegrationEventHandler : ...
    method SubscriptionExpirationDateChangedIntegrationEventHandler (line 13) | public SubscriptionExpirationDateChangedIntegrationEventHandler(IComma...
    method Handle (line 18) | public async Task Handle(SubscriptionExpirationDateChangedIntegrationE...

FILE: src/Modules/Meetings/Application/Members/CreateMember/CreateMemberCommand.cs
  class CreateMemberCommand (line 6) | public class CreateMemberCommand : InternalCommandBase
    method CreateMemberCommand (line 8) | [JsonConstructor]

FILE: src/Modules/Meetings/Application/Members/CreateMember/CreateMemberCommandHandler.cs
  class CreateMemberCommandHandler (line 6) | internal class CreateMemberCommandHandler : ICommandHandler<CreateMember...
    method CreateMemberCommandHandler (line 10) | public CreateMemberCommandHandler(IMemberRepository memberRepository)
    method Handle (line 15) | public async Task Handle(CreateMemberCommand request, CancellationToke...

FILE: src/Modules/Meetings/Application/Members/CreateMember/MemberCratedNotificationHandler.cs
  class MemberCratedNotificationHandler (line 5) | public class MemberCratedNotificationHandler : INotificationHandler<Memb...
    method Handle (line 7) | public Task Handle(MemberCreatedNotification notification, Cancellatio...

FILE: src/Modules/Meetings/Application/Members/CreateMember/MemberCreatedNotification.cs
  class MemberCreatedNotification (line 7) | public class MemberCreatedNotification : DomainNotificationBase<MeetingC...
    method MemberCreatedNotification (line 9) | [JsonConstructor]

FILE: src/Modules/Meetings/Application/Members/CreateMember/NewUserRegisteredIntegrationEventHandler.cs
  class NewUserRegisteredIntegrationEventHandler (line 7) | public class NewUserRegisteredIntegrationEventHandler : INotificationHan...
    method NewUserRegisteredIntegrationEventHandler (line 11) | public NewUserRegisteredIntegrationEventHandler(ICommandsScheduler com...
    method Handle (line 16) | public async Task Handle(NewUserRegisteredIntegrationEvent notificatio...

FILE: src/Modules/Meetings/Application/Members/MemberContext.cs
  class MemberContext (line 6) | public class MemberContext : IMemberContext
    method MemberContext (line 10) | public MemberContext(IExecutionContextAccessor executionContextAccessor)

FILE: src/Modules/Meetings/Application/Members/MemberDto.cs
  class MemberDto (line 3) | public class MemberDto

FILE: src/Modules/Meetings/Application/Members/MembersQueryHelper.cs
  class MembersQueryHelper (line 9) | public class MembersQueryHelper
    method GetMember (line 11) | public static async Task<MemberDto> GetMember(MemberId memberId, IDbCo...
    method GetMeetingGroupMember (line 30) | public static async Task<MeetingGroupMemberData> GetMeetingGroupMember...
    class MeetingGroupMemberResponse (line 55) | private class MeetingGroupMemberResponse

FILE: src/Modules/Meetings/Domain/MeetingCommentingConfigurations/Events/MeetingCommentingConfigurationCreatedDomainEvent.cs
  class MeetingCommentingConfigurationCreatedDomainEvent (line 6) | public class MeetingCommentingConfigurationCreatedDomainEvent : DomainEv...
    method MeetingCommentingConfigurationCreatedDomainEvent (line 12) | public MeetingCommentingConfigurationCreatedDomainEvent(MeetingId meet...

FILE: src/Modules/Meetings/Domain/MeetingCommentingConfigurations/Events/MeetingCommentingDisabledDomainEvent.cs
  class MeetingCommentingDisabledDomainEvent (line 6) | public class MeetingCommentingDisabledDomainEvent : DomainEventBase
    method MeetingCommentingDisabledDomainEvent (line 10) | public MeetingCommentingDisabledDomainEvent(MeetingId meetingId)

FILE: src/Modules/Meetings/Domain/MeetingCommentingConfigurations/Events/MeetingCommentingEnabledDomainEvent.cs
  class MeetingCommentingEnabledDomainEvent (line 6) | public class MeetingCommentingEnabledDomainEvent : DomainEventBase
    method MeetingCommentingEnabledDomainEvent (line 10) | public MeetingCommentingEnabledDomainEvent(MeetingId meetingId)

FILE: src/Modules/Meetings/Domain/MeetingCommentingConfigurations/IMeetingCommentingConfigurationRepository.cs
  type IMeetingCommentingConfigurationRepository (line 5) | public interface IMeetingCommentingConfigurationRepository
    method AddAsync (line 7) | Task AddAsync(MeetingCommentingConfiguration meetingCommentingConfigur...
    method GetByMeetingIdAsync (line 9) | Task<MeetingCommentingConfiguration> GetByMeetingIdAsync(MeetingId mee...

FILE: src/Modules/Meetings/Domain/MeetingCommentingConfigurations/MeetingCommentingConfiguration.cs
  class MeetingCommentingConfiguration (line 10) | public class MeetingCommentingConfiguration : Entity, IAggregateRoot
    method MeetingCommentingConfiguration (line 18) | private MeetingCommentingConfiguration(MeetingId meetingId)
    method MeetingCommentingConfiguration (line 27) | private MeetingCommentingConfiguration()
    method EnableCommenting (line 32) | public void EnableCommenting(MemberId enablingMemberId, MeetingGroup m...
    method DisableCommenting (line 43) | public void DisableCommenting(MemberId disablingMemberId, MeetingGroup...
    method GetIsCommentingEnabled (line 54) | public bool GetIsCommentingEnabled() => _isCommentingEnabled;
    method Create (line 56) | internal static MeetingCommentingConfiguration Create(MeetingId meetin...

FILE: src/Modules/Meetings/Domain/MeetingCommentingConfigurations/MeetingCommentingConfigurationId.cs
  class MeetingCommentingConfigurationId (line 5) | public class MeetingCommentingConfigurationId : TypedIdValueBase
    method MeetingCommentingConfigurationId (line 7) | public MeetingCommentingConfigurationId(Guid value)

FILE: src/Modules/Meetings/Domain/MeetingCommentingConfigurations/Rules/MeetingCommentingCanBeDisabledOnlyByGroupOrganizerRule.cs
  class MeetingCommentingCanBeDisabledOnlyByGroupOrganizerRule (line 7) | public class MeetingCommentingCanBeDisabledOnlyByGroupOrganizerRule : IB...
    method MeetingCommentingCanBeDisabledOnlyByGroupOrganizerRule (line 12) | public MeetingCommentingCanBeDisabledOnlyByGroupOrganizerRule(MemberId...
    method IsBroken (line 18) | public bool IsBroken() => !_meetingGroup.IsOrganizer(_disablingMemberId);

FILE: src/Modules/Meetings/Domain/MeetingCommentingConfigurations/Rules/MeetingCommentingCanBeEnabledOnlyByGroupOrganizerRule.cs
  class MeetingCommentingCanBeEnabledOnlyByGroupOrganizerRule (line 7) | public class MeetingCommentingCanBeEnabledOnlyByGroupOrganizerRule : IBu...
    method MeetingCommentingCanBeEnabledOnlyByGroupOrganizerRule (line 12) | public MeetingCommentingCanBeEnabledOnlyByGroupOrganizerRule(MemberId ...
    method IsBroken (line 18) | public bool IsBroken() => !_meetingGroup.IsOrganizer(_enablingMemberId);

FILE: src/Modules/Meetings/Domain/MeetingComments/Events/MeetingCommentAddedDomainEvent.cs
  class MeetingCommentAddedDomainEvent (line 6) | public class MeetingCommentAddedDomainEvent : DomainEventBase
    method MeetingCommentAddedDomainEvent (line 14) | public MeetingCommentAddedDomainEvent(MeetingCommentId meetingCommentI...

FILE: src/Modules/Meetings/Domain/MeetingComments/Events/MeetingCommentEditedDomainEvent.cs
  class MeetingCommentEditedDomainEvent (line 5) | public class MeetingCommentEditedDomainEvent : DomainEventBase
    method MeetingCommentEditedDomainEvent (line 11) | public MeetingCommentEditedDomainEvent(MeetingCommentId meetingComment...

FILE: src/Modules/Meetings/Domain/MeetingComments/Events/MeetingCommentRemovedDomainEvent.cs
  class MeetingCommentRemovedDomainEvent (line 5) | public class MeetingCommentRemovedDomainEvent : DomainEventBase
    method MeetingCommentRemovedDomainEvent (line 9) | public MeetingCommentRemovedDomainEvent(MeetingCommentId meetingCommen...

FILE: src/Modules/Meetings/Domain/MeetingComments/Events/ReplyToMeetingCommentAddedDomainEvent.cs
  class ReplyToMeetingCommentAddedDomainEvent (line 5) | public class ReplyToMeetingCommentAddedDomainEvent : DomainEventBase
    method ReplyToMeetingCommentAddedDomainEvent (line 13) | public ReplyToMeetingCommentAddedDomainEvent(MeetingCommentId meetingC...

FILE: src/Modules/Meetings/Domain/MeetingComments/IMeetingCommentRepository.cs
  type IMeetingCommentRepository (line 3) | public interface IMeetingCommentRepository
    method AddAsync (line 5) | Task AddAsync(MeetingComment meetingComment);
    method GetByIdAsync (line 7) | Task<MeetingComment> GetByIdAsync(MeetingCommentId meetingCommentId);

FILE: src/Modules/Meetings/Domain/MeetingComments/MeetingComment.cs
  class MeetingComment (line 14) | public class MeetingComment : Entity, IAggregateRoot
    method MeetingComment (line 36) | private MeetingComment(
    method MeetingComment (line 72) | private MeetingComment()
    method Edit (line 78) | public void Edit(MemberId editorId, string editedComment, MeetingComme...
    method Remove (line 90) | public void Remove(MemberId removingMemberId, MeetingGroup meetingGrou...
    method Reply (line 101) | public MeetingComment Reply(MemberId replierId, string reply, MeetingG...
    method Like (line 110) | public MeetingMemberCommentLike Like(
    method GetMeetingId (line 121) | public MeetingId GetMeetingId() => this._meetingId;
    method Create (line 123) | internal static MeetingComment Create(

FILE: src/Modules/Meetings/Domain/MeetingComments/MeetingCommentId.cs
  class MeetingCommentId (line 5) | public class MeetingCommentId : TypedIdValueBase
    method MeetingCommentId (line 7) | public MeetingCommentId(Guid value)

FILE: src/Modules/Meetings/Domain/MeetingComments/Rules/CommentCanBeAddedOnlyByMeetingGroupMemberRule.cs
  class CommentCanBeAddedOnlyByMeetingGroupMemberRule (line 7) | public class CommentCanBeAddedOnlyByMeetingGroupMemberRule : IBusinessRule
    method CommentCanBeAddedOnlyByMeetingGroupMemberRule (line 12) | public CommentCanBeAddedOnlyByMeetingGroupMemberRule(MemberId authorId...
    method IsBroken (line 18) | public bool IsBroken() => !_meetingGroup.IsMemberOfGroup(_authorId);

FILE: src/Modules/Meetings/Domain/MeetingComments/Rules/CommentCanBeCreatedOnlyIfCommentingForMeetingEnabledRule.cs
  class CommentCanBeCreatedOnlyIfCommentingForMeetingEnabledRule (line 6) | public class CommentCanBeCreatedOnlyIfCommentingForMeetingEnabledRule : ...
    method CommentCanBeCreatedOnlyIfCommentingForMeetingEnabledRule (line 10) | public CommentCanBeCreatedOnlyIfCommentingForMeetingEnabledRule(Meetin...
    method IsBroken (line 15) | public bool IsBroken() => !_meetingCommentingConfiguration.GetIsCommen...

FILE: src/Modules/Meetings/Domain/MeetingComments/Rules/CommentCanBeEditedOnlyIfCommentingForMeetingEnabledRule.cs
  class CommentCanBeEditedOnlyIfCommentingForMeetingEnabledRule (line 6) | public class CommentCanBeEditedOnlyIfCommentingForMeetingEnabledRule : I...
    method CommentCanBeEditedOnlyIfCommentingForMeetingEnabledRule (line 10) | public CommentCanBeEditedOnlyIfCommentingForMeetingEnabledRule(Meeting...
    method IsBroken (line 15) | public bool IsBroken() => !_meetingCommentingConfiguration.GetIsCommen...

FILE: src/Modules/Meetings/Domain/MeetingComments/Rules/CommentCanBeLikedOnlyByMeetingGroupMemberRule.cs
  class CommentCanBeLikedOnlyByMeetingGroupMemberRule (line 6) | public class CommentCanBeLikedOnlyByMeetingGroupMemberRule : IBusinessRule
    method CommentCanBeLikedOnlyByMeetingGroupMemberRule (line 11) | public CommentCanBeLikedOnlyByMeetingGroupMemberRule(MeetingGroupMembe...
    method IsBroken (line 16) | public bool IsBroken() => _likerMeetingGroupMember == null;

FILE: src/Modules/Meetings/Domain/MeetingComments/Rules/CommentCannotBeLikedByTheSameMemberMoreThanOnceRule.cs
  class CommentCannotBeLikedByTheSameMemberMoreThanOnceRule (line 5) | public class CommentCannotBeLikedByTheSameMemberMoreThanOnceRule : IBusi...
    method CommentCannotBeLikedByTheSameMemberMoreThanOnceRule (line 9) | public CommentCannotBeLikedByTheSameMemberMoreThanOnceRule(int memberC...
    method IsBroken (line 14) | public bool IsBroken() => _memberCommentLikesCount > 0;

FILE: src/Modules/Meetings/Domain/MeetingComments/Rules/CommentTextMustBeProvidedRule.cs
  class CommentTextMustBeProvidedRule (line 5) | public class CommentTextMustBeProvidedRule : IBusinessRule
    method CommentTextMustBeProvidedRule (line 9) | public CommentTextMustBeProvidedRule(string comment)
    method IsBroken (line 14) | public bool IsBroken() => string.IsNullOrEmpty(_comment);

FILE: src/Modules/Meetings/Domain/MeetingComments/Rules/MeetingCommentCanBeEditedOnlyByAuthorRule.cs
  class MeetingCommentCanBeEditedOnlyByAuthorRule (line 6) | public class MeetingCommentCanBeEditedOnlyByAuthorRule : IBusinessRule
    method MeetingCommentCanBeEditedOnlyByAuthorRule (line 11) | public MeetingCommentCanBeEditedOnlyByAuthorRule(MemberId authorId, Me...
    method IsBroken (line 17) | public bool IsBroken() => _editorId != _authorId;

FILE: src/Modules/Meetings/Domain/MeetingComments/Rules/MeetingCommentCanBeRemovedOnlyByAuthorOrGroupOrganizerRule.cs
  class MeetingCommentCanBeRemovedOnlyByAuthorOrGroupOrganizerRule (line 7) | public class MeetingCommentCanBeRemovedOnlyByAuthorOrGroupOrganizerRule ...
    method MeetingCommentCanBeRemovedOnlyByAuthorOrGroupOrganizerRule (line 13) | public MeetingCommentCanBeRemovedOnlyByAuthorOrGroupOrganizerRule(Meet...
    method IsBroken (line 20) | public bool IsBroken() => _removingMemberId != _authorId && !_meetingG...

FILE: src/Modules/Meetings/Domain/MeetingComments/Rules/RemovingReasonCanBeProvidedOnlyByGroupOrganizerRule.cs
  class RemovingReasonCanBeProvidedOnlyByGroupOrganizerRule (line 7) | public class RemovingReasonCanBeProvidedOnlyByGroupOrganizerRule : IBusi...
    method RemovingReasonCanBeProvidedOnlyByGroupOrganizerRule (line 13) | public RemovingReasonCanBeProvidedOnlyByGroupOrganizerRule(MeetingGrou...
    method IsBroken (line 20) | public bool IsBroken() =>

FILE: src/Modules/Meetings/Domain/MeetingGroupProposals/Events/MeetingGroupProposalAcceptedDomainEvent.cs
  class MeetingGroupProposalAcceptedDomainEvent (line 5) | public class MeetingGroupProposalAcceptedDomainEvent : DomainEventBase
    method MeetingGroupProposalAcceptedDomainEvent (line 9) | public MeetingGroupProposalAcceptedDomainEvent(MeetingGroupProposalId ...

FILE: src/Modules/Meetings/Domain/MeetingGroupProposals/Events/MeetingGroupProposedDomainEvent.cs
  class MeetingGroupProposedDomainEvent (line 6) | public class MeetingGroupProposedDomainEvent : DomainEventBase
    method MeetingGroupProposedDomainEvent (line 8) | public MeetingGroupProposedDomainEvent(

FILE: src/Modules/Meetings/Domain/MeetingGroupProposals/IMeetingGroupProposalRepository.cs
  type IMeetingGroupProposalRepository (line 3) | public interface IMeetingGroupProposalRepository
    method AddAsync (line 5) | Task AddAsync(MeetingGroupProposal meetingGroupProposal);
    method GetByIdAsync (line 7) | Task<MeetingGroupProposal> GetByIdAsync(MeetingGroupProposalId meeting...

FILE: src/Modules/Meetings/Domain/MeetingGroupProposals/MeetingGroupProposal.cs
  class MeetingGroupProposal (line 10) | public class MeetingGroupProposal : Entity, IAggregateRoot
    method CreateMeetingGroup (line 26) | public MeetingGroup CreateMeetingGroup()
    method MeetingGroupProposal (line 31) | private MeetingGroupProposal()
    method MeetingGroupProposal (line 36) | private MeetingGroupProposal(
    method ProposeNew (line 53) | public static MeetingGroupProposal ProposeNew(
    method Accept (line 62) | public void Accept()

FILE: src/Modules/Meetings/Domain/MeetingGroupProposals/MeetingGroupProposalId.cs
  class MeetingGroupProposalId (line 5) | public class MeetingGroupProposalId : TypedIdValueBase
    method MeetingGroupProposalId (line 7) | public MeetingGroupProposalId(Guid value)

FILE: src/Modules/Meetings/Domain/MeetingGroupProposals/MeetingGroupProposalStatus.cs
  class MeetingGroupProposalStatus (line 5) | public class MeetingGroupProposalStatus : ValueObject
    method MeetingGroupProposalStatus (line 15) | private MeetingGroupProposalStatus(string value)

FILE: src/Modules/Meetings/Domain/MeetingGroupProposals/Rules/MeetingGroupProposalCannotBeAcceptedMoreThanOnceRule.cs
  class MeetingGroupProposalCannotBeAcceptedMoreThanOnceRule (line 5) | public class MeetingGroupProposalCannotBeAcceptedMoreThanOnceRule : IBus...
    method MeetingGroupProposalCannotBeAcceptedMoreThanOnceRule (line 9) | internal MeetingGroupProposalCannotBeAcceptedMoreThanOnceRule(MeetingG...
    method IsBroken (line 14) | public bool IsBroken() => _actualStatus.IsAccepted;

FILE: src/Modules/Meetings/Domain/MeetingGroups/Events/MeetingAttendeeChangedDecisionDomainEvent.cs
  class MeetingAttendeeChangedDecisionDomainEvent (line 7) | public class MeetingAttendeeChangedDecisionDomainEvent : DomainEventBase
    method MeetingAttendeeChangedDecisionDomainEvent (line 9) | public MeetingAttendeeChangedDecisionDomainEvent(MemberId memberId, Me...

FILE: src/Modules/Meetings/Domain/MeetingGroups/Events/MeetingGroupCreatedDomainEvent.cs
  class MeetingGroupCreatedDomainEvent (line 6) | public class MeetingGroupCreatedDomainEvent : DomainEventBase
    method MeetingGroupCreatedDomainEvent (line 12) | public MeetingGroupCreatedDomainEvent(MeetingGroupId meetingGroupId, M...

FILE: src/Modules/Meetings/Domain/MeetingGroups/Events/MeetingGroupGeneralAttributesEditedDomainEvent.cs
  class MeetingGroupGeneralAttributesEditedDomainEvent (line 5) | public class MeetingGroupGeneralAttributesEditedDomainEvent : DomainEven...
    method MeetingGroupGeneralAttributesEditedDomainEvent (line 13) | public MeetingGroupGeneralAttributesEditedDomainEvent(string newName, ...

FILE: src/Modules/Meetings/Domain/MeetingGroups/Events/MeetingGroupMemberLeftGroupDomainEvent.cs
  class MeetingGroupMemberLeftGroupDomainEvent (line 6) | public class MeetingGroupMemberLeftGroupDomainEvent : DomainEventBase
    method MeetingGroupMemberLeftGroupDomainEvent (line 8) | public MeetingGroupMemberLeftGroupDomainEvent(MeetingGroupId meetingGr...

FILE: src/Modules/Meetings/Domain/MeetingGroups/Events/MeetingGroupPaymentInfoUpdatedDomainEvent.cs
  class MeetingGroupPaymentInfoUpdatedDomainEvent (line 5) | public class MeetingGroupPaymentInfoUpdatedDomainEvent : DomainEventBase
    method MeetingGroupPaymentInfoUpdatedDomainEvent (line 7) | public MeetingGroupPaymentInfoUpdatedDomainEvent(MeetingGroupId meetin...

FILE: src/Modules/Meetings/Domain/MeetingGroups/Events/MeetingNotAttendeeChangedDecisionDomainEvent.cs
  class MeetingNotAttendeeChangedDecisionDomainEvent (line 7) | public class MeetingNotAttendeeChangedDecisionDomainEvent : DomainEventBase
    method MeetingNotAttendeeChangedDecisionDomainEvent (line 9) | public MeetingNotAttendeeChangedDecisionDomainEvent(MemberId memberId,...

FILE: src/Modules/Meetings/Domain/MeetingGroups/Events/NewMeetingGroupMemberJoinedDomainEvent.cs
  class NewMeetingGroupMemberJoinedDomainEvent (line 6) | public class NewMeetingGroupMemberJoinedDomainEvent : DomainEventBase
    method NewMeetingGroupMemberJoinedDomainEvent (line 14) | public NewMeetingGroupMemberJoinedDomainEvent(MeetingGroupId meetingGr...

FILE: src/Modules/Meetings/Domain/MeetingGroups/IMeetingGroupRepository.cs
  type IMeetingGroupRepository (line 3) | public interface IMeetingGroupRepository
    method AddAsync (line 5) | Task AddAsync(MeetingGroup meetingGroup);
    method Commit (line 7) | Task<int> Commit();
    method GetByIdAsync (line 9) | Task<MeetingGroup> GetByIdAsync(MeetingGroupId id);

FILE: src/Modules/Meetings/Domain/MeetingGroups/MeetingGroup.cs
  class MeetingGroup (line 11) | public class MeetingGroup : Entity, IAggregateRoot
    method CreateBasedOnProposal (line 29) | internal static MeetingGroup CreateBasedOnProposal(
    method MeetingGroup (line 39) | private MeetingGroup()
    method MeetingGroup (line 44) | private MeetingGroup(MeetingGroupProposalId meetingGroupProposalId, st...
    method EditGeneralAttributes (line 58) | public void EditGeneralAttributes(string name, string description, Mee...
    method JoinToGroupMember (line 67) | public void JoinToGroupMember(MemberId memberId)
    method LeaveGroup (line 74) | public void LeaveGroup(MemberId memberId)
    method SetExpirationDate (line 83) | public void SetExpirationDate(DateTime dateTo)
    method CreateMeeting (line 90) | public Meeting CreateMeeting(
    method IsMemberOfGroup (line 119) | internal bool IsMemberOfGroup(MemberId attendeeId)
    method IsOrganizer (line 124) | internal bool IsOrganizer(MemberId memberId)

FILE: src/Modules/Meetings/Domain/MeetingGroups/MeetingGroupId.cs
  class MeetingGroupId (line 5) | public class MeetingGroupId : TypedIdValueBase
    method MeetingGroupId (line 7) | public MeetingGroupId(Guid value)

FILE: src/Modules/Meetings/Domain/MeetingGroups/MeetingGroupLocation.cs
  class MeetingGroupLocation (line 5) | public class MeetingGroupLocation : ValueObject
    method CreateNew (line 7) | public static MeetingGroupLocation CreateNew(string city, string count...
    method MeetingGroupLocation (line 16) | private MeetingGroupLocation(string city, string countryCode)

FILE: src/Modules/Meetings/Domain/MeetingGroups/MeetingGroupMember.cs
  class MeetingGroupMember (line 8) | public class MeetingGroupMember : Entity
    method MeetingGroupMember (line 22) | private MeetingGroupMember()
    method MeetingGroupMember (line 27) | private MeetingGroupMember(
    method CreateNew (line 41) | internal static MeetingGroupMember CreateNew(
    method Leave (line 49) | internal void Leave()
    method IsMember (line 57) | internal bool IsMember(MemberId memberId)
    method IsOrganizer (line 62) | internal bool IsOrganizer(MemberId memberId)

FILE: src/Modules/Meetings/Domain/MeetingGroups/MeetingGroupMemberRole.cs
  class MeetingGroupMemberRole (line 5) | public class MeetingGroupMemberRole : ValueObject
    method MeetingGroupMemberRole (line 13) | private MeetingGroupMemberRole(string value)
    method Of (line 18) | public static MeetingGroupMemberRole Of(string roleCode)

FILE: src/Modules/Meetings/Domain/MeetingGroups/Policies/MeetingGroupExpirationDatePolicy.cs
  class MeetingGroupExpirationDatePolicy (line 3) | public static class MeetingGroupExpirationDatePolicy
    method GetMeetingGroupsCoveredByMemberSubscription (line 5) | public static List<MeetingGroupId> GetMeetingGroupsCoveredByMemberSubs...

FILE: src/Modules/Meetings/Domain/MeetingGroups/Policies/MeetingGroupMemberData.cs
  class MeetingGroupMemberData (line 3) | public class MeetingGroupMemberData
    method MeetingGroupMemberData (line 5) | public MeetingGroupMemberData(MeetingGroupId meetingGroupId, MeetingGr...

FILE: src/Modules/Meetings/Domain/MeetingGroups/Rules/MeetingCanBeOrganizedOnlyByPayedGroupRule.cs
  class MeetingCanBeOrganizedOnlyByPayedGroupRule (line 6) | public class MeetingCanBeOrganizedOnlyByPayedGroupRule : IBusinessRule
    method MeetingCanBeOrganizedOnlyByPayedGroupRule (line 10) | internal MeetingCanBeOrganizedOnlyByPayedGroupRule(DateTime? paymentDa...
    method IsBroken (line 15) | public bool IsBroken() => !_paymentDateTo.HasValue || _paymentDateTo <...

FILE: src/Modules/Meetings/Domain/MeetingGroups/Rules/MeetingGroupMemberCannotBeAddedTwiceRule.cs
  class MeetingGroupMemberCannotBeAddedTwiceRule (line 6) | public class MeetingGroupMemberCannotBeAddedTwiceRule : IBusinessRule
    method MeetingGroupMemberCannotBeAddedTwiceRule (line 12) | public MeetingGroupMemberCannotBeAddedTwiceRule(List<MeetingGroupMembe...
    method IsBroken (line 19) | public bool IsBroken() => this._members.SingleOrDefault(x => x.IsMembe...

FILE: src/Modules/Meetings/Domain/MeetingGroups/Rules/MeetingHostMustBeAMeetingGroupMemberRule.cs
  class MeetingHostMustBeAMeetingGroupMemberRule (line 6) | public class MeetingHostMustBeAMeetingGroupMemberRule : IBusinessRule
    method MeetingHostMustBeAMeetingGroupMemberRule (line 14) | public MeetingHostMustBeAMeetingGroupMemberRule(
    method IsBroken (line 24) | public bool IsBroken()

FILE: src/Modules/Meetings/Domain/MeetingGroups/Rules/NotActualGroupMemberCannotLeaveGroupRule.cs
  class NotActualGroupMemberCannotLeaveGroupRule (line 6) | public class NotActualGroupMemberCannotLeaveGroupRule : IBusinessRule
    method NotActualGroupMemberCannotLeaveGroupRule (line 12) | public NotActualGroupMemberCannotLeaveGroupRule(List<MeetingGroupMembe...
    method IsBroken (line 19) | public bool IsBroken() => this._members.SingleOrDefault(x => x.IsMembe...

FILE: src/Modules/Meetings/Domain/MeetingMemberCommentLikes/Events/MeetingCommentLikedDomainEvent.cs
  class MeetingCommentLikedDomainEvent (line 7) | public class MeetingCommentLikedDomainEvent : DomainEventBase
    method MeetingCommentLikedDomainEvent (line 13) | public MeetingCommentLikedDomainEvent(MeetingCommentId meetingCommentI...

FILE: src/Modules/Meetings/Domain/MeetingMemberCommentLikes/Events/MeetingCommentUnlikedDomainEvent.cs
  class MeetingCommentUnlikedDomainEvent (line 7) | public class MeetingCommentUnlikedDomainEvent : DomainEventBase
    method MeetingCommentUnlikedDomainEvent (line 13) | public MeetingCommentUnlikedDomainEvent(MeetingCommentId meetingCommen...

FILE: src/Modules/Meetings/Domain/MeetingMemberCommentLikes/IMeetingMemberCommentLikesRepository.cs
  type IMeetingMemberCommentLikesRepository (line 6) | public interface IMeetingMemberCommentLikesRepository
    method AddAsync (line 8) | Task AddAsync(MeetingMemberCommentLike meetingMemberCommentLike);
    method GetAsync (line 10) | Task<MeetingMemberCommentLike> GetAsync(MemberId memberId, MeetingComm...
    method CountMemberCommentLikesAsync (line 12) | Task<int> CountMemberCommentLikesAsync(MemberId memberId, MeetingComme...
    method Remove (line 14) | void Remove(MeetingMemberCommentLike meetingMemberCommentLike);

FILE: src/Modules/Meetings/Domain/MeetingMemberCommentLikes/MeetingMemberCommentLike.cs
  class MeetingMemberCommentLike (line 8) | public class MeetingMemberCommentLike : Entity, IAggregateRoot
    method MeetingMemberCommentLike (line 16) | private MeetingMemberCommentLike()
    method MeetingMemberCommentLike (line 21) | private MeetingMemberCommentLike(MeetingCommentId meetingCommentId, Me...
    method Remove (line 30) | public void Remove()
    method Create (line 35) | public static MeetingMemberCommentLike Create(MeetingCommentId meeting...

FILE: src/Modules/Meetings/Domain/MeetingMemberCommentLikes/MeetingMemberCommentLikeId.cs
  class MeetingMemberCommentLikeId (line 5) | public class MeetingMemberCommentLikeId : TypedIdValueBase
    method MeetingMemberCommentLikeId (line 7) | public MeetingMemberCommentLikeId(Guid value)

FILE: src/Modules/Meetings/Domain/Meetings/Events/MeetingAttendeeAddedDomainEvent.cs
  class MeetingAttendeeAddedDomainEvent (line 6) | public class MeetingAttendeeAddedDomainEvent : DomainEventBase
    method MeetingAttendeeAddedDomainEvent (line 8) | public MeetingAttendeeAddedDomainEvent(

FILE: src/Modules/Meetings/Domain/Meetings/Events/MeetingAttendeeFeePaidDomainEvent.cs
  class MeetingAttendeeFeePaidDomainEvent (line 6) | public class MeetingAttendeeFeePaidDomainEvent : DomainEventBase
    method MeetingAttendeeFeePaidDomainEvent (line 8) | public MeetingAttendeeFeePaidDomainEvent(MeetingId meetingId, MemberId...

FILE: src/Modules/Meetings/Domain/Meetings/Events/MeetingAttendeeRemovedDomainEvent.cs
  class MeetingAttendeeRemovedDomainEvent (line 6) | public class MeetingAttendeeRemovedDomainEvent : DomainEventBase
    method MeetingAttendeeRemovedDomainEvent (line 8) | public MeetingAttendeeRemovedDomainEvent(MemberId memberId, MeetingId ...

FILE: src/Modules/Meetings/Domain/Meetings/Events/MeetingCanceledDomainEvent.cs
  class MeetingCanceledDomainEvent (line 6) | public class MeetingCanceledDomainEvent : DomainEventBase
    method MeetingCanceledDomainEvent (line 8) | public MeetingCanceledDomainEvent(MeetingId meetingId, MemberId cancel...

FILE: src/Modules/Meetings/Domain/Meetings/Events/MeetingCreatedDomainEvent.cs
  class MeetingCreatedDomainEvent (line 5) | public class MeetingCreatedDomainEvent : DomainEventBase
    method MeetingCreatedDomainEvent (line 7) | public MeetingCreatedDomainEvent(MeetingId meetingId)

FILE: src/Modules/Meetings/Domain/Meetings/Events/MeetingEditedDomainEvent.cs
  class MeetingEditedDomainEvent (line 5) | public class MeetingEditedDomainEvent : DomainEventBase
    method MeetingEditedDomainEvent (line 7) | public MeetingEditedDomainEvent(Guid meetingId)

FILE: src/Modules/Meetings/Domain/Meetings/Events/MeetingMainAttributesChangedDomainEvent.cs
  class MeetingMainAttributesChangedDomainEvent (line 5) | public class MeetingMainAttributesChangedDomainEvent : DomainEventBase
    method MeetingMainAttributesChangedDomainEvent (line 7) | public MeetingMainAttributesChangedDomainEvent(MeetingId meetingId)

FILE: src/Modules/Meetings/Domain/Meetings/Events/MeetingNotAttendeeAddedDomainEvent.cs
  class MeetingNotAttendeeAddedDomainEvent (line 6) | public class MeetingNotAttendeeAddedDomainEvent : DomainEventBase
    method MeetingNotAttendeeAddedDomainEvent (line 12) | public MeetingNotAttendeeAddedDomainEvent(MeetingId meetingId, MemberI...

FILE: src/Modules/Meetings/Domain/Meetings/Events/MeetingWaitlistMemberAddedDomainEvent.cs
  class MeetingWaitlistMemberAddedDomainEvent (line 6) | public class MeetingWaitlistMemberAddedDomainEvent : DomainEventBase
    method MeetingWaitlistMemberAddedDomainEvent (line 8) | public MeetingWaitlistMemberAddedDomainEvent(MeetingId meetingId, Memb...

FILE: src/Modules/Meetings/Domain/Meetings/Events/MemberSetAsAttendeeDomainEvent.cs
  class MemberSetAsAttendeeDomainEvent (line 6) | public class MemberSetAsAttendeeDomainEvent : DomainEventBase
    method MemberSetAsAttendeeDomainEvent (line 8) | public MemberSetAsAttendeeDomainEvent(MeetingId meetingId, MemberId ho...

FILE: src/Modules/Meetings/Domain/Meetings/Events/MemberSignedOffFromMeetingWaitlistDomainEvent.cs
  class MemberSignedOffFromMeetingWaitlistDomainEvent (line 6) | public class MemberSignedOffFromMeetingWaitlistDomainEvent : DomainEvent...
    method MemberSignedOffFromMeetingWaitlistDomainEvent (line 8) | public MemberSignedOffFromMeetingWaitlistDomainEvent(MeetingId meeting...

FILE: src/Modules/Meetings/Domain/Meetings/Events/NewMeetingHostSetDomainEvent.cs
  class NewMeetingHostSetDomainEvent (line 6) | public class NewMeetingHostSetDomainEvent : DomainEventBase
    method NewMeetingHostSetDomainEvent (line 8) | public NewMeetingHostSetDomainEvent(MeetingId meetingId, MemberId hostId)

FILE: src/Modules/Meetings/Domain/Meetings/IMeetingRepository.cs
  type IMeetingRepository (line 3) | public interface IMeetingRepository
    method AddAsync (line 5) | Task AddAsync(Meeting meeting);
    method GetByIdAsync (line 7) | Task<Meeting> GetByIdAsync(MeetingId id);

FILE: src/Modules/Meetings/Domain/Meetings/Meeting.cs
  class Meeting (line 12) | public class Meeting : Entity, IAggregateRoot
    method Meeting (line 52) | private Meeting()
    method CreateNew (line 59) | internal static Meeting CreateNew(
    method Meeting (line 84) | private Meeting(
    method ChangeMainAttributes (line 128) | public void ChangeMainAttributes(
    method AddAttendee (line 156) | public void AddAttendee(MeetingGroup meetingGroup, MemberId attendeeId...
    method AddNotAttendee (line 182) | public void AddNotAttendee(MemberId memberId)
    method ChangeNotAttendeeDecision (line 211) | public void ChangeNotAttendeeDecision(MemberId memberId)
    method SignUpMemberToWaitlist (line 222) | public void SignUpMemberToWaitlist(MeetingGroup meetingGroup, MemberId...
    method SignOffMemberFromWaitlist (line 235) | public void SignOffMemberFromWaitlist(MemberId memberId)
    method SetHostRole (line 246) | public void SetHostRole(MeetingGroup meetingGroup, MemberId settingMem...
    method SetAttendeeRole (line 259) | public void SetAttendeeRole(MeetingGroup meetingGroup, MemberId settin...
    method GetMeetingGroupId (line 276) | public MeetingGroupId GetMeetingGroupId() => _meetingGroupId;
    method Cancel (line 278) | public void Cancel(MemberId cancelMemberId)
    method RemoveAttendee (line 292) | public void RemoveAttendee(MemberId attendeeId, MemberId removingPerso...
    method MarkAttendeeFeeAsPayed (line 302) | public void MarkAttendeeFeeAsPayed(MemberId memberId)
    method AddComment (line 309) | public MeetingComment AddComment(MemberId authorId, string comment, Me...
    method CreateCommentingConfiguration (line 317) | public MeetingCommentingConfiguration CreateCommentingConfiguration()
    method GetActiveMemberOnWaitlist (line 322) | private MeetingWaitlistMember GetActiveMemberOnWaitlist(MemberId membe...
    method GetActiveAttendee (line 327) | private MeetingAttendee GetActiveAttendee(MemberId attendeeId)
    method GetActiveNotAttendee (line 332) | private MeetingNotAttendee GetActiveNotAttendee(MemberId memberId)
    method GetAllActiveAttendeesWithGuestsNumber (line 337) | private int GetAllActiveAttendeesWithGuestsNumber()
    method SetRsvpTerm (line 342) | private void SetRsvpTerm(Term rsvpTerm, MeetingTerm meetingTerm)

FILE: src/Modules/Meetings/Domain/Meetings/MeetingAttendee.cs
  class MeetingAttendee (line 10) | public class MeetingAttendee : Entity
    method MeetingAttendee (line 40) | private MeetingAttendee()
    method CreateNew (line 44) | internal static MeetingAttendee CreateNew(
    method MeetingAttendee (line 55) | private MeetingAttendee(
    method ChangeDecision (line 90) | internal void ChangeDecision()
    method IsActiveAttendee (line 98) | internal bool IsActiveAttendee(MemberId attendeeId)
    method IsActive (line 103) | internal bool IsActive()
    method IsActiveHost (line 108) | internal bool IsActiveHost()
    method GetAttendeeWithGuestsNumber (line 113) | internal int GetAttendeeWithGuestsNumber()
    method SetAsHost (line 118) | internal void SetAsHost()
    method SetAsAttendee (line 125) | internal void SetAsAttendee()
    method Remove (line 133) | internal void Remove(MemberId removingMemberId, string reason)
    method MarkFeeAsPayed (line 145) | internal void MarkFeeAsPayed()

FILE: src/Modules/Meetings/Domain/Meetings/MeetingAttendeeRole.cs
  class MeetingAttendeeRole (line 5) | public class MeetingAttendeeRole : ValueObject
    method MeetingAttendeeRole (line 13) | private MeetingAttendeeRole(string value)

FILE: src/Modules/Meetings/Domain/Meetings/MeetingId.cs
  class MeetingId (line 5) | public class MeetingId : TypedIdValueBase
    method MeetingId (line 7) | public MeetingId(Guid value)

FILE: src/Modules/Meetings/Domain/Meetings/MeetingLimits.cs
  class MeetingLimits (line 6) | public class MeetingLimits : ValueObject
    method MeetingLimits (line 12) | private MeetingLimits(int? attendeesLimit, int guestsLimit)
    method Create (line 18) | public static MeetingLimits Create(int? attendeesLimit, int guestsLimit)

FILE: src/Modules/Meetings/Domain/Meetings/MeetingLocation.cs
  class MeetingLocation (line 5) | public class MeetingLocation : ValueObject
    method CreateNew (line 7) | public static MeetingLocation CreateNew(string name, string address, s...
    method MeetingLocation (line 12) | private MeetingLocation(string name, string address, string postalCode...

FILE: src/Modules/Meetings/Domain/Meetings/MeetingNotAttendee.cs
  class MeetingNotAttendee (line 9) | public class MeetingNotAttendee : Entity
    method MeetingNotAttendee (line 21) | private MeetingNotAttendee()
    method MeetingNotAttendee (line 25) | private MeetingNotAttendee(MeetingId meetingId, MemberId memberId)
    method CreateNew (line 34) | internal static MeetingNotAttendee CreateNew(MeetingId meetingId, Memb...
    method IsActiveNotAttendee (line 39) | internal bool IsActiveNotAttendee(MemberId memberId)
    method ChangeDecision (line 44) | internal void ChangeDecision()

FILE: src/Modules/Meetings/Domain/Meetings/MeetingTerm.cs
  class MeetingTerm (line 6) | public class MeetingTerm : ValueObject
    method CreateNewBetweenDates (line 12) | public static MeetingTerm CreateNewBetweenDates(DateTime startDate, Da...
    method MeetingTerm (line 17) | private MeetingTerm(DateTime startDate, DateTime endDate)
    method IsAfterStart (line 23) | internal bool IsAfterStart()

FILE: src/Modules/Meetings/Domain/Meetings/MeetingWaitlistMember.cs
  class MeetingWaitlistMember (line 8) | public class MeetingWaitlistMember : Entity
    method MeetingWaitlistMember (line 24) | private MeetingWaitlistMember()
    method MeetingWaitlistMember (line 28) | private MeetingWaitlistMember(MeetingId meetingId, MemberId memberId)
    method CreateNew (line 38) | internal static MeetingWaitlistMember CreateNew(MeetingId meetingId, M...
    method MarkIsMovedToAttendees (line 43) | internal void MarkIsMovedToAttendees()
    method IsActiveOnWaitList (line 49) | internal bool IsActiveOnWaitList(MemberId memberId)
    method IsActive (line 54) | internal bool IsActive()
    method SignOff (line 59) | internal void SignOff()

FILE: src/Modules/Meetings/Domain/Meetings/MoneyValue.cs
  class MoneyValue (line 5) | public class MoneyValue : ValueObject
    method Of (line 13) | public static MoneyValue Of(decimal value, string currency)
    method MoneyValue (line 18) | private MoneyValue(decimal? value, string currency)

FILE: src/Modules/Meetings/Domain/Meetings/Rules/AttendeeCanBeAddedOnlyInRsvpTermRule.cs
  class AttendeeCanBeAddedOnlyInRsvpTermRule (line 6) | public class AttendeeCanBeAddedOnlyInRsvpTermRule : IBusinessRule
    method AttendeeCanBeAddedOnlyInRsvpTermRule (line 10) | internal AttendeeCanBeAddedOnlyInRsvpTermRule(Term rsvpTerm)
    method IsBroken (line 15) | public bool IsBroken() => !_rsvpTerm.IsInTerm(SystemClock.Now);

FILE: src/Modules/Meetings/Domain/Meetings/Rules/AttendeesLimitCannotBeChangedToSmallerThanActiveAttendeesRule.cs
  class AttendeesLimitCannotBeChangedToSmallerThanActiveAttendeesRule (line 5) | internal class AttendeesLimitCannotBeChangedToSmallerThanActiveAttendees...
    method AttendeesLimitCannotBeChangedToSmallerThanActiveAttendeesRule (line 11) | internal AttendeesLimitCannotBeChangedToSmallerThanActiveAttendeesRule(
    method IsBroken (line 19) | public bool IsBroken() => _attendeesLimit.HasValue && _attendeesLimit....

FILE: src/Modules/Meetings/Domain/Meetings/Rules/MeetingAttendeeMustBeAMemberOfGroupRule.cs
  class MeetingAttendeeMustBeAMemberOfGroupRule (line 7) | public class MeetingAttendeeMustBeAMemberOfGroupRule : IBusinessRule
    method MeetingAttendeeMustBeAMemberOfGroupRule (line 13) | internal MeetingAttendeeMustBeAMemberOfGroupRule(MemberId attendeeId, ...
    method IsBroken (line 19) | public bool IsBroken()

FILE: src/Modules/Meetings/Domain/Meetings/Rules/MeetingAttendeesLimitCannotBeNegativeRule.cs
  class MeetingAttendeesLimitCannotBeNegativeRule (line 5) | public class MeetingAttendeesLimitCannotBeNegativeRule : IBusinessRule
    method MeetingAttendeesLimitCannotBeNegativeRule (line 9) | public MeetingAttendeesLimitCannotBeNegativeRule(int? attendeesLimit)
    method IsBroken (line 14) | public bool IsBroken() => _attendeesLimit.HasValue && _attendeesLimit....

FILE: src/Modules/Meetings/Domain/Meetings/Rules/MeetingAttendeesLimitMustBeGreaterThanGuestsLimitRule.cs
  class MeetingAttendeesLimitMustBeGreaterThanGuestsLimitRule (line 5) | public class MeetingAttendeesLimitMustBeGreaterThanGuestsLimitRule : IBu...
    method MeetingAttendeesLimitMustBeGreaterThanGuestsLimitRule (line 11) | public MeetingAttendeesLimitMustBeGreaterThanGuestsLimitRule(int? atte...
    method IsBroken (line 17) | public bool IsBroken() => _attendeesLimit.HasValue && _attendeesLimit....

FILE: src/Modules/Meetings/Domain/Meetings/Rules/MeetingAttendeesNumberIsAboveLimitRule.cs
  class MeetingAttendeesNumberIsAboveLimitRule (line 5) | public class MeetingAttendeesNumberIsAboveLimitRule : IBusinessRule
    method MeetingAttendeesNumberIsAboveLimitRule (line 13) | internal MeetingAttendeesNumberIsAboveLimitRule(
    method IsBroken (line 23) | public bool IsBroken() => this._attendeesLimit.HasValue &&

FILE: src/Modules/Meetings/Domain/Meetings/Rules/MeetingCannotBeChangedAfterStartRule.cs
  class MeetingCannotBeChangedAfterStartRule (line 5) | public class MeetingCannotBeChangedAfterStartRule : IBusinessRule
    method MeetingCannotBeChangedAfterStartRule (line 9) | public MeetingCannotBeChangedAfterStartRule(MeetingTerm meetingTerm)
    method IsBroken (line 14) | public bool IsBroken() => _meetingTerm.IsAfterStart();

FILE: src/Modules/Meetings/Domain/Meetings/Rules/MeetingGuestsLimitCannotBeNegativeRule.cs
  class MeetingGuestsLimitCannotBeNegativeRule (line 5) | public class MeetingGuestsLimitCannotBeNegativeRule : IBusinessRule
    method MeetingGuestsLimitCannotBeNegativeRule (line 9) | public MeetingGuestsLimitCannotBeNegativeRule(int guestsLimit)
    method IsBroken (line 14) | public bool IsBroken() => _guestsLimit < 0;

FILE: src/Modules/Meetings/Domain/Meetings/Rules/MeetingGuestsNumberIsAboveLimitRule.cs
  class MeetingGuestsNumberIsAboveLimitRule (line 5) | public class MeetingGuestsNumberIsAboveLimitRule : IBusinessRule
    method MeetingGuestsNumberIsAboveLimitRule (line 11) | public MeetingGuestsNumberIsAboveLimitRule(int guestsLimit, int guests...
    method IsBroken (line 17) | public bool IsBroken() => this._guestsLimit > 0 && this._guestsLimit <...

FILE: src/Modules/Meetings/Domain/Meetings/Rules/MeetingMustHaveAtLeastOneHostRule.cs
  class MeetingMustHaveAtLeastOneHostRule (line 5) | public class MeetingMustHaveAtLeastOneHostRule : IBusinessRule
    method MeetingMustHaveAtLeastOneHostRule (line 9) | public MeetingMustHaveAtLeastOneHostRule(int meetingHostNumber)
    method IsBroken (line 14) | public bool IsBroken() => _meetingHostNumber == 0;

FILE: src/Modules/Meetings/Domain/Meetings/Rules/MemberCannotBeAnAttendeeOfMeetingMoreThanOnceRule.cs
  class MemberCannotBeAnAttendeeOfMeetingMoreThanOnceRule (line 6) | public class MemberCannotBeAnAttendeeOfMeetingMoreThanOnceRule : IBusine...
    method MemberCannotBeAnAttendeeOfMeetingMoreThanOnceRule (line 12) | public MemberCannotBeAnAttendeeOfMeetingMoreThanOnceRule(MemberId atte...
    method IsBroken (line 18) | public bool IsBroken() => _attendees.SingleOrDefault(x => x.IsActiveAt...

FILE: src/Modules/Meetings/Domain/Meetings/Rules/MemberCannotBeMoreThanOnceOnMeetingWaitlistRule.cs
  class MemberCannotBeMoreThanOnceOnMeetingWaitlistRule (line 6) | public class MemberCannotBeMoreThanOnceOnMeetingWaitlistRule : IBusiness...
    method MemberCannotBeMoreThanOnceOnMeetingWaitlistRule (line 12) | internal MemberCannotBeMoreThanOnceOnMeetingWaitlistRule(List<MeetingW...
    method IsBroken (line 18) | public bool IsBroken() => _waitListMembers.SingleOrDefault(x => x.IsAc...

FILE: src/Modules/Meetings/Domain/Meetings/Rules/MemberCannotBeNotAttendeeTwiceRule.cs
  class MemberCannotBeNotAttendeeTwiceRule (line 6) | public class MemberCannotBeNotAttendeeTwiceRule : IBusinessRule
    method MemberCannotBeNotAttendeeTwiceRule (line 12) | public MemberCannotBeNotAttendeeTwiceRule(List<MeetingNotAttendee> not...
    method IsBroken (line 18) | public bool IsBroken() => _notAttendees.SingleOrDefault(x => x.IsActiv...

FILE: src/Modules/Meetings/Domain/Meetings/Rules/MemberCannotHaveSetAttendeeRoleMoreThanOnceRule.cs
  class MemberCannotHaveSetAttendeeRoleMoreThanOnceRule (line 5) | public class MemberCannotHaveSetAttendeeRoleMoreThanOnceRule : IBusiness...
    method MemberCannotHaveSetAttendeeRoleMoreThanOnceRule (line 9) | internal MemberCannotHaveSetAttendeeRoleMoreThanOnceRule(MeetingAttend...
    method IsBroken (line 14) | public bool IsBroken() => _meetingAttendeeRole == MeetingAttendeeRole....

FILE: src/Modules/Meetings/Domain/Meetings/Rules/MemberOnWaitlistMustBeAMemberOfGroupRule.cs
  class MemberOnWaitlistMustBeAMemberOfGroupRule (line 7) | public class MemberOnWaitlistMustBeAMemberOfGroupRule : IBusinessRule
    method MemberOnWaitlistMustBeAMemberOfGroupRule (line 15) | internal MemberOnWaitlistMustBeAMemberOfGroupRule(MeetingGroup meeting...
    method IsBroken (line 23) | public bool IsBroken() => !_meetingGroup.IsMemberOfGroup(_memberId);

FILE: src/Modules/Meetings/Domain/Meetings/Rules/NotActiveMemberOfWaitlistCannotBeSignedOffRule.cs
  class NotActiveMemberOfWaitlistCannotBeSignedOffRule (line 6) | public class NotActiveMemberOfWaitlistCannotBeSignedOffRule : IBusinessRule
    method NotActiveMemberOfWaitlistCannotBeSignedOffRule (line 12) | public NotActiveMemberOfWaitlistCannotBeSignedOffRule(List<MeetingWait...
    method IsBroken (line 18) | public bool IsBroken() => _waitlistMembers.SingleOrDefault(x => x.IsAc...

FILE: src/Modules/Meetings/Domain/Meetings/Rules/NotActiveNotAttendeeCannotChangeDecisionRule.cs
  class NotActiveNotAttendeeCannotChangeDecisionRule (line 6) | public class NotActiveNotAttendeeCannotChangeDecisionRule : IBusinessRule
    method NotActiveNotAttendeeCannotChangeDecisionRule (line 12) | internal NotActiveNotAttendeeCannotChangeDecisionRule(List<MeetingNotA...
    method IsBroken (line 18) | public bool IsBroken() => _notAttendees.SingleOrDefault(x => x.IsActiv...

FILE: src/Modules/Meetings/Domain/Meetings/Rules/OnlyActiveAttendeeCanBeRemovedFromMeetingRule.cs
  class OnlyActiveAttendeeCanBeRemovedFromMeetingRule (line 6) | public class OnlyActiveAttendeeCanBeRemovedFromMeetingRule : IBusinessRule
    method OnlyActiveAttendeeCanBeRemovedFromMeetingRule (line 11) | internal OnlyActiveAttendeeCanBeRemovedFromMeetingRule(
    method IsBroken (line 19) | public bool IsBroken() => _attendees.SingleOrDefault(x => x.IsActiveAt...

FILE: src/Modules/Meetings/Domain/Meetings/Rules/OnlyMeetingAttendeeCanHaveChangedRoleRule.cs
  class OnlyMeetingAttendeeCanHaveChangedRoleRule (line 6) | internal class OnlyMeetingAttendeeCanHaveChangedRoleRule : IBusinessRule
    method OnlyMeetingAttendeeCanHaveChangedRoleRule (line 12) | internal OnlyMeetingAttendeeCanHaveChangedRoleRule(List<MeetingAttende...
    method IsBroken (line 18) | public bool IsBroken() => _attendees.SingleOrDefault(x => x.IsActiveAt...

FILE: src/Modules/Meetings/Domain/Meetings/Rules/OnlyMeetingOrGroupOrganizerCanSetMeetingMemberRolesRule.cs
  class OnlyMeetingOrGroupOrganizerCanSetMeetingMemberRolesRule (line 7) | public class OnlyMeetingOrGroupOrganizerCanSetMeetingMemberRolesRule : I...
    method OnlyMeetingOrGroupOrganizerCanSetMeetingMemberRolesRule (line 13) | public OnlyMeetingOrGroupOrganizerCanSetMeetingMemberRolesRule(MemberI...
    method IsBroken (line 20) | public bool IsBroken()

FILE: src/Modules/Meetings/Domain/Meetings/Rules/ReasonOfRemovingAttendeeFromMeetingMustBeProvidedRule.cs
  class ReasonOfRemovingAttendeeFromMeetingMustBeProvidedRule (line 5) | public class ReasonOfRemovingAttendeeFromMeetingMustBeProvidedRule : IBu...
    method ReasonOfRemovingAttendeeFromMeetingMustBeProvidedRule (line 9) | internal ReasonOfRemovingAttendeeFromMeetingMustBeProvidedRule(string ...
    method IsBroken (line 14) | public bool IsBroken() => string.IsNullOrEmpty(_reason);

FILE: src/Modules/Meetings/Domain/Meetings/Term.cs
  class Term (line 5) | public class Term : ValueObject
    method
Condensed preview — 1289 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,501K chars).
[
  {
    "path": ".github/workflows/buildPipeline.yml",
    "chars": 763,
    "preview": "name: CI Pipeline\n\non:\n  push:\n    branches: [master]\n  pull_request:\n    branches: [master]\n\njobs:\n  build:\n    name: B"
  },
  {
    "path": ".gitignore",
    "chars": 4884,
    "preview": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# User"
  },
  {
    "path": ".nuke/build.schema.json",
    "chars": 5140,
    "preview": "{\n  \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n  \"$ref\": \"#/definitions/build\",\n  \"title\": \"Build Schema\",\n  "
  },
  {
    "path": ".nuke/parameters.json",
    "chars": 86,
    "preview": "{\n  \"$schema\": \"./build.schema.json\",\n  \"Solution\": \"src/CompanyName.MyMeetings.sln\"\n}"
  },
  {
    "path": "LICENSE",
    "chars": 1070,
    "preview": "MIT License\n\nCopyright (c) 2019 Kamil Grzybek\n\nPermission is hereby granted, free of charge, to any person obtaining a c"
  },
  {
    "path": "README.md",
    "chars": 103354,
    "preview": "# Modular Monolith with DDD\n\nFull Modular Monolith .NET application with Domain-Driven Design approach.\n\n## Announcement"
  },
  {
    "path": "azure-pipelines.yml",
    "chars": 985,
    "preview": "# ASP.NET Core (.NET Framework)\n# Build and test ASP.NET Core projects targeting the full .NET Framework.\n# Add steps th"
  },
  {
    "path": "build/.editorconfig",
    "chars": 506,
    "preview": "[*.cs]\ndotnet_style_qualification_for_field = false:warning\ndotnet_style_qualification_for_property = false:warning\ndotn"
  },
  {
    "path": "build/Build.cs",
    "chars": 2210,
    "preview": "using Nuke.Common;\nusing Nuke.Common.IO;\nusing Nuke.Common.ProjectModel;\nusing Nuke.Common.Tools.DotNet;\nusing static Nu"
  },
  {
    "path": "build/BuildIntegrationTests.cs",
    "chars": 9342,
    "preview": "using System;\nusing System.Linq;\nusing Nuke.Common;\nusing Nuke.Common.IO;\nusing Nuke.Common.Tools.Docker;\nusing Nuke.Co"
  },
  {
    "path": "build/Configuration.cs",
    "chars": 451,
    "preview": "using System.ComponentModel;\nusing Nuke.Common.Tooling;\n\n[TypeConverter(typeof(TypeConverter<Configuration>))]\npublic cl"
  },
  {
    "path": "build/Database.cs",
    "chars": 1007,
    "preview": "using System.Linq;\nusing Nuke.Common;\nusing Nuke.Common.Tools.DotNet;\nusing static Nuke.Common.Tools.DotNet.DotNetTasks"
  },
  {
    "path": "build/Directory.Build.props",
    "chars": 428,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsof"
  },
  {
    "path": "build/Directory.Build.targets",
    "chars": 432,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsof"
  },
  {
    "path": "build/SUTCreator.cs",
    "chars": 1367,
    "preview": "using System;\nusing System.Collections.Generic;\nusing Nuke.Common;\nusing Nuke.Common.Tools.DotNet;\nusing static Nuke.Co"
  },
  {
    "path": "build/Utils/SqlReadinessChecker.cs",
    "chars": 1026,
    "preview": "using System;\nusing System.Threading;\nusing Dapper;\nusing System.Data.SqlClient;\n\nnamespace Utils\n{\n    public static c"
  },
  {
    "path": "build/_build.csproj",
    "chars": 700,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net8.0</Targe"
  },
  {
    "path": "build/_build.csproj.DotSettings",
    "chars": 4767,
    "preview": "<wpf:ResourceDictionary xml:space=\"preserve\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:s=\"clr-namesp"
  },
  {
    "path": "build.cmd",
    "chars": 207,
    "preview": ":; set -eo pipefail\n:; SCRIPT_DIR=$(cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd)\n:; ${SCRIPT_DIR}/build.sh \"$@\"\n:; exit"
  },
  {
    "path": "build.ps1",
    "chars": 2931,
    "preview": "[CmdletBinding()]\nParam(\n    [Parameter(Position=0,Mandatory=$false,ValueFromRemainingArguments=$true)]\n    [string[]]$B"
  },
  {
    "path": "build.sh",
    "chars": 2280,
    "preview": "#!/usr/bin/env bash\n\nbash --version 2>&1 | head -n 1\n\nset -eo pipefail\nSCRIPT_DIR=$(cd \"$( dirname \"${BASH_SOURCE[0]}\" )"
  },
  {
    "path": "docker-compose.yml",
    "chars": 1134,
    "preview": "version: '3.4'\n\nservices:\n\n  backend:\n    container_name: mymeetings_backend\n    build:\n      context: ./src/\n    ports:"
  },
  {
    "path": "docs/C4/c1_system_context.puml",
    "chars": 971,
    "preview": "@startuml C1 System Context\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Context.pum"
  },
  {
    "path": "docs/C4/c2_container.puml",
    "chars": 1087,
    "preview": "@startuml C2 Containers\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n"
  },
  {
    "path": "docs/C4/c3_components.puml",
    "chars": 2103,
    "preview": "@startuml C3 Components\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml\n"
  },
  {
    "path": "docs/C4/c3_components_module.puml",
    "chars": 2781,
    "preview": "@startuml C3 Components Module (zoom-in)\n!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C"
  },
  {
    "path": "docs/C4/c4_class.puml",
    "chars": 1539,
    "preview": "@startuml C4  Code\n\npackage \"Meeting Groups Aggregate\" <<Rectangle>> {\n\n    class \"MeetingGroupId\" << VO >> {   \n\n    }\n"
  },
  {
    "path": "docs/PlantUML/Commenting_Conceptual_Model.puml",
    "chars": 623,
    "preview": "@startuml\n\nobject \"Meeting\" as Meeting\nobject \"Member\" as Member\nobject \"Meeting Commenting Configuration\" as MeetingCom"
  },
  {
    "path": "docs/PlantUML/Conceptual_Model.puml",
    "chars": 4382,
    "preview": "@startuml\nscale max 2000 width\n\npackage \"User Access\" #f3e8f8 {\nobject Permission\nobject \"User Role\" as UserRole\nobject "
  },
  {
    "path": "docs/architecture-decision-log/0001-record-architecture-decisions.md",
    "chars": 805,
    "preview": "# 1.  Record architecture decisions\n\nDate: 2019-10-28\n\n## Status\n\nAccepted\n\n## Context\n\nAs the project is an example of "
  },
  {
    "path": "docs/architecture-decision-log/0002-use_modular-monolith-system-architecture.md",
    "chars": 661,
    "preview": "# 2.  Use Modular Monolith System Architecture\n\nDate: 2019-07-01\n\nLog date: 2019-10-28\n\n## Status\n\nAccepted\n\n## Context\n"
  },
  {
    "path": "docs/architecture-decision-log/0003-use_dotnetcore_and_csharp.md",
    "chars": 739,
    "preview": "# 3.  Use .NET Core and C# language\n\nDate: 2019-07-01\n\nLog date: 2019-10-28\n\n## Status\n\nAccepted\n\n## Context\n\nAs it is m"
  },
  {
    "path": "docs/architecture-decision-log/0004-divide-the-system-into-4-modules.md",
    "chars": 2346,
    "preview": "# 4.   Divide the system into 4 modules \n\nDate: 2019-07-01\n\nLog date: 2019-11-02\n\n## Status\n\nAccepted\n\n## Context\n\nThe M"
  },
  {
    "path": "docs/architecture-decision-log/0005-create-one-rest-api-module.md",
    "chars": 1652,
    "preview": "# 5.   Create one REST API module\n\nDate: 2019-07-01\n\nLog date: 2019-11-04\n\n## Status\n\nAccepted\n\n## Context\n\nWe need to e"
  },
  {
    "path": "docs/architecture-decision-log/0006-create-facade-between-api-and-business-module.md",
    "chars": 1247,
    "preview": "# 6. Create façade between API and business module\n\nDate: 2019-07-01\n\nLog date: 2019-11-04\n\n## Status\n\nAccepted\n\n## Cont"
  },
  {
    "path": "docs/architecture-decision-log/0007-use-cqrs-architectural-style.md",
    "chars": 1113,
    "preview": "# 7. Use CQRS architectural style\n\nDate: 2019-07-01\n\nLog date: 2019-11-04\n\n## Status\n\nAccepted\n\n## Context\n\nOur applicat"
  },
  {
    "path": "docs/architecture-decision-log/0008-allow-return-result-after-command-processing.md",
    "chars": 1027,
    "preview": "# 8. Allow return result after command processing\n\nDate: 2019-07-01\n\nLog date: 2019-11-04\n\n## Status\n\nAccepted\n\n## Conte"
  },
  {
    "path": "docs/architecture-decision-log/0009-use-2-layered-architectural-style-for-reads.md",
    "chars": 988,
    "preview": "# 9. Use 2 layered architectural style for reads\n\nDate: 2019-07-01\n\nLog date: 2019-11-04\n\n## Status\n\nAccepted\n\n## Contex"
  },
  {
    "path": "docs/architecture-decision-log/0010-use-clean-architecture-for-writes.md",
    "chars": 1466,
    "preview": "# 10. Use Clean Architecture for writes\n\nDate: 2019-07-01\n\nLog date: 2019-11-05\n\n## Status\n\nAccepted\n\n## Context\n\nWe app"
  },
  {
    "path": "docs/architecture-decision-log/0011-create-rich-domain-models.md",
    "chars": 1987,
    "preview": "# 11. Create rich Domain Models\n\nDate: 2019-07-01\n\nLog date: 2019-11-05\n\n## Status\n\nAccepted\n\n## Context\n\nWe need to cre"
  },
  {
    "path": "docs/architecture-decision-log/0012-use-domain-driven-design-tactical-patterns.md",
    "chars": 1708,
    "preview": "# 12. Use Domain-Driven Design tactical patterns\n\nDate: 2019-07-01\n\nLog date: 2019-11-05\n\n## Status\n\nAccepted\n\n## Contex"
  },
  {
    "path": "docs/architecture-decision-log/0013-protect-business-invariants-using-exceptions.md",
    "chars": 1817,
    "preview": "# 13. Protect business invariants using exceptions\n\nDate: 2019-07-01\n\nLog date: 2019-11-05\n\n## Status\n\nAccepted\n\n## Cont"
  },
  {
    "path": "docs/architecture-decision-log/0014-event-driven-communication-between-modules.md",
    "chars": 1943,
    "preview": "# 14. Event-driven communication between modules\n\nDate: 2019-07-15\n\nLog date: 2019-11-09\n\n## Status\n\nAccepted\n\n## Contex"
  },
  {
    "path": "docs/architecture-decision-log/0015-use-in-memory-events-bus.md",
    "chars": 1700,
    "preview": "# 15. Use In-Memory Events Bus\n\nDate: 2019-07-15\n\nLog date: 2019-11-09\n\n## Status\n\nAccepted\n\n## Context\n\nAs we want to b"
  },
  {
    "path": "docs/architecture-decision-log/0016-create-ioc-container-per-module.md",
    "chars": 1243,
    "preview": "# 16. Create an IoC Container per module\n\nDate: 2019-07-15\n\nLog date: 2019-11-09\n\n## Status\n\nAccepted\n\n## Context\n\nFor e"
  },
  {
    "path": "docs/architecture-decision-log/0017-implement-archictecture-tests.md",
    "chars": 1076,
    "preview": "# 17. Implement Architecture Tests\n\nDate: 2019-11-16\n\n## Status\n\nAccepted\n\n## Context\n\nIn some cases it is not possible "
  },
  {
    "path": "docs/catalog-of-terms/Aggregate-DDD/README.md",
    "chars": 5412,
    "preview": "# Aggregate (DDD)\n\n## Definition\n\n*Cluster ENTITES and VALUE OBJECTS into AGGREGATES and define boundaries around each. "
  },
  {
    "path": "docs/catalog-of-terms/Aggregate-DDD/aggregate-ddd.puml",
    "chars": 1540,
    "preview": "@startuml Aggregate\n\npackage \"Meeting Groups Aggregate\" <<Rectangle>> {\n\n    class \"MeetingGroupId\" << VO >> {   \n\n    }"
  },
  {
    "path": "docs/catalog-of-terms/Command/README.md",
    "chars": 2699,
    "preview": "# Command\n\n## Definition\n\n*A command is a request made to do something. A command represents the intention of a system’s"
  },
  {
    "path": "docs/catalog-of-terms/Command/command.puml",
    "chars": 287,
    "preview": "@startuml Command\n\nclass CancelMeetingCommand {\n    MeetingGroupId: Id\n}\n\nnote top of CancelMeetingCommand : Command as "
  },
  {
    "path": "docs/catalog-of-terms/Decorator-Pattern/README.md",
    "chars": 4605,
    "preview": "# Decorator Pattern\n\n## Definition\n\n*In object-oriented programming, the decorator pattern is a design pattern that allo"
  },
  {
    "path": "docs/catalog-of-terms/Decorator-Pattern/decorator-pattern.puml",
    "chars": 1333,
    "preview": "@startuml\nclass MeetingsController {\n +AddMeetingAttendee()\n +RemoveMeetingAttendee()\n}\n\nclass AddMeetingAttendeeCommand"
  },
  {
    "path": "docs/catalog-of-terms/Dependency-Injection/README.md",
    "chars": 1572,
    "preview": "# Dependency Injection\n\n## Definition\n\n*Dependency Injection is a technique in which an object receives other objects th"
  },
  {
    "path": "docs/catalog-of-terms/Dependency-Injection/dependency-injection.puml",
    "chars": 365,
    "preview": "@startuml Dependency Injection\n\nclass \"CancelMeetingCommandHandler\" {\nCancelMeetingCommandHandler(IMeetingRepository mee"
  },
  {
    "path": "docs/catalog-of-terms/Domain-Event/README.md",
    "chars": 3000,
    "preview": "# Domain Event\n\n## Definition\n\n*An event is something that has happened in the past. A **domain event** is, something th"
  },
  {
    "path": "docs/catalog-of-terms/Domain-Event/domain-event.puml",
    "chars": 348,
    "preview": "@startuml\nclass SubscriptionPaymentCreatedDomainEvent {\n +SubscriptionPaymentId\n +PayerId\n +SubscriptionPeriodCode\n +Cou"
  },
  {
    "path": "docs/catalog-of-terms/Entity-DDD/README.md",
    "chars": 4601,
    "preview": "# Entity (DDD)\n\n## Definition\n\n*When an object is distinguished by its identity, rather than its attributes, make this p"
  },
  {
    "path": "docs/catalog-of-terms/Entity-DDD/entity-ddd.puml",
    "chars": 501,
    "preview": "@startuml Entity\n\nclass \"MeetingGroup\" << Entity >> {\n    MeetingGroupId: Id\n    -string: _description\n    -DateTime: _c"
  },
  {
    "path": "docs/catalog-of-terms/Event/README.md",
    "chars": 554,
    "preview": "# Event\n\n## Definition\n\n*An event is something that has happened in the past.*\n\nSource: [Domain events: design and imple"
  },
  {
    "path": "docs/catalog-of-terms/Event-Driven-Architecture/README.md",
    "chars": 33,
    "preview": "# Event Driven Architecture\n\nTODO"
  },
  {
    "path": "docs/catalog-of-terms/Event-Sourcing/README.md",
    "chars": 22,
    "preview": "# Event Sourcing\n\nTODO"
  },
  {
    "path": "docs/catalog-of-terms/Event-Storming/README.md",
    "chars": 22,
    "preview": "# Event Storming\n\nTODO"
  },
  {
    "path": "docs/catalog-of-terms/Integration-Event/README.md",
    "chars": 25,
    "preview": "# Integration Event\n\nTODO"
  },
  {
    "path": "docs/catalog-of-terms/README.md",
    "chars": 1880,
    "preview": "# Catalog of terms\n\n- Act/Arrange/Assert\n- Actor (Event Storming)\n- API\n- Application Layer\n- [Aggregate (DDD)](Aggregat"
  },
  {
    "path": "docs/catalog-of-terms/Strategy-Pattern/README.md",
    "chars": 8864,
    "preview": "# Strategy Pattern\n\n## Definition\n\n*The strategy pattern (also known as the policy pattern) is a behavioral software des"
  },
  {
    "path": "docs/catalog-of-terms/Strategy-Pattern/strategy-pattern.puml",
    "chars": 1473,
    "preview": "@startuml\npackage \"Generic\" #DDDDDD {\nclass Client {\n - context\n}\n\nclass Context {\n - strategy\n + setStrategy(strategy)\n"
  },
  {
    "path": "docs/catalog-of-terms/ValueObject-DDD/README.md",
    "chars": 2346,
    "preview": "# ValueObject (DDD)\n\n## Definition\n\n*When you care only about the attributes of an element of the model, classify it as "
  },
  {
    "path": "docs/catalog-of-terms/ValueObject-DDD/value-object-ddd.puml",
    "chars": 136,
    "preview": "@startuml ValueObject\n\nclass \"MeetingGroup\" << ValueObject >> {\n    decimal: Value {readonly}\n    string: Currency {read"
  },
  {
    "path": "docs/mutation-tests-reports/mutation-report.html",
    "chars": 413106,
    "preview": "<!DOCTYPE html>\n<html>\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta name=\"viewport\" content=\"width=device-wid"
  },
  {
    "path": "runIntegrationTests.cmd",
    "chars": 1927,
    "preview": "@ECHO OFF\nSETLOCAL\nSET CONTAINER_ID=\nFOR /f %%i IN ('docker ps -q -f name^=myMeetings-integration-db') DO SET CONTAINER_"
  },
  {
    "path": "src/.dockerignore",
    "chars": 316,
    "preview": "**/.classpath\n**/.dockerignore\n**/.env\n**/.git\n**/.gitignore\n**/.project\n**/.settings\n**/.toolstarget\n**/.vs\n**/.vscode\n"
  },
  {
    "path": "src/.editorconfig",
    "chars": 1099,
    "preview": "[*.cs]\n\n# SA1309: Field names should not begin with underscore\ndotnet_diagnostic.SA1309.severity = none\n\n# SA1600: Elem"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/CompanyName.MyMeetings.API.csproj",
    "chars": 675,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n  <PropertyGroup>\n    <GenerateDocumentationFile>true</GenerateDocumentationFile>"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Configuration/Authorization/AttributeAuthorizationHandler.cs",
    "chars": 904,
    "preview": "using Microsoft.AspNetCore.Authorization;\n\nnamespace CompanyName.MyMeetings.API.Configuration.Authorization\n{\n    publi"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Configuration/Authorization/AuthorizationChecker.cs",
    "chars": 2153,
    "preview": "using System.Reflection;\nusing System.Text;\nusing Microsoft.AspNetCore.Mvc;\n\nnamespace CompanyName.MyMeetings.API.Confi"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Configuration/Authorization/HasPermissionAttribute.cs",
    "chars": 531,
    "preview": "using Microsoft.AspNetCore.Authorization;\n\nnamespace CompanyName.MyMeetings.API.Configuration.Authorization\n{\n    [Attr"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Configuration/Authorization/HasPermissionAuthorizationHandler.cs",
    "chars": 1894,
    "preview": "using CompanyName.MyMeetings.BuildingBlocks.Application;\nusing CompanyName.MyMeetings.Modules.UserAccess.Application.Au"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Configuration/Authorization/HasPermissionAuthorizationRequirement.cs",
    "chars": 207,
    "preview": "using Microsoft.AspNetCore.Authorization;\n\nnamespace CompanyName.MyMeetings.API.Configuration.Authorization\n{\n    publi"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Configuration/Authorization/NoPermissionRequiredAttribute.cs",
    "chars": 208,
    "preview": "namespace CompanyName.MyMeetings.API.Configuration.Authorization\n{\n    [AttributeUsage(AttributeTargets.Method, AllowMu"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Configuration/ExecutionContext/CorrelationMiddleware.cs",
    "chars": 608,
    "preview": "namespace CompanyName.MyMeetings.API.Configuration.ExecutionContext\n{\n    internal class CorrelationMiddleware\n    {\n  "
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Configuration/ExecutionContext/ExecutionContextAccessor.cs",
    "chars": 1662,
    "preview": "using CompanyName.MyMeetings.BuildingBlocks.Application;\n\nnamespace CompanyName.MyMeetings.API.Configuration.ExecutionC"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Configuration/Extensions/SwaggerExtensions.cs",
    "chars": 2509,
    "preview": "using System.Reflection;\r\nusing Microsoft.OpenApi.Models;\r\n\r\nnamespace CompanyName.MyMeetings.API.Configuration.Extensi"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Configuration/Validation/BusinessRuleValidationExceptionProblemDetails.cs",
    "chars": 575,
    "preview": "using CompanyName.MyMeetings.BuildingBlocks.Domain;\nusing Microsoft.AspNetCore.Mvc;\n\nnamespace CompanyName.MyMeetings.A"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Configuration/Validation/InvalidCommandProblemDetails.cs",
    "chars": 574,
    "preview": "using CompanyName.MyMeetings.BuildingBlocks.Application;\nusing Microsoft.AspNetCore.Mvc;\n\nnamespace CompanyName.MyMeeti"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Administration/AdministrationAutofacModule.cs",
    "chars": 521,
    "preview": "using Autofac;\nusing CompanyName.MyMeetings.Modules.Administration.Application.Contracts;\nusing CompanyName.MyMeetings."
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Administration/AdministrationPermissions.cs",
    "chars": 206,
    "preview": "namespace CompanyName.MyMeetings.API.Modules.Administration\n{\n    public class AdministrationPermissions\n    {\n        "
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Administration/MeetingGroupProposals/MeetingGroupProposalsController.cs",
    "chars": 1932,
    "preview": "using CompanyName.MyMeetings.API.Configuration.Authorization;\nusing CompanyName.MyMeetings.Modules.Administration.Appli"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Meetings/Countries/CountriesController.cs",
    "chars": 1043,
    "preview": "using CompanyName.MyMeetings.API.Configuration.Authorization;\nusing CompanyName.MyMeetings.Modules.Meetings.Application"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Meetings/MeetingCommentingConfiguration/MeetingCommentingConfigurationController.cs",
    "chars": 1688,
    "preview": "using CompanyName.MyMeetings.API.Configuration.Authorization;\nusing CompanyName.MyMeetings.Modules.Meetings.Application"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Meetings/MeetingComments/AddMeetingCommentRequest.cs",
    "chars": 217,
    "preview": "namespace CompanyName.MyMeetings.API.Modules.Meetings.MeetingComments\n{\n    public class AddMeetingCommentRequest\n    {"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Meetings/MeetingComments/EditMeetingCommentRequest.cs",
    "chars": 179,
    "preview": "namespace CompanyName.MyMeetings.API.Modules.Meetings.MeetingComments\n{\n    public class EditMeetingCommentRequest\n    "
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Meetings/MeetingComments/MeetingCommentsController.cs",
    "chars": 3931,
    "preview": "using CompanyName.MyMeetings.API.Configuration.Authorization;\nusing CompanyName.MyMeetings.Modules.Meetings.Application"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Meetings/MeetingGroupProposals/MeetingGroupProposalsController.cs",
    "chars": 2546,
    "preview": "using CompanyName.MyMeetings.API.Configuration.Authorization;\nusing CompanyName.MyMeetings.Modules.Meetings.Application"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Meetings/MeetingGroupProposals/ProposeMeetingGroupRequest.cs",
    "chars": 333,
    "preview": "namespace CompanyName.MyMeetings.API.Modules.Meetings.MeetingGroupProposals\n{\n    public class ProposeMeetingGroupReque"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Meetings/MeetingGroups/CreateNewMeetingGroupRequest.cs",
    "chars": 323,
    "preview": "namespace CompanyName.MyMeetings.API.Modules.Meetings.MeetingGroups\n{\n    public class CreateNewMeetingGroupRequest\n   "
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Meetings/MeetingGroups/EditMeetingGroupGeneralAttributesRequest.cs",
    "chars": 335,
    "preview": "namespace CompanyName.MyMeetings.API.Modules.Meetings.MeetingGroups\n{\n    public class EditMeetingGroupGeneralAttribute"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Meetings/MeetingGroups/MeetingGroupsController.cs",
    "chars": 3980,
    "preview": "using CompanyName.MyMeetings.API.Configuration.Authorization;\nusing CompanyName.MyMeetings.Modules.Meetings.Application"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Meetings/Meetings/AddMeetingAttendeeRequest.cs",
    "chars": 168,
    "preview": "namespace CompanyName.MyMeetings.API.Modules.Meetings.Meetings\n{\n    public class AddMeetingAttendeeRequest\n    {\n     "
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Meetings/Meetings/ChangeMeetingMainAttributesRequest.cs",
    "chars": 980,
    "preview": "namespace CompanyName.MyMeetings.API.Modules.Meetings.Meetings\n{\n    public class ChangeMeetingMainAttributesRequest\n  "
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Meetings/Meetings/CreateMeetingRequest.cs",
    "chars": 971,
    "preview": "namespace CompanyName.MyMeetings.API.Modules.Meetings.Meetings\n{\n    public class CreateMeetingRequest\n    {\n        pu"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Meetings/Meetings/MeetingsController.cs",
    "chars": 9351,
    "preview": "using CompanyName.MyMeetings.API.Configuration.Authorization;\nusing CompanyName.MyMeetings.Modules.Meetings.Application"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Meetings/Meetings/RemoveMeetingAttendeeRequest.cs",
    "chars": 176,
    "preview": "namespace CompanyName.MyMeetings.API.Modules.Meetings.Meetings\n{\n    public class RemoveMeetingAttendeeRequest\n    {\n  "
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Meetings/Meetings/SetMeetingAttendeeRequest.cs",
    "chars": 167,
    "preview": "namespace CompanyName.MyMeetings.API.Modules.Meetings.Meetings\n{\n    public class SetMeetingAttendeeRequest\n    {\n     "
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Meetings/Meetings/SetMeetingHostRequest.cs",
    "chars": 163,
    "preview": "namespace CompanyName.MyMeetings.API.Modules.Meetings.Meetings\n{\n    public class SetMeetingHostRequest\n    {\n        p"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Meetings/MeetingsAutofacModule.cs",
    "chars": 483,
    "preview": "using Autofac;\nusing CompanyName.MyMeetings.Modules.Meetings.Application.Contracts;\nusing CompanyName.MyMeetings.Module"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Meetings/MeetingsPermissions.cs",
    "chars": 2383,
    "preview": "namespace CompanyName.MyMeetings.API.Modules.Meetings\n{\n    public class MeetingsPermissions\n    {\n        public const"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Payments/MeetingFees/CreateMeetingFeePaymentRequest.cs",
    "chars": 177,
    "preview": "namespace CompanyName.MyMeetings.API.Modules.Payments.MeetingFees\n{\n    public class CreateMeetingFeePaymentRequest\n   "
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Payments/MeetingFees/MeetingFeePaymentsController.cs",
    "chars": 1627,
    "preview": "using CompanyName.MyMeetings.API.Configuration.Authorization;\nusing CompanyName.MyMeetings.Modules.Payments.Application"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Payments/MeetingFees/RegisterMeetingFeePaymentRequest.cs",
    "chars": 176,
    "preview": "namespace CompanyName.MyMeetings.API.Modules.Payments.MeetingFees\n{\n    public class RegisterMeetingFeePaymentRequest\n "
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Payments/Payers/PayersController.cs",
    "chars": 1195,
    "preview": "using CompanyName.MyMeetings.API.Configuration.Authorization;\nusing CompanyName.MyMeetings.Modules.Payments.Application"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Payments/PaymentsAutofacModule.cs",
    "chars": 483,
    "preview": "using Autofac;\nusing CompanyName.MyMeetings.Modules.Payments.Application.Contracts;\nusing CompanyName.MyMeetings.Module"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Payments/PaymentsPermissions.cs",
    "chars": 798,
    "preview": "namespace CompanyName.MyMeetings.API.Modules.Payments\n{\n    public class PaymentsPermissions\n    {\n        public const"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Payments/PriceListItems/ChangePriceListItemAttributesRequest.cs",
    "chars": 448,
    "preview": "namespace CompanyName.MyMeetings.API.Modules.Payments.PriceListItems\n{\n    public class ChangePriceListItemAttributesRe"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Payments/PriceListItems/CreatePriceListItemRequest.cs",
    "chars": 387,
    "preview": "namespace CompanyName.MyMeetings.API.Modules.Payments.PriceListItems\n{\n    public class CreatePriceListItemRequest\n    "
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Payments/PriceListItems/GetPriceListItemRequest.cs",
    "chars": 276,
    "preview": "namespace CompanyName.MyMeetings.API.Modules.Payments.PriceListItems\n{\n    public class GetPriceListItemRequest\n    {\n "
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Payments/PriceListItems/PriceListItemsController.cs",
    "chars": 3711,
    "preview": "using CompanyName.MyMeetings.API.Configuration.Authorization;\nusing CompanyName.MyMeetings.Modules.Payments.Application"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Payments/RegisterSubscriptionRenewalPaymentRequest.cs",
    "chars": 172,
    "preview": "namespace CompanyName.MyMeetings.API.Modules.Payments\n{\n    public class RegisterSubscriptionRenewalPaymentRequest\n    {"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Payments/SubscriptionRenewalsController.cs",
    "chars": 1067,
    "preview": "using CompanyName.MyMeetings.API.Configuration.Authorization;\nusing CompanyName.MyMeetings.Modules.Payments.Application."
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Payments/Subscriptions/BuySubscriptionRequest.cs",
    "chars": 320,
    "preview": "namespace CompanyName.MyMeetings.API.Modules.Payments.Subscriptions\n{\n    public class BuySubscriptionRequest\n    {\n   "
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Payments/Subscriptions/RegisterSubscriptionPaymentRequest.cs",
    "chars": 180,
    "preview": "namespace CompanyName.MyMeetings.API.Modules.Payments.Subscriptions\n{\n    public class RegisterSubscriptionPaymentReque"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Payments/Subscriptions/RenewSubscriptionRequest.cs",
    "chars": 322,
    "preview": "namespace CompanyName.MyMeetings.API.Modules.Payments.Subscriptions\n{\n    public class RenewSubscriptionRequest\n    {\n "
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Payments/Subscriptions/SubscriptionPaymentsController.cs",
    "chars": 1100,
    "preview": "using CompanyName.MyMeetings.API.Configuration.Authorization;\nusing CompanyName.MyMeetings.Modules.Payments.Application"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/Payments/Subscriptions/SubscriptionsController.cs",
    "chars": 1870,
    "preview": "using CompanyName.MyMeetings.API.Configuration.Authorization;\nusing CompanyName.MyMeetings.Modules.Payments.Application"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/UserAccess/AuthenticatedUserController.cs",
    "chars": 1687,
    "preview": "using CompanyName.MyMeetings.API.Configuration.Authorization;\nusing CompanyName.MyMeetings.Modules.UserAccess.Applicati"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/UserAccess/EmailsController.cs",
    "chars": 940,
    "preview": "using CompanyName.MyMeetings.API.Configuration.Authorization;\nusing CompanyName.MyMeetings.Modules.UserAccess.Applicati"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/UserAccess/RegisterNewUserRequest.cs",
    "chars": 385,
    "preview": "namespace CompanyName.MyMeetings.API.Modules.UserAccess\n{\n    public class RegisterNewUserRequest\n    {\n        public "
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/UserAccess/UserAccessAutofacModule.cs",
    "chars": 495,
    "preview": "using Autofac;\nusing CompanyName.MyMeetings.Modules.UserAccess.Application.Contracts;\nusing CompanyName.MyMeetings.Modu"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Modules/UserAccess/UserRegistrationsController.cs",
    "chars": 1884,
    "preview": "using CompanyName.MyMeetings.API.Configuration.Authorization;\nusing CompanyName.MyMeetings.Modules.Registrations.Applic"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Program.cs",
    "chars": 586,
    "preview": "using Autofac.Extensions.DependencyInjection;\n\nnamespace CompanyName.MyMeetings.API\n{\n    public class Program\n    {\n  "
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Properties/launchSettings.json",
    "chars": 980,
    "preview": "{\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n      "
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/Startup.cs",
    "chars": 7346,
    "preview": "using Autofac;\nusing Autofac.Extensions.DependencyInjection;\nusing CompanyName.MyMeetings.API.Configuration.Authorizati"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/appsettings.Development.json",
    "chars": 137,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Debug\",\n      \"System\": \"Information\",\n      \"Microsoft\": \"Informat"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/appsettings.Production.json",
    "chars": 137,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Debug\",\n      \"System\": \"Information\",\n      \"Microsoft\": \"Informat"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/appsettings.json",
    "chars": 502,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Trace\",\n      \"System\": \"Information\",\n      \"Microsoft\": \"None\"\n  "
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/entrypoint.sh",
    "chars": 61,
    "preview": "#!/bin/bash\nsleep 30 ;\n\ndotnet CompanyName.MyMeetings.API.dll"
  },
  {
    "path": "src/API/CompanyName.MyMeetings.API/tempkey.rsa",
    "chars": 1689,
    "preview": "{\"KeyId\":\"6962297f9adb377dadb20e11b9d82f6c\",\"Parameters\":{\"D\":\"k4wzTPOMjoB3/gKcu/IGMXrLgZlmPR7NbtUb22Dkw8xhUMVGBV2fE7zEE"
  },
  {
    "path": "src/API/RequestExamples/Authentication.http",
    "chars": 437,
    "preview": "### Authenticate Member\nPOST {{baseUrl}}/connect/token\nContent-Type: application/x-www-form-urlencoded\n\ngrant_type=pass"
  },
  {
    "path": "src/API/RequestExamples/Users.http",
    "chars": 377,
    "preview": "### Register a new user\nPOST {{baseUrl}}/userAccess/UserRegistrations\nContent-Type: application/json\n\n{\n  \"Login\": \"log"
  },
  {
    "path": "src/API/RequestExamples/http-client.env.json",
    "chars": 58,
    "preview": "{\n  \"dev\": {\n    \"baseUrl\": \"http://localhost:5000\"\n  }\n}"
  },
  {
    "path": "src/BuildingBlocks/Application/CompanyName.MyMeetings.BuildingBlocks.Application.csproj",
    "chars": 36,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\" />"
  },
  {
    "path": "src/BuildingBlocks/Application/Data/ISqlConnectionFactory.cs",
    "chars": 272,
    "preview": "using System.Data;\n\nnamespace CompanyName.MyMeetings.BuildingBlocks.Application.Data\n{\n    public interface ISqlConnect"
  },
  {
    "path": "src/BuildingBlocks/Application/Emails/EmailMessage.cs",
    "chars": 455,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.Application.Emails\n{\n    public struct EmailMessage\n    {\n        publi"
  },
  {
    "path": "src/BuildingBlocks/Application/Emails/IEmailSender.cs",
    "chars": 163,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.Application.Emails\n{\n    public interface IEmailSender\n    {\n        Ta"
  },
  {
    "path": "src/BuildingBlocks/Application/Events/DomainNotificationBase.cs",
    "chars": 464,
    "preview": "using CompanyName.MyMeetings.BuildingBlocks.Domain;\n\nnamespace CompanyName.MyMeetings.BuildingBlocks.Application.Events"
  },
  {
    "path": "src/BuildingBlocks/Application/Events/IDomainEventNotification.cs",
    "chars": 328,
    "preview": "using MediatR;\n\nnamespace CompanyName.MyMeetings.BuildingBlocks.Application.Events\n{\n    public interface IDomainEventN"
  },
  {
    "path": "src/BuildingBlocks/Application/IExecutionContextAccessor.cs",
    "chars": 224,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.Application\n{\n    public interface IExecutionContextAccessor\n    {\n    "
  },
  {
    "path": "src/BuildingBlocks/Application/InvalidCommandException.cs",
    "chars": 289,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.Application\n{\n    public class InvalidCommandException : Exception\n    "
  },
  {
    "path": "src/BuildingBlocks/Application/Outbox/IOutbox.cs",
    "chars": 175,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.Application.Outbox\n{\n    public interface IOutbox\n    {\n        void Ad"
  },
  {
    "path": "src/BuildingBlocks/Application/Outbox/OutboxMessage.cs",
    "chars": 626,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.Application.Outbox\n{\n    public class OutboxMessage\n    {\n        publi"
  },
  {
    "path": "src/BuildingBlocks/Application/Queries/IPagedQuery.cs",
    "chars": 366,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.Application.Queries\n{\n    public interface IPagedQuery\n    {\n        //"
  },
  {
    "path": "src/BuildingBlocks/Application/Queries/PageData.cs",
    "chars": 311,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.Application.Queries\n{\n    public struct PageData\n    {\n        public i"
  },
  {
    "path": "src/BuildingBlocks/Application/Queries/PagedQueryHelper.cs",
    "chars": 1031,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.Application.Queries\n{\n    public static class PagedQueryHelper\n    {\n  "
  },
  {
    "path": "src/BuildingBlocks/Domain/BusinessRuleValidationException.cs",
    "chars": 579,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.Domain\n{\n    public class BusinessRuleValidationException : Exception\n "
  },
  {
    "path": "src/BuildingBlocks/Domain/CompanyName.MyMeetings.BuildingBlocks.Domain.csproj",
    "chars": 35,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\" />"
  },
  {
    "path": "src/BuildingBlocks/Domain/DomainEventBase.cs",
    "chars": 335,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.Domain\n{\n    public class DomainEventBase : IDomainEvent\n    {\n        "
  },
  {
    "path": "src/BuildingBlocks/Domain/Entity.cs",
    "chars": 932,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.Domain\n{\n    public abstract class Entity\n    {\n        private List<ID"
  },
  {
    "path": "src/BuildingBlocks/Domain/IAggregateRoot.cs",
    "chars": 108,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.Domain\n{\n    public interface IAggregateRoot\n    {\n    }\n}\n"
  },
  {
    "path": "src/BuildingBlocks/Domain/IBusinessRule.cs",
    "chars": 164,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.Domain\n{\n    public interface IBusinessRule\n    {\n        bool IsBroken"
  },
  {
    "path": "src/BuildingBlocks/Domain/IDomainEvent.cs",
    "chars": 200,
    "preview": "using MediatR;\n\nnamespace CompanyName.MyMeetings.BuildingBlocks.Domain\n{\n    public interface IDomainEvent : INotificat"
  },
  {
    "path": "src/BuildingBlocks/Domain/IgnoreMemberAttribute.cs",
    "chars": 195,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.Domain\n{\n    [AttributeUsage(AttributeTargets.Property | AttributeTarge"
  },
  {
    "path": "src/BuildingBlocks/Domain/TypedIdValueBase.cs",
    "chars": 1377,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.Domain\n{\n    public abstract class TypedIdValueBase : IEquatable<TypedI"
  },
  {
    "path": "src/BuildingBlocks/Domain/ValueObject.cs",
    "chars": 3421,
    "preview": "using System.Reflection;\n\nnamespace CompanyName.MyMeetings.BuildingBlocks.Domain\n{\n    public abstract class ValueObjec"
  },
  {
    "path": "src/BuildingBlocks/Infrastructure/BiDictionary.cs",
    "chars": 1027,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.Infrastructure\n{\n    public class BiDictionary<TFirst, TSecond>\n    {\n "
  },
  {
    "path": "src/BuildingBlocks/Infrastructure/CompanyName.MyMeetings.BuildingBlocks.Infrastructure.csproj",
    "chars": 36,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\" />"
  },
  {
    "path": "src/BuildingBlocks/Infrastructure/DomainEventsDispatching/DomainEventsAccessor.cs",
    "chars": 1184,
    "preview": "using CompanyName.MyMeetings.BuildingBlocks.Domain;\nusing Microsoft.EntityFrameworkCore;\n\nnamespace CompanyName.MyMeeti"
  },
  {
    "path": "src/BuildingBlocks/Infrastructure/DomainEventsDispatching/DomainEventsDispatcher.cs",
    "chars": 3179,
    "preview": "using Autofac;\nusing Autofac.Core;\nusing CompanyName.MyMeetings.BuildingBlocks.Application.Events;\nusing CompanyName.My"
  },
  {
    "path": "src/BuildingBlocks/Infrastructure/DomainEventsDispatching/DomainEventsDispatcherNotificationHandlerDecorator.cs",
    "chars": 929,
    "preview": "using MediatR;\n\nnamespace CompanyName.MyMeetings.BuildingBlocks.Infrastructure.DomainEventsDispatching\n{\n    public cla"
  },
  {
    "path": "src/BuildingBlocks/Infrastructure/DomainEventsDispatching/DomainNotificationsMapper.cs",
    "chars": 736,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.Infrastructure.DomainEventsDispatching\n{\n    public class DomainNotific"
  },
  {
    "path": "src/BuildingBlocks/Infrastructure/DomainEventsDispatching/IDomainEventsAccessor.cs",
    "chars": 301,
    "preview": "using CompanyName.MyMeetings.BuildingBlocks.Domain;\n\nnamespace CompanyName.MyMeetings.BuildingBlocks.Infrastructure.Dom"
  },
  {
    "path": "src/BuildingBlocks/Infrastructure/DomainEventsDispatching/IDomainEventsDispatcher.cs",
    "chars": 184,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.Infrastructure.DomainEventsDispatching\n{\n    public interface IDomainEv"
  },
  {
    "path": "src/BuildingBlocks/Infrastructure/DomainEventsDispatching/IDomainNotificationsMapper.cs",
    "chars": 222,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.Infrastructure.DomainEventsDispatching\n{\n    public interface IDomainNo"
  },
  {
    "path": "src/BuildingBlocks/Infrastructure/DomainEventsDispatching/UnitOfWorkCommandHandlerDecorator.cs",
    "chars": 815,
    "preview": "using MediatR;\r\n\r\nnamespace CompanyName.MyMeetings.BuildingBlocks.Infrastructure.DomainEventsDispatching\r\n{\r\n    public"
  },
  {
    "path": "src/BuildingBlocks/Infrastructure/Emails/EmailSender.cs",
    "chars": 1718,
    "preview": "using CompanyName.MyMeetings.BuildingBlocks.Application.Data;\nusing CompanyName.MyMeetings.BuildingBlocks.Application.E"
  },
  {
    "path": "src/BuildingBlocks/Infrastructure/Emails/EmailsConfiguration.cs",
    "chars": 273,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.Infrastructure.Emails\n{\n    public class EmailsConfiguration\n    {\n    "
  },
  {
    "path": "src/BuildingBlocks/Infrastructure/EventBus/IEventsBus.cs",
    "chars": 344,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.Infrastructure.EventBus\n{\n    public interface IEventsBus : IDisposable"
  },
  {
    "path": "src/BuildingBlocks/Infrastructure/EventBus/IIntegrationEventHandler.cs",
    "chars": 340,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.Infrastructure.EventBus\n{\n    public interface IIntegrationEventHandler"
  },
  {
    "path": "src/BuildingBlocks/Infrastructure/EventBus/InMemoryEventBus.cs",
    "chars": 1719,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.Infrastructure.EventBus\n{\n    public sealed class InMemoryEventBus\n    "
  },
  {
    "path": "src/BuildingBlocks/Infrastructure/EventBus/InMemoryEventBusClient.cs",
    "chars": 851,
    "preview": "using Serilog;\n\nnamespace CompanyName.MyMeetings.BuildingBlocks.Infrastructure.EventBus\n{\n    public class InMemoryEven"
  },
  {
    "path": "src/BuildingBlocks/Infrastructure/EventBus/IntegrationEvent.cs",
    "chars": 394,
    "preview": "using MediatR;\n\nnamespace CompanyName.MyMeetings.BuildingBlocks.Infrastructure.EventBus\n{\n    public abstract class Int"
  },
  {
    "path": "src/BuildingBlocks/Infrastructure/IUnitOfWork.cs",
    "chars": 247,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.Infrastructure\n{\n    public interface IUnitOfWork\n    {\n        Task<in"
  },
  {
    "path": "src/BuildingBlocks/Infrastructure/Inbox/InboxMessage.cs",
    "chars": 628,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.Infrastructure.Inbox\n{\n    public class InboxMessage\n    {\n        publ"
  },
  {
    "path": "src/BuildingBlocks/Infrastructure/InternalCommands/IInternalCommandsMapper.cs",
    "chars": 212,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.Infrastructure.InternalCommands\n{\n    public interface IInternalCommand"
  },
  {
    "path": "src/BuildingBlocks/Infrastructure/InternalCommands/InternalCommand.cs",
    "chars": 304,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.Infrastructure.InternalCommands\n{\n    public class InternalCommand\n    "
  },
  {
    "path": "src/BuildingBlocks/Infrastructure/InternalCommands/InternalCommandsMapper.cs",
    "chars": 702,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.Infrastructure.InternalCommands\n{\n    public class InternalCommandsMapp"
  },
  {
    "path": "src/BuildingBlocks/Infrastructure/Serialization/AllPropertiesContractResolver.cs",
    "chars": 837,
    "preview": "using System.Reflection;\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Serialization;\n\nnamespace CompanyName.MyMeetings."
  },
  {
    "path": "src/BuildingBlocks/Infrastructure/ServiceProviderWrapper.cs",
    "chars": 477,
    "preview": "using Autofac;\n\nnamespace CompanyName.MyMeetings.BuildingBlocks.Infrastructure\n{\n    public class ServiceProviderWrappe"
  },
  {
    "path": "src/BuildingBlocks/Infrastructure/SqlConnectionFactory.cs",
    "chars": 1358,
    "preview": "using System.Data;\nusing System.Data.SqlClient;\nusing CompanyName.MyMeetings.BuildingBlocks.Application.Data;\n\nnamespac"
  },
  {
    "path": "src/BuildingBlocks/Infrastructure/StronglyTypedIdValueConverterSelector.cs",
    "chars": 2444,
    "preview": "using System.Collections.Concurrent;\nusing CompanyName.MyMeetings.BuildingBlocks.Domain;\nusing Microsoft.EntityFramewor"
  },
  {
    "path": "src/BuildingBlocks/Infrastructure/TypedIdValueConverter.cs",
    "chars": 632,
    "preview": "using CompanyName.MyMeetings.BuildingBlocks.Domain;\nusing Microsoft.EntityFrameworkCore.Storage.ValueConversion;\n\nnames"
  },
  {
    "path": "src/BuildingBlocks/Infrastructure/UnitOfWork.cs",
    "chars": 915,
    "preview": "using CompanyName.MyMeetings.BuildingBlocks.Infrastructure.DomainEventsDispatching;\nusing Microsoft.EntityFrameworkCore"
  },
  {
    "path": "src/BuildingBlocks/Tests/Application.UnitTests/CompanyName.MyMeetings.BuildingBlocks.Application.UnitTests.csproj",
    "chars": 37,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\" />\n"
  },
  {
    "path": "src/BuildingBlocks/Tests/Application.UnitTests/Queries/PagedQueryHelperTests.cs",
    "chars": 1050,
    "preview": "using CompanyName.MyMeetings.BuildingBlocks.Application.Queries;\nusing NUnit.Framework;\n\nnamespace CompanyName.MyMeeting"
  },
  {
    "path": "src/BuildingBlocks/Tests/IntegrationTests/CompanyName.MyMeetings.BuildingBlocks.IntegrationTests.csproj",
    "chars": 35,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\" />"
  },
  {
    "path": "src/BuildingBlocks/Tests/IntegrationTests/EnvironmentVariablesProvider.cs",
    "chars": 792,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.IntegrationTests\n{\n    public static class EnvironmentVariablesProvider"
  },
  {
    "path": "src/BuildingBlocks/Tests/IntegrationTests/Probing/AssertErrorException.cs",
    "chars": 239,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.IntegrationTests.Probing\n{\n    public class AssertErrorException : Exce"
  },
  {
    "path": "src/BuildingBlocks/Tests/IntegrationTests/Probing/IProbe.cs",
    "chars": 363,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.IntegrationTests.Probing\n{\n    public interface IProbe\n    {\n        bo"
  },
  {
    "path": "src/BuildingBlocks/Tests/IntegrationTests/Probing/Poller.cs",
    "chars": 1621,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.IntegrationTests.Probing\n{\n    public class Poller\n    {\n        privat"
  },
  {
    "path": "src/BuildingBlocks/Tests/IntegrationTests/Probing/Timeout.cs",
    "chars": 384,
    "preview": "namespace CompanyName.MyMeetings.BuildingBlocks.IntegrationTests.Probing\n{\n    public class Timeout\n    {\n        priva"
  },
  {
    "path": "src/CompanyName.MyMeetings.sln",
    "chars": 44933,
    "preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.8.3433"
  },
  {
    "path": "src/Database/.dockerignore",
    "chars": 316,
    "preview": "**/.classpath\n**/.dockerignore\n**/.env\n**/.git\n**/.gitignore\n**/.project\n**/.settings\n**/.toolstarget\n**/.vs\n**/.vscode\n"
  }
]

// ... and 1089 more files (download for full content)

About this extraction

This page contains the full source code of the kgrzybek/modular-monolith-with-ddd GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1289 files (2.2 MB), approximately 657.7k tokens, and a symbol index with 3486 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!