diff --git a/app/api/oauth/[route]/oauth-metadata.ts b/app/api/oauth/[route]/oauth-metadata.ts index cbe512dc..567cbbb3 100644 --- a/app/api/oauth/[route]/oauth-metadata.ts +++ b/app/api/oauth/[route]/oauth-metadata.ts @@ -8,7 +8,7 @@ const hostname = : "https://leaflet.pub"; const scope = - "atproto transition:generic transition:email include:pub.leaflet.authFullPermissions include:site.standard.authFull include:app.bsky.authCreatePosts include:app.bsky.authViewAll?aud=did:web:api.bsky.app%23bsky_appview rpc:parts.page.mention.searchService?aud=* blob:*/*"; + "atproto transition:generic transition:email include:pub.leaflet.authFullPermissions include:site.standard.authFull include:app.bsky.authCreatePosts include:app.bsky.authViewAll?aud=did:web:api.bsky.app%23bsky_appview rpc:parts.page.mention.search?aud=* blob:*/*"; const localconfig: OAuthClientMetadataInput = { client_id: `http://localhost/?redirect_uri=${encodeURI(`http://127.0.0.1:3000/api/oauth/callback`)}&scope=${encodeURIComponent(scope)}`, client_name: `Leaflet`, diff --git a/app/api/oauth/[route]/route.ts b/app/api/oauth/[route]/route.ts index 4c269b8e..94c113eb 100644 --- a/app/api/oauth/[route]/route.ts +++ b/app/api/oauth/[route]/route.ts @@ -43,7 +43,7 @@ export async function GET( const url = await client.authorize(handle || "https://bsky.social", { scope: - "atproto transition:email include:pub.leaflet.authFullPermissions include:site.standard.authFull include:app.bsky.authCreatePosts include:app.bsky.authViewAll?aud=did:web:api.bsky.app%23bsky_appview rpc:parts.page.mention.searchService?aud=* blob:*/*", + "atproto transition:email include:pub.leaflet.authFullPermissions include:site.standard.authFull include:app.bsky.authCreatePosts include:app.bsky.authViewAll?aud=did:web:api.bsky.app%23bsky_appview rpc:parts.page.mention.search?aud=* blob:*/*", signal: ac.signal, state: JSON.stringify(state), }); diff --git a/app/api/rpc/[command]/proxy_mention_search.ts b/app/api/rpc/[command]/proxy_mention_search.ts index 60272193..679f90f1 100644 --- a/app/api/rpc/[command]/proxy_mention_search.ts +++ b/app/api/rpc/[command]/proxy_mention_search.ts @@ -4,7 +4,7 @@ import type { Env } from "./route"; import { getIdentityData } from "actions/getIdentityData"; import { restoreOAuthSession } from "src/atproto-oauth"; import { AtpBaseClient } from "lexicons/api"; -import type * as SearchService from "lexicons/api/types/parts/page/mention/searchService"; +import type * as SearchService from "lexicons/api/types/parts/page/mention/search"; import type * as MentionService from "lexicons/api/types/parts/page/mention/service"; export type ProxyMentionSearchReturnType = Awaited< @@ -21,49 +21,57 @@ export const proxy_mention_search = makeRoute({ { service_uri, search }, { supabase }: Pick, ) => { - const identity = await getIdentityData(); - if (!identity?.atp_did) throw new Error("Not authenticated"); + try { + const identity = await getIdentityData(); + if (!identity?.atp_did) throw new Error("Not authenticated"); - const { data: service } = await supabase - .from("mention_services") - .select("record") - .eq("uri", service_uri) - .single(); + const { data: service } = await supabase + .from("mention_services") + .select("record") + .eq("uri", service_uri) + .single(); - if (!service) throw new Error("Mention service not found"); + if (!service) throw new Error("Mention service not found"); - const record = service.record as MentionService.Record; - const did = record.did; - if (!did) throw new Error("Service has no DID"); + const record = service.record as MentionService.Record; + const did = record.did; + if (!did) throw new Error("Service has no DID"); - const sessionResult = await restoreOAuthSession(identity.atp_did); - if (!sessionResult.ok) throw new Error("OAuth session expired"); + const sessionResult = await restoreOAuthSession(identity.atp_did); + if (!sessionResult.ok) throw new Error("OAuth session expired"); - const session = sessionResult.value; - const agent = new AtpBaseClient(session.fetchHandler.bind(session)); - agent.setHeader("atproto-proxy", `${did}#mention_search`); - console.log("DID: " + did); + const session = sessionResult.value; + const agent = new AtpBaseClient(session.fetchHandler.bind(session)); + agent.setHeader("atproto-proxy", `${did}#mention_search`); - const response = await agent.call("parts.page.mention.searchService", { - service: service_uri, - search, - }); + const response = await agent.call("parts.page.mention.search", { + service: service_uri, + search, + }); - const data = response.data as SearchService.OutputSchema | undefined; - const results: SearchService.Result[] = Array.isArray(data?.results) - ? data.results - : []; + const data = response.data as SearchService.OutputSchema | undefined; + const results: SearchService.Result[] = Array.isArray(data?.results) + ? data.results + : []; - return { - result: { - results: results.slice(0, 50).map((r) => ({ - uri: r.uri, - name: r.name, - href: r.href, - icon: r.icon, - embed: r.embed, - })), - }, - }; + return { + result: { + results: results.slice(0, 50).map((r) => ({ + uri: r.uri, + name: r.name, + href: r.href, + icon: r.icon, + embed: r.embed, + })), + }, + }; + } catch (error) { + console.error("proxy_mention_search failed", { + service_uri, + search, + error, + }); + throw error; + } }, }); diff --git a/components/Mention.tsx b/components/Mention.tsx index bcaac604..4b8e6bf1 100644 --- a/components/Mention.tsx +++ b/components/Mention.tsx @@ -12,7 +12,7 @@ import useSWR from "swr"; import * as Popover from "@radix-ui/react-popover"; import { EditorView } from "prosemirror-view"; import { callRPC } from "app/api/rpc/client"; -import type * as SearchService from "lexicons/api/types/parts/page/mention/searchService"; +import type * as SearchService from "lexicons/api/types/parts/page/mention/search"; import { ArrowRightTiny } from "components/Icons/ArrowRightTiny"; import { GoBackSmall } from "components/Icons/GoBackSmall"; import { SearchTiny } from "components/Icons/SearchTiny"; diff --git a/feeds/index.ts b/feeds/index.ts index 5ca4ccb9..72fd67a7 100644 --- a/feeds/index.ts +++ b/feeds/index.ts @@ -45,7 +45,7 @@ const mentionServices: Record< pokemon, }; -app.get("/xrpc/parts.page.mention.searchService", async (c) => { +app.get("/xrpc/parts.page.mention.search", async (c) => { const serviceUri = c.req.query("service"); const search = c.req.query("search"); const limit = Math.min( diff --git a/lexicons/api/index.ts b/lexicons/api/index.ts index f5a3b049..c16e0d50 100644 --- a/lexicons/api/index.ts +++ b/lexicons/api/index.ts @@ -24,7 +24,7 @@ import * as ComAtprotoRepoPutRecord from './types/com/atproto/repo/putRecord' import * as ComAtprotoRepoStrongRef from './types/com/atproto/repo/strongRef' import * as ComAtprotoRepoUploadBlob from './types/com/atproto/repo/uploadBlob' import * as PartsPageMentionConfig from './types/parts/page/mention/config' -import * as PartsPageMentionSearchService from './types/parts/page/mention/searchService' +import * as PartsPageMentionSearch from './types/parts/page/mention/search' import * as PartsPageMentionService from './types/parts/page/mention/service' import * as PubLeafletBlocksBlockquote from './types/pub/leaflet/blocks/blockquote' import * as PubLeafletBlocksBskyPost from './types/pub/leaflet/blocks/bskyPost' @@ -75,7 +75,7 @@ export * as ComAtprotoRepoPutRecord from './types/com/atproto/repo/putRecord' export * as ComAtprotoRepoStrongRef from './types/com/atproto/repo/strongRef' export * as ComAtprotoRepoUploadBlob from './types/com/atproto/repo/uploadBlob' export * as PartsPageMentionConfig from './types/parts/page/mention/config' -export * as PartsPageMentionSearchService from './types/parts/page/mention/searchService' +export * as PartsPageMentionSearch from './types/parts/page/mention/search' export * as PartsPageMentionService from './types/parts/page/mention/service' export * as PubLeafletBlocksBlockquote from './types/pub/leaflet/blocks/blockquote' export * as PubLeafletBlocksBskyPost from './types/pub/leaflet/blocks/bskyPost' @@ -434,12 +434,12 @@ export class PartsPageMentionNS { this.service = new PartsPageMentionServiceRecord(client) } - searchService( - params?: PartsPageMentionSearchService.QueryParams, - opts?: PartsPageMentionSearchService.CallOptions, - ): Promise { + search( + params?: PartsPageMentionSearch.QueryParams, + opts?: PartsPageMentionSearch.CallOptions, + ): Promise { return this._client.call( - 'parts.page.mention.searchService', + 'parts.page.mention.search', params, undefined, opts, diff --git a/lexicons/api/lexicons.ts b/lexicons/api/lexicons.ts index 3bb77d03..9b4772f3 100644 --- a/lexicons/api/lexicons.ts +++ b/lexicons/api/lexicons.ts @@ -1042,9 +1042,9 @@ export const schemaDict = { }, }, }, - PartsPageMentionSearchService: { + PartsPageMentionSearch: { lexicon: 1, - id: 'parts.page.mention.searchService', + id: 'parts.page.mention.search', defs: { main: { type: 'query', @@ -1083,7 +1083,7 @@ export const schemaDict = { type: 'array', items: { type: 'ref', - ref: 'lex:parts.page.mention.searchService#result', + ref: 'lex:parts.page.mention.search#result', }, maxLength: 50, }, @@ -1116,7 +1116,7 @@ export const schemaDict = { }, embed: { type: 'ref', - ref: 'lex:parts.page.mention.searchService#embedInfo', + ref: 'lex:parts.page.mention.search#embedInfo', description: 'Optional embed info for creating an embed block instead of an inline mention', }, @@ -1155,7 +1155,7 @@ export const schemaDict = { type: 'record', key: 'any', description: - 'Declares a mention service. The did is an XRPC service URL that implements parts.page.mention.searchService.', + 'Declares a mention service. The did is an XRPC service URL that implements parts.page.mention.search.', record: { type: 'object', required: ['name', 'did'], @@ -1172,7 +1172,7 @@ export const schemaDict = { type: 'string', format: 'did', description: - 'DID of the service that implements parts.page.mention.searchService', + 'DID of the service that implements parts.page.mention.search', }, }, }, @@ -2707,7 +2707,7 @@ export const ids = { ComAtprotoRepoStrongRef: 'com.atproto.repo.strongRef', ComAtprotoRepoUploadBlob: 'com.atproto.repo.uploadBlob', PartsPageMentionConfig: 'parts.page.mention.config', - PartsPageMentionSearchService: 'parts.page.mention.searchService', + PartsPageMentionSearch: 'parts.page.mention.search', PartsPageMentionService: 'parts.page.mention.service', PubLeafletBlocksBlockquote: 'pub.leaflet.blocks.blockquote', PubLeafletBlocksBskyPost: 'pub.leaflet.blocks.bskyPost', diff --git a/lexicons/api/types/parts/page/mention/searchService.ts b/lexicons/api/types/parts/page/mention/search.ts similarity index 92% rename from lexicons/api/types/parts/page/mention/searchService.ts rename to lexicons/api/types/parts/page/mention/search.ts index cf95ad25..d5c3ac22 100644 --- a/lexicons/api/types/parts/page/mention/searchService.ts +++ b/lexicons/api/types/parts/page/mention/search.ts @@ -13,7 +13,7 @@ import { const is$typed = _is$typed, validate = _validate -const id = 'parts.page.mention.searchService' +const id = 'parts.page.mention.search' export type QueryParams = { /** AT URI of the parts.page.mention.service record identifying which service to query */ @@ -45,7 +45,7 @@ export function toKnownErr(e: any) { } export interface Result { - $type?: 'parts.page.mention.searchService#result' + $type?: 'parts.page.mention.search#result' /** Identifier for the mentioned entity */ uri: string /** Display name for the mentioned entity */ @@ -68,7 +68,7 @@ export function validateResult(v: V) { } export interface EmbedInfo { - $type?: 'parts.page.mention.searchService#embedInfo' + $type?: 'parts.page.mention.search#embedInfo' /** Source URL for the iframe embed */ src: string /** Default width of the embed in pixels */ diff --git a/lexicons/api/types/parts/page/mention/service.ts b/lexicons/api/types/parts/page/mention/service.ts index fd2e6b90..8ae5dea8 100644 --- a/lexicons/api/types/parts/page/mention/service.ts +++ b/lexicons/api/types/parts/page/mention/service.ts @@ -18,7 +18,7 @@ export interface Record { $type: 'parts.page.mention.service' name: string description?: string - /** DID of the service that implements parts.page.mention.searchService */ + /** DID of the service that implements parts.page.mention.search */ did: string [k: string]: unknown } diff --git a/lexicons/parts/page/mention/searchService.json b/lexicons/parts/page/mention/search.json similarity index 98% rename from lexicons/parts/page/mention/searchService.json rename to lexicons/parts/page/mention/search.json index e1ef1792..16a1aada 100644 --- a/lexicons/parts/page/mention/searchService.json +++ b/lexicons/parts/page/mention/search.json @@ -1,6 +1,6 @@ { "lexicon": 1, - "id": "parts.page.mention.searchService", + "id": "parts.page.mention.search", "defs": { "main": { "type": "query", diff --git a/lexicons/parts/page/mention/service.json b/lexicons/parts/page/mention/service.json index c89e28bf..627a399f 100644 --- a/lexicons/parts/page/mention/service.json +++ b/lexicons/parts/page/mention/service.json @@ -5,7 +5,7 @@ "main": { "type": "record", "key": "any", - "description": "Declares a mention service. The did is an XRPC service URL that implements parts.page.mention.searchService.", + "description": "Declares a mention service. The did is an XRPC service URL that implements parts.page.mention.search.", "record": { "type": "object", "required": [ @@ -24,7 +24,7 @@ "did": { "type": "string", "format": "did", - "description": "DID of the service that implements parts.page.mention.searchService" + "description": "DID of the service that implements parts.page.mention.search" } } } diff --git a/lexicons/src/mentionService.ts b/lexicons/src/mentionService.ts index 4cf77c94..7dab2c15 100644 --- a/lexicons/src/mentionService.ts +++ b/lexicons/src/mentionService.ts @@ -8,7 +8,7 @@ export const PagePartsMentionService: LexiconDoc = { type: "record", key: "any", description: - "Declares a mention service. The did is an XRPC service URL that implements parts.page.mention.searchService.", + "Declares a mention service. The did is an XRPC service URL that implements parts.page.mention.search.", record: { type: "object", required: ["name", "did"], @@ -19,7 +19,7 @@ export const PagePartsMentionService: LexiconDoc = { type: "string", format: "did", description: - "DID of the service that implements parts.page.mention.searchService", + "DID of the service that implements parts.page.mention.search", }, }, }, @@ -29,7 +29,7 @@ export const PagePartsMentionService: LexiconDoc = { export const PagePartsMentionSearchService: LexiconDoc = { lexicon: 1, - id: "parts.page.mention.searchService", + id: "parts.page.mention.search", defs: { main: { type: "query",