-
Notifications
You must be signed in to change notification settings - Fork 32
"fields" query param logic
Some models have one to many relations to other models, see Data Model.
For example one Resource Booking record can have multiple Work Periods. When we call endpoint GET /resourceBookings we are getting a list of Resource Bookings which looks like this:
[
{
"id": "dc4477ec-07f8-4c8e-a8fe-ffe38dd290fa",
"projectId": 111,
"userId": "e5e667ad-0950-43c2-8d1d-6e83ad7d1c7e",
"jobId": "2d5e2a52-e0dd-4cd9-8f4c-7cffa43951d0",
// ... all other fields
},
{
"id": "d38a6223-3f91-4300-9ecb-6e5fee173625",
"projectId": 111,
"userId": "39c7376e-2d5c-4601-bc47-6b60f505814d",
"jobId": "2d5e2a52-e0dd-4cd9-8f4c-7cffa43951d0",
// ... all other fields
},
// ... other records
]But we might be interested in getting a list of corresponding Work Periods inside Resource Bookings records like this:
[
{
"id": "dc4477ec-07f8-4c8e-a8fe-ffe38dd290fa",
"projectId": 111,
"userId": "e5e667ad-0950-43c2-8d1d-6e83ad7d1c7e",
"jobId": "2d5e2a52-e0dd-4cd9-8f4c-7cffa43951d0",
// ... all other fields
"workPeriods": [
{
"startDate": "2021-01-01",
"endDate": "2021-01-07"
// ... all other fields
},
{
"startDate": "2021-01-08",
"endDate": "2021-01-15"
// ... all other fields
},
// ... other Work Period records
]
},
{
"id": "d38a6223-3f91-4300-9ecb-6e5fee173625",
"projectId": 111,
"userId": "39c7376e-2d5c-4601-bc47-6b60f505814d",
"jobId": "2d5e2a52-e0dd-4cd9-8f4c-7cffa43951d0",
// ... all other fields
"workPeriods": [
{
"startDate": "2021-01-01",
"endDate": "2021-01-07"
// ... all other fields
},
{
"startDate": "2021-01-08",
"endDate": "2021-01-15"
// ... all other fields
},
// ... other Work Period records
]
},
// ... other records
]Though as we not always want to get such nested data we would like to keep this optional.
Endpoints for getting a list of records (like GET /resourceBookings) or individual records (like GET /resourceBookings/:id) might support fields query param with the next logic:
-
If
fieldsquery params is not defined, then we by default we return all the fields from the main model. -
If
fieldsquery param is defined, then we return only the fields listed in this query param. For example:fields=id,projectIdshould only return records with fieldsidandprojectIdlike this:[ { "id": "dc4477ec-07f8-4c8e-a8fe-ffe38dd290fa", "projectId": 111, }, { "id": "d38a6223-3f91-4300-9ecb-6e5fee173625", "projectId": 111 }, // ... other records ]
-
To return nested model records we have to explicitly list it in the
fieldslist. For example:fields=id,projectId,workPeriodsshould only return records with fieldsidandprojectIdandworkPeriodsfield with the list of associated Work Periods:[ { "id": "dc4477ec-07f8-4c8e-a8fe-ffe38dd290fa", "projectId": 111, "workPeriods": [ { "id": "57646ff9-1cd3-4d3c-88ba-eb09a395366c", "startDate": "2021-01-01", "endDate": "2021-01-07" // ... all other fields of Work Period record }, { "id": "2d5e2a52-e0dd-4cd9-8f4c-7cffa43951d0", "startDate": "2021-01-08", "endDate": "2021-01-15" // ... all other fields of Work Period record }, // ... other Work Period records ] }, { "id": "d38a6223-3f91-4300-9ecb-6e5fee173625", "projectId": 111, "workPeriods": [ { "id": "57646ff9-1cd3-4d3c-88ba-eb09a395366d", "startDate": "2021-03-04", "endDate": "2021-03-10" // ... all other fields of Work Period record }, { "id": "2d5e2a52-e0dd-4cd9-8f4c-7cffa43951d1", "startDate": "2021-03-11", "endDate": "2021-03-17" // ... all other fields of Work Period record }, // ... other Work Period records ] }, // ... other Resource Bookings records ]
-
We should be also able to return only specific fields from the nested model like Work Periods, by listing the particular fields like this:
fields=id,projectId,workPeriods.id,workPeriods.startDatewould only returnidandprojectIdfrom the main model, plusidandstartDatefor the nested Work Periods records:[ { "id": "dc4477ec-07f8-4c8e-a8fe-ffe38dd290fa", "projectId": 111, "workPeriods": [ { "id": "57646ff9-1cd3-4d3c-88ba-eb09a395366c", "startDate": "2021-01-01" }, { "id": "2d5e2a52-e0dd-4cd9-8f4c-7cffa43951d0" "startDate": "2021-01-08" }, // ... other Work Period records ] }, { "id": "d38a6223-3f91-4300-9ecb-6e5fee173625", "projectId": 111, "workPeriods": [ { "id": "57646ff9-1cd3-4d3c-88ba-eb09a395366d", "startDate": "2021-03-04" }, { "id": "2d5e2a52-e0dd-4cd9-8f4c-7cffa43951d1", "startDate": "2021-03-11" }, // ... other Work Period records ] }, // ... other Resource Bookings records ]