From a5be7c3ac8f61a90bd40b485d2866cce033fea89 Mon Sep 17 00:00:00 2001
From: Laura Hausmann <laura@hausmann.dev>
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
         }