@iexec/web3mail
Version:
This product enables users to confidentially store data–such as mail address, documents, personal information ...
109 lines (95 loc) • 2.78 kB
text/typescript
import { GraphQLClient, gql } from 'graphql-request';
import { Contact, GraphQLResponse, ProtectedDataQuery } from '../index.js';
import { WorkflowError } from './errors.js';
const checkProtectedDataQuery = gql`
query GetValidContacts(
$requiredSchema: [String!]!
$id: [String!]!
$start: Int!
$range: Int!
) {
protectedDatas(
where: {
transactionHash_not: "0x"
schema_contains: $requiredSchema
id_in: $id
}
skip: $start
first: $range
orderBy: creationTimestamp
orderDirection: desc
) {
id
}
}
`;
export const getValidContact = async (
graphQLClient: GraphQLClient,
contacts: Contact[]
): Promise<Contact[]> => {
try {
// Contacts addresses
const contactsAddresses = contacts.map((contact) => contact.address);
// Pagination
const protectedDataList: ProtectedDataQuery[] = [];
let start = 0;
const range = 1000;
let continuePagination = true;
do {
const variables = {
requiredSchema: ['email:string'],
id: contactsAddresses,
start,
range,
};
const protectedDataResultQuery: GraphQLResponse =
await graphQLClient.request(checkProtectedDataQuery, variables);
const { protectedDatas } = protectedDataResultQuery;
protectedDataList.push(...protectedDatas);
continuePagination = protectedDatas.length === range;
start += range;
} while (continuePagination);
// Convert contacts array into a map where the key is the contact's address
const contactsMap = new Map(
contacts.map((contact) => [contact.address, contact])
);
// Convert protectedData[] into Contact[] using the map for constant time lookups
return protectedDataList.map(({ id }) => {
const contact = contactsMap.get(id);
if (contact) {
return {
address: id,
owner: contact.owner,
accessGrantTimestamp: contact.accessGrantTimestamp,
};
}
});
} catch (error) {
throw new WorkflowError({
message: 'Failed to fetch subgraph',
errorCause: error,
});
}
};
export const checkProtectedDataValidity = async (
graphQLClient: GraphQLClient,
protectedData: string
): Promise<boolean> => {
try {
const variables = {
requiredSchema: ['email:string'],
id: [protectedData],
start: 0,
range: 1,
};
const protectedDataResultQuery: GraphQLResponse =
await graphQLClient.request(checkProtectedDataQuery, variables);
const { protectedDatas } = protectedDataResultQuery;
return protectedDatas.length === 1;
} catch (error) {
throw new WorkflowError({
message: 'Failed to fetch subgraph',
errorCause: error,
});
}
};