From 63b5e6cd2958b8689871f60454c6d337af7df4e1 Mon Sep 17 00:00:00 2001 From: Jared Pereira Date: Wed, 27 May 2026 17:25:50 -0400 Subject: [PATCH] more profile read fixes --- .../dashboard/PublicationSubscribers.tsx | 33 ++----------------- .../dashboard/SubscribersList.tsx | 4 +-- .../[publication]/dashboard/subs/page.tsx | 3 +- app/(app)/merge-accounts/page.tsx | 12 +++---- .../inngest/functions/send_post_broadcast.ts | 11 +++---- app/api/rpc/[command]/get_publication_data.ts | 6 ++-- .../get_publication_subscribers_timeseries.ts | 4 +-- .../rpc/[command]/get_standard_site_posts.ts | 19 +++-------- 8 files changed, 24 insertions(+), 68 deletions(-) diff --git a/app/(app)/lish/[did]/[publication]/dashboard/PublicationSubscribers.tsx b/app/(app)/lish/[did]/[publication]/dashboard/PublicationSubscribers.tsx index d0ead28d..882690c4 100644 --- a/app/(app)/lish/[did]/[publication]/dashboard/PublicationSubscribers.tsx +++ b/app/(app)/lish/[did]/[publication]/dashboard/PublicationSubscribers.tsx @@ -45,12 +45,12 @@ export function useMergedSubscribers(): MergedSubscriber[] | null { let byDid = new Map(); let emailOnly: MergedSubscriber[] = []; for (let s of atprotoSubs) { - let did = s.identities?.bsky_profiles?.did; + let did = s.identities?.atp_did ?? undefined; if (!did) continue; byDid.set(did, { key: `did:${did}`, did, - handle: s.identities?.bsky_profiles?.handle ?? undefined, + handle: undefined, email: undefined, created_at: s.created_at, status: "subscribed", @@ -72,7 +72,7 @@ export function useMergedSubscribers(): MergedSubscriber[] | null { emailOnly.push({ key: `email:${s.id}`, did: linkedDid, - handle: s.identities?.bsky_profiles?.handle ?? undefined, + handle: undefined, email: s.email, created_at: s.created_at, status, @@ -181,33 +181,6 @@ export function SubscribersListView(props: { ); } -export function SubscribersListSkeleton(props: { showPageBackground?: boolean }) { - return ( -
-
- {[0, 1, 2, 3].map((i) => ( -
-
-
-
- ))} -
-
- ); -} - const SubscriberListItem = (props: { handle: string | undefined; did: string | undefined; diff --git a/app/(app)/lish/[did]/[publication]/dashboard/SubscribersList.tsx b/app/(app)/lish/[did]/[publication]/dashboard/SubscribersList.tsx index d362edc9..c2a39b11 100644 --- a/app/(app)/lish/[did]/[publication]/dashboard/SubscribersList.tsx +++ b/app/(app)/lish/[did]/[publication]/dashboard/SubscribersList.tsx @@ -37,7 +37,7 @@ export async function SubscribersList({ const dids = new Set(); for (const s of atprotoSubs) { - const d = s.identities?.bsky_profiles?.did; + const d = s.identities?.atp_did ?? undefined; if (d) dids.add(d); } for (const s of emailSubs) { @@ -50,7 +50,7 @@ export async function SubscribersList({ const emailOnly: MergedSubscriber[] = []; for (const s of atprotoSubs) { - const d = s.identities?.bsky_profiles?.did; + const d = s.identities?.atp_did ?? undefined; if (!d) continue; const p = profiles.get(d); byDid.set(d, { diff --git a/app/(app)/lish/[did]/[publication]/dashboard/subs/page.tsx b/app/(app)/lish/[did]/[publication]/dashboard/subs/page.tsx index 4979e0f6..64f5d027 100644 --- a/app/(app)/lish/[did]/[publication]/dashboard/subs/page.tsx +++ b/app/(app)/lish/[did]/[publication]/dashboard/subs/page.tsx @@ -1,7 +1,6 @@ import { Suspense } from "react"; import { SubsPageShell } from "../SubsPageShell"; import { SubscribersList } from "../SubscribersList"; -import { SubscribersListSkeleton } from "../PublicationSubscribers"; export default async function SubsPage(props: { params: Promise<{ did: string; publication: string }>; @@ -12,7 +11,7 @@ export default async function SubsPage(props: { return ( - }> + diff --git a/app/(app)/merge-accounts/page.tsx b/app/(app)/merge-accounts/page.tsx index d45e7269..5e10f30b 100644 --- a/app/(app)/merge-accounts/page.tsx +++ b/app/(app)/merge-accounts/page.tsx @@ -11,6 +11,7 @@ import { PENDING_MERGE_TOKEN_COOKIE, resolveAuthToken, } from "src/auth"; +import { getProfiles } from "src/identity"; type SearchParams = { [key: string]: string | string[] | undefined }; @@ -59,19 +60,16 @@ export default async function MergeAccountsPage(props: { ); } - const [{ data: bsky }, { count: docCount }] = await Promise.all([ - supabaseServerClient - .from("bsky_profiles") - .select("handle") - .eq("did", target.identity.atp_did!) - .maybeSingle(), + const [profiles, { count: docCount }] = await Promise.all([ + getProfiles([target.identity.atp_did!]), supabaseServerClient .from("permission_token_on_homepage") .select("token", { count: "exact", head: true }) .eq("identity", source.identity.id) .not("archived", "is", true), ]); - const targetHandle = bsky?.handle ?? target.identity.atp_did!; + const targetHandle = + profiles.get(target.identity.atp_did!)?.handle ?? target.identity.atp_did!; const sourceEmail = source.identity.email!; const targetEmail = target.identity.email; const documents = docCount ?? 0; diff --git a/app/api/inngest/functions/send_post_broadcast.ts b/app/api/inngest/functions/send_post_broadcast.ts index ab3fa0a9..b872e09d 100644 --- a/app/api/inngest/functions/send_post_broadcast.ts +++ b/app/api/inngest/functions/send_post_broadcast.ts @@ -15,6 +15,7 @@ import { resolveReplyToEmail, } from "src/utils/newsletterSender"; import { PubLeafletPagesLinearDocument } from "lexicons/api"; +import { getProfiles } from "src/identity"; import type { Json } from "supabase/database.types"; const BATCH_SIZE = 500; @@ -48,7 +49,7 @@ export const send_post_broadcast = inngest.createFunction( const authorDid = new AtUri(document_uri).host; const loaded = await step.run("load-pub-and-doc", async () => { - const [pubRes, docRes, profileRes] = await Promise.all([ + const [pubRes, docRes, profiles] = await Promise.all([ supabaseServerClient .from("publications") .select( @@ -61,16 +62,12 @@ export const send_post_broadcast = inngest.createFunction( .select("data") .eq("uri", document_uri) .maybeSingle(), - supabaseServerClient - .from("bsky_profiles") - .select("handle") - .eq("did", authorDid) - .maybeSingle(), + getProfiles([authorDid]), ]); return { pub: pubRes.data, doc: docRes.data, - profile: profileRes.data, + profile: profiles.get(authorDid) ?? null, }; }); diff --git a/app/api/rpc/[command]/get_publication_data.ts b/app/api/rpc/[command]/get_publication_data.ts index aa329b3f..9c444bc0 100644 --- a/app/api/rpc/[command]/get_publication_data.ts +++ b/app/api/rpc/[command]/get_publication_data.ts @@ -32,7 +32,7 @@ export const get_publication_data = makeRoute({ publication_name, ).toString(); } - let { data: publication, error } = await supabase + let { data: publication } = await supabase .from("publications") .select( `*, @@ -43,8 +43,8 @@ export const get_publication_data = makeRoute({ recommends_on_documents(count), publication_post_sends(status, subscriber_count) )), - publication_subscriptions(*, identities(bsky_profiles(*))), - publication_email_subscribers(*, identities(atp_did, bsky_profiles(*))), + publication_subscriptions(*, identities(atp_did)), + publication_email_subscribers(*, identities(atp_did)), publication_domains(*), publication_newsletter_settings(enabled, reply_to_email, reply_to_verified_at), leaflets_in_publications(*, diff --git a/app/api/rpc/[command]/get_publication_subscribers_timeseries.ts b/app/api/rpc/[command]/get_publication_subscribers_timeseries.ts index 4d2b2a58..d2a5a592 100644 --- a/app/api/rpc/[command]/get_publication_subscribers_timeseries.ts +++ b/app/api/rpc/[command]/get_publication_subscribers_timeseries.ts @@ -47,7 +47,7 @@ export const get_publication_subscribers_timeseries = makeRoute({ const [{ data: atprotoSubs }, { data: emailSubs }] = await Promise.all([ supabase .from("publication_subscriptions") - .select("created_at, identities(bsky_profiles(did))") + .select("created_at, identities(atp_did)") .eq("publication", publication_uri), newsletterEnabled ? supabase @@ -63,7 +63,7 @@ export const get_publication_subscribers_timeseries = makeRoute({ // matching the UI merge in PublicationSubscribers.tsx. const subscribers = new Map(); for (const s of atprotoSubs || []) { - const did = s.identities?.bsky_profiles?.did; + const did = s.identities?.atp_did; if (!did) continue; subscribers.set(`did:${did}`, s.created_at); } diff --git a/app/api/rpc/[command]/get_standard_site_posts.ts b/app/api/rpc/[command]/get_standard_site_posts.ts index 5ff3b31f..4f88a9f1 100644 --- a/app/api/rpc/[command]/get_standard_site_posts.ts +++ b/app/api/rpc/[command]/get_standard_site_posts.ts @@ -8,6 +8,7 @@ import { type NormalizedDocument, type NormalizedPublication, } from "src/utils/normalizeRecords"; +import { getProfiles } from "src/identity"; export type StandardSitePostData = { uri: string; @@ -66,16 +67,7 @@ export const get_standard_site_posts = makeRoute({ ), ); - const { data: profiles } = dids.length - ? await supabase - .from("bsky_profiles") - .select("did, handle, record") - .in("did", dids) - : { data: [] as { did: string; handle: string | null; record: unknown }[] }; - - const profileByDid = new Map( - (profiles || []).map((p) => [p.did, p] as const), - ); + const profiles = await getProfiles(dids); const posts: StandardSitePostData[] = (documents || []) .map((d): StandardSitePostData | null => { @@ -93,15 +85,12 @@ export const get_standard_site_posts = makeRoute({ } catch { did = null; } - const profile = did ? profileByDid.get(did) : undefined; - const profileRecord = (profile?.record ?? null) as - | { displayName?: string } - | null; + const profile = did ? profiles.get(did) : null; const author = did ? { did, handle: profile?.handle ?? null, - displayName: profileRecord?.displayName ?? null, + displayName: profile?.displayName ?? null, } : null; -- 2.51.2