From 0a74bbfe938c7f9438d3121a3f9c39d88cf71d2e Mon Sep 17 00:00:00 2001 From: Jesse Wierzbinski Date: Sun, 26 Nov 2023 12:46:15 -1000 Subject: [PATCH] Fix timelines --- database/entities/Notification.ts | 2 +- server/api/api/v1/accounts/[id]/statuses.ts | 2 +- server/api/api/v1/statuses/[id]/context.ts | 4 ++-- server/api/api/v1/statuses/[id]/index.ts | 2 +- server/api/api/v1/timelines/home.ts | 12 +++++------- server/api/api/v1/timelines/public.ts | 6 +++++- utils/request.ts | 7 +++++++ 7 files changed, 22 insertions(+), 13 deletions(-) diff --git a/database/entities/Notification.ts b/database/entities/Notification.ts index bdef3cb3..f6bd4c00 100644 --- a/database/entities/Notification.ts +++ b/database/entities/Notification.ts @@ -17,7 +17,7 @@ export const notificationToAPI = async ( id: notification.id, type: notification.type, status: notification.status - ? await statusToAPI(notification.status) + ? await statusToAPI(notification.status, notification.account) : undefined, }; }; diff --git a/server/api/api/v1/accounts/[id]/statuses.ts b/server/api/api/v1/accounts/[id]/statuses.ts index 84f8b155..4082e856 100644 --- a/server/api/api/v1/accounts/[id]/statuses.ts +++ b/server/api/api/v1/accounts/[id]/statuses.ts @@ -85,7 +85,7 @@ export default async ( } return jsonResponse( - await Promise.all(objects.map(status => statusToAPI(status))), + await Promise.all(objects.map(status => statusToAPI(status, user))), 200, { Link: linkHeader.join(", "), diff --git a/server/api/api/v1/statuses/[id]/context.ts b/server/api/api/v1/statuses/[id]/context.ts index 5db9307e..ab9aadab 100644 --- a/server/api/api/v1/statuses/[id]/context.ts +++ b/server/api/api/v1/statuses/[id]/context.ts @@ -49,10 +49,10 @@ export default async ( return jsonResponse({ ancestors: await Promise.all( - ancestors.map(status => statusToAPI(status)) + ancestors.map(status => statusToAPI(status, user || undefined)) ), descendants: await Promise.all( - descendants.map(status => statusToAPI(status)) + descendants.map(status => statusToAPI(status, user || undefined)) ), }); }; diff --git a/server/api/api/v1/statuses/[id]/index.ts b/server/api/api/v1/statuses/[id]/index.ts index 8fbc6bea..ad7b7cee 100644 --- a/server/api/api/v1/statuses/[id]/index.ts +++ b/server/api/api/v1/statuses/[id]/index.ts @@ -61,7 +61,7 @@ export default async ( return jsonResponse( { - ...(await statusToAPI(status)), + ...(await statusToAPI(status, user)), // TODO: Add // text: Add source text // poll: Add source poll diff --git a/server/api/api/v1/timelines/home.ts b/server/api/api/v1/timelines/home.ts index ca92bccf..ea54886c 100644 --- a/server/api/api/v1/timelines/home.ts +++ b/server/api/api/v1/timelines/home.ts @@ -78,17 +78,15 @@ export default async (req: Request): Promise => { if (objects.length > 0) { const urlWithoutQuery = req.url.split("?")[0]; linkHeader.push( - `<${urlWithoutQuery}?max_id=${objects[0].id}&limit=${limit}>; rel="next"` - ); - linkHeader.push( - `<${urlWithoutQuery}?since_id=${ - objects[objects.length - 1].id - }&limit=${limit}>; rel="prev"` + `<${urlWithoutQuery}?max_id=${objects.at(-1)?.id}>; rel="next"`, + `<${urlWithoutQuery}?min_id=${objects[0].id}>; rel="prev"` ); } return jsonResponse( - await Promise.all(objects.map(async status => statusToAPI(status))), + await Promise.all( + objects.map(async status => statusToAPI(status, user)) + ), 200, { Link: linkHeader.join(", "), diff --git a/server/api/api/v1/timelines/public.ts b/server/api/api/v1/timelines/public.ts index 2623efee..2f209107 100644 --- a/server/api/api/v1/timelines/public.ts +++ b/server/api/api/v1/timelines/public.ts @@ -3,6 +3,7 @@ import { parseRequest } from "@request"; import { errorResponse, jsonResponse } from "@response"; import { client } from "~database/datasource"; import { statusAndUserRelations, statusToAPI } from "~database/entities/Status"; +import { getFromRequest } from "~database/entities/User"; import type { APIRouteMeta } from "~types/api"; export const meta: APIRouteMeta = applyConfig({ @@ -18,6 +19,7 @@ export const meta: APIRouteMeta = applyConfig({ }); export default async (req: Request): Promise => { + const { user } = await getFromRequest(req); const { local, limit = 20, @@ -81,7 +83,9 @@ export default async (req: Request): Promise => { } return jsonResponse( - await Promise.all(objects.map(async status => statusToAPI(status))), + await Promise.all( + objects.map(async status => statusToAPI(status, user || undefined)) + ), 200, { Link: linkHeader.join(", "), diff --git a/utils/request.ts b/utils/request.ts index 53027326..e4fa0e52 100644 --- a/utils/request.ts +++ b/utils/request.ts @@ -11,6 +11,7 @@ export async function parseRequest(request: Request): Promise> { // Parse SearchParams arrays into JSON arrays const arrayKeys = [...query.keys()].filter(key => key.endsWith("[]")); + const nonArrayKeys = [...query.keys()].filter(key => !key.endsWith("[]")); for (const key of arrayKeys) { const value = query.getAll(key); @@ -18,6 +19,12 @@ export async function parseRequest(request: Request): Promise> { query.append(key, JSON.stringify(value)); } + // Append non array keys to output + for (const key of nonArrayKeys) { + // @ts-expect-error Complains about type + output[key] = query.get(key); + } + const queryEntries = [...query.entries()]; if (queryEntries.length > 0) {