QutBioacoustics/baw-server

View on GitHub
app/controllers/taggings_controller.rb

Summary

Maintainability
A
1 hr
Test Coverage
# frozen_string_literal: true

class TaggingsController < ApplicationController
  include Api::ControllerHelper

  # GET /audio_recordings/:audio_recording_id/audio_events/:audio_event_id/taggings
  def index
    do_authorize_class
    get_audio_recording
    get_audio_event
    do_authorize_instance(:show, @audio_event)

    @taggings, opts = Settings.api_response.response_advanced(
      api_filter_params,
      Access::ByPermission.audio_events_tags(current_user, audio_event: @audio_event),
      Tagging,
      Tagging.filter_settings
    )
    respond_index(opts)
  end

  # GET /user_accounts/:user_id/taggings
  def user_index
    do_authorize_class
    @user = User.find(params[:user_id])
    do_authorize_instance(:show, @user)

    @taggings, opts = Settings.api_response.response_advanced(
      api_filter_params,
      Access::ByPermission.audio_events_tags(current_user).where(creator: @user),
      Tagging,
      Tagging.filter_settings
    )
    respond_index(opts)
  end

  # GET /audio_recordings/:audio_recording_id/audio_events/:audio_event_id/taggings/:id
  def show
    do_load_resource
    get_audio_recording
    get_audio_event
    do_authorize_instance
    do_authorize_instance(:show, @audio_event)

    respond_show
  end

  # GET /audio_recordings/:audio_recording_id/audio_events/:audio_event_id/taggings/new
  def new
    do_new_resource
    do_set_attributes
    get_audio_recording
    get_audio_event
    do_authorize_instance

    respond_new
  end

  # POST /audio_recordings/:audio_recording_id/audio_events/:audio_event_id/taggings/
  def create
    do_new_resource
    do_set_attributes(tagging_params)
    get_audio_recording
    get_audio_event
    do_authorize_instance

    if tagging_params && tagging_params[:tag_attributes] && tagging_params[:tag_attributes][:text]
      tag = Tag.where(text: tagging_params[:tag_attributes][:text]).first
      if tag.blank?
        # if the tag with the name does not already exist, create it via tag_attributes
        tag = Tag.new(tagging_params[:tag_attributes])
        render json: tag.errors, status: :unprocessable_entity and return unless tag.save
      end
      @tagging.tag = tag
    else
      # tag attributes are directly available
      @tagging = Tagging.new(tagging_params)
    end

    @tagging.audio_event = @audio_event

    if @tagging.save
      respond_create_success(audio_recording_audio_event_tagging_path(@audio_recording, @audio_event, @tagging))
    else
      respond_change_fail
    end
  end

  # PUT|PATCH /audio_recordings/:audio_recording_id/audio_events/:audio_event_id/taggings/:id
  def update
    do_load_resource
    get_audio_recording
    get_audio_event
    do_authorize_instance

    if @tagging.update(tagging_params)
      respond_show
    else
      respond_change_fail
    end
  end

  ## DELETE /audio_recordings/:audio_recording_id/audio_events/:audio_event_id/taggings/:id
  def destroy
    do_load_resource
    do_authorize_instance

    @tagging.destroy

    respond_destroy
  end

  # GET|POST /taggings/filter
  def filter
    do_authorize_class

    filter_response, opts = Settings.api_response.response_advanced(
      api_filter_params,
      Access::ByPermission.audio_events_tags(current_user),
      Tagging,
      Tagging.filter_settings
    )
    respond_filter(filter_response, opts)
  end

  private

  # override resource name
  def resource_name
    'tagging'
  end

  def get_audio_recording
    @audio_recording = AudioRecording.find(params[:audio_recording_id])
  end

  def get_audio_event
    @audio_event = AudioEvent.find(params[:audio_event_id])

    # avoid the same project assigned more than once to a site
    @tagging.audio_event = @audio_event if defined?(@tagging) && @tagging.audio_event.blank?
  end

  def tagging_params
    params.require(:tagging).permit(:audio_event_id, :tag_id, tag_attributes: [:is_taxonomic, :text, :type_of_tag, :retired, :notes])
  end
end