From 4e8b8e6a695aceed64bfcd8f57229cd2d2935d73 Mon Sep 17 00:00:00 2001 From: Shizun Ge Date: Mon, 27 Nov 2023 23:07:46 -0800 Subject: [PATCH] calling store.UpdateFeed and store.UpdateFeedError in a defer function --- internal/cli/refresh_feeds.go | 2 +- internal/reader/handler/handler.go | 55 ++++++++++++++---------------- 2 files changed, 27 insertions(+), 30 deletions(-) diff --git a/internal/cli/refresh_feeds.go b/internal/cli/refresh_feeds.go index d01b3ceb6ad..5a8964e5f9a 100644 --- a/internal/cli/refresh_feeds.go +++ b/internal/cli/refresh_feeds.go @@ -56,7 +56,7 @@ func refreshFeeds(store *storage.Storage) { slog.Int("worker_id", workerID), ) - if localizedError := feedHandler.RefreshFeed(store, job.UserID, job.FeedID, false); err != nil { + if localizedError := feedHandler.RefreshFeed(store, job.UserID, job.FeedID, false); localizedError != nil { slog.Warn("Unable to refresh feed", slog.Int64("feed_id", job.FeedID), slog.Int64("user_id", job.UserID), diff --git a/internal/reader/handler/handler.go b/internal/reader/handler/handler.go index 18d9f15c1fa..a446dd67e11 100644 --- a/internal/reader/handler/handler.go +++ b/internal/reader/handler/handler.go @@ -227,7 +227,30 @@ func RefreshFeed(store *storage.Storage, userID, feedID int64, forceRefresh bool } originalFeed.CheckedNow() - originalFeed.ScheduleNextCheck(weeklyEntryCount, newTTL) + // Commit the result to the database at the end of this function. + // If we met an error before entering the defer function, localizedError would not be nil. + defer func() { + originalFeed.ScheduleNextCheck(weeklyEntryCount, newTTL) + slog.Debug("Updated next check date", + slog.Int64("user_id", userID), + slog.Int64("feed_id", feedID), + slog.Int("weeklyEntryCount", weeklyEntryCount), + slog.Int("ttl", newTTL), + slog.Time("new_next_check_at", originalFeed.NextCheckAt), + ) + if localizedError == nil { + // We have not encountered any error before entering this delay function. + originalFeed.ResetErrorCounter() + if storeErr := store.UpdateFeed(originalFeed); storeErr != nil { + // Update the return value when there is an error. + localizedError = locale.NewLocalizedErrorWrapper(storeErr, "error.database_error", storeErr) + } + } + if localizedError != nil { + originalFeed.WithTranslatedErrorMessage(localizedError.Translate(user.Language)) + store.UpdateFeedError(originalFeed) + } + }() requestBuilder := fetcher.NewRequestBuilder() requestBuilder.WithUsernameAndPassword(originalFeed.Username, originalFeed.Password) @@ -245,15 +268,11 @@ func RefreshFeed(store *storage.Storage, userID, feedID int64, forceRefresh bool if localizedError = responseHandler.LocalizedError(); localizedError != nil { slog.Warn("Unable to fetch feed", slog.String("feed_url", originalFeed.FeedURL), slog.Any("error", localizedError.Error())) - originalFeed.WithTranslatedErrorMessage(localizedError.Translate(user.Language)) - store.UpdateFeedError(originalFeed) return localizedError } if store.AnotherFeedURLExists(userID, originalFeed.ID, responseHandler.EffectiveURL()) { localizedError = locale.NewLocalizedErrorWrapper(ErrDuplicatedFeed, "error.duplicated_feed") - originalFeed.WithTranslatedErrorMessage(localizedError.Translate(user.Language)) - store.UpdateFeedError(originalFeed) return localizedError } @@ -271,27 +290,16 @@ func RefreshFeed(store *storage.Storage, userID, feedID int64, forceRefresh bool updatedFeed, parseErr := parser.ParseFeed(responseHandler.EffectiveURL(), bytes.NewReader(responseBody)) if parseErr != nil { - localizedError = locale.NewLocalizedErrorWrapper(parseErr, "error.unable_to_parse_feed") - if errors.Is(parseErr, parser.ErrFeedFormatNotDetected) { localizedError = locale.NewLocalizedErrorWrapper(parseErr, "error.feed_format_not_detected", parseErr) + } else { + localizedError = locale.NewLocalizedErrorWrapper(parseErr, "error.unable_to_parse_feed") } - - originalFeed.WithTranslatedErrorMessage(localizedError.Translate(user.Language)) - store.UpdateFeedError(originalFeed) return localizedError } // If the feed has a TTL defined, we use it to make sure we don't check it too often. newTTL = updatedFeed.TTL - // Set the next check at with updated arguments. - originalFeed.ScheduleNextCheck(weeklyEntryCount, newTTL) - slog.Debug("Updated next check date", - slog.Int64("user_id", userID), - slog.Int64("feed_id", feedID), - slog.Int("ttl", newTTL), - slog.Time("new_next_check_at", originalFeed.NextCheckAt), - ) originalFeed.Entries = updatedFeed.Entries processor.ProcessFeedEntries(store, originalFeed, user, forceRefresh) @@ -301,8 +309,6 @@ func RefreshFeed(store *storage.Storage, userID, feedID int64, forceRefresh bool newEntries, storeErr := store.RefreshFeedEntries(originalFeed.UserID, originalFeed.ID, originalFeed.Entries, updateExistingEntries) if storeErr != nil { localizedError = locale.NewLocalizedErrorWrapper(storeErr, "error.database_error", storeErr) - originalFeed.WithTranslatedErrorMessage(localizedError.Translate(user.Language)) - store.UpdateFeedError(originalFeed) return localizedError } @@ -336,15 +342,6 @@ func RefreshFeed(store *storage.Storage, userID, feedID int64, forceRefresh bool ) } - originalFeed.ResetErrorCounter() - - if storeErr := store.UpdateFeed(originalFeed); storeErr != nil { - localizedError = locale.NewLocalizedErrorWrapper(storeErr, "error.database_error", storeErr) - originalFeed.WithTranslatedErrorMessage(localizedError.Translate(user.Language)) - store.UpdateFeedError(originalFeed) - return localizedError - } - return localizedError }