Ensure bookmarks are displayed reverse-chronologically
This commit is contained in:
parent
5f6715db46
commit
9841d193eb
|
@ -119,9 +119,10 @@ function buildLinkHeader(url: string, events: Event[]): string | undefined {
|
||||||
const firstEvent = events[0];
|
const firstEvent = events[0];
|
||||||
const lastEvent = events[events.length - 1];
|
const lastEvent = events[events.length - 1];
|
||||||
|
|
||||||
|
const { localDomain } = Conf;
|
||||||
const { pathname, search } = new URL(url);
|
const { pathname, search } = new URL(url);
|
||||||
const next = new URL(pathname + search, Conf.localDomain);
|
const next = new URL(pathname + search, localDomain);
|
||||||
const prev = new URL(pathname + search, Conf.localDomain);
|
const prev = new URL(pathname + search, localDomain);
|
||||||
|
|
||||||
next.searchParams.set('until', String(lastEvent.created_at));
|
next.searchParams.set('until', String(lastEvent.created_at));
|
||||||
prev.searchParams.set('since', String(firstEvent.created_at));
|
prev.searchParams.set('since', String(firstEvent.created_at));
|
||||||
|
@ -132,7 +133,7 @@ function buildLinkHeader(url: string, events: Event[]): string | undefined {
|
||||||
type Entity = { id: string };
|
type Entity = { id: string };
|
||||||
type HeaderRecord = Record<string, string | string[]>;
|
type HeaderRecord = Record<string, string | string[]>;
|
||||||
|
|
||||||
/** Return results with pagination headers. */
|
/** Return results with pagination headers. Assumes chronological sorting of events. */
|
||||||
function paginated(c: AppContext, events: Event[], entities: (Entity | undefined)[], headers: HeaderRecord = {}) {
|
function paginated(c: AppContext, events: Event[], entities: (Entity | undefined)[], headers: HeaderRecord = {}) {
|
||||||
const link = buildLinkHeader(c.req.url, events);
|
const link = buildLinkHeader(c.req.url, events);
|
||||||
|
|
||||||
|
|
11
src/views.ts
11
src/views.ts
|
@ -47,10 +47,10 @@ async function renderAccounts(c: AppContext, authors: string[], signal = AbortSi
|
||||||
|
|
||||||
/** Render statuses by event IDs. */
|
/** Render statuses by event IDs. */
|
||||||
async function renderStatuses(c: AppContext, ids: string[], signal = AbortSignal.timeout(1000)) {
|
async function renderStatuses(c: AppContext, ids: string[], signal = AbortSignal.timeout(1000)) {
|
||||||
const { since, until, limit } = paginationSchema.parse(c.req.query());
|
const { limit } = paginationSchema.parse(c.req.query());
|
||||||
|
|
||||||
const events = await eventsDB.getEvents(
|
const events = await eventsDB.getEvents(
|
||||||
[{ kinds: [1], ids, relations: ['author', 'event_stats', 'author_stats'], since, until, limit }],
|
[{ kinds: [1], ids, relations: ['author', 'event_stats', 'author_stats'], limit }],
|
||||||
{ signal },
|
{ signal },
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -58,11 +58,14 @@ async function renderStatuses(c: AppContext, ids: string[], signal = AbortSignal
|
||||||
return c.json([]);
|
return c.json([]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const sortedEvents = [...events].sort((a, b) => ids.indexOf(a.id) - ids.indexOf(b.id));
|
||||||
|
|
||||||
const statuses = await Promise.all(
|
const statuses = await Promise.all(
|
||||||
events.map((event) => renderStatus(event, c.get('pubkey'))),
|
sortedEvents.map((event) => renderStatus(event, c.get('pubkey'))),
|
||||||
);
|
);
|
||||||
|
|
||||||
return paginated(c, events, statuses);
|
// TODO: pagination with min_id and max_id based on the order of `ids`.
|
||||||
|
return c.json(statuses);
|
||||||
}
|
}
|
||||||
|
|
||||||
export { renderAccounts, renderEventAccounts, renderStatuses };
|
export { renderAccounts, renderEventAccounts, renderStatuses };
|
||||||
|
|
Loading…
Reference in New Issue