diff --git a/backend/src/errors/index.ts b/backend/src/errors/index.ts index 03e5aa3..e62c26a 100644 --- a/backend/src/errors/index.ts +++ b/backend/src/errors/index.ts @@ -38,8 +38,8 @@ export function internalServerError(): Response { return generateErrorResponse('Internal Server Error', 500) } -export function statusNotFound(): Response { - return generateErrorResponse('Status not found', 404) +export function statusNotFound(id: string): Response { + return generateErrorResponse('Resource not found', 404, `Status "${id}" not found`) } export function exceededLimit(detail: string): Response { diff --git a/backend/test/mastodon/accounts.spec.ts b/backend/test/mastodon/accounts.spec.ts index 9878ac0..2fea04f 100644 --- a/backend/test/mastodon/accounts.spec.ts +++ b/backend/test/mastodon/accounts.spec.ts @@ -355,8 +355,6 @@ describe('Mastodon APIs', () => { const data = await res.json>() assert.equal(data.length, 2) - console.log({ data }) - assert(isUUID(data[0].id)) assert.equal(data[0].content, 'my second status') assert.equal(data[0].account.acct, 'sven@' + domain) @@ -472,6 +470,13 @@ describe('Mastodon APIs', () => { } }) + test('get local actor statuses with max_id poiting to unknown id', async () => { + const db = await makeDB() + const req = new Request('https://' + domain + '?max_id=object1') + const res = await accounts_statuses.handleRequest(req, db, 'sven@' + domain) + assert.equal(res.status, 404) + }) + test('get remote actor statuses', async () => { const db = await makeDB() diff --git a/functions/api/v1/accounts/[id]/statuses.ts b/functions/api/v1/accounts/[id]/statuses.ts index 1b4b2d7..638c277 100644 --- a/functions/api/v1/accounts/[id]/statuses.ts +++ b/functions/api/v1/accounts/[id]/statuses.ts @@ -1,5 +1,6 @@ import type { Env } from 'wildebeest/backend/src/types/env' import { PUBLIC_GROUP } from 'wildebeest/backend/src/activitypub/activities' +import * as errors from 'wildebeest/backend/src/errors' import { cors } from 'wildebeest/backend/src/utils/cors' import type { Activity } from 'wildebeest/backend/src/activitypub/activities' import type { Note } from 'wildebeest/backend/src/activitypub/objects/note' @@ -154,9 +155,12 @@ LIMIT ?3 // Client asked to retrieve statuses after the max_id // As opposed to Mastodon we don't use incremental ID but UUID, we need // to retrieve the cdate of the max_id row and only show the newer statuses. - const maxId = url.searchParams.get('max_id') + const maxId = url.searchParams.get('max_id')! const row: any = await db.prepare('SELECT cdate FROM outbox_objects WHERE object_id=?').bind(maxId).first() + if (!row) { + return errors.statusNotFound(maxId) + } afterCdate = row.cdate } diff --git a/functions/api/v1/statuses.ts b/functions/api/v1/statuses.ts index a7c157d..d1ca748 100644 --- a/functions/api/v1/statuses.ts +++ b/functions/api/v1/statuses.ts @@ -48,8 +48,6 @@ export async function handleRequest( if (request.method !== 'POST') { return new Response('', { status: 400 }) } - const contentType = request.headers.get('content-type') - console.log({ contentType }) const body = await readBody(request) console.log(body) @@ -79,7 +77,7 @@ export async function handleRequest( if (body.in_reply_to_id) { inReplyToObject = await getObjectByMastodonId(db, body.in_reply_to_id) if (inReplyToObject === null) { - return errors.statusNotFound() + return errors.statusNotFound(body.in_reply_to_id) } }