Skip to content

Commit 50d10a2

Browse files
committed
Add api to accept data requests
In this PR I change how the accepted_at is used. It was in a weird place because right now the owner could create a request that has it set automatically. So basically the code was not really used. I now use it to let the owner approve the requests made through IRIS. This also made it possible to remove the dead code :) references [#125](railslove/recover-backlog#125)
1 parent 8a0fa7b commit 50d10a2

19 files changed

+201
-33
lines changed

.env.test

+1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
STRIPE_SUBSCRIPTION_PRICE_ID=test_price
2+
HAPPY_PDF_API_KEY=HAPPY_KEY
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module Owners
2+
class AcceptDataRequestsController < Owners::ApplicationController
3+
def update
4+
data_request = current_owner.data_requests.find(params[:unaccepted_data_request_id])
5+
result = AcceptDataRequest.call(data_request: data_request)
6+
render json: result.data_request, include: { tickets: { methods: [:encrypted_data, :area_name, :encrypted_data_change_history] } }
7+
end
8+
end
9+
end

app/controllers/owners/data_requests_controller.rb

+1-5
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,7 @@ class DataRequestsController < Owners::ApplicationController
33
def show
44
data_request = current_owner.data_requests.find(params[:id])
55

6-
if data_request.accepted?
7-
render json: data_request, include: { tickets: { methods: [:encrypted_data, :area_name, :encrypted_data_change_history] } }
8-
else
9-
render json: data_request
10-
end
6+
render json: data_request, include: { tickets: { methods: [:encrypted_data, :area_name, :encrypted_data_change_history] } }
117
end
128

139
def index
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module Owners
2+
class UnacceptedDataRequestsController < Owners::ApplicationController
3+
4+
def index
5+
render json: company.data_requests.unaccepted
6+
end
7+
8+
private
9+
10+
def company
11+
current_owner.companies.find(params[:company_id])
12+
end
13+
14+
end
15+
end
+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class AcceptDataRequest
2+
include Interactor
3+
include RequiredAttributes
4+
5+
required_attributes %i[data_request]
6+
7+
def call
8+
if (!data_request.accepted?)
9+
data_request.accept!
10+
end
11+
context.data_request = data_request
12+
end
13+
end

app/models/concerns/rails_admin_config/for_data_request.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ module ForDataRequest
44

55
included do
66
rails_admin do
7-
fields :company, :from, :to, :reason
7+
fields :company, :from, :to, :reason, :iris_health_department
88

99
fields :accepted_at, :tickets do
1010
read_only true

app/models/data_request.rb

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ class DataRequest < ApplicationRecord
22
include ApiSerializable
33
include RailsAdminConfig::ForDataRequest
44

5-
EXPOSED_ATTRIBUTES = %i[id from to accepted_at]
5+
EXPOSED_ATTRIBUTES = %i[id from to reason accepted_at iris_health_department iris_key_of_health_department]
66

77
belongs_to :company
88
has_many :tickets, -> (request) { during(request.time_range) }, through: :company
99

10+
scope :unaccepted, -> { where(accepted_at: nil) }
11+
1012
validates :from, presence: true
1113
validates :to, presence: true
1214
validates :reason, presence: true

config/initializers/rails_admin.rb

-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
require "nested_form/engine"
66
require "nested_form/builder_mixin"
77

8-
RailsAdmin::Config::Actions.register(RailsAdmin::Config::Actions::AcceptDataRequest)
98
RailsAdmin::Config::Actions.register(RailsAdmin::Config::Actions::BlockOwner)
109
RailsAdmin::Config::Actions.register(RailsAdmin::Config::Actions::GenerateOwnerApiToken)
1110

@@ -35,6 +34,5 @@
3534
export
3635
block_owner
3736
generate_owner_api_token
38-
accept_data_request
3937
end
4038
end

config/locales/en.yml

-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
en:
22
admin:
33
actions:
4-
accept_data_request:
5-
menu: 'Accept'
6-
title: 'Accept'
7-
breadcrumb: 'Accept'
84
block_owner:
95
menu: 'Block'
106
title: 'Block'

config/routes.rb

+3
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@
2828
resources :areas, only: %i[index create update show], shallow: true
2929
resources :tickets, only: :index
3030
resources :data_requests, only: %i[show index create], shallow: true
31+
resources :unaccepted_data_requests, only: %i[index], shallow: true do
32+
patch "accept", to: "accept_data_requests#update"
33+
end
3134
get :stats
3235
end
3336
resource :owner, only: %i[show update]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
class AddIrisFieldsToDataRequest < ActiveRecord::Migration[6.1]
2+
def change
3+
add_column :data_requests, :iris_submission_url, :string
4+
add_column :data_requests, :iris_health_department, :text
5+
add_column :data_requests, :iris_key_of_health_department, :text
6+
add_column :data_requests, :iris_key_reference, :text
7+
add_index :data_requests, :accepted_at
8+
end
9+
end

db/schema.rb

+6-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#
1111
# It's strongly recommended that you check this file into your version control system.
1212

13-
ActiveRecord::Schema.define(version: 2021_04_19_095723) do
13+
ActiveRecord::Schema.define(version: 2021_04_22_102308) do
1414

1515
# These are extensions that must be enabled in order to support this database
1616
enable_extension "pgcrypto"
@@ -81,6 +81,11 @@
8181
t.datetime "to"
8282
t.datetime "accepted_at"
8383
t.string "reason"
84+
t.string "iris_submission_url"
85+
t.text "iris_health_department"
86+
t.text "iris_key_of_health_department"
87+
t.text "iris_key_reference"
88+
t.index ["accepted_at"], name: "index_data_requests_on_accepted_at"
8489
t.index ["company_id"], name: "index_data_requests_on_company_id"
8590
end
8691

lib/rails_admin/actions.rb

-16
Original file line numberDiff line numberDiff line change
@@ -36,22 +36,6 @@ class GenerateOwnerApiToken < RailsAdmin::Config::Actions::Base
3636
end
3737
end
3838

39-
class AcceptDataRequest < RailsAdmin::Config::Actions::Base
40-
register_instance_option :visible? do
41-
bindings[:object].class == DataRequest
42-
end
43-
44-
register_instance_option(:member) { true }
45-
register_instance_option(:link_icon) { 'icon-check' }
46-
register_instance_option(:pjax) { false}
47-
register_instance_option(:controller) do
48-
Proc.new do
49-
@object.accept!
50-
51-
redirect_to back_or_index
52-
end
53-
end
54-
end
5539
end
5640
end
5741
end

spec/models/data_request_spec.rb

+22
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
11
require 'rails_helper'
22

33
RSpec.describe DataRequest do
4+
describe "#unaccepted" do
5+
6+
it "returns a list of unaccepted data requests" do
7+
data_request = FactoryBot.create(:data_request)
8+
FactoryBot.create(:data_request, accepted_at: Time.zone.now)
9+
10+
expect(DataRequest.unaccepted).to eq([data_request])
11+
end
12+
13+
end
14+
415
describe "#accept!" do
516
let(:data_request) { FactoryBot.create(:data_request) }
617

@@ -15,5 +26,16 @@
1526
it { is_expected.to change { ticket.reload.status }.to('at_risk') }
1627

1728
it { is_expected.to change { data_request.reload.accepted_at }.from(nil) }
29+
30+
it "only returns tickets from the correct timestamp" do
31+
FactoryBot.create(:ticket, company: data_request.company,
32+
entered_at: data_request.from - 5.minutes,
33+
left_at: data_request.from - 1.minute)
34+
FactoryBot.create(:ticket, company: data_request.company,
35+
entered_at: data_request.to + 1.minute,
36+
left_at: data_request.to + 5.minute)
37+
expect(data_request.tickets).to eq([ticket])
38+
end
39+
1840
end
1941
end

spec/requests/authentication_spec.rb

+3-2
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,9 @@
2424
expect(response.headers['Authorization']).to be_present
2525
end
2626

27-
xit 'returns valid JWT token' do
28-
decoded_token = decoded_jwt_token_from_response(response)
27+
it 'returns valid JWT token' do
28+
token_from_request = response.headers['Authorization'].split(" ").last
29+
decoded_token = JWT.decode(token_from_request, ENV['DEVISE_JWT_SECRET_KEY'], true)
2930

3031
expect(decoded_token.first['sub']).to be_present
3132
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# frozen_string_literal: true
2+
3+
require 'rails_helper'
4+
5+
RSpec.describe Owners::AcceptDataRequestsController do
6+
include_context 'api request authentication'
7+
8+
let(:owner) { FactoryBot.create(:owner) }
9+
let(:company) { FactoryBot.create(:company, owner: owner) }
10+
let(:other_company) { FactoryBot.create(:company, owner: owner) }
11+
let(:area) { FactoryBot.create(:area, company: company) }
12+
13+
before do
14+
sign_in(owner)
15+
end
16+
17+
context "PATCH accepted_data_request update" do
18+
let!(:data_request) do
19+
FactoryBot.create(:ticket, area: area, encrypted_data: "data", entered_at: Time.zone.now.yesterday - 2.hours, left_at: Time.zone.now.yesterday - 1.hour)
20+
FactoryBot.create(:data_request,
21+
company: company,
22+
from: Time.zone.now.yesterday - 4.hours,
23+
to: Time.zone.now.yesterday,
24+
accepted_at: Time.zone.now.yesterday)
25+
FactoryBot.create(:data_request,
26+
company: other_company,
27+
from: Time.zone.now.yesterday - 4.hours,
28+
to: Time.zone.now.yesterday)
29+
FactoryBot.create(:data_request,
30+
company: company,
31+
from: Time.zone.now.yesterday - 4.hours,
32+
to: Time.zone.now.yesterday)
33+
end
34+
35+
before do
36+
patch owners_unaccepted_data_request_accept_path(unaccepted_data_request_id: data_request.id)
37+
end
38+
39+
subject { JSON.parse(response.body) }
40+
41+
it "has the correct data" do
42+
expect(subject['id']).to eq(data_request.id)
43+
expect(data_request.reload.accepted?).to be(true)
44+
end
45+
end
46+
end

spec/requests/owners/area_request_spec.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959
context 'GET qr pdf' do
6060
let!(:area) { FactoryBot.create(:area, company: company) }
6161

62-
xit 'requests the pdf from happy pdf' do
62+
it 'requests the pdf from happy pdf' do
6363
stub_request(:get, %r{http://app.happypdf.com/api/pdf.*})
6464

6565
get owners_area_path(area, format: :pdf)

spec/requests/owners/data_requests_request_spec.rb

+22
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,28 @@
1313
sign_in(owner)
1414
end
1515

16+
context "GET data_request index" do
17+
let!(:data_request) do
18+
FactoryBot.create(:ticket, area: area, encrypted_data: "data", entered_at: Time.zone.now.yesterday - 2.hours, left_at: Time.zone.now.yesterday - 1.hour)
19+
FactoryBot.create(:data_request,
20+
company: company,
21+
from: Time.zone.now.yesterday - 4.hours,
22+
to: Time.zone.now.yesterday,
23+
accepted_at: Time.zone.now.yesterday)
24+
end
25+
26+
before do
27+
get owners_company_data_requests_path(company_id: company.id)
28+
end
29+
30+
subject { JSON.parse(response.body) }
31+
32+
it "has the correct data" do
33+
expect(subject.length).to eq(1)
34+
expect(subject.map{|item| item["id"]}).to eq([data_request.id])
35+
end
36+
end
37+
1638
context 'POST first data_request' do
1739
subject do
1840
-> { post owners_company_data_requests_path(company_id: company.id), params: { data_request: { reason: 'for fun' } } }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# frozen_string_literal: true
2+
3+
require 'rails_helper'
4+
5+
RSpec.describe Owners::UnacceptedDataRequestsController do
6+
include_context 'api request authentication'
7+
8+
let(:owner) { FactoryBot.create(:owner) }
9+
let(:company) { FactoryBot.create(:company, owner: owner) }
10+
let(:other_company) { FactoryBot.create(:company, owner: owner) }
11+
let(:area) { FactoryBot.create(:area, company: company) }
12+
13+
before do
14+
sign_in(owner)
15+
end
16+
17+
context "GET unaccepted_data_request index" do
18+
let!(:data_request) do
19+
FactoryBot.create(:ticket, area: area, encrypted_data: "data", entered_at: Time.zone.now.yesterday - 2.hours, left_at: Time.zone.now.yesterday - 1.hour)
20+
FactoryBot.create(:data_request,
21+
company: company,
22+
from: Time.zone.now.yesterday - 4.hours,
23+
to: Time.zone.now.yesterday,
24+
accepted_at: Time.zone.now.yesterday)
25+
FactoryBot.create(:data_request,
26+
company: other_company,
27+
from: Time.zone.now.yesterday - 4.hours,
28+
to: Time.zone.now.yesterday)
29+
FactoryBot.create(:data_request,
30+
company: company,
31+
from: Time.zone.now.yesterday - 4.hours,
32+
to: Time.zone.now.yesterday)
33+
end
34+
35+
before do
36+
get owners_company_unaccepted_data_requests_path(company_id: company.id)
37+
end
38+
39+
subject { JSON.parse(response.body) }
40+
41+
it "has the correct data" do
42+
expect(subject.length).to eq(1)
43+
expect(subject.map{|item| item["id"]}).to eq([data_request.id])
44+
end
45+
end
46+
end

0 commit comments

Comments
 (0)