public async Task <IActionResult> Save(Guid id, [FromBody] UserDto user)
        {
            var ety = new EventStoreEntityDto {
                ID      = user.Id.ToString(),
                Version = user.Version.Value,
                Data    = user.ToUser()
            };

            var json = JsonConvert.SerializeObject(ety, new JsonSerializerSettings {
                ContractResolver = new CamelCasePropertyNamesContractResolver()
            });

            var client  = _httpClientFactory.CreateClient();
            var content = new StringContent(json, Encoding.UTF8, "application/json");
            var resp    = await client.PutAsync($"{_evtStoreBaseUrl}/{user.Id}", content);

            if (resp.StatusCode != HttpStatusCode.OK)
            {
                var err = await resp.Content.ReadAsStringAsync();

                return(StatusCode((int)resp.StatusCode, err));
            }

            var tmp = await resp.Content.ReadAsStringAsync();

            var respUser = JsonConvert.DeserializeObject <EventStoreEntityDto>(tmp);

            var result = new UserDto();

            result.FromUser(respUser.Data);
            result.Version = respUser.Version;

            await _daprClient.PublishEventAsync(_eventStoreOptions.TopicName, new UserUpdated
            {
                Id      = respUser.ID,
                Version = respUser.Version
            });

            return(Ok(result));
        }
        public async Task <IActionResult> Add([FromBody] UserDto user)
        {
            user.Id      = Guid.NewGuid();
            user.Version = 0;

            var ety = new EventStoreEntityDto {
                ID      = user.Id.ToString(),
                Version = 1,
                Data    = user.ToUser()
            };

            var json = JsonConvert.SerializeObject(ety, new JsonSerializerSettings {
                ContractResolver = new CamelCasePropertyNamesContractResolver()
            });

            var client  = _httpClientFactory.CreateClient();
            var content = new StringContent(json, Encoding.UTF8, "application/json");
            var resp    = await client.PostAsync($"{_evtStoreBaseUrl}/{user.Id}", content);

            if (resp.StatusCode != HttpStatusCode.Created)
            {
                var err = await resp.Content.ReadAsStringAsync();

                return(StatusCode((int)resp.StatusCode, err));
            }

            var tmp = await resp.Content.ReadAsStringAsync();

            var respUser = JsonConvert.DeserializeObject <EventStoreEntityDto>(tmp);

            user.Version = respUser.Version;

            // publish events
            await _daprClient.PublishEventAsync(_eventStoreOptions.TopicName, new UserAdded {
                Id      = user.Id.ToString(),
                Version = user.Version.Value
            });

            return(Created("QueryUserApi/todo", user));
        }