class V1::ReviewsController < ApplicationController include ::DeletedObjectsController before_action :set_review, only: [:show, :destroy, :rate] before_action :authenticate_user!, only: [:create, :rate, :destroy] # GET /v1/collections/1/reviews def index render json: ActiveModel::ArraySerializer.new( reviewable.reviews, each_serializer: ReviewSerializer) end # GET /v1/collections/1/reviews/1 def show render json: @review end # POST /v1/learning_objects/1/reviews # POST /v1/learning_objects/1/reviews.json def create review = reviewable.reviews.new(review_params.merge(user: current_user)) errors = process_creation review # If review has any errors, status 422 if errors.any? render json: errors, status: :unprocessable_entity else render json: review, status: :created end end def process_creation(review) # Store errors errors = [] # If review saved, without errors ... if review.save # ... build ratings objects from parameters review.review_ratings.each do |r| r.review = review # ... and store if r.save errors << r.errors end else errors << review.errors end errors = errors.map { |e| e.messages }.inject(:merge) end # DELETE /v1/learning_objects/1/reviews/2 # DELETE /v1/learning_objects/1/reviews/2.json def destroy authorize @review @review.destroy render nothing: true, status: :ok end # User can rate the review to approve or not # POST /v1/learning_objects/1/reviews/2/rate # POST /v1/learning_objects/1/reviews/2/rate.json def rate 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: :created else render json: rate.errors, status: :unprocessable_entity end end private def deleted_resource Review end 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, review_ratings_attributes: [:rating_id, :value]) end def set_review @review ||= Review.find(params[:id]) end end