Skip to content

Commit be0d956

Browse files
committed
Add batch email resolution and APIs for account emails
Introduce the `get_account_emails` API to fetch emails for multiple DIDs in a single request. Updated the frontend logic to utilize batch resolution, improving efficiency and reducing API calls.
1 parent d241ebc commit be0d956

2 files changed

Lines changed: 48 additions & 18 deletions

File tree

src/App.tsx

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -106,31 +106,49 @@ function App() {
106106
const resolveHandles = useCallback(
107107
async (invitesList: InviteCode[]) => {
108108
const didsToResolve = new Set<string>();
109+
const emailsToResolve = new Set<string>();
110+
109111
invitesList.forEach((invite) => {
110112
const usedBy = getUsedBy(invite);
111-
if (usedBy && usedBy.startsWith('did:') && !handles[usedBy]) {
112-
didsToResolve.add(usedBy);
113+
if (usedBy && usedBy.startsWith('did:')) {
114+
if (!handles[usedBy]) {
115+
didsToResolve.add(usedBy);
116+
}
117+
if (!emails[usedBy]) {
118+
emailsToResolve.add(usedBy);
119+
}
113120
}
114121
});
115122

116-
for (const did of didsToResolve) {
123+
// Resolve emails in batch first
124+
if (emailsToResolve.size > 0) {
117125
try {
118-
// Resolve email first if not already present
119-
if (!emails[did]) {
120-
try {
121-
const emailResponse = await activeService.getAccountEmail(did);
122-
if (emailResponse.data?.email) {
123-
setEmails((prev) => ({ ...prev, [did]: emailResponse.data.email! }));
124-
} else {
125-
setEmails((prev) => ({ ...prev, [did]: '-' }));
126-
}
127-
} catch (err) {
128-
console.error(`Failed to resolve email for DID: ${did}`, err);
129-
setEmails((prev) => ({ ...prev, [did]: '-' }));
130-
}
131-
}
126+
const emailResponse = await activeService.getAccountEmails(Array.from(emailsToResolve));
127+
const resolvedEmails = emailResponse.data?.emails || {};
128+
129+
setEmails((prev) => {
130+
const next = { ...prev };
131+
emailsToResolve.forEach((did) => {
132+
next[did] = resolvedEmails[did] || '-';
133+
});
134+
return next;
135+
});
136+
} catch (err) {
137+
console.error('Failed to resolve emails in batch', err);
138+
// Fallback: mark as unresolved so we don't keep trying
139+
setEmails((prev) => {
140+
const next = { ...prev };
141+
emailsToResolve.forEach((did) => {
142+
next[did] = '-';
143+
});
144+
return next;
145+
});
146+
}
147+
}
132148

133-
// Then resolve handle
149+
// Then resolve handles individually (PLC directory doesn't seem to have a batch API)
150+
for (const did of didsToResolve) {
151+
try {
134152
const response = await activeService.resolveDid(did);
135153
// PLC directory response has 'alsoKnownAs' array with 'at://handle'
136154
const alsoKnownAs = response.data?.alsoKnownAs || [];

src/api.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,9 @@ export const apiService = {
111111

112112
getAccountEmail: (did: string): Promise<AxiosResponse<{ email: string | null }>> =>
113113
api.get(`/api/account/email`, { params: { did } }),
114+
115+
getAccountEmails: (dids: string[]): Promise<AxiosResponse<{ emails: Record<string, string | null> }>> =>
116+
api.get(`/api/account/emails`, { params: { dids } }),
114117
};
115118

116119
export const mockApiService = {
@@ -252,4 +255,13 @@ export const mockApiService = {
252255
await new Promise((resolve) => setTimeout(resolve, 100));
253256
return { data: { email: `${did.replace('did:plc:', '')}@example.com` } };
254257
},
258+
259+
getAccountEmails: async (dids: string[]): Promise<{ data: { emails: Record<string, string | null> } }> => {
260+
await new Promise((resolve) => setTimeout(resolve, 100));
261+
const emails: Record<string, string | null> = {};
262+
dids.forEach((did) => {
263+
emails[did] = `${did.replace('did:plc:', '')}@example.com`;
264+
});
265+
return { data: { emails } };
266+
},
255267
};

0 commit comments

Comments
 (0)