public async Task<HttpResponseMessage> Post(SaveUrlRequest model)
 {
     if (!ModelState.IsValid)
     {
         return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
     }
     ValidationResult<SavedUrl> result = await _urlService.Save(User.Identity.GetUserId(), model);
     if (result.Failed)
     {
         result.AddToModelState(ModelState);
         return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
     }
     return Request.CreateResponse(HttpStatusCode.OK, result.Item);
 }
        public async Task<ValidationResult<SavedUrl>> Save(string userId, SaveUrlRequest model)
        {
            NoSqlSavedUrl savedUrl = new NoSqlSavedUrl(userId, model.Url)
            {
                Description = model.Description,
                NumberOfVisits = 0,
                SavedAt = DateTimeOffset.UtcNow,
                Title = model.Title,
                Tags = model.Tags
            };

            SavedUrlQueueItem queueItem = new SavedUrlQueueItem
            {
                Url = model.Url,
                UserId = userId
            };

            try
            {
                await _urlRepository.Save(savedUrl);
            }
            catch (UniqueKeyViolation)
            {
                ValidationResult<SavedUrl> result = new ValidationResult<SavedUrl>();
                result.AddError("Link already exists");
                return result;
            }

            await Task.WhenAll(new[]
            {
                _urlRepository.Save(new DateOrderedUrl(userId, savedUrl.SavedAt, savedUrl.Url)),
                _queue.EnqueueAsync(queueItem)
            });
            
            return new ValidationResult<SavedUrl>(_mapperFactory.GetSavedUrlMapper().Map(savedUrl));
        }