app/controllers/concepts/versions_controller.rb

Summary

Maintainability
A
3 hrs
Test Coverage
# encoding: UTF-8

# Copyright 2011-2013 innoQ Deutschland GmbH
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

class Concepts::VersionsController < ApplicationController
  include RdfSyncService::Helper

  def merge
    concept_scope = Iqvoc::Concept.base_class.by_origin(params[:origin])

    current_concept = concept_scope.published.last
    new_version = concept_scope.unpublished.last

    unless new_version
      raise ActiveRecord::RecordNotFound,
          "Can't find draft concept with origin '#{params[:origin]}'"
    end

    authorize! :merge, new_version

    ActiveRecord::Base.transaction do
      new_version.rdf_updated_at = nil
      new_version.publish

      if new_version.publishable?
        new_version.save

        if current_concept && !current_concept.destroy
          flash[:error] = t('txt.controllers.versioning.merged_delete_error')
          redirect_to concept_path(published: 0, id: new_version)
        end

        if Iqvoc.config['triplestore.autosync']
         synced = triplestore_syncer.sync([new_version]) # XXX: blocking
         flash[:warning] = 'triplestore synchronization failed' unless synced # TODO: i18n
        end

        flash[:success] = t('txt.controllers.versioning.published')
        redirect_to concept_path(id: new_version)
      else
        flash[:error] = t('txt.controllers.versioning.merged_publishing_error')
        redirect_to concept_path(published: 0, id: new_version)
      end
    end
  end

  def branch
    concept_scope = Iqvoc::Concept.base_class.by_origin(params[:origin])
    current_concept = concept_scope.published.last!

    if draft_concept = concept_scope.unpublished.last
      flash[:info] = t('txt.controllers.versioning.branch_error')
      redirect_to concept_path(published: 0, id: draft_concept)
    else
      authorize! :branch, current_concept

      new_version = nil
      ActiveRecord::Base.transaction do
        new_version = current_concept.branch
        new_version.save!
        Iqvoc.change_note_class.create! do |note|
          note.owner = new_version
          note.language = I18n.locale.to_s
          note.position = (current_concept.send(Iqvoc.change_note_class_name.to_relation_name).maximum(:position) || 0).succ
          note.annotations_attributes = [
            { namespace: 'dct', predicate: 'creator', value: current_user.name },
            { namespace: 'dct', predicate: 'modified', value: DateTime.now.to_s }
          ]
        end
      end
      flash[:success] = t('txt.controllers.versioning.branched')
      redirect_to edit_concept_path(published: 0, id: new_version)
    end
  end

  def consistency_check
    concept = Iqvoc::Concept.base_class.
        by_origin(params[:origin]).
        unpublished.
        last!

    authorize! :check_consistency, concept

    if concept.publishable?
      flash[:success] = t('txt.controllers.versioning.consistency_check_success')
      redirect_to concept_path(published: 0, id: concept)
    else
      flash[:error] = t('txt.controllers.versioning.consistency_check_error')
      redirect_to concept_path(published: 0, id: concept, full_consistency_check: '1')
    end
  end

  def to_review
    concept = Iqvoc::Concept.base_class.
        by_origin(params[:origin]).
        unpublished.
        last!

    authorize! :send_to_review, concept

    # Only send the concept to review if it is publishable (e.g. consistency check is OK)
    if concept.publishable?
      concept.to_review
      concept.save!

      flash[:success] = t('txt.controllers.versioning.to_review_success')
      redirect_to concept_path(published: 0, id: concept)
    else
      flash[:error] = t('txt.controllers.versioning.consistency_check_error')
      redirect_to concept_path(published: 0, id: concept, full_consistency_check: '1')
    end
  end
end