diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index 08c47942c..220d68715 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -41,7 +41,10 @@ def new def create post = model.new(post_params) post.organization = current_organization - if post.save + + persister = ::Persister::PostPersister.new(post) + + if persister.save redirect_to send("#{resource}_path", post) else instance_variable_set("@#{resource}", post) @@ -68,7 +71,10 @@ def update post = current_organization.posts.find params[:id] authorize post instance_variable_set("@#{resource}", post) - if post.update_attributes(post_params) + + persister = ::Persister::PostPersister.new(post) + + if persister.update_attributes(post_params) redirect_to post else render action: :edit, status: :unprocessable_entity diff --git a/app/controllers/transfers_controller.rb b/app/controllers/transfers_controller.rb index 29704e42b..b322f59ab 100644 --- a/app/controllers/transfers_controller.rb +++ b/app/controllers/transfers_controller.rb @@ -2,14 +2,18 @@ class TransfersController < ApplicationController def create @source = find_source @account = Account.find(transfer_params[:destination]) + transfer = Transfer.new( transfer_params.merge(source: @source, destination: @account) ) - transfer.save! - redirect_to redirect_target - rescue ActiveRecord::RecordInvalid - flash[:error] = transfer.errors.full_messages.to_sentence + persister = ::Persister::TransferPersister.new(transfer) + + if persister.save + redirect_to redirect_target + else + flash[:error] = transfer.errors.full_messages.to_sentence + end end def new diff --git a/app/models/user.rb b/app/models/user.rb index 01f416274..4a75173ad 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -61,10 +61,18 @@ def user end def add_to_organization(organization) - organization && members. - find_or_create_by(organization: organization) do |member| - member.entry_date = DateTime.now.utc - end + return unless organization + + member = members.where(organization: organization).first_or_initialize + + return member if member.persisted? + + member.entry_date = DateTime.now.utc + + persister = ::Persister::MemberPersister.new(member) + persister.save + + return member if member.persisted? end def active?(organization) diff --git a/app/services/persister/member_persister.rb b/app/services/persister/member_persister.rb new file mode 100644 index 000000000..4bed82cf1 --- /dev/null +++ b/app/services/persister/member_persister.rb @@ -0,0 +1,13 @@ +module Persister + class MemberPersister + attr_accessor :member + + def initialize(member) + @member = member + end + + def save + member.save + end + end +end diff --git a/app/services/persister/post_persister.rb b/app/services/persister/post_persister.rb new file mode 100644 index 000000000..eb4e94fe3 --- /dev/null +++ b/app/services/persister/post_persister.rb @@ -0,0 +1,17 @@ +module Persister + class PostPersister + attr_accessor :post + + def initialize(post) + @post = post + end + + def save + post.save + end + + def update_attributes(params) + post.update_attributes(params) + end + end +end diff --git a/app/services/persister/transfer_persister.rb b/app/services/persister/transfer_persister.rb new file mode 100644 index 000000000..5e72e46d7 --- /dev/null +++ b/app/services/persister/transfer_persister.rb @@ -0,0 +1,13 @@ +module Persister + class TransferPersister + attr_accessor :transfer + + def initialize(transfer) + @transfer = transfer + end + + def save + transfer.save + end + end +end diff --git a/spec/services/persister/member_persister_spec.rb b/spec/services/persister/member_persister_spec.rb new file mode 100644 index 000000000..9ca7f61b6 --- /dev/null +++ b/spec/services/persister/member_persister_spec.rb @@ -0,0 +1,17 @@ +require 'spec_helper' + +describe Persister::MemberPersister do + let(:organization) { Fabricate(:organization) } + let(:user) { Fabricate(:user) } + + describe '#save' do + it 'saves the member' do + member = Member.new(user: user, organization: organization) + + persister = ::Persister::MemberPersister.new(member) + persister.save + + expect(member).to be_persisted + end + end +end diff --git a/spec/services/persister/post_persister_spec.rb b/spec/services/persister/post_persister_spec.rb new file mode 100644 index 000000000..9592b1fd2 --- /dev/null +++ b/spec/services/persister/post_persister_spec.rb @@ -0,0 +1,28 @@ +require 'spec_helper' + +describe Persister::PostPersister do + let(:organization) { Fabricate(:organization) } + let(:user) { Fabricate(:user) } + let(:category) { Fabricate(:category) } + let(:post) { Fabricate(:post, organization: organization) } + + describe '#save' do + it 'saves the post' do + post = Offer.new(organization: organization, user: user, category: category, title: 'Title') + persister = ::Persister::PostPersister.new(post) + + persister.save + + expect(post).to be_persisted + end + end + + describe '#update_attributes' do + it 'updates the attributes' do + persister = ::Persister::PostPersister.new(post) + persister.update_attributes(title: 'New title') + + expect(post.title).to eq('New title') + end + end +end diff --git a/spec/services/persister/transfer_persister_spec.rb b/spec/services/persister/transfer_persister_spec.rb new file mode 100644 index 000000000..a7d77dab8 --- /dev/null +++ b/spec/services/persister/transfer_persister_spec.rb @@ -0,0 +1,19 @@ +require 'spec_helper' + +describe Persister::TransferPersister do + let(:source_account) { Fabricate(:account) } + let(:destination_account) { Fabricate(:account) } + let(:organization) { Fabricate(:organization) } + let(:post) { Fabricate(:post, organization: organization) } + + describe '#save' do + it 'saves the transfer' do + transfer = Transfer.new(post: post, source: source_account, destination: destination_account) + + persister = ::Persister::TransferPersister.new(transfer) + persister.save + + expect(transfer).to be_persisted + end + end +end