Skip to content
This repository was archived by the owner on Nov 6, 2021. It is now read-only.

Commit 1e2bf18

Browse files
authored
Create individuals orders (#435)
* Allow HTTP hosts on DiaperBankClient (i.e.: localhost) * Extract multi-item-form helpers from partner requests * Add soft and hard deletes to multi-item-form * Move verify_staus_in_diaper_base to before_filter on PartnerRequestsController * Extract authorize_verified_partners before_action * Introduce individuals requests form * Introduce FamilyRequest model * Use FamilyRequest model on individuals requests * Pull up payload generation for DiaperBankClient.send_family_request * Create individuals request with FamilyRequestService * Rename people_count to person_count to match family request * Introduce item.as_payload to make sure item_id is integer * Leverage FamilyRequest on FamilyRequestPayloadService * Support assigning children through FamilyRequestService * Submit family requests using FamilyRequestService * Add link to individuals diaper request * Fix rubocop violations * Relable person count fields * Verify response directly from subject * Remove flaky test * Remove unused method
1 parent d0e3dbc commit 1e2bf18

24 files changed

+493
-126
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
$(document).on('click', '[data-add-target][data-add-template]', (event) => {
2+
var button = $(event.target)
3+
var target = button.data('add-target');
4+
var template = button.data("add-template");
5+
var templateId = new Date().getTime();
6+
var rendered = template.replace(/([\[_])([0-9]+)([\]_])/g, "$1" + templateId + '$3');
7+
8+
$(target).append(rendered);
9+
10+
event.preventDefault();
11+
});
12+
13+
$(document).on('click', '[data-remove-item]', (event) => {
14+
var button = $(event.target)
15+
var wrapper = button.closest('tr')
16+
if (button.data("remove-item") === "soft") {
17+
wrapper.hide();
18+
button.prev('input[type=hidden]').val('1');
19+
} else {
20+
wrapper.remove()
21+
}
22+
event.preventDefault();
23+
});

app/assets/javascripts/partner_requests.js

Lines changed: 0 additions & 17 deletions
This file was deleted.

app/controllers/application_controller.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,12 @@ def verify_status_in_diaper_base
3333
end
3434
end
3535

36+
def authorize_verified_partners
37+
return if current_partner.verified?
38+
39+
redirect_to partner_requests_path, notice: "Please review your application details and submit for approval in order to make a new request."
40+
end
41+
3642
private
3743

3844
def user_not_authorized
Lines changed: 8 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
class FamilyRequestsController < ApplicationController
22
before_action :authenticate_user!
3+
before_action :verify_status_in_diaper_base
4+
before_action :authorize_verified_partners
35

46
def new
5-
verify_status_in_diaper_base
67
@filterrific = initialize_filterrific(
78
current_partner.children
89
.order(last_name: :asc)
@@ -13,43 +14,13 @@ def new
1314
end
1415

1516
def create
16-
verify_status_in_diaper_base
17-
children = current_partner.children.active.where.not(item_needed_diaperid: nil)
18-
children_grouped_by_diaperid = children.group_by(&:item_needed_diaperid)
19-
api_response = DiaperBankClient.send_family_request(
20-
children: children,
21-
partner: current_partner
22-
)
17+
children = current_partner.children.active.where.not(item_needed_diaperid: [nil, 0])
18+
request = FamilyRequestPayloadService.execute(children: children, partner: current_partner)
2319

24-
if api_response
25-
flash[:notice] = "Request sent to diaper bank successfully"
26-
partner_request = PartnerRequest.new(
27-
api_response
28-
.slice("organization_id")
29-
.merge(partner_id: current_partner.id, sent: true, for_families: true)
30-
)
31-
api_response["requested_items"].each do |item_hash|
32-
partner_request.item_requests.new(
33-
name: item_hash["item_name"],
34-
item_id: item_hash["item_id"],
35-
quantity: item_hash["count"],
36-
).tap do |item_request|
37-
item_request.children =
38-
children_grouped_by_diaperid[item_hash["item_id"]].to_a
39-
end
40-
end
41-
partner_request.save!
42-
redirect_to partner_requests_path
43-
else
44-
render :new
45-
end
46-
end
47-
48-
private
20+
FamilyRequestService.execute(request)
4921

50-
def family_request_params
51-
params.require(:family_request).slice(
52-
:child_ids
53-
)
22+
redirect_to partner_requests_path, notice: "Requested items successfuly!"
23+
rescue ActiveModel::ValidationError
24+
render :new
5425
end
5526
end
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
class IndividualsRequestsController < ApplicationController
2+
helper MultiItemFormHelper
3+
4+
before_action :authenticate_user!
5+
before_action :verify_status_in_diaper_base
6+
before_action :authorize_verified_partners
7+
8+
def new
9+
@request = FamilyRequest.new({}, initial_items: 1)
10+
end
11+
12+
def create
13+
@request = FamilyRequest.new(family_request_params, partner: current_partner)
14+
15+
FamilyRequestService.execute(@request)
16+
17+
redirect_to partner_requests_path, notice: "Requested items successfuly!"
18+
rescue ActiveModel::ValidationError
19+
render :new
20+
end
21+
22+
private
23+
24+
def family_request_params
25+
params.require(:family_request)
26+
.permit(:comments, items_attributes: %i[item_id person_count])
27+
end
28+
end

app/controllers/partner_requests_controller.rb

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,21 @@
11
class PartnerRequestsController < ApplicationController
2+
helper MultiItemFormHelper
3+
24
before_action :authenticate_user!
5+
before_action :verify_status_in_diaper_base, only: %i[new create]
6+
before_action :authorize_verified_partners, only: %i[new]
37

48
def index
59
@partner = current_partner
610
@partner_requests = current_partner.partner_requests.order(created_at: :desc) # PartnerRequest.where(partner_id: current_partner.id)
711
end
812

913
def new
10-
verify_status_in_diaper_base
11-
if current_partner.partner_status.casecmp("verified").zero?
12-
@partner_request = PartnerRequest.new
13-
@partner_request.item_requests.build # required to render the empty items form
14-
else
15-
redirect_to partner_requests_path, notice: "Please review your application details and submit for approval in order to make a new request."
16-
end
14+
@partner_request = PartnerRequest.new
15+
@partner_request.item_requests.build # required to render the empty items form
1716
end
1817

1918
def create
20-
verify_status_in_diaper_base
2119
@partner_request = PartnerRequest.new(partner_request_params.merge(partner_id: current_partner.id))
2220
@partner_request.item_requests << create_item_requests
2321
respond_to do |format|
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
module MultiItemFormHelper
2+
def remove_item_button(label, soft: false)
3+
link_to label, 'javascript:void(0)', class: 'btn btn-warning', data: { remove_item: soft ? "soft" : nil }
4+
end
5+
6+
def add_item_button(label, container: ".fields", &block)
7+
link_to(
8+
label, "javascript:void(0)",
9+
class: "btn btn-outline-primary",
10+
data: { add_target: container, add_template: capture(&block) }
11+
)
12+
end
13+
end

app/helpers/partner_requests_helper.rb

Lines changed: 0 additions & 10 deletions
This file was deleted.

app/models/family_request.rb

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
class FamilyRequest
2+
include ActiveModel::Model
3+
4+
attr_accessor :comments, :partner
5+
attr_reader :items
6+
7+
def initialize(params, partner: nil, initial_items: nil)
8+
@items = [Item.new] * initial_items if initial_items
9+
@partner = partner
10+
super params
11+
end
12+
13+
def items_attributes=(attributes)
14+
@items = attributes.map do |_, params|
15+
Item.new(params.slice(:item_id, :person_count, :children))
16+
end
17+
end
18+
19+
def as_payload
20+
{
21+
organization_id: partner&.diaper_bank_id,
22+
partner_id: partner&.diaper_partner_id,
23+
requested_items: items.map(&:as_payload)
24+
}
25+
end
26+
27+
class Item
28+
include ActiveModel::Model
29+
30+
attr_accessor :item_id, :person_count, :children
31+
32+
def as_payload
33+
{ item_id: item_id&.to_i, person_count: person_count&.to_i }
34+
end
35+
end
36+
end

app/services/diaper_bank_client.rb

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,8 @@ def self.get_available_items(diaper_bank_id)
1515
end
1616
end
1717

18-
def self.send_family_request(children:, partner:)
19-
payload = FamilyRequestPayloadService
20-
.execute(children: children, partner: partner)
21-
22-
response = diaper_post_request(routes.family_requests, payload)
18+
def self.send_family_request(payload)
19+
response = diaper_post_request(routes.family_requests, payload.to_json)
2320
response.body ? JSON.parse(response.body) : nil
2421
end
2522

@@ -35,7 +32,7 @@ def self.request_submission_post(partner_request_id)
3532
def self.https(uri)
3633
# Use a uri with `http://` to not use ssl.
3734
Net::HTTP.new(uri.host, uri.port).tap do |http|
38-
http.use_ssl = true
35+
http.use_ssl = uri.scheme.eql?("https")
3936
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
4037
end
4138
end

0 commit comments

Comments
 (0)