public async Task <IActionResult> Post(ProductViewModel model, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState.Values));
            }

            var product = Mapper.Map <Product>(model);

            var category = await _context.Categories.FirstOrDefaultAsync(p => p.Id == model.CategoryId, cancellationToken);

            product.Category = category;

            await _context.Products.AddAsync(product, cancellationToken);

            var @event = new ProductCreatedIntegrationEvent(
                product.Id,
                product.Name,
                product.Category.Id,
                product.Category.Name,
                product.Price,
                product.Featured);

            await _integrationEvent.SaveEventAndProductContextChangesAsync(@event, cancellationToken);

            await _integrationEvent.PublishThroughEventBusAsync(@event, cancellationToken);

            return(CreatedAtRoute(new { product.Id }, product));
        }