Skip to content

Commit 2272af6

Browse files
committed
Create getMealRequests query and tests
1 parent c7fe515 commit 2272af6

File tree

4 files changed

+160
-1
lines changed

4 files changed

+160
-1
lines changed

backend/app/graphql/meal_request.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,21 @@ class MealRequestMutations(MutationList):
306306

307307

308308
class MealRequestQueries(QueryList):
309+
# Get all meal requests, with option to filter by certain statuses
310+
getMealRequests = graphene.List(
311+
MealRequestResponse,
312+
admin_id=graphene.ID(required=True), # Admin ID
313+
min_drop_off_date=graphene.Date(default_value=None),
314+
max_drop_off_date=graphene.Date(default_value=None),
315+
status=graphene.List(
316+
graphene.Enum.from_enum(MealStatus),
317+
default_value=MEAL_STATUSES_ENUMS,
318+
),
319+
offset=graphene.Int(default_value=0),
320+
limit=graphene.Int(default_value=None),
321+
sort_by_date_direction=SortDirection(default_value=SortDirection.ASCENDING),
322+
)
323+
309324
getMealRequestsByRequestorId = graphene.List(
310325
MealRequestResponse,
311326
requestor_id=graphene.ID(required=True),
@@ -334,6 +349,50 @@ class MealRequestQueries(QueryList):
334349
ids=graphene.List(graphene.ID),
335350
)
336351

352+
@secure_requestor_id
353+
def resolve_getMealRequests(
354+
self,
355+
info,
356+
admin_id: str,
357+
min_drop_off_date: str,
358+
max_drop_off_date: str,
359+
status: List[MealStatus],
360+
offset: int,
361+
limit: int,
362+
sort_by_date_direction: SortDirection,
363+
):
364+
# The user must actually be an admin to view all meal requests
365+
user_service = services["user_service"]
366+
admin_auth_id = user_service.get_auth_id_by_user_id(admin_id)
367+
admin_role = user_service.get_user_role_by_auth_id(admin_auth_id)
368+
if admin_role != "Admin":
369+
raise Exception("Only admins can view all meal requests")
370+
371+
meal_request_dtos = services["meal_request_service"].get_meal_requests(
372+
min_drop_off_date,
373+
max_drop_off_date,
374+
status,
375+
offset,
376+
limit,
377+
sort_by_date_direction,
378+
)
379+
380+
return [
381+
MealRequestResponse(
382+
id=meal_request_dto.id,
383+
requestor=meal_request_dto.requestor,
384+
status=meal_request_dto.status,
385+
drop_off_datetime=meal_request_dto.drop_off_datetime,
386+
meal_info=meal_request_dto.meal_info,
387+
onsite_contacts=meal_request_dto.onsite_contacts,
388+
date_created=meal_request_dto.date_created,
389+
date_updated=meal_request_dto.date_updated,
390+
delivery_instructions=meal_request_dto.delivery_instructions,
391+
donation_info=meal_request_dto.donation_info,
392+
)
393+
for meal_request_dto in meal_request_dtos
394+
]
395+
337396
@secure_requestor_id
338397
def resolve_getMealRequestById(
339398
self,

backend/app/services/implementations/meal_request_service.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,50 @@ def delete_meal_request(self, meal_request_id: str) -> MealRequestDTO:
260260
self.logger.error(str(error))
261261
raise error
262262

263+
def get_meal_requests(
264+
self,
265+
min_drop_off_date,
266+
max_drop_off_date,
267+
status: List[MealStatus],
268+
offset,
269+
limit,
270+
sort_by_date_direction,
271+
) -> List[MealRequestDTO]:
272+
status_value_list = list(map(lambda stat: stat.value, status))
273+
try:
274+
sort_prefix = "+"
275+
if sort_by_date_direction == SortDirection.DESCENDING:
276+
sort_prefix = "-"
277+
requests = MealRequest.objects(
278+
status__in=status_value_list,
279+
).order_by(f"{sort_prefix}drop_off_datetime")
280+
281+
# Filter results by optional parameters.
282+
# Since we want to filter these optionally (i.e. filter only if specified),
283+
# we cannot include them in the query above.
284+
if min_drop_off_date is not None:
285+
requests = requests.filter(
286+
drop_off_datetime__gte=min_drop_off_date,
287+
)
288+
if max_drop_off_date is not None:
289+
requests = requests.filter(
290+
drop_off_datetime__lte=max_drop_off_date,
291+
)
292+
if limit is not None:
293+
requests = requests[offset : offset + limit]
294+
else:
295+
requests = requests[offset:]
296+
297+
meal_request_dtos = []
298+
for request in requests:
299+
meal_request_dtos.append(request.to_dto())
300+
301+
return meal_request_dtos
302+
303+
except Exception as error:
304+
self.logger.error(str(error))
305+
raise error
306+
263307
def get_meal_requests_by_requestor_id(
264308
self,
265309
requestor_id,

backend/app/services/interfaces/meal_request_service.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,18 @@ def commit_to_meal_request(
6363
) -> List[MealRequestDTO]:
6464
pass
6565

66+
@abstractmethod
67+
def get_meal_requests(
68+
self,
69+
min_drop_off_date,
70+
max_drop_off_date,
71+
status,
72+
offset,
73+
limit,
74+
sort_by_date_direction,
75+
) -> List[MealRequestDTO]:
76+
pass
77+
6678
@abstractmethod
6779
def get_meal_request_by_id(
6880
self,

backend/tests/graphql/test_meal_request.py

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ def test_create_meal_request_fails_repeat_date(
261261
existing_date = datetime.strptime(
262262
meal_request.drop_off_datetime, "%Y-%m-%dT%H:%M:%S"
263263
)
264-
invalid_new_time = str((existing_date + timedelta(hours=3)).time())+ "Z"
264+
invalid_new_time = str((existing_date + timedelta(hours=3)).time()) + "Z"
265265

266266
counter_before = MealRequest.objects().count()
267267
mutation = f"""
@@ -937,6 +937,50 @@ def test_delete_meal_request_as_non_admin_fails_if_donor(meal_request_setup):
937937
assert MealRequest.objects(id=meal_request.id).first() is not None
938938

939939

940+
def test_get_meal_requests(meal_request_setup, onsite_contact_setup, user_setup):
941+
asp, donor, meal_request = meal_request_setup
942+
asp_onsite_contact, _, donor_onsite_contact, _ = onsite_contact_setup
943+
_, _, admin = user_setup
944+
945+
executed = graphql_schema.execute(
946+
f"""{{
947+
getMealRequests(adminId: "{str(admin.id)}") {{
948+
id
949+
requestor {{
950+
id
951+
}},
952+
status,
953+
dropOffDatetime,
954+
mealInfo {{
955+
portions
956+
dietaryRestrictions
957+
}},
958+
onsiteContacts {{
959+
name
960+
email
961+
phone
962+
}},
963+
dateCreated,
964+
dateUpdated,
965+
deliveryInstructions,
966+
donationInfo {{
967+
donor {{
968+
id
969+
}},
970+
commitmentDate
971+
mealDescription
972+
additionalInfo
973+
}}
974+
}}
975+
}}"""
976+
)
977+
978+
assert len(executed.data["getMealRequests"]) == 1
979+
result = executed.data["getMealRequests"][0]
980+
assert result["requestor"]["id"] == str(asp.id)
981+
assert result["id"] == str(meal_request.id)
982+
983+
940984
def test_get_meal_request_by_donor_id(meal_request_setup, onsite_contact_setup):
941985
_, donor, meal_request = meal_request_setup
942986

0 commit comments

Comments
 (0)