lanej/zendesk2

View on GitHub
lib/zendesk2/create_membership.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true
class Zendesk2::CreateMembership
  include Zendesk2::Request

  request_method :post
  request_path { |r| "/users/#{r.user_id}/organization_memberships.json" }
  request_body { |r| { 'organization_membership' => r.membership_params } }

  def self.accepted_params
    %w(user_id organization_id default)
  end

  def membership_params
    @_membership_params ||= Cistern::Hash.slice(params.fetch('membership'), *self.class.accepted_params)
  end

  def user_id
    params.fetch('membership').fetch('user_id').to_i
  end

  def organization_id
    params.fetch('membership').fetch('organization_id').to_i
  end

  def mock
    user = find!(:users, user_id)
    find!(:organizations, organization_id,
          error: :invalid,
          details: {
            'organization' => [{ 'description' => 'Organization cannot be blank' }],
          })

    if data[:memberships].values.find { |m| m['user_id'] == user_id && m['organization_id'] == organization_id }
      error!(:invalid, description: { 'user_id' => [{ 'description' => 'User has already been taken' }] })
    end

    resource_id = cistern.serial_id

    default_membership = !data[:memberships].values.find { |m| m['user_id'] == user_id && m['default'] }

    resource = {
      'id'              => resource_id,
      'user_id'         => user_id,
      'organization_id' => organization_id,
      'default'         => default_membership,
    }

    data[:memberships][resource_id] = resource

    primary_organization = data[:memberships].values.find { |m| m['user_id'] == user_id && m['default'] }

    if primary_organization
      user['organization_id'] = primary_organization['organization_id']
    end

    mock_response('organization_membership' => resource)
  end
end