this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

make use of the db

+38 -32
+19 -10
database.go
··· 1 1 package main 2 2 3 3 import ( 4 + "context" 4 5 "database/sql" 5 6 "errors" 6 7 "fmt" 7 8 "log/slog" 8 9 "os" 9 10 10 - "github.com/bugsnag/bugsnag-go/v2" 11 11 _ "github.com/glebarez/go-sqlite" 12 12 ) 13 13 ··· 75 75 UserDID string 76 76 } 77 77 78 - func read(db *sql.DB) { 79 - rows, err := db.Query("SELECT id, uri, userDID FROM feed") 78 + func addFeedItem(_ context.Context, db *sql.DB, feedItem feedItem) error { 79 + sql := `INSERT INTO feed (uri, userDID) 80 + VALUES (?, ?, ?);` 81 + _, err := db.Exec(sql, feedItem.URI, feedItem.UserDID) 82 + if err != nil { 83 + return fmt.Errorf("exec insert feed item: %w", err) 84 + } 85 + return nil 86 + } 87 + 88 + func getUsersFeedItems(db *sql.DB, usersDID string) ([]feedItem, error) { 89 + sql := "SELECT id, uri, userDID FROM feed WHERE userDID = ?" 90 + rows, err := db.Query(sql, usersDID) 80 91 if err != nil { 81 - bugsnag.Notify(fmt.Errorf("db query: %w", err)) 82 - return 92 + return nil, fmt.Errorf("run query to get users feed item: %w", err) 83 93 } 84 - defer rows.Close() // Ensure rows are closed after processing 94 + defer rows.Close() 85 95 86 - feedItems := make([]feedItem, 0) // Slice to store todos 96 + feedItems := make([]feedItem, 0) 87 97 for rows.Next() { 88 98 var feedItem feedItem 89 99 if err := rows.Scan(&feedItem.ID, &feedItem.URI, &feedItem.UserDID); err != nil { 90 - bugsnag.Notify(fmt.Errorf("db scan: %w", err)) 91 - return 100 + return nil, fmt.Errorf("scan row: %w", err) 92 101 } 93 102 feedItems = append(feedItems, feedItem) 94 103 } 95 104 96 - slog.Info("feed items read", "values", feedItems) 105 + return feedItems, nil 97 106 }
+19 -22
feed.go
··· 3 3 import ( 4 4 "context" 5 5 "database/sql" 6 - "sync" 6 + "fmt" 7 + "log/slog" 8 + 9 + "github.com/bugsnag/bugsnag-go/v2" 7 10 ) 8 11 9 12 type FeedGenerator struct { 10 - db *sql.DB 11 - mu sync.Mutex 12 - posts map[string][]string 13 + db *sql.DB 13 14 } 14 15 15 16 func NewFeedGenerator(db *sql.DB) *FeedGenerator { 16 17 return &FeedGenerator{ 17 - db: db, 18 - posts: make(map[string][]string), 18 + db: db, 19 19 } 20 20 } 21 21 ··· 24 24 Feed: make([]FeedItem, 0, 0), 25 25 } 26 26 27 - f.mu.Lock() 28 - defer f.mu.Unlock() 29 - 30 - usersFeed, ok := f.posts[userDID] 31 - if !ok { 32 - return resp, nil 27 + usersFeed, err := getUsersFeedItems(f.db, userDID) 28 + if err != nil { 29 + return resp, fmt.Errorf("get users feed items from DB: %w", err) 33 30 } 34 31 35 32 feedItems := make([]FeedItem, 0, len(usersFeed)) 36 33 for _, post := range usersFeed { 37 34 feedItems = append(feedItems, FeedItem{ 38 - Post: post, 35 + Post: post.URI, 39 36 }) 40 37 } 41 38 ··· 46 43 } 47 44 48 45 func (f *FeedGenerator) AddToFeedPosts(usersDids []string, postURI string) { 49 - f.mu.Lock() 50 - defer f.mu.Unlock() 51 46 for _, did := range usersDids { 52 - // TODO: store this in DB instead 53 - usersPosts, ok := f.posts[did] 54 - if !ok { 55 - usersPosts = make([]string, 0, 1) 47 + feedItem := feedItem{ 48 + URI: postURI, 49 + UserDID: did, 56 50 } 57 - 58 - usersPosts = append(usersPosts, postURI) 59 - f.posts[did] = usersPosts 51 + err := addFeedItem(context.Background(), f.db, feedItem) 52 + if err != nil { 53 + slog.Error("add users feed item", "error", err, "did", did, "uri", postURI) 54 + bugsnag.Notify(err) 55 + continue 56 + } 60 57 } 61 58 }