Skip to content

Commit 6cf72b4

Browse files
committed
add custom sorting to ARP POA Request controller
1 parent 8eb8fc6 commit 6cf72b4

File tree

2 files changed

+73
-1
lines changed

2 files changed

+73
-1
lines changed

modules/accredited_representative_portal/app/controllers/accredited_representative_portal/v0/power_of_attorney_requests_controller.rb

+18
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ def index
1919
# Validate and normalize pagination parameters
2020
validated_params = PowerOfAttorneyRequestService::ParamsSchema.validate_and_normalize!(params.to_unsafe_h)
2121
page_params = validated_params[:page]
22+
sort_params = validated_params[:sort]
2223

2324
relation = policy_scope(PowerOfAttorneyRequest)
2425
status = params[:status].presence
@@ -37,6 +38,10 @@ def index
3738
MSG
3839
end
3940

41+
if sort_params.present? && sort_params[:by].present?
42+
relation = apply_custom_sorting(relation, sort_params[:by], sort_params[:order])
43+
end
44+
4045
poa_requests = relation.includes(scope_includes)
4146
.paginate(page: page_params[:number], per_page: page_params[:size])
4247

@@ -96,6 +101,19 @@ def scope_includes
96101
{ resolution: :resolving }
97102
]
98103
end
104+
105+
def apply_custom_sorting(relation, sort_field, sort_order)
106+
return relation unless sort_field.present? && sort_order.present?
107+
108+
direction = sort_order.to_s.downcase == 'asc' ? :asc : :desc
109+
110+
case sort_field
111+
when 'created_at'
112+
relation.order(created_at: direction)
113+
else
114+
relation
115+
end
116+
end
99117
end
100118
end
101119
end

modules/accredited_representative_portal/spec/requests/accredited_representative_portal/v0/power_of_attorney_requests_spec.rb

+55-1
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,61 @@ def load_response_fixture(path_suffix)
137137
end
138138
end
139139

140-
describe 'a variety of POA request configurations' do
140+
describe 'sorting' do
141+
let!(:poa_requests) do
142+
[
143+
create(:power_of_attorney_request, :with_veteran_claimant,
144+
created_at: time.to_time - 2.days,
145+
poa_code:),
146+
create(:power_of_attorney_request, :with_veteran_claimant,
147+
created_at: time.to_time - 1.day,
148+
poa_code:),
149+
create(:power_of_attorney_request, :with_veteran_claimant,
150+
created_at: time.to_time - 3.days,
151+
poa_code:)
152+
]
153+
end
154+
155+
it 'sorts by created_at in ascending order' do
156+
get('/accredited_representative_portal/v0/power_of_attorney_requests',
157+
params: { sort: { by: 'created_at', order: 'asc' } })
158+
159+
expect(response).to have_http_status(:ok)
160+
161+
# check that they're sorted by created_at in ascending order
162+
ids = parsed_response.to_h['data'].map { |item| item['id'] }[0..2]
163+
expect(ids).to eq([poa_requests[2].id, poa_requests[0].id, poa_requests[1].id])
164+
end
165+
166+
it 'sorts by created_at in descending order' do
167+
get('/accredited_representative_portal/v0/power_of_attorney_requests',
168+
params: { sort: { by: 'created_at', order: 'desc' } })
169+
170+
expect(response).to have_http_status(:ok)
171+
172+
# check that they're sorted by created_at in descending order
173+
ids = parsed_response.to_h['data'].map { |item| item['id'] }[1..3]
174+
expect(ids).to eq([poa_requests[1].id, poa_requests[0].id, poa_requests[2].id])
175+
end
176+
177+
it 'returns error for invalid sort field' do
178+
get('/accredited_representative_portal/v0/power_of_attorney_requests',
179+
params: { sort: { by: 'invalid_field' } })
180+
181+
expect(response).to have_http_status(:bad_request)
182+
expect(parsed_response.to_h['errors']).to include(/Invalid parameters/)
183+
end
184+
185+
it 'returns error for invalid sort order' do
186+
get('/accredited_representative_portal/v0/power_of_attorney_requests',
187+
params: { sort: { by: 'created_at', order: 'invalid' } })
188+
189+
expect(response).to have_http_status(:bad_request)
190+
expect(parsed_response.to_h['errors']).to include(/Invalid parameters/)
191+
end
192+
end
193+
194+
describe 'a variety of poa request configurations' do
141195
let(:poa_requests) do
142196
[].tap do |memo|
143197
memo <<

0 commit comments

Comments
 (0)