Add list recent emails api

This commit is contained in:
Hongbo Wu 2023-01-17 17:40:30 +08:00
parent 3f373ab3b6
commit 62a3b48e00
5 changed files with 173 additions and 0 deletions

View file

@ -1669,6 +1669,7 @@ export type Query = {
labels: LabelsResult;
me?: Maybe<User>;
newsletterEmails: NewsletterEmailsResult;
recentEmails: RecentEmailsResult;
recentSearches: RecentSearchesResult;
reminder: ReminderResult;
rules: RulesResult;
@ -1812,6 +1813,35 @@ export type ReadState = {
readingTime?: Maybe<Scalars['Int']>;
};
export type RecentEmail = {
__typename?: 'RecentEmail';
createdAt: Scalars['Date'];
from: Scalars['String'];
html?: Maybe<Scalars['String']>;
id: Scalars['ID'];
subject: Scalars['String'];
text: Scalars['String'];
to: Scalars['String'];
type: Scalars['String'];
};
export type RecentEmailsError = {
__typename?: 'RecentEmailsError';
errorCodes: Array<RecentEmailsErrorCode>;
};
export enum RecentEmailsErrorCode {
BadRequest = 'BAD_REQUEST',
Unauthorized = 'UNAUTHORIZED'
}
export type RecentEmailsResult = RecentEmailsError | RecentEmailsSuccess;
export type RecentEmailsSuccess = {
__typename?: 'RecentEmailsSuccess';
recentEmails: Array<RecentEmail>;
};
export type RecentSearch = {
__typename?: 'RecentSearch';
createdAt: Scalars['Date'];
@ -3353,6 +3383,11 @@ export type ResolversTypes = {
Reaction: ResolverTypeWrapper<Reaction>;
ReactionType: ReactionType;
ReadState: ResolverTypeWrapper<ReadState>;
RecentEmail: ResolverTypeWrapper<RecentEmail>;
RecentEmailsError: ResolverTypeWrapper<RecentEmailsError>;
RecentEmailsErrorCode: RecentEmailsErrorCode;
RecentEmailsResult: ResolversTypes['RecentEmailsError'] | ResolversTypes['RecentEmailsSuccess'];
RecentEmailsSuccess: ResolverTypeWrapper<RecentEmailsSuccess>;
RecentSearch: ResolverTypeWrapper<RecentSearch>;
RecentSearchesError: ResolverTypeWrapper<RecentSearchesError>;
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<ContextType = ResolverContext, ParentType extends Res
labels?: Resolver<ResolversTypes['LabelsResult'], ParentType, ContextType>;
me?: Resolver<Maybe<ResolversTypes['User']>, ParentType, ContextType>;
newsletterEmails?: Resolver<ResolversTypes['NewsletterEmailsResult'], ParentType, ContextType>;
recentEmails?: Resolver<ResolversTypes['RecentEmailsResult'], ParentType, ContextType>;
recentSearches?: Resolver<ResolversTypes['RecentSearchesResult'], ParentType, ContextType>;
reminder?: Resolver<ResolversTypes['ReminderResult'], ParentType, ContextType, RequireFields<QueryReminderArgs, 'linkId'>>;
rules?: Resolver<ResolversTypes['RulesResult'], ParentType, ContextType, Partial<QueryRulesArgs>>;
@ -4976,6 +5016,32 @@ export type ReadStateResolvers<ContextType = ResolverContext, ParentType extends
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};
export type RecentEmailResolvers<ContextType = ResolverContext, ParentType extends ResolversParentTypes['RecentEmail'] = ResolversParentTypes['RecentEmail']> = {
createdAt?: Resolver<ResolversTypes['Date'], ParentType, ContextType>;
from?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
html?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
subject?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
text?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
to?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
type?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};
export type RecentEmailsErrorResolvers<ContextType = ResolverContext, ParentType extends ResolversParentTypes['RecentEmailsError'] = ResolversParentTypes['RecentEmailsError']> = {
errorCodes?: Resolver<Array<ResolversTypes['RecentEmailsErrorCode']>, ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};
export type RecentEmailsResultResolvers<ContextType = ResolverContext, ParentType extends ResolversParentTypes['RecentEmailsResult'] = ResolversParentTypes['RecentEmailsResult']> = {
__resolveType: TypeResolveFn<'RecentEmailsError' | 'RecentEmailsSuccess', ParentType, ContextType>;
};
export type RecentEmailsSuccessResolvers<ContextType = ResolverContext, ParentType extends ResolversParentTypes['RecentEmailsSuccess'] = ResolversParentTypes['RecentEmailsSuccess']> = {
recentEmails?: Resolver<Array<ResolversTypes['RecentEmail']>, ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};
export type RecentSearchResolvers<ContextType = ResolverContext, ParentType extends ResolversParentTypes['RecentSearch'] = ResolversParentTypes['RecentSearch']> = {
createdAt?: Resolver<ResolversTypes['Date'], ParentType, ContextType>;
id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
@ -5934,6 +6000,10 @@ export type Resolvers<ContextType = ResolverContext> = {
Query?: QueryResolvers<ContextType>;
Reaction?: ReactionResolvers<ContextType>;
ReadState?: ReadStateResolvers<ContextType>;
RecentEmail?: RecentEmailResolvers<ContextType>;
RecentEmailsError?: RecentEmailsErrorResolvers<ContextType>;
RecentEmailsResult?: RecentEmailsResultResolvers<ContextType>;
RecentEmailsSuccess?: RecentEmailsSuccessResolvers<ContextType>;
RecentSearch?: RecentSearchResolvers<ContextType>;
RecentSearchesError?: RecentSearchesErrorResolvers<ContextType>;
RecentSearchesResult?: RecentSearchesResultResolvers<ContextType>;

View file

@ -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!

View file

@ -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'),
}

View file

@ -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],
}
}
})

View file

@ -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!
}
`