From fc17756a53f3747c4fbc065a307269517defd528 Mon Sep 17 00:00:00 2001 From: Alessio Date: Mon, 26 Jun 2023 13:16:22 -0300 Subject: [PATCH] Add queries for Likes --- persistence/likes_queries.go | 34 +++++++++++++++++++++++++++ persistence/likes_queries_test.go | 38 +++++++++++++++++++++++++++++++ persistence/schema.sql | 9 ++++++++ persistence/utils_test.go | 8 +++++++ 4 files changed, 89 insertions(+) create mode 100644 persistence/likes_queries.go create mode 100644 persistence/likes_queries_test.go diff --git a/persistence/likes_queries.go b/persistence/likes_queries.go new file mode 100644 index 0000000..0a14842 --- /dev/null +++ b/persistence/likes_queries.go @@ -0,0 +1,34 @@ +package persistence + +import ( + "fmt" + + "offline_twitter/scraper" +) + +func (p Profile) SaveLike(l scraper.Like) error { + _, err := p.DB.NamedExec(` + insert into likes (sort_order, user_id, tweet_id) + values (:sort_order, :user_id, :tweet_id) + on conflict do update set sort_order = max(sort_order, :sort_order) + `, + l, + ) + if err != nil { + return fmt.Errorf("Error executing SaveLike(%#v):\n %w", l, err) + } + return nil +} + +func (p Profile) GetLikeBySortID(id scraper.LikeSortID) (scraper.Like, error) { + var l scraper.Like + err := p.DB.Get(&l, ` + select sort_order, user_id, tweet_id + from likes + where sort_order = ? + `, id) + if err != nil { + return l, fmt.Errorf("Error executing GetLikeBySortID(%d):\n %w", id, err) + } + return l, nil +} diff --git a/persistence/likes_queries_test.go b/persistence/likes_queries_test.go new file mode 100644 index 0000000..9046c39 --- /dev/null +++ b/persistence/likes_queries_test.go @@ -0,0 +1,38 @@ +package persistence_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/go-test/deep" +) + +func TestSaveAndLoadLike(t *testing.T) { + require := require.New(t) + + profile_path := "test_profiles/TestLikesQueries" + profile := create_or_load_profile(profile_path) + + like := create_dummy_like() + err := profile.SaveLike(like) + require.NoError(err) + + // Reload the Like + new_like, err := profile.GetLikeBySortID(like.SortID) + require.NoError(err) + + // Should come back the same + if diff := deep.Equal(like, new_like); diff != nil { + t.Error(diff) + } + + // Test double-saving + err = profile.SaveLike(like) + require.NoError(err) + new_like, err = profile.GetLikeBySortID(like.SortID) + require.NoError(err) + if diff := deep.Equal(like, new_like); diff != nil { + t.Error(diff) + } +} diff --git a/persistence/schema.sql b/persistence/schema.sql index abcc94c..540cb3f 100644 --- a/persistence/schema.sql +++ b/persistence/schema.sql @@ -192,5 +192,14 @@ create table database_version(rowid integer primary key, version_number integer not null unique ); +create table likes(rowid integer primary key, + sort_order integer unique not null, + user_id integer not null, + tweet_id integer not null, + unique(user_id, tweet_id) + foreign key(user_id) references users(id) + foreign key(tweet_id) references tweets(id) +); + create table fake_user_sequence(latest_fake_id integer not null); insert into fake_user_sequence values(0x4000000000000000); diff --git a/persistence/utils_test.go b/persistence/utils_test.go index 398f271..48c9fb6 100644 --- a/persistence/utils_test.go +++ b/persistence/utils_test.go @@ -317,3 +317,11 @@ func create_space_from_id(id int) scraper.Space { ParticipantIds: []scraper.UserID{-1}, } } + +func create_dummy_like() scraper.Like { + return scraper.Like{ + TweetID: create_stable_tweet().ID, + UserID: create_stable_user().ID, + SortID: scraper.LikeSortID(12345), + } +}