From 3dd6b7b6f7d421f4c1201fc93629462bf4915eb5 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Wed, 12 Mar 2025 23:19:40 +0800 Subject: [PATCH] :recycle: Refactor save fediverse data logic --- pkg/internal/services/fediverse.go | 33 +++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/pkg/internal/services/fediverse.go b/pkg/internal/services/fediverse.go index 9b9defd..07a3387 100644 --- a/pkg/internal/services/fediverse.go +++ b/pkg/internal/services/fediverse.go @@ -58,17 +58,44 @@ func FetchFediverseTimedTask() { log.Debug().Msg("Starting fetching fediverse friends timeline...") var totalPosts []models.FediversePost + var totalUsers []models.FediverseUser + userMap := make(map[string]models.FediverseUser) + for _, friend := range fediverseFriends { log.Info().Str("id", friend.ID).Str("url", friend.URL).Msg("Fetching fediverse friend timeline...") posts, err := FetchFediversePost(friend) if err != nil { - log.Error().Err(err).Str("id", friend.ID).Str("url", friend.URL).Msg("Failed to fetch fediverse friend timelime...") + log.Error().Err(err).Str("id", friend.ID).Str("url", friend.URL).Msg("Failed to fetch fediverse friend timeline...") + continue } + log.Info().Str("id", friend.ID).Str("url", friend.URL).Int("count", len(posts)).Msg("Fetched fediverse friend timeline...") + + for _, post := range posts { + if _, exists := userMap[post.User.Identifier]; !exists { + userMap[post.User.Identifier] = post.User + } + } + totalPosts = append(totalPosts, posts...) } - if err := database.C.Clauses(clause.OnConflict{DoNothing: true}).Create(&totalPosts).Error; err != nil { - log.Error().Err(err).Msg("Failed to save timeline posts...") + for _, user := range userMap { + totalUsers = append(totalUsers, user) + } + + if len(totalUsers) > 0 { + if err := database.C.Clauses(clause.OnConflict{ + Columns: []clause.Column{{Name: "identifier"}}, + DoUpdates: clause.AssignmentColumns([]string{"name", "nick", "avatar"}), + }).Create(&totalUsers).Error; err != nil { + log.Error().Err(err).Msg("Failed to save fediverse users...") + } + } + + if len(totalPosts) > 0 { + if err := database.C.Clauses(clause.OnConflict{DoNothing: true}).Create(&totalPosts).Error; err != nil { + log.Error().Err(err).Msg("Failed to save timeline posts...") + } } }