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/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 diff --git a/src/infra/user/rom_user_repository.rb b/src/infra/user/rom_user_repository.rb index df115ac..07bb103 100644 --- a/src/infra/user/rom_user_repository.rb +++ b/src/infra/user/rom_user_repository.rb @@ -1,41 +1,49 @@ require 'import' +require 'infra/base/repository' module Infra module User - class ROMUserRepository - include Import[ - 'domain.user.user_entity', - 'infra.rom.rom' - ] + class ROMUserRepository < Base::Repository[:users] + include Import['domain.user.user_entity'] 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(user_entity) + end + + def to_entity(hash) + user_entity.new(hash) end - def build_entity(user_rom) - user_entity.new(user_rom.to_h) + def to_database(user) + user.attributes end end end