Merge branch 'feat/inda-383-daily-stat' into 'main'
[ProtonMail-WebClient.git] / packages / drive-store / utils / getPublicKeysForEmail.ts
bloba3942f367090cfb0390e6fc2d82bbb37e481e333
1 import { getAllPublicKeys } from '@proton/shared/lib/api/keys';
2 import type { KEY_FLAG } from '@proton/shared/lib/constants';
3 import { API_CUSTOM_ERROR_CODES } from '@proton/shared/lib/errors';
4 import type { Api } from '@proton/shared/lib/interfaces';
6 type Key = {
7     Flags: KEY_FLAG;
8     PublicKey: string;
9     Source: string;
12 const cache = new Map<string, string[]>();
13 /**
14  * Retrieve all public keys for a specific user email.
15  * We silence errors for address missing and external domain as we allow addition of exernal users.
16  */
17 export const getPublicKeysForEmail = async (api: Api, email: string) => {
18     const cached = cache.get(email);
19     if (cached) {
20         return cached;
21     }
22     return api<{ Address: { Keys: Key[] } }>({
23         ...getAllPublicKeys({
24             Email: email,
25             InternalOnly: 1,
26         }),
27         silence: [API_CUSTOM_ERROR_CODES.KEY_GET_ADDRESS_MISSING, API_CUSTOM_ERROR_CODES.KEY_GET_DOMAIN_EXTERNAL],
28     })
29         .then(({ Address }) => {
30             const keysMap = Address.Keys.map((key) => key.PublicKey);
31             cache.set(email, keysMap);
32             return keysMap;
33         })
34         .catch((error) => {
35             if (
36                 error?.data?.Code === API_CUSTOM_ERROR_CODES.KEY_GET_ADDRESS_MISSING ||
37                 error?.data?.Code === API_CUSTOM_ERROR_CODES.KEY_GET_DOMAIN_EXTERNAL
38             ) {
39                 return undefined;
40             }
41             throw error;
42         });
44 export const getPrimaryPublicKeyForEmail = async (api: Api, email: string) =>
45     getPublicKeysForEmail(api, email).then((PublicKeys) => PublicKeys?.[0]);