From 42ac4510eb9aa8a9e165338f7ca5b3719b0df5af Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Sat, 8 Jul 2023 03:24:11 +0200 Subject: [PATCH] [mastodon-client] handle user & note URLs in search --- .../server/api/mastodon/endpoints/search.ts | 1 + packages/megalodon/src/misskey.ts | 52 +++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/packages/backend/src/server/api/mastodon/endpoints/search.ts b/packages/backend/src/server/api/mastodon/endpoints/search.ts index c2f828ad7..8a4817557 100644 --- a/packages/backend/src/server/api/mastodon/endpoints/search.ts +++ b/packages/backend/src/server/api/mastodon/endpoints/search.ts @@ -42,6 +42,7 @@ export function apiSearchMastodon(router: Router): void { !type || type === "hashtags" ? await client.search(query.q, "hashtags", query) : null; + ctx.body = { accounts: acct?.data?.accounts.map((account) => convertAccount(account)) ?? [], diff --git a/packages/megalodon/src/misskey.ts b/packages/megalodon/src/misskey.ts index 07826f316..f2befd31e 100644 --- a/packages/megalodon/src/misskey.ts +++ b/packages/megalodon/src/misskey.ts @@ -2395,6 +2395,32 @@ export default class Misskey implements MegalodonInterface { switch (type) { case 'accounts': { + if (q.startsWith("http://") || q.startsWith("https://")) { + return this.client.post('/api/ap/show', {uri: q}).then(async res => { + if (res.status != 200 || res.data.type != 'User') { + res.status = 200; + res.statusText = "OK"; + res.data = { + accounts: [], + statuses: [], + hashtags: [] + }; + + return res; + } + + const account = await this.converter.userDetail(res.data.object as MisskeyAPI.Entity.UserDetail, this.baseUrlToHost(this.baseUrl)); + + return { + ...res, + data: { + accounts: options?.max_id && options?.max_id >= account.id ? [] : [account], + statuses: [], + hashtags: [] + } + }; + }) + } let params = { query: q } @@ -2468,6 +2494,32 @@ export default class Misskey implements MegalodonInterface { })) } case 'statuses': { + if (q.startsWith("http://") || q.startsWith("https://")) { + return this.client.post('/api/ap/show', {uri: q}).then(async res => { + if (res.status != 200 || res.data.type != 'Note') { + res.status = 200; + res.statusText = "OK"; + res.data = { + accounts: [], + statuses: [], + hashtags: [] + }; + + return res; + } + + const post = await this.noteWithDetails(res.data.object as MisskeyAPI.Entity.Note, this.baseUrlToHost(this.baseUrl), accountCache); + + return { + ...res, + data: { + accounts: [], + statuses: options?.max_id && options.max_id >= post.id ? [] : [post], + hashtags: [] + } + } + }) + } let params = { query: q }