add refresh home api

This commit is contained in:
Hongbo Wu
2024-05-29 17:24:37 +08:00
parent a9ebcd33e4
commit 91c2ae8d97
6 changed files with 110 additions and 5 deletions

View File

@ -1714,6 +1714,7 @@ export type Mutation = {
optInFeature: OptInFeatureResult;
recommend: RecommendResult;
recommendHighlights: RecommendHighlightsResult;
refreshHome: RefreshHomeResult;
replyToEmail: ReplyToEmailResult;
reportItem: ReportItemResult;
revokeApiKey: RevokeApiKeyResult;
@ -2525,6 +2526,22 @@ export type RecommendingUser = {
username: Scalars['String'];
};
export type RefreshHomeError = {
__typename?: 'RefreshHomeError';
errorCodes: Array<RefreshHomeErrorCode>;
};
export enum RefreshHomeErrorCode {
Pending = 'PENDING'
}
export type RefreshHomeResult = RefreshHomeError | RefreshHomeSuccess;
export type RefreshHomeSuccess = {
__typename?: 'RefreshHomeSuccess';
success: Scalars['Boolean'];
};
export type Reminder = {
__typename?: 'Reminder';
archiveUntil: Scalars['Boolean'];
@ -2875,6 +2892,7 @@ export type SearchItem = {
recommendations?: Maybe<Array<Recommendation>>;
savedAt: Scalars['Date'];
score?: Maybe<Scalars['Float']>;
seenAt?: Maybe<Scalars['Date']>;
shortId?: Maybe<Scalars['String']>;
siteIcon?: Maybe<Scalars['String']>;
siteName?: Maybe<Scalars['String']>;
@ -4411,6 +4429,10 @@ export type ResolversTypes = {
Recommendation: ResolverTypeWrapper<Recommendation>;
RecommendationGroup: ResolverTypeWrapper<RecommendationGroup>;
RecommendingUser: ResolverTypeWrapper<RecommendingUser>;
RefreshHomeError: ResolverTypeWrapper<RefreshHomeError>;
RefreshHomeErrorCode: RefreshHomeErrorCode;
RefreshHomeResult: ResolversTypes['RefreshHomeError'] | ResolversTypes['RefreshHomeSuccess'];
RefreshHomeSuccess: ResolverTypeWrapper<RefreshHomeSuccess>;
Reminder: ResolverTypeWrapper<Reminder>;
ReminderError: ResolverTypeWrapper<ReminderError>;
ReminderErrorCode: ReminderErrorCode;
@ -4947,6 +4969,9 @@ export type ResolversParentTypes = {
Recommendation: Recommendation;
RecommendationGroup: RecommendationGroup;
RecommendingUser: RecommendingUser;
RefreshHomeError: RefreshHomeError;
RefreshHomeResult: ResolversParentTypes['RefreshHomeError'] | ResolversParentTypes['RefreshHomeSuccess'];
RefreshHomeSuccess: RefreshHomeSuccess;
Reminder: Reminder;
ReminderError: ReminderError;
ReminderResult: ResolversParentTypes['ReminderError'] | ResolversParentTypes['ReminderSuccess'];
@ -6391,6 +6416,7 @@ export type MutationResolvers<ContextType = ResolverContext, ParentType extends
optInFeature?: Resolver<ResolversTypes['OptInFeatureResult'], ParentType, ContextType, RequireFields<MutationOptInFeatureArgs, 'input'>>;
recommend?: Resolver<ResolversTypes['RecommendResult'], ParentType, ContextType, RequireFields<MutationRecommendArgs, 'input'>>;
recommendHighlights?: Resolver<ResolversTypes['RecommendHighlightsResult'], ParentType, ContextType, RequireFields<MutationRecommendHighlightsArgs, 'input'>>;
refreshHome?: Resolver<ResolversTypes['RefreshHomeResult'], ParentType, ContextType>;
replyToEmail?: Resolver<ResolversTypes['ReplyToEmailResult'], ParentType, ContextType, RequireFields<MutationReplyToEmailArgs, 'recentEmailId' | 'reply'>>;
reportItem?: Resolver<ResolversTypes['ReportItemResult'], ParentType, ContextType, RequireFields<MutationReportItemArgs, 'input'>>;
revokeApiKey?: Resolver<ResolversTypes['RevokeApiKeyResult'], ParentType, ContextType, RequireFields<MutationRevokeApiKeyArgs, 'id'>>;
@ -6663,6 +6689,20 @@ export type RecommendingUserResolvers<ContextType = ResolverContext, ParentType
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};
export type RefreshHomeErrorResolvers<ContextType = ResolverContext, ParentType extends ResolversParentTypes['RefreshHomeError'] = ResolversParentTypes['RefreshHomeError']> = {
errorCodes?: Resolver<Array<ResolversTypes['RefreshHomeErrorCode']>, ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};
export type RefreshHomeResultResolvers<ContextType = ResolverContext, ParentType extends ResolversParentTypes['RefreshHomeResult'] = ResolversParentTypes['RefreshHomeResult']> = {
__resolveType: TypeResolveFn<'RefreshHomeError' | 'RefreshHomeSuccess', ParentType, ContextType>;
};
export type RefreshHomeSuccessResolvers<ContextType = ResolverContext, ParentType extends ResolversParentTypes['RefreshHomeSuccess'] = ResolversParentTypes['RefreshHomeSuccess']> = {
success?: Resolver<ResolversTypes['Boolean'], ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};
export type ReminderResolvers<ContextType = ResolverContext, ParentType extends ResolversParentTypes['Reminder'] = ResolversParentTypes['Reminder']> = {
archiveUntil?: Resolver<ResolversTypes['Boolean'], ParentType, ContextType>;
id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
@ -6864,6 +6904,7 @@ export type SearchItemResolvers<ContextType = ResolverContext, ParentType extend
recommendations?: Resolver<Maybe<Array<ResolversTypes['Recommendation']>>, ParentType, ContextType>;
savedAt?: Resolver<ResolversTypes['Date'], ParentType, ContextType>;
score?: Resolver<Maybe<ResolversTypes['Float']>, ParentType, ContextType>;
seenAt?: Resolver<Maybe<ResolversTypes['Date']>, ParentType, ContextType>;
shortId?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
siteIcon?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
siteName?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
@ -7796,6 +7837,9 @@ export type Resolvers<ContextType = ResolverContext> = {
Recommendation?: RecommendationResolvers<ContextType>;
RecommendationGroup?: RecommendationGroupResolvers<ContextType>;
RecommendingUser?: RecommendingUserResolvers<ContextType>;
RefreshHomeError?: RefreshHomeErrorResolvers<ContextType>;
RefreshHomeResult?: RefreshHomeResultResolvers<ContextType>;
RefreshHomeSuccess?: RefreshHomeSuccessResolvers<ContextType>;
Reminder?: ReminderResolvers<ContextType>;
ReminderError?: ReminderErrorResolvers<ContextType>;
ReminderResult?: ReminderResultResolvers<ContextType>;

View File

@ -1551,6 +1551,7 @@ type Mutation {
optInFeature(input: OptInFeatureInput!): OptInFeatureResult!
recommend(input: RecommendInput!): RecommendResult!
recommendHighlights(input: RecommendHighlightsInput!): RecommendHighlightsResult!
refreshHome: RefreshHomeResult!
replyToEmail(recentEmailId: ID!, reply: AllowedReply!): ReplyToEmailResult!
reportItem(input: ReportItemInput!): ReportItemResult!
revokeApiKey(id: ID!): RevokeApiKeyResult!
@ -1891,6 +1892,20 @@ type RecommendingUser {
username: String!
}
type RefreshHomeError {
errorCodes: [RefreshHomeErrorCode!]!
}
enum RefreshHomeErrorCode {
PENDING
}
union RefreshHomeResult = RefreshHomeError | RefreshHomeSuccess
type RefreshHomeSuccess {
success: Boolean!
}
type Reminder {
archiveUntil: Boolean!
id: ID!
@ -2217,6 +2232,7 @@ type SearchItem {
recommendations: [Recommendation!]
savedAt: Date!
score: Float
seenAt: Date
shortId: String
siteIcon: String
siteName: String

View File

@ -670,7 +670,7 @@ export const searchResolver = authorized<
SearchSuccess,
SearchError,
QuerySearchArgs
>(async (_obj, params, { uid, log }) => {
>(async (_obj, params, { uid }) => {
const startCursor = params.after || ''
const first = Math.min(params.first || 10, 100) // limit to 100 items

View File

@ -60,7 +60,7 @@ import {
saveDiscoverArticleResolver,
} from './discover_feeds'
import { optInFeatureResolver } from './features'
import { homeResolver } from './home'
import { homeResolver, refreshHomeResolver } from './home'
import { uploadImportFileResolver } from './importers/uploadImportFileResolver'
import {
addPopularReadResolver,
@ -332,6 +332,7 @@ export const functionResolvers = {
fetchContent: fetchContentResolver,
exportToIntegration: exportToIntegrationResolver,
replyToEmail: replyToEmailResolver,
refreshHome: refreshHomeResolver,
},
Query: {
me: getMeUserResolver,
@ -867,4 +868,5 @@ export const functionResolvers = {
...resultResolveTypeResolver('ReplyToEmail'),
...resultResolveTypeResolver('Home'),
...resultResolveTypeResolver('Subscription'),
...resultResolveTypeResolver('RefreshHome'),
}

View File

@ -5,6 +5,9 @@ import {
HomeSection,
HomeSuccess,
QueryHomeArgs,
RefreshHomeError,
RefreshHomeErrorCode,
RefreshHomeSuccess,
} from '../../generated/graphql'
import { getHomeSections } from '../../jobs/update_home'
import { getJob } from '../../queue-processor'
@ -34,12 +37,12 @@ export const homeResolver = authorized<
const cursor = after ? parseInt(after) : Date.now()
const sections = await getHomeSections(uid, limit, cursor)
log.info('Just read feed sections fetched')
log.info('Home sections fetched')
if (sections.length === 0) {
const existingJob = await getJob(updateHomeJobId(uid))
if (existingJob) {
log.info('Just read feed update job already enqueued')
log.info('Update job job already enqueued')
return {
errorCodes: [HomeErrorCode.Pending],
@ -51,7 +54,7 @@ export const homeResolver = authorized<
cursor,
})
log.info('Just read feed update enqueued')
log.info('Update home job enqueued')
return {
errorCodes: [HomeErrorCode.Pending],
@ -75,3 +78,27 @@ export const homeResolver = authorized<
},
}
})
export const refreshHomeResolver = authorized<
RefreshHomeSuccess,
RefreshHomeError
>(async (_, __, { uid, log }) => {
const existingJob = await getJob(updateHomeJobId(uid))
if (existingJob) {
log.info('Update home job already enqueued')
return {
errorCodes: [RefreshHomeErrorCode.Pending],
}
}
await enqueueUpdateHomeJob({
userId: uid,
})
log.info('Update home job enqueued')
return {
success: true,
}
})

View File

@ -1677,6 +1677,7 @@ const schema = gql`
directionality: DirectionalityType
format: String
score: Float
seenAt: Date
}
type SearchItemEdge {
@ -3193,6 +3194,20 @@ const schema = gql`
union SubscriptionResult = SubscriptionSuccess | SubscriptionError
type RefreshHomeSuccess {
success: Boolean!
}
enum RefreshHomeErrorCode {
PENDING
}
type RefreshHomeError {
errorCodes: [RefreshHomeErrorCode!]!
}
union RefreshHomeResult = RefreshHomeSuccess | RefreshHomeError
# Mutations
type Mutation {
googleLogin(input: GoogleLoginInput!): LoginResult!
@ -3318,6 +3333,7 @@ const schema = gql`
): DeleteDiscoverFeedResult!
editDiscoverFeed(input: EditDiscoverFeedInput!): EditDiscoverFeedResult!
emptyTrash: EmptyTrashResult!
refreshHome: RefreshHomeResult!
}
# FIXME: remove sort from feedArticles after all cached tabs are closed