-
-
Notifications
You must be signed in to change notification settings - Fork 572
Expand file tree
/
Copy pathrequests_controller.rb
More file actions
121 lines (100 loc) · 3.8 KB
/
requests_controller.rb
File metadata and controls
121 lines (100 loc) · 3.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
module Partners
class RequestsController < BaseController
include Validatable
skip_before_action :require_partner, only: [:new, :create, :validate]
before_action :require_partner_or_org_admin, only: [:new, :create, :validate]
layout :layout
protect_from_forgery with: :exception
def index
@partner = current_partner
@partner_requests = @partner.requests.includes(:item_requests).order(created_at: :desc).limit(10)
end
def new
@partner_request = ::Request.new
@partner_request.item_requests.build
fetch_items
end
def show
@partner_request = current_partner.requests.find(params[:id])
end
def create
create_service = Partners::RequestCreateService.new(
request_type: "quantity",
partner_id: partner.id,
user_id: current_user.id,
comments: partner_request_params[:comments],
item_requests_attributes: partner_request_params[:item_requests_attributes]&.values || []
)
create_service.call
if create_service.errors.none?
flash[:success] = 'Request was successfully created.'
if current_partner
redirect_to partners_request_path(create_service.partner_request.id)
else
redirect_to request_path(create_service.partner_request.id)
end
else
@partner_request = create_service.partner_request
@errors = create_service.errors
fetch_items
Rails.logger.info("[Request Creation Failure] partner_user_id=#{current_user.id} reason=#{@errors.full_messages}")
render :new, status: :unprocessable_entity
end
end
def validate
create_service = Partners::RequestCreateService.new(
request_type: "quantity",
partner_id: partner.id,
user_id: current_user.id,
comments: partner_request_params[:comments],
item_requests_attributes: partner_request_params[:item_requests_attributes]&.values || []
).initialize_only
if create_service.errors.none?
@partner_request = create_service.partner_request
@total_items = @partner_request.total_items
@quota_exceeded = partner.quota_exceeded?(@total_items)
body = render_to_string(template: 'partners/requests/validate', formats: [:html], layout: false)
render json: {valid: true, body: body}
else
render json: {valid: false}
end
end
private
def partner_request_params
params.require(:request).permit(:comments, item_requests_attributes: [:item_id, :quantity, :request_unit])
end
def fetch_items
@requestable_items = PartnerFetchRequestableItemsService.new(partner_id: partner.id).call
# Packs are always enabled, so always fetch item units
item_ids = @requestable_items.to_h.values
if item_ids.present?
@item_units = Item.where(id: item_ids).to_h do |i|
[i.id, i.request_units.to_h { |u| [u.name, u.name.pluralize] }]
end
end
end
def require_partner_or_org_admin
return if current_partner
partner_id = params.permit(:partner_id)[:partner_id]
return redirect_invalid_user if partner_id.blank?
partner = Partner.find(partner_id)
if current_user.has_role?(Role::ORG_ADMIN, current_organization) && current_organization == partner&.organization
@partner = partner
else
redirect_invalid_user
end
end
def redirect_invalid_user
respond_to do |format|
format.html { redirect_to dashboard_path, flash: {error: "That screen is not available. Please try again as a partner."} }
format.json { render body: nil, status: :forbidden }
end
end
def partner
@partner ||= current_partner
end
def layout
@layout ||= current_partner ? "partners/application" : "application"
end
end
end