Sha256: daf11013a530864f2a50617d991116d8dbe03564054b55ceb174b591a6575052

Contents?: true

Size: 1.9 KB

Versions: 90

Compression:

Stored size: 1.9 KB

Contents

# frozen_string_literal: true

module Motor
  module Queries
    module Persistance
      NameAlreadyExists = Class.new(StandardError)

      module_function

      def build_from_params(params, current_user = nil)
        query = assign_attributes(Query.new, params)

        query.author = current_user

        query
      end

      def create_from_params!(params, current_user = nil)
        raise NameAlreadyExists if Query.exists?(name: params[:name])

        query = build_from_params(params, current_user)

        ApplicationRecord.transaction do
          query.save!
        end

        query
      rescue ActiveRecord::RecordNotUnique
        retry
      end

      def update_from_params!(query, params, force_replace: false)
        tag_ids = query.tags.ids

        query = assign_attributes(query, params)

        raise NameAlreadyExists if !force_replace && name_already_exists?(query)

        ApplicationRecord.transaction do
          archive_with_existing_name(query) if force_replace

          query.save!
        end

        query.touch if tag_ids.sort != query.tags.reload.ids.sort && params[:updated_at].blank?

        query
      rescue ActiveRecord::RecordNotUnique
        retry
      end

      def assign_attributes(query, params)
        query.assign_attributes(params.slice(:name, :description, :sql_body, :preferences))
        query.updated_at = [params[:updated_at], Time.current].min if params[:updated_at].present?

        Motor::Tags.assign_tags(query, params[:tags])
      end

      def archive_with_existing_name(query)
        Motor::Query.where(['name = ? AND id != ?', query.name, query.id])
                    .update_all(deleted_at: Time.current)
      end

      def name_already_exists?(query)
        if query.new_record?
          Query.exists?(name: query.name)
        else
          Query.exists?(['name = ? AND id != ?', query.name, query.id])
        end
      end
    end
  end
end

Version data entries

90 entries across 90 versions & 1 rubygems

Version Path
motor-admin-0.2.38 lib/motor/queries/persistance.rb
motor-admin-0.2.37 lib/motor/queries/persistance.rb
motor-admin-0.2.36 lib/motor/queries/persistance.rb
motor-admin-0.2.35 lib/motor/queries/persistance.rb
motor-admin-0.2.34 lib/motor/queries/persistance.rb
motor-admin-0.2.33 lib/motor/queries/persistance.rb
motor-admin-0.2.32 lib/motor/queries/persistance.rb
motor-admin-0.2.31 lib/motor/queries/persistance.rb
motor-admin-0.2.30 lib/motor/queries/persistance.rb
motor-admin-0.2.29 lib/motor/queries/persistance.rb
motor-admin-0.2.28 lib/motor/queries/persistance.rb
motor-admin-0.2.27 lib/motor/queries/persistance.rb
motor-admin-0.2.26 lib/motor/queries/persistance.rb
motor-admin-0.2.25 lib/motor/queries/persistance.rb
motor-admin-0.2.24 lib/motor/queries/persistance.rb
motor-admin-0.2.23 lib/motor/queries/persistance.rb
motor-admin-0.2.22 lib/motor/queries/persistance.rb
motor-admin-0.2.21 lib/motor/queries/persistance.rb
motor-admin-0.2.20 lib/motor/queries/persistance.rb
motor-admin-0.2.19 lib/motor/queries/persistance.rb