private async Task <ProductChangedEvent> PrepareProductChangedEvent(ProductUpsert productUpsert,
                                                                            string correlationToken)
        {
            // Perform Lookup to get Genre and Artist Names
            var artistName = (await _artistRepository.GetById(productUpsert.ArtistId, correlationToken)).Name;
            var genreName  = (await _genreRepository.GetById(productUpsert.GenreId, correlationToken)).Name;

            //// Provide fallback logic in the event we cannot fetch Artist or Genre name
            genreName ??= "Unknown Genre";
            artistName ??= "Unknown Artist";

            // Populate data in the event object
            var productChangedEvent = new ProductChangedEvent
            {
                Id              = productUpsert.Id,
                Title           = productUpsert.Title,
                ArtistName      = artistName,
                GenreName       = genreName,
                Price           = productUpsert.Price,
                ReleaseDate     = productUpsert.ReleaseDate ?? DateTime.UtcNow.Date,
                ParentalCaution = productUpsert.ParentalCaution,
                Upc             = productUpsert.Upc,
                Cutout          = productUpsert.Cutout
            };

            productChangedEvent.CorrelationToken = correlationToken;

            return(productChangedEvent);
        }
        public async Task Add(string correlationToken, Product product)
        {
            // Idempotent write check. Ensure insert with same correlation token has
            // not already happened. This would most likely do to a retry after the
            // product has been added.
            var targetAlbum = await _musicRepository.GetByIdWithIdempotencyCheck(product.Id, correlationToken);

            if (targetAlbum == null)
            {
                // Product has not been added yet
                await _musicRepository.Add(product);

                // Hack: Yet another transformation of same data.
                //       Added to remove issue in new Core Serializer which doesn't allow circular references.
                var productUpsert = new ProductUpsert
                {
                    Id              = product.Id,
                    ArtistId        = product.ArtistId,
                    GenreId         = product.GenreId,
                    Title           = product.Title,
                    ParentalCaution = product.ParentalCaution,
                    Cutout          = product.Cutout,
                    Price           = product.Price,
                    ReleaseDate     = product.ReleaseDate,
                    Upc             = product.Upc
                };
                await _eventBusPublisher.Publish <ProductChangedEvent>(
                    await PrepareProductChangedEvent(productUpsert, correlationToken));
            }
        }
        public async Task Update(string correlationToken, Product product)
        {
            await _musicRepository.Update(product);

            // Hack: Yet another transformation of same data.
            //       Added to remove issue in new Core Serializer which doesn't allow circular references.
            var productUpsert = new ProductUpsert
            {
                Id              = product.Id,
                ArtistId        = product.ArtistId,
                GenreId         = product.GenreId,
                Title           = product.Title,
                ParentalCaution = product.ParentalCaution,
                Cutout          = product.Cutout,
                Price           = product.Price,
                ReleaseDate     = product.ReleaseDate,
                Upc             = product.Upc
            };
            //************** Publish Event  *************************
            await _eventBusPublisher.Publish <ProductChangedEvent>(
                await PrepareProductChangedEvent(productUpsert, correlationToken));
        }