Add ability to sort and paginate repository tags by publishing date
Context
This is required to support gitlab#351031 (closed) and is related to the new List Repository Tags API endpoint.
Problem
We lack support for sorting and paginating tags by their publishing date on the registry API. Right now, we always sort tags by name, and the pagination cursor (the last tag on the last page) is the tag name as well.
It's important to note that there is no "published at" timestamp for tags on the registry side, we only have the "created at" and "updated at" timestamps. When a tag is first created, the "created at" is set to the current timestamp, and "updated at" is left empty. If/once the tag is switched/re-pushed, the registry will set the "updated at" to the current timestamp. On the Rails side, and for users, it's currently irrelevant to distinguish between creation and update timestamps. Instead, users are focused on when a tag was last created OR updated (i.e., published).
Solution
To make this possible we need to add support for sorting tags by their virtually computed "published at" timestamp (calculated with GREATEST(updated_at, created_at)
). In the API spec, this can be achieved by accepting a new sort
query parameter. This should then be set to published_at
, i.e. ...&sort=published_at
.
When tags are being sorted by this timestamp, we also need to handle pagination differently. We can't simply do WHERE tags.name > 'last-page-tag-name'
. We need to take the published timestamp of the "last tag on the last page" into account as well. Additionally, because there may be multiple tags with the same published timestamp, we need to have a composite cursor composed of the published timestamp and the name (unique) of the "last tag on the last page". Ideally, this composite cursor should be base64-encoded as <published_at>|<name>
, i.e. ...&last=<base64-encoded>
.
This page may contain information related to upcoming products, features and functionality. It is important to note that the information presented is for informational purposes only, so please do not rely on the information for purchasing or planning purposes. Just like with all projects, the items mentioned on the page are subject to change or delay, and the development, release, and timing of any products, features, or functionality remain at the sole discretion of GitLab Inc.
Note: we introduced the sort
query parameter via Add ability to sort and paginate repository tag... (#1000 - closed) and that assumes that the values are only asc|desc
. We will need to update the query parameter to:
- default to
?sort=name
- update validation to allow
["name","published_at"]
instead of["asc", "desc"]
- support the
-
sign before the entity to sort results in descending order