diff --git a/packages/api/src/generated/graphql.ts b/packages/api/src/generated/graphql.ts index c285dcc47..a4392d52e 100644 --- a/packages/api/src/generated/graphql.ts +++ b/packages/api/src/generated/graphql.ts @@ -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; +}; + +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>; savedAt: Scalars['Date']; score?: Maybe; + seenAt?: Maybe; shortId?: Maybe; siteIcon?: Maybe; siteName?: Maybe; @@ -4411,6 +4429,10 @@ export type ResolversTypes = { Recommendation: ResolverTypeWrapper; RecommendationGroup: ResolverTypeWrapper; RecommendingUser: ResolverTypeWrapper; + RefreshHomeError: ResolverTypeWrapper; + RefreshHomeErrorCode: RefreshHomeErrorCode; + RefreshHomeResult: ResolversTypes['RefreshHomeError'] | ResolversTypes['RefreshHomeSuccess']; + RefreshHomeSuccess: ResolverTypeWrapper; Reminder: ResolverTypeWrapper; ReminderError: ResolverTypeWrapper; 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>; recommend?: Resolver>; recommendHighlights?: Resolver>; + refreshHome?: Resolver; replyToEmail?: Resolver>; reportItem?: Resolver>; revokeApiKey?: Resolver>; @@ -6663,6 +6689,20 @@ export type RecommendingUserResolvers; }; +export type RefreshHomeErrorResolvers = { + errorCodes?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type RefreshHomeResultResolvers = { + __resolveType: TypeResolveFn<'RefreshHomeError' | 'RefreshHomeSuccess', ParentType, ContextType>; +}; + +export type RefreshHomeSuccessResolvers = { + success?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + export type ReminderResolvers = { archiveUntil?: Resolver; id?: Resolver; @@ -6864,6 +6904,7 @@ export type SearchItemResolvers>, ParentType, ContextType>; savedAt?: Resolver; score?: Resolver, ParentType, ContextType>; + seenAt?: Resolver, ParentType, ContextType>; shortId?: Resolver, ParentType, ContextType>; siteIcon?: Resolver, ParentType, ContextType>; siteName?: Resolver, ParentType, ContextType>; @@ -7796,6 +7837,9 @@ export type Resolvers = { Recommendation?: RecommendationResolvers; RecommendationGroup?: RecommendationGroupResolvers; RecommendingUser?: RecommendingUserResolvers; + RefreshHomeError?: RefreshHomeErrorResolvers; + RefreshHomeResult?: RefreshHomeResultResolvers; + RefreshHomeSuccess?: RefreshHomeSuccessResolvers; Reminder?: ReminderResolvers; ReminderError?: ReminderErrorResolvers; ReminderResult?: ReminderResultResolvers; diff --git a/packages/api/src/generated/schema.graphql b/packages/api/src/generated/schema.graphql index ccc07cf6f..1642622d7 100644 --- a/packages/api/src/generated/schema.graphql +++ b/packages/api/src/generated/schema.graphql @@ -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 diff --git a/packages/api/src/resolvers/article/index.ts b/packages/api/src/resolvers/article/index.ts index dc1489c9e..026cb7988 100644 --- a/packages/api/src/resolvers/article/index.ts +++ b/packages/api/src/resolvers/article/index.ts @@ -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 diff --git a/packages/api/src/resolvers/function_resolvers.ts b/packages/api/src/resolvers/function_resolvers.ts index 45bfc9dfd..4de6224fa 100644 --- a/packages/api/src/resolvers/function_resolvers.ts +++ b/packages/api/src/resolvers/function_resolvers.ts @@ -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'), } diff --git a/packages/api/src/resolvers/home/index.ts b/packages/api/src/resolvers/home/index.ts index 0434250e7..cdd214d1e 100644 --- a/packages/api/src/resolvers/home/index.ts +++ b/packages/api/src/resolvers/home/index.ts @@ -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, + } +}) diff --git a/packages/api/src/schema.ts b/packages/api/src/schema.ts index 4338377a0..2e51e3b00 100755 --- a/packages/api/src/schema.ts +++ b/packages/api/src/schema.ts @@ -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