Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 29 additions & 16 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -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)
Expand Down
30 changes: 20 additions & 10 deletions spec/unit/infra/user/rom_user_repository_spec.rb
Original file line number Diff line number Diff line change
@@ -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

Expand Down Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion src/boot.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
7 changes: 7 additions & 0 deletions src/infra/base/repository.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
require 'rom-repository'

module Infra
module Base
Repository = ::ROM::Repository
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
require 'mysql2'

module Infra
module ROM
module Base
SQLRelation = ::ROM::Relation[:sql]
end
end
Original file line number Diff line number Diff line change
@@ -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
Expand Down
5 changes: 4 additions & 1 deletion src/infra/rom/rom_container.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
38 changes: 23 additions & 15 deletions src/infra/user/rom_user_repository.rb
Original file line number Diff line number Diff line change
@@ -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
Expand Down