shift-org / shift-org/shift-docs

Evaluate an option to fetch limited or all event fields for range requests

Open
#736 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

API backend enhancement frontend question
Dominant language
JavaScript
Stars
30
Forks
25
Avg merge
9m
Merged PRs (30d)
1

Description

Currently, whether you fetch a single event or a range of events from the events endpoint, we send back an events array which contains 1 event object for every matching event. Each event object always includes all of the (public) fields for an event.

For single events, this is obviously desired. For range requests, the client may not need the full object for every single event. For example, the grid view only uses a few properties: id, title, date, time, cancelled, featured, and maybe a few others. We request all of the data for every event that it displays, but to actually see it you have to navigate to an individual ride page (at which point we make a second request and re-fetch the full record anyway).

I did some brief experimenting with past ride data. comparing the current results vs. omitting a handful of fields that aren't likely needed until someone wants to read an individual ride listing:

  • description
  • contact fields: email, phone, contact
  • all of the "print" and "hide" fields (which should be deprecated anyway in this endpoint; see #576)

In my test, this reduced the (uncompressed, but minified) JSON by about 50%, from 512 KB down to 205 KB.

If we want to pursue this further, some considerations:

  • The description and print description fields alone may be responsible for a lot of the weight difference
  • We'll gain some improvements just by deprecating the "print" and "hide" fields for all requests to the events endpoint
  • How would these requests by made — optional URL param? e.g. events.php?startdate=2024-04-04&enddate=2024-04-04&fields=all
  • A sensible default might be to serve the limited response for range requests, unless the client explicitly requests the full records. This wouldn't be backwards-compatible, however. As a transition, we could make it opt-in for now (fields=limited?), but flip the default behavior in the next major API version.
  • Should consider including an additional field in the truncated response, with a URL for the full record
    (e.g. "full_record":"https://localhost:4443/api/events.php?id=12345"; this is different from the shareable URL, which is a link to the web page rather than the API request)
  • Fetching a single event could always return all fields, ignoring the param.
  • Our list view currently makes use of the fact that it has the full event record for every fetched event. If you expand a ride listing in-place, it does so without needing to load a new page or make another request. We should determine which is speedier overall — requesting all event data up front and expanding in-place, or making a just-in-time request to fetch details if/when needed. (This might be different for busy times of year vs less busy ones, e.g. Pedalpalooza vs January.)
  • Find out which core fields Bike Fun app is using for its list and map views and which are needed only for detail views, and if/how they are making follow-up requests.

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by examining the events.php endpoint and comparing the fields used by list and detail views. Review issue #576 and determine which core fields the Bike Fun app uses for list and map views, including any follow-up requests. Done means the response strategy, request parameter, compatibility plan, and full-record behavior are documented.

Written by the indexing model from the issue text.

Assessment

Tech stack
javascript, php
Domain
api, backend, performance
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.