Module: Goodreads::Reviews

Included in:
Client
Defined in:
lib/goodreads/client/reviews.rb

Instance Method Summary collapse

Instance Method Details

#create_review(book_id, params = {}) ⇒ Object

Add review for a book

Params can include :review, :rating, and :shelf

review: text of the review (optional) rating: rating (0-5) (optional, default is 0 (no rating)) shelf: Name of shelf to add book to (optional, must exist, see: shelves.list)

Note that Goodreads API documentation says that this endpoint accepts the read_at parameter but it does not appear to work as of 2018-06.



51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/goodreads/client/reviews.rb', line 51

def create_review(book_id, params = {})
  params = params.merge(book_id: book_id, v: "2")

  params[:read_at] = params[:read_at].strftime('%Y-%m-%d') if params[:read_at].is_a?(Time)

  params[:'review[review]'] = params.delete(:review) if params[:review]
  params[:'review[rating]'] = params.delete(:rating) if params[:rating]
  params[:'review[read_at]'] = params.delete(:read_at) if params[:read_at]

  data = oauth_request_method(:post, '/review.xml', params)

  Hashie::Mash.new(data["review"])
end

#edit_review(review_id, params = {}) ⇒ Object

Edit review for a book

Params can include :review, :rating, :read_at and :shelf, and :finished

review: text of the review (optional) rating: rating (0-5) (optional, default is 0 (no rating)) shelf: Name of shelf to add book to (optional, must exist, see: shelves.list) read_at: Time object or String in YYYY-MM-DD format (optional) finished: true to mark finished reading (optional) shelf: Name of shelf to add book to (optional, must exist, see: shelves.list)



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/goodreads/client/reviews.rb', line 75

def edit_review(review_id, params = {})
  params = params.merge(v: "2")

  params[:read_at] = params[:read_at].strftime('%Y-%m-%d') if params[:read_at].is_a?(Time)

  params[:'review[review]'] = params.delete(:review) if params[:review]
  params[:'review[rating]'] = params.delete(:rating) if params[:rating]
  params[:'review[read_at]'] = params.delete(:read_at) if params[:read_at]

  # Documentation says that you should use HTTP PUT, but API returns
  # 401 Unauthorized when PUT is used instead of POST
  data = oauth_request_method(:post, "/review/#{review_id}.xml", params)

  Hashie::Mash.new(data["review"])
end

#recent_reviews(params = {}) ⇒ Object

Recent reviews from all members.

params - Select only non-cropped reviews



7
8
9
10
11
12
13
14
# File 'lib/goodreads/client/reviews.rb', line 7

def recent_reviews(params = {})
  skip_cropped = params.delete(:skip_cropped) || false
  data = request("/review/recent_reviews", params)
  return unless data["reviews"] && data["reviews"].key?("review")
  reviews = data["reviews"]["review"].map { |r| Hashie::Mash.new(r) }
  reviews = reviews.select { |r| !r.body.include?(r.url) } if skip_cropped
  reviews
end

#review(id) ⇒ Object

Get review details



18
19
20
21
# File 'lib/goodreads/client/reviews.rb', line 18

def review(id)
  data = request("/review/show", id: id)
  Hashie::Mash.new(data["review"])
end

#reviews(params = {}) ⇒ Object

Get list of reviews



25
26
27
28
29
30
31
32
33
# File 'lib/goodreads/client/reviews.rb', line 25

def reviews(params = {})
  data = request("/review/list", params.merge(v: "2"))
  reviews = data["reviews"]["review"]
  if reviews.present?
    reviews.map { |review| Hashie::Mash.new(review) }
  else
    []
  end
end

#user_review(user_id, book_id, params = {}) ⇒ Object

Get a user’s review for a given book



36
37
38
39
# File 'lib/goodreads/client/reviews.rb', line 36

def user_review(user_id, book_id, params = {})
  data = request('/review/show_by_user_and_book.xml', params.merge(v: "2", user_id: user_id, book_id: book_id))
  Hashie::Mash.new(data["review"])
end