mirror of
https://github.com/omnivore-app/omnivore.git
synced 2026-03-11 08:54:26 +00:00
Add list recent emails api
This commit is contained in:
parent
3f373ab3b6
commit
62a3b48e00
5 changed files with 173 additions and 0 deletions
|
|
@ -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>;
|
||||
|
|
|
|||
|
|
@ -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!
|
||||
|
|
|
|||
|
|
@ -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'),
|
||||
}
|
||||
|
|
|
|||
46
packages/api/src/resolvers/recent_emails/index.ts
Normal file
46
packages/api/src/resolvers/recent_emails/index.ts
Normal 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],
|
||||
}
|
||||
}
|
||||
})
|
||||
|
|
@ -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!
|
||||
}
|
||||
`
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue