Skip to content
Snippets Groups Projects
Commit 8b90f378 authored by Mauricio Giacomini Girardello's avatar Mauricio Giacomini Girardello
Browse files

improve reviews routes

parent d2b3dc97
No related branches found
No related tags found
No related merge requests found
......@@ -2,12 +2,12 @@ class V1::ReviewsController < ApplicationController
before_action :set_review, only: [:show, :destroy, :rate]
before_action :authenticate_user!, only: [:create, :rate, :destroy]
# GET /v1/reviews
# GET /v1/collections/1/reviews
def index
render json: Review.all
render json: Review.where(reviewable: reviewable)
end
# GET /v1/reviews/1
# GET /v1/collections/1/reviews/1
def show
render json: @review
end
......@@ -15,7 +15,7 @@ class V1::ReviewsController < ApplicationController
# POST /v1/learning_objects/1/reviews
# POST /v1/learning_objects/1/reviews.json
def create
review = Review.new(review_params.merge(user: current_user))
review = reviewable.reviews.new(review_params.merge(user: current_user))
if review.save
render json: review, status: :created
......@@ -35,21 +35,27 @@ class V1::ReviewsController < ApplicationController
# POST /v1/learning_objects/1/reviews/2/rate
# POST /v1/learning_objects/1/reviews/2/rate.json
def rate
approves = 'true' == params[:approves] ? true : false
approves = params[:approves].to_bool
rate = Rate.where(user: current_user, review: @review).first_or_initialize
if rate.update(approves: approves)
render json: rate, status: :ok
render json: rate, status: :created
else
render json: rate.errors, status: :unprocessable_entity
end
end
protected
private
def reviewable
resource, id = request.path.split('/')[2, 3]
reviewable_model = resource.singularize.classify.constantize
@reviewable = reviewable_model.find(id)
end
# Never trust parameters from the scary internet, only allow the white list through.
def review_params
params.require(:review).permit(:name, :description, :pros, :cons, :reviewable_id, :reviewable_type)
params.require(:review).permit(:name, :description, :pros, :cons)
end
def set_review
......
......@@ -8,17 +8,13 @@
# review_id :integer
# created_at :datetime not null
# updated_at :datetime not null
#
class Rate < ActiveRecord::Base
belongs_to :user
belongs_to :review
validates_presence_of :user, :review
validates_inclusion_of :approves, in: [true, false]
validates_uniqueness_of :user, scope: :review
validate :cannot_rate_your_own, on: :create
private
......
......@@ -17,7 +17,7 @@ Rails.application.routes.draw do
end
concern :reviewable do
resources :reviews do
resources :reviews, except: :update do
member do
post :rate
end
......@@ -41,8 +41,8 @@ Rails.application.routes.draw do
resources :bookmarks, module: 'users', only: [:index, :create, :destroy]
end
end
resources :collections, concerns: [:followable, :sociable]
resources :learning_objects, concerns: [:sociable] do
resources :collections, concerns: [:followable, :sociable, :reviewable]
resources :learning_objects, concerns: [:sociable, :reviewable] do
member do
resource :chunk, module: 'learning_objects', only: [:create, :show]
resource :upload, module: 'learning_objects', only: :create
......
require 'test_helper'
class V1::ReviewsControllerTest < ActionController::TestCase
tests V1::ReviewsController
include Devise::TestHelpers
test 'should get index' do
skip('Unsolved issue: ArgumentError: wrong number of arguments (2 for 0)')
end
test 'should user review collection and return :created code' do
auth_request users(:jack)
post :create, review: {name: 'test review', description: 'description',
pros: 'pros', cons: 'cons', reviewable_id: learning_objects(:institution_lo).id, reviewable_type: 'LearningObject'}
assert_response :created
end
end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment