Skip to content

Commit 4cd924f

Browse files
committed
Create requests, with specs!
1 parent 3895d6b commit 4cd924f

File tree

19 files changed

+351
-11
lines changed

19 files changed

+351
-11
lines changed

.env.test

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
DATABASE_URL=postgres://podify:FJJuo5onaohF8rp@localhost/podify_test
2+
3+
HOST=localhost
4+
PORT=3000
5+
SSL=no

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,4 @@
2727
yarn-debug.log*
2828
.yarn-integrity
2929
/.env.*.local
30+
/spec/examples.txt

.rspec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
--require spec_helper

Gemfile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ group :development, :test do
4848
gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
4949
gem 'pry-rails'
5050
gem 'amazing_print'
51+
52+
gem 'rspec'
53+
gem 'rspec-rails'
54+
gem 'factory_bot_rails'
5155
end
5256

5357
group :development do

Gemfile.lock

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ GEM
8484
responders
8585
warden (~> 1.2.3)
8686
devise-bootstrap-views (1.1.0)
87+
diff-lcs (1.3)
8788
dotenv (2.7.5)
8889
dotenv-rails (2.7.5)
8990
dotenv (= 2.7.5)
@@ -163,6 +164,11 @@ GEM
163164
dry-inflector (~> 0.1)
164165
tilt (~> 2.0, >= 2.0.6)
165166
erubi (1.9.0)
167+
factory_bot (5.2.0)
168+
activesupport (>= 4.2.0)
169+
factory_bot_rails (5.2.0)
170+
factory_bot (~> 5.2.0)
171+
railties (>= 4.2.0)
166172
faraday (1.0.1)
167173
multipart-post (>= 1.2, < 3)
168174
ffi (1.12.2)
@@ -260,6 +266,27 @@ GEM
260266
responders (3.0.0)
261267
actionpack (>= 5.0)
262268
railties (>= 5.0)
269+
rspec (3.9.0)
270+
rspec-core (~> 3.9.0)
271+
rspec-expectations (~> 3.9.0)
272+
rspec-mocks (~> 3.9.0)
273+
rspec-core (3.9.1)
274+
rspec-support (~> 3.9.1)
275+
rspec-expectations (3.9.1)
276+
diff-lcs (>= 1.2.0, < 2.0)
277+
rspec-support (~> 3.9.0)
278+
rspec-mocks (3.9.1)
279+
diff-lcs (>= 1.2.0, < 2.0)
280+
rspec-support (~> 3.9.0)
281+
rspec-rails (4.0.0)
282+
actionpack (>= 4.2)
283+
activesupport (>= 4.2)
284+
railties (>= 4.2)
285+
rspec-core (~> 3.9)
286+
rspec-expectations (~> 3.9)
287+
rspec-mocks (~> 3.9)
288+
rspec-support (~> 3.9)
289+
rspec-support (3.9.2)
263290
ruby_dep (1.5.0)
264291
sass-rails (6.0.0)
265292
sassc-rails (~> 2.1, >= 2.1.1)
@@ -345,6 +372,7 @@ DEPENDENCIES
345372
dry-monads
346373
dry-rails
347374
dry-view
375+
factory_bot_rails
348376
jbuilder (~> 2.7)
349377
letter_opener
350378
listen (>= 3.0.5, < 3.2)
@@ -355,6 +383,8 @@ DEPENDENCIES
355383
pry-rails
356384
puma (~> 4.1)
357385
rails (~> 6.0.2, >= 6.0.2.2)
386+
rspec
387+
rspec-rails
358388
sass-rails (>= 6)
359389
sentry-raven
360390
sequel-devise

config/routes.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
root to: 'sources#index'
55
devise_for :user, class_name: 'DeviseUser'
66

7-
resources :sources, only: %i[index show create] do
7+
resources :requests, only: %i[create]
8+
9+
resources :sources, only: %i[index show] do
810
resources :downloads, only: [] do
911
member do
1012
get 'download', action: :serve, as: :serve

lib/events/publisher.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ module Events
22
class Publisher
33
include Dry::Events::Publisher[:podify]
44

5+
register_event('requests.created')
6+
register_event('requests.destroyed')
7+
58
register_event('sources.created')
69
register_event('sources.destroyed')
710

lib/requests/contract.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
module Requests
2+
class Contract < ApplicationContract
3+
params do
4+
required(:user_id).value(:integer)
5+
required(:source_id).value(:integer)
6+
end
7+
end
8+
end

lib/requests/create.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
module Requests
2+
class Create
3+
include Dry::Monads[:result, :do]
4+
5+
include Podify::Import['events', 'requests.contract']
6+
7+
def call(attrs)
8+
attrs = yield(contract.call(attrs).to_monad).to_h
9+
request = yield create_request(attrs)
10+
events.publish('requests.created', request: request)
11+
Success(request)
12+
end
13+
14+
def create_request(attrs)
15+
Success(Request.create(attrs))
16+
end
17+
end
18+
end

lib/requests/create_for_url.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
module Requests
2+
class CreateForUrl
3+
include Dry::Monads[:result, :do, :maybe]
4+
5+
include Podify::Import[
6+
create_request: 'requests.create',
7+
find_or_create_source: 'sources.find_or_create',
8+
]
9+
10+
def call(user:, url:)
11+
DB.transaction do
12+
source = yield find_or_create_source.call(url)
13+
request = yield create_request.call(user_id: user.id, source_id: source.id)
14+
Success(request)
15+
end
16+
end
17+
end
18+
end

0 commit comments

Comments
 (0)