public async Task<IHttpActionResult> CreateOrUpdateBook(JObject rawBook)
 {
     try
     {
         var book = new DatabaseJObject(rawBook);
         if (book.ObjectTypeIsNot(DatabaseObjectType.BOOK, DatabaseObjectType.NONE))
         {
             return Ok(new Result(DatabaseObjectType.BOOK, book.ObjectType));
         }
         else
         {
             book.ObjectType = DatabaseObjectType.BOOK;
             book = await this.databaseClient.CreateOrUpdateBookAsync(book);
             if (book.ObjectId.HasValue)
             {
                 await this.searchClient.CreateOrUpdateBookIndexAsync(book);
                 return Ok(new Result<ObjectIdResult>(new ObjectIdResult { ObjectId = book.ObjectId.Value }));
             }
             else
             {
                 return Ok(new Result("No object ID could be found or created for the book."));
             }
         }
     }
     catch (Exception ex)
     {
         return Ok(new Result(ex.ToString()));
     }
 }
        public async Task<DatabaseJObject> CreateOrUpdateBookAsync(DatabaseJObject book)
        {
            if (!book.ObjectId.HasValue)
            {
                book.ObjectId = await this.GetNextObjectId();
            }

            var document = Document.FromJson(book.JObject.ToString(Newtonsoft.Json.Formatting.None));
            await DatabaseTable.PutItemAsync(document);
            return book;
        }
 public async Task<bool> CreateOrUpdateBookIndexAsync(DatabaseJObject book)
 {
     try
     {
         var indexObject = await this.PrimaryIndex.GetObjectAsync(book.ObjectId.ToString(), new string[] { DatabaseFields.OBJECT_ID });
         if (indexObject != null)
         {
             await PrimaryIndex.SaveObjectAsync(book.JObject);
         }
     }
     catch (AlgoliaException ex)
     {
         if (ex.Message.Equals("ObjectID does not exist"))
         {
             await PrimaryIndex.AddObjectAsync(book.JObject, objectId: book.ObjectId.ToString());
         }
         else
         {
             throw;
         }
     }
     return true;
 }