From eb19554841511c995319a5c7b9634aefe3e770a3 Mon Sep 17 00:00:00 2001 From: Talysson Oliveira Cassiano Date: Thu, 3 Aug 2017 13:20:03 -0700 Subject: [PATCH 1/3] Reorganize infra folder --- src/infra/{rom => base}/sql_relation.rb | 2 +- src/infra/{rom => database}/relations/users.rb | 6 +++--- src/infra/rom/rom_container.rb | 5 ++++- 3 files changed, 8 insertions(+), 5 deletions(-) rename src/infra/{rom => base}/sql_relation.rb (88%) rename src/infra/{rom => database}/relations/users.rb (52%) diff --git a/src/infra/rom/sql_relation.rb b/src/infra/base/sql_relation.rb similarity index 88% rename from src/infra/rom/sql_relation.rb rename to src/infra/base/sql_relation.rb index daef829..dd7c4ce 100644 --- a/src/infra/rom/sql_relation.rb +++ b/src/infra/base/sql_relation.rb @@ -3,7 +3,7 @@ require 'mysql2' module Infra - module ROM + module Base SQLRelation = ::ROM::Relation[:sql] end end diff --git a/src/infra/rom/relations/users.rb b/src/infra/database/relations/users.rb similarity index 52% rename from src/infra/rom/relations/users.rb rename to src/infra/database/relations/users.rb index d22d5ac..0f22c05 100644 --- a/src/infra/rom/relations/users.rb +++ b/src/infra/database/relations/users.rb @@ -1,9 +1,9 @@ -require 'infra/rom/sql_relation' +require 'infra/base/sql_relation' module Infra - module ROM + module Database module Relations - class Users < SQLRelation + class Users < Base::SQLRelation schema(:users, infer: true) end end diff --git a/src/infra/rom/rom_container.rb b/src/infra/rom/rom_container.rb index 6d522c8..b41011d 100644 --- a/src/infra/rom/rom_container.rb +++ b/src/infra/rom/rom_container.rb @@ -3,7 +3,10 @@ module Infra module ROM ROMContainer = ::ROM.container(:sql, ENV['DATABASE_URL']) do |config| - config.auto_registration(File.dirname(__FILE__), namespace: 'Infra::ROM') + config.auto_registration( + Pathname(__FILE__).dirname.join('..', 'database'), + namespace: 'Infra::Database' + ) end end end From b95c744ddc22f266648736de8393aa9de0069279 Mon Sep 17 00:00:00 2001 From: Talysson Oliveira Cassiano Date: Fri, 20 Oct 2017 11:23:37 -0200 Subject: [PATCH 2/3] Update ROM and use ROM::Repository as base for the repository --- Gemfile.lock | 45 ++++++++++++------- .../infra/user/rom_user_repository_spec.rb | 30 ++++++++----- src/boot.rb | 2 +- src/infra/base/repository.rb | 7 +++ src/infra/user/rom_user_repository.rb | 43 +++++++++++------- 5 files changed, 84 insertions(+), 43 deletions(-) create mode 100644 src/infra/base/repository.rb diff --git a/Gemfile.lock b/Gemfile.lock index 6a8db75..a01aa3b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -29,11 +29,11 @@ GEM dry-container (0.6.0) concurrent-ruby (~> 1.0) dry-configurable (~> 0.1, >= 0.1.3) - dry-core (0.3.1) + dry-core (0.3.4) concurrent-ruby (~> 1.0) dry-equalizer (0.2.0) - dry-initializer (1.4.1) - dry-logic (0.4.1) + dry-initializer (2.3.0) + dry-logic (0.4.2) dry-container (~> 0.2, >= 0.2.6) dry-core (~> 0.2) dry-equalizer (~> 0.2) @@ -50,13 +50,13 @@ GEM dry-container (~> 0.6) dry-equalizer (~> 0.2) inflecto (>= 0.0.2) - dry-types (0.11.0) + dry-types (0.12.1) concurrent-ruby (~> 1.0) dry-configurable (~> 0.1) dry-container (~> 0.3) dry-core (~> 0.2, >= 0.2.1) dry-equalizer (~> 0.2) - dry-logic (~> 0.4, >= 0.4.0) + dry-logic (~> 0.4, >= 0.4.2) inflecto (~> 0.0.0, >= 0.0.2) equalizer (0.0.11) faker (1.8.4) @@ -79,28 +79,41 @@ GEM rack-test (0.6.3) rack (>= 1.0) rake (12.0.0) - rom (3.3.1) + rom (4.0.0) + rom-changeset (~> 1.0) + rom-core (~> 4.0) + rom-mapper (~> 1.0) + rom-repository (~> 2.0) + rom-changeset (1.0.0) + dry-core (~> 0.3, >= 0.3.1) + rom-core (~> 4.0.0.rc) + transproc (~> 1.0) + rom-core (4.0.0) concurrent-ruby (~> 1.0) + dry-container (~> 0.6) dry-core (~> 0.3) dry-equalizer (~> 0.2) - dry-initializer (~> 1.3) - dry-types (~> 0.9, >= 0.9.4) - rom-mapper (~> 0.5, >= 0.5.1) + dry-initializer (~> 2.0) + dry-types (~> 0.12, >= 0.12.1) + rom-mapper (~> 1.0) rom-factory (0.4.0) dry-configurable (~> 0.1) dry-core (~> 0.2) dry-struct (~> 0.2) faker (~> 1.7) - rom-mapper (0.5.1) - dry-core (~> 0.2, >= 0.2.3) + rom-mapper (1.0.0) + dry-core (~> 0.3, >= 0.3.1) dry-equalizer (~> 0.2) transproc (~> 1.0) - rom-sql (1.3.3) + rom-repository (2.0.0) + dry-struct (~> 0.3) + rom-mapper (~> 1.0) + rom-sql (2.0.0) dry-core (~> 0.3) dry-equalizer (~> 0.2) - dry-types (~> 0.10, >= 0.10.2) - rom (~> 3.2, >= 3.2.2) - sequel (~> 4.43) + dry-types (~> 0.12, >= 0.12.1) + rom-core (~> 4.0) + sequel (>= 4.49) rspec (3.6.0) rspec-core (~> 3.6.0) rspec-expectations (~> 3.6.0) @@ -114,7 +127,7 @@ GEM diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.6.0) rspec-support (3.6.0) - sequel (4.48.0) + sequel (5.1.0) shotgun (0.9.2) rack (>= 1.0) simplecov (0.14.1) diff --git a/spec/unit/infra/user/rom_user_repository_spec.rb b/spec/unit/infra/user/rom_user_repository_spec.rb index 2e08b7c..a74bf8e 100644 --- a/spec/unit/infra/user/rom_user_repository_spec.rb +++ b/spec/unit/infra/user/rom_user_repository_spec.rb @@ -1,19 +1,27 @@ require 'spec_helper' +require 'infra/rom/rom_container' require 'infra/user/rom_user_repository' +require 'domain/user/user' describe Infra::User::ROMUserRepository do - let(:user_repository) { Infra::User::ROMUserRepository.new } + let(:user_repository) { Infra::User::ROMUserRepository.new(Infra::ROM::ROMContainer) } describe '#get_all' do context 'when there are users on the database' do - before { create(:user, name: 'Me', email: 'me@email.com') } + before do + create(:user, name: 'Me', email: 'me@email.com') + create(:user, name: 'You', email: 'you@email.com') + end it 'return persisted users' do users = user_repository.get_all - expect(users.size).to eq 1 + expect(users.size).to eq 2 expect(users[0].name).to eq 'Me' expect(users[0].email).to eq 'me@email.com' + + expect(users[1].name).to eq 'You' + expect(users[1].email).to eq 'you@email.com' end end @@ -47,19 +55,21 @@ end end - describe '#create' do - it 'creates a user' do + describe '#add' do + let(:user) { Domain::User::User.new(name: 'Me', email: 'me@example.com') } + + it 'creates a user in the database' do expect { - user_repository.create(name: 'Me', email: 'me@example.com') + user_repository.add(user) }.to change { user_repository.count }.by(1) end it 'returns the new user' do - user = user_repository.create(name: 'Me', email: 'me@example.com') + new_user = user_repository.add(user) - expect(user.id).to be_truthy - expect(user.name).to eq 'Me' - expect(user.email).to eq 'me@example.com' + expect(new_user.id).to be_truthy + expect(new_user.name).to eq 'Me' + expect(new_user.email).to eq 'me@example.com' end end diff --git a/src/boot.rb b/src/boot.rb index 2554113..7071c0e 100644 --- a/src/boot.rb +++ b/src/boot.rb @@ -32,7 +32,7 @@ end namespace('user') do - register('user_repository') { Infra::User::ROMUserRepository.new } + register('user_repository') { Infra::User::ROMUserRepository.new(container['infra.rom.rom']) } end end end diff --git a/src/infra/base/repository.rb b/src/infra/base/repository.rb new file mode 100644 index 0000000..8878384 --- /dev/null +++ b/src/infra/base/repository.rb @@ -0,0 +1,7 @@ +require 'rom-repository' + +module Infra + module Base + Repository = ::ROM::Repository + end +end diff --git a/src/infra/user/rom_user_repository.rb b/src/infra/user/rom_user_repository.rb index df115ac..a11fba2 100644 --- a/src/infra/user/rom_user_repository.rb +++ b/src/infra/user/rom_user_repository.rb @@ -1,41 +1,52 @@ require 'import' +require 'infra/base/repository' +require 'domain/user/user' module Infra module User - class ROMUserRepository - include Import[ - 'domain.user.user_entity', - 'infra.rom.rom' - ] - + class ROMUserRepository < Base::Repository[:users] UserNotFound = Class.new(::StandardError) + auto_struct false + + def add(user) + to_entity(create(user)) + end + def get_all - users.map(&method(:build_entity)) + map_to_entity(users).to_a end def get_by_id(id) - build_entity(users.fetch(id)) + map_to_entity(users.by_pk(id)).one! rescue ::ROM::TupleCountMismatchError raise UserNotFound, id end - def create(attributes) - get_by_id(users.insert(attributes)) - end - def count users.count end private - def users - rom.relations.users + def create(user) + users.command(:create).call(to_database(user)) + end + + def map_to_entity(result_set) + result_set.map_to(entity_class) + end + + def to_entity(hash) + entity_class.new(hash) + end + + def to_database(user) + user.attributes end - def build_entity(user_rom) - user_entity.new(user_rom.to_h) + def entity_class + Domain::User::User end end end From 29cdaac549cc05e0127b1e224db4fea83554c084 Mon Sep 17 00:00:00 2001 From: Talysson Oliveira Cassiano Date: Fri, 20 Oct 2017 11:27:40 -0200 Subject: [PATCH 3/3] Inject user entity class instead of importing it --- src/infra/user/rom_user_repository.rb | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/infra/user/rom_user_repository.rb b/src/infra/user/rom_user_repository.rb index a11fba2..07bb103 100644 --- a/src/infra/user/rom_user_repository.rb +++ b/src/infra/user/rom_user_repository.rb @@ -1,10 +1,11 @@ require 'import' require 'infra/base/repository' -require 'domain/user/user' module Infra module User class ROMUserRepository < Base::Repository[:users] + include Import['domain.user.user_entity'] + UserNotFound = Class.new(::StandardError) auto_struct false @@ -34,20 +35,16 @@ def create(user) end def map_to_entity(result_set) - result_set.map_to(entity_class) + result_set.map_to(user_entity) end def to_entity(hash) - entity_class.new(hash) + user_entity.new(hash) end def to_database(user) user.attributes end - - def entity_class - Domain::User::User - end end end end