public void TakeSnapshot(Guid aggregateId)
        {
            // arrange;
            var savedEvents = new IAggregateEvent <Guid>[]
            {
                new GiftCardCreated(aggregateId, DateTime.UtcNow.AddDays(-10), 100),
                new GiftCardDebited(aggregateId, 2, DateTime.UtcNow.AddDays(-5), 30),
                new GiftCardDebited(aggregateId, 3, DateTime.UtcNow.AddDays(-2), 20)
            };
            var sut = new GiftCard(aggregateId, savedEvents);

            // act
            sut.TakeSnapshot();

            // assert
            Assert.Equal(3, sut.Version);
            IAggregateChangeset <Guid> changeset = sut.GetChangeset();

            Assert.NotNull(changeset.Snapshot);
            Assert.IsType <GiftCardSnapshot>(changeset.Snapshot);
            var snapshot = changeset.Snapshot as GiftCardSnapshot;

            Assert.Equal(aggregateId, snapshot.AggregateId);
            Assert.Equal(3, snapshot.AggregateVersion);
            Assert.Equal(sut.Balance, snapshot.Balance);
        }
        public async Task <IActionResult> OnPostTakeSnapshot(Guid id)
        {
            GiftCard giftCard = await _repository.FindGiftCardAsync(id)
                                ?? throw new InvalidOperationException("Gift card not found");

            giftCard.TakeSnapshot();
            await _repository.SaveGiftCardAsync(giftCard);

            return(RedirectToPage(new { id }));
        }