diff --git a/api/api/v1/accounts/lookup/index.ts b/api/api/v1/accounts/lookup/index.ts index cf6607c5..2d69c54d 100644 --- a/api/api/v1/accounts/lookup/index.ts +++ b/api/api/v1/accounts/lookup/index.ts @@ -106,6 +106,13 @@ export default apiRoute((app) => // Try to fetch it from database const instance = await Instance.resolveFromHost(instanceHost); + if (!instance) { + return context.json( + { error: `Instance ${instanceHost} not found` }, + 404, + ); + } + const account = await User.fromSql( and( eq(Users.username, username), diff --git a/classes/database/emoji.ts b/classes/database/emoji.ts index a3131af7..4258bddb 100644 --- a/classes/database/emoji.ts +++ b/classes/database/emoji.ts @@ -29,6 +29,7 @@ export class Emoji extends BaseInterface { visible_in_picker: z.boolean(), category: z.string().optional(), static_url: z.string(), + global: z.boolean(), }); public static $type: EmojiWithInstance; diff --git a/classes/database/instance.ts b/classes/database/instance.ts index 4f940f40..5f75c3ae 100644 --- a/classes/database/instance.ts +++ b/classes/database/instance.ts @@ -319,7 +319,7 @@ export class Instance extends BaseInterface { } } - public static resolveFromHost(host: string): Promise { + public static resolveFromHost(host: string): Promise { if (host.startsWith("http")) { const url = new URL(host).host; @@ -331,7 +331,7 @@ export class Instance extends BaseInterface { return Instance.resolve(url.origin); } - public static async resolve(url: string): Promise { + public static async resolve(url: string): Promise { const logger = getLogger(["federation", "resolvers"]); const host = new URL(url).host; @@ -347,7 +347,7 @@ export class Instance extends BaseInterface { if (!output) { logger.error`Failed to resolve instance ${chalk.bold(host)}`; - throw new Error("Failed to resolve instance"); + return null; } const { metadata, protocol } = output; diff --git a/classes/database/user.ts b/classes/database/user.ts index 85c28c27..4b253262 100644 --- a/classes/database/user.ts +++ b/classes/database/user.ts @@ -599,18 +599,26 @@ export class User extends BaseInterface { const updated = await User.saveFromRemote(this.getUri()); + if (!updated) { + throw new Error("Failed to update user from remote"); + } + this.data = updated.data; return this; } - public static async saveFromRemote(uri: string): Promise { + public static async saveFromRemote(uri: string): Promise { if (!URL.canParse(uri)) { throw new Error(`Invalid URI: ${uri}`); } const instance = await Instance.resolve(uri); + if (!instance) { + return null; + } + if (instance.data.protocol === "versia") { return await User.saveFromVersia(uri, instance); } @@ -636,12 +644,20 @@ export class User extends BaseInterface { private static async saveFromVersia( uri: string, instance: Instance, - ): Promise { + ): Promise { const requester = await User.getFederationRequester(); - const { data: json } = await requester.get>(uri, { - // @ts-expect-error Bun extension - proxy: config.http.proxy.address, - }); + const output = await requester + .get>(uri, { + // @ts-expect-error Bun extension + proxy: config.http.proxy.address, + }) + .catch(() => null); + + if (!output) { + return null; + } + + const { data: json } = output; const validator = new EntityValidator(); const data = await validator.User(json);