diff --git a/Rakefile b/Rakefile
index c526f38..2e10e6a 100644
--- a/Rakefile
+++ b/Rakefile
@@ -1,3 +1,16 @@
# frozen_string_literal: true
require "hanami/rake_tasks"
+require 'rom/sql/rake_task'
+
+task :environment do
+ require_relative 'config/app'
+ require 'hanami/prepare'
+end
+
+namespace :db do
+ task setup: :environment do
+ Hanami.app.prepare(:persistence)
+ ROM::SQL::RakeSupport.env = Hanami.app['persistence.config']
+ end
+end
\ No newline at end of file
diff --git a/app/actions/players/show.rb b/app/actions/players/show.rb
new file mode 100644
index 0000000..5d7d81a
--- /dev/null
+++ b/app/actions/players/show.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module EuchreCamp
+ module Actions
+ module Players
+ class Show < EuchreCamp::Action
+ include Deps[ repo: 'repositories.players' ]
+
+ def handle(request, response)
+ requested_player = request.params[:id]
+ player = repo.by_id(requested_player)
+ response.render(view, player: player)
+ end
+ end
+ end
+ end
+end
diff --git a/app/templates/players/show.html.erb b/app/templates/players/show.html.erb
new file mode 100644
index 0000000..aff2552
--- /dev/null
+++ b/app/templates/players/show.html.erb
@@ -0,0 +1,5 @@
+
EuchreCamp::Views::Players::Show
+
+<%= player.name %>
+
+<%= player.rating %>
\ No newline at end of file
diff --git a/app/views/players/show.rb b/app/views/players/show.rb
new file mode 100644
index 0000000..52f1de9
--- /dev/null
+++ b/app/views/players/show.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module EuchreCamp
+ module Views
+ module Players
+ class Show < EuchreCamp::View
+ expose :player
+ end
+ end
+ end
+end
diff --git a/config/routes.rb b/config/routes.rb
index dc50297..4071a83 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -3,5 +3,6 @@
module EuchreCamp
class Routes < Hanami::Routes
# Add your routes here. See https://guides.hanamirb.org/routing/overview/ for details.
+ get "/players/:id", to: "players.show"
end
end
diff --git a/db/migrate/20240913010237_create_players.rb b/db/migrate/20240913010237_create_players.rb
new file mode 100644
index 0000000..545cc8d
--- /dev/null
+++ b/db/migrate/20240913010237_create_players.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+ROM::SQL.migration do
+ change do
+ create_table :players do
+ primary_key :id
+ column :name, String, null: false
+ column :rating, Integer, null: false
+ end
+ end
+end
diff --git a/euchre_camp.db b/euchre_camp.db
new file mode 100644
index 0000000..d63e3da
Binary files /dev/null and b/euchre_camp.db differ
diff --git a/lib/euchre_camp/persistence/players.rb b/lib/euchre_camp/persistence/players.rb
new file mode 100644
index 0000000..f1fd95c
--- /dev/null
+++ b/lib/euchre_camp/persistence/players.rb
@@ -0,0 +1,9 @@
+module EuchreCamp
+ module Persistence
+ module Relations
+ class Players < ROM::Relation[:sql]
+ schema(:players, infer: true)
+ end
+ end
+ end
+end
diff --git a/lib/euchre_camp/persistence/repositories/player.rb b/lib/euchre_camp/persistence/repositories/player.rb
new file mode 100644
index 0000000..78a0920
--- /dev/null
+++ b/lib/euchre_camp/persistence/repositories/player.rb
@@ -0,0 +1,17 @@
+module EuchreCamp
+ module Persistence
+ module Repositories
+ class Player < ROM::Repository[:players]
+ commands :create, update: :by_pk, delete: :by_pk
+
+ def all
+ players.to_a
+ end
+
+ def find(id)
+ players.by_pk(id).one!
+ end
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/spec/actions/players/show_spec.rb b/spec/actions/players/show_spec.rb
new file mode 100644
index 0000000..cc1c502
--- /dev/null
+++ b/spec/actions/players/show_spec.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+RSpec.describe EuchreCamp::Actions::Players::Show do
+ let(:params) { Hash[] }
+
+ it "works" do
+ response = subject.call(params)
+ expect(response).to be_successful
+ end
+end