diff --git a/packages/api/src/generated/graphql.ts b/packages/api/src/generated/graphql.ts index 781aa004e..b5dab497a 100644 --- a/packages/api/src/generated/graphql.ts +++ b/packages/api/src/generated/graphql.ts @@ -1669,6 +1669,7 @@ export type Query = { labels: LabelsResult; me?: Maybe; newsletterEmails: NewsletterEmailsResult; + recentEmails: RecentEmailsResult; recentSearches: RecentSearchesResult; reminder: ReminderResult; rules: RulesResult; @@ -1812,6 +1813,35 @@ export type ReadState = { readingTime?: Maybe; }; +export type RecentEmail = { + __typename?: 'RecentEmail'; + createdAt: Scalars['Date']; + from: Scalars['String']; + html?: Maybe; + id: Scalars['ID']; + subject: Scalars['String']; + text: Scalars['String']; + to: Scalars['String']; + type: Scalars['String']; +}; + +export type RecentEmailsError = { + __typename?: 'RecentEmailsError'; + errorCodes: Array; +}; + +export enum RecentEmailsErrorCode { + BadRequest = 'BAD_REQUEST', + Unauthorized = 'UNAUTHORIZED' +} + +export type RecentEmailsResult = RecentEmailsError | RecentEmailsSuccess; + +export type RecentEmailsSuccess = { + __typename?: 'RecentEmailsSuccess'; + recentEmails: Array; +}; + export type RecentSearch = { __typename?: 'RecentSearch'; createdAt: Scalars['Date']; @@ -3353,6 +3383,11 @@ export type ResolversTypes = { Reaction: ResolverTypeWrapper; ReactionType: ReactionType; ReadState: ResolverTypeWrapper; + RecentEmail: ResolverTypeWrapper; + RecentEmailsError: ResolverTypeWrapper; + RecentEmailsErrorCode: RecentEmailsErrorCode; + RecentEmailsResult: ResolversTypes['RecentEmailsError'] | ResolversTypes['RecentEmailsSuccess']; + RecentEmailsSuccess: ResolverTypeWrapper; RecentSearch: ResolverTypeWrapper; RecentSearchesError: ResolverTypeWrapper; RecentSearchesErrorCode: RecentSearchesErrorCode; @@ -3771,6 +3806,10 @@ export type ResolversParentTypes = { Query: {}; Reaction: Reaction; ReadState: ReadState; + RecentEmail: RecentEmail; + RecentEmailsError: RecentEmailsError; + RecentEmailsResult: ResolversParentTypes['RecentEmailsError'] | ResolversParentTypes['RecentEmailsSuccess']; + RecentEmailsSuccess: RecentEmailsSuccess; RecentSearch: RecentSearch; RecentSearchesError: RecentSearchesError; RecentSearchesResult: ResolversParentTypes['RecentSearchesError'] | ResolversParentTypes['RecentSearchesSuccess']; @@ -4943,6 +4982,7 @@ export type QueryResolvers; me?: Resolver, ParentType, ContextType>; newsletterEmails?: Resolver; + recentEmails?: Resolver; recentSearches?: Resolver; reminder?: Resolver>; rules?: Resolver>; @@ -4976,6 +5016,32 @@ export type ReadStateResolvers; }; +export type RecentEmailResolvers = { + createdAt?: Resolver; + from?: Resolver; + html?: Resolver, ParentType, ContextType>; + id?: Resolver; + subject?: Resolver; + text?: Resolver; + to?: Resolver; + type?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type RecentEmailsErrorResolvers = { + errorCodes?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type RecentEmailsResultResolvers = { + __resolveType: TypeResolveFn<'RecentEmailsError' | 'RecentEmailsSuccess', ParentType, ContextType>; +}; + +export type RecentEmailsSuccessResolvers = { + recentEmails?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + export type RecentSearchResolvers = { createdAt?: Resolver; id?: Resolver; @@ -5934,6 +6000,10 @@ export type Resolvers = { Query?: QueryResolvers; Reaction?: ReactionResolvers; ReadState?: ReadStateResolvers; + RecentEmail?: RecentEmailResolvers; + RecentEmailsError?: RecentEmailsErrorResolvers; + RecentEmailsResult?: RecentEmailsResultResolvers; + RecentEmailsSuccess?: RecentEmailsSuccessResolvers; RecentSearch?: RecentSearchResolvers; RecentSearchesError?: RecentSearchesErrorResolvers; RecentSearchesResult?: RecentSearchesResultResolvers; diff --git a/packages/api/src/generated/schema.graphql b/packages/api/src/generated/schema.graphql index c58faa3e7..d31a308a3 100644 --- a/packages/api/src/generated/schema.graphql +++ b/packages/api/src/generated/schema.graphql @@ -1218,6 +1218,7 @@ type Query { labels: LabelsResult! me: User newsletterEmails: NewsletterEmailsResult! + recentEmails: RecentEmailsResult! recentSearches: RecentSearchesResult! reminder(linkId: ID!): ReminderResult! rules(enabled: Boolean): RulesResult! @@ -1258,6 +1259,32 @@ type ReadState { readingTime: Int } +type RecentEmail { + createdAt: Date! + from: String! + html: String + id: ID! + subject: String! + text: String! + to: String! + type: String! +} + +type RecentEmailsError { + errorCodes: [RecentEmailsErrorCode!]! +} + +enum RecentEmailsErrorCode { + BAD_REQUEST + UNAUTHORIZED +} + +union RecentEmailsResult = RecentEmailsError | RecentEmailsSuccess + +type RecentEmailsSuccess { + recentEmails: [RecentEmail!]! +} + type RecentSearch { createdAt: Date! id: ID! diff --git a/packages/api/src/resolvers/function_resolvers.ts b/packages/api/src/resolvers/function_resolvers.ts index 39dac70c3..db2f6f9b3 100644 --- a/packages/api/src/resolvers/function_resolvers.ts +++ b/packages/api/src/resolvers/function_resolvers.ts @@ -117,6 +117,7 @@ import { getPageByParam } from '../elastic/pages' import { recentSearchesResolver } from './recent_searches' import { optInFeatureResolver } from './features' import { uploadImportFileResolver } from './importers/uploadImportFileResolver' +import { recentEmailsResolver } from './recent_emails' /* eslint-disable @typescript-eslint/naming-convention */ type ResultResolveType = { @@ -230,6 +231,7 @@ export const functionResolvers = { deviceTokens: deviceTokensResolver, filters: filtersResolver, groups: groupsResolver, + recentEmails: recentEmailsResolver, }, User: { async sharedArticles( @@ -659,4 +661,5 @@ export const functionResolvers = { ...resultResolveTypeResolver('RecommendHighlights'), ...resultResolveTypeResolver('LeaveGroup'), ...resultResolveTypeResolver('UploadImportFile'), + ...resultResolveTypeResolver('RecentEmails'), } diff --git a/packages/api/src/resolvers/recent_emails/index.ts b/packages/api/src/resolvers/recent_emails/index.ts new file mode 100644 index 000000000..b12e331ab --- /dev/null +++ b/packages/api/src/resolvers/recent_emails/index.ts @@ -0,0 +1,46 @@ +import { + RecentEmailsError, + RecentEmailsErrorCode, + RecentEmailsSuccess, +} from '../../generated/graphql' +import { authorized } from '../../utils/helpers' +import { getRepository } from '../../entity/utils' +import { ReceivedEmail } from '../../entity/received_email' + +export const recentEmailsResolver = authorized< + RecentEmailsSuccess, + RecentEmailsError +>(async (_, __, { claims, log }) => { + log.info('Getting recent emails', { + labels: { + source: 'resolver', + resolver: 'recentEmailsResolver', + uid: claims.uid, + }, + }) + + try { + const recentEmails = await getRepository(ReceivedEmail).find({ + where: { user: { id: claims.uid } }, + order: { createdAt: 'DESC' }, + take: 20, + }) + + return { + recentEmails, + } + } catch (error) { + log.error('Error getting recent emails', { + error, + labels: { + source: 'resolver', + resolver: 'recentEmailsResolver', + uid: claims.uid, + }, + }) + + return { + errorCodes: [RecentEmailsErrorCode.BadRequest], + } + } +}) diff --git a/packages/api/src/schema.ts b/packages/api/src/schema.ts index 6732c45d0..fb5fc8459 100755 --- a/packages/api/src/schema.ts +++ b/packages/api/src/schema.ts @@ -2331,6 +2331,32 @@ const schema = gql` uploadSignedUrl: String } + union RecentEmailsResult = RecentEmailsSuccess | RecentEmailsError + + type RecentEmailsSuccess { + recentEmails: [RecentEmail!]! + } + + type RecentEmailsError { + errorCodes: [RecentEmailsErrorCode!]! + } + + enum RecentEmailsErrorCode { + UNAUTHORIZED + BAD_REQUEST + } + + type RecentEmail { + id: ID! + from: String! + to: String! + subject: String! + type: String! + text: String! + html: String + createdAt: Date! + } + # Mutations type Mutation { googleLogin(input: GoogleLoginInput!): LoginResult! @@ -2481,6 +2507,7 @@ const schema = gql` deviceTokens: DeviceTokensResult! filters: FiltersResult! groups: GroupsResult! + recentEmails: RecentEmailsResult! } `