diff options
author | 2022-08-15 12:35:05 +0200 | |
---|---|---|
committer | 2022-08-15 11:35:05 +0100 | |
commit | ac6ed3d939fe9dad81aadbd04541e905c625ca82 (patch) | |
tree | 6116baf25675837dc99f69c49b9fec2ff112ce5c /internal/db | |
parent | [frontend] Sensitive media spoilers (#752) (diff) | |
download | gotosocial-ac6ed3d939fe9dad81aadbd04541e905c625ca82.tar.xz |
[chore] Update bun / sqlite versions; update gtsmodels (#754)
* upstep bun and sqlite versions
* allow specific columns to be updated in the db
* only update necessary columns for user
* bit tidier
* only update necessary fields of media_attachment
* only update relevant instance fields
* update tests
* update only specific account columns
* use bool pointers on gtsmodels
includes attachment, status, account, user
* update columns more selectively
* test all default fields on new account insert
* updating remaining bools on gtsmodels
* initialize pointer fields when extracting AP emoji
* copy bools properly
* add copyBoolPtr convenience function + test it
* initialize false bool ptrs a bit more neatly
Diffstat (limited to 'internal/db')
-rw-r--r-- | internal/db/basic.go | 6 | ||||
-rw-r--r-- | internal/db/bundb/account.go | 6 | ||||
-rw-r--r-- | internal/db/bundb/account_test.go | 10 | ||||
-rw-r--r-- | internal/db/bundb/admin.go | 10 | ||||
-rw-r--r-- | internal/db/bundb/basic.go | 3 | ||||
-rw-r--r-- | internal/db/bundb/basic_test.go | 70 | ||||
-rw-r--r-- | internal/db/bundb/bundb.go | 8 | ||||
-rw-r--r-- | internal/db/bundb/notification_test.go | 3 | ||||
-rw-r--r-- | internal/db/bundb/relationship.go | 4 | ||||
-rw-r--r-- | internal/db/bundb/status_test.go | 32 |
10 files changed, 116 insertions, 36 deletions
diff --git a/internal/db/basic.go b/internal/db/basic.go index 07f04eae3..6e5184d31 100644 --- a/internal/db/basic.go +++ b/internal/db/basic.go @@ -62,9 +62,11 @@ type Basic interface { // The given interface i will be set to the result of the query, whatever it is. Use a pointer or a slice. Put(ctx context.Context, i interface{}) Error - // UpdateByPrimaryKey updates all values of i based on its primary key. + // UpdateByPrimaryKey updates values of i based on its primary key. + // If any columns are specified, these will be updated exclusively. + // Otherwise, the whole model will be updated. // The given interface i will be set to the result of the query, whatever it is. Use a pointer or a slice. - UpdateByPrimaryKey(ctx context.Context, i interface{}) Error + UpdateByPrimaryKey(ctx context.Context, i interface{}, columns ...string) Error // UpdateWhere updates column key of interface i with the given value, where the given parameters apply. UpdateWhere(ctx context.Context, where []Where, key string, value interface{}, i interface{}) Error diff --git a/internal/db/bundb/account.go b/internal/db/bundb/account.go index aaeb646cf..201de6f02 100644 --- a/internal/db/bundb/account.go +++ b/internal/db/bundb/account.go @@ -164,15 +164,15 @@ func (a *accountDB) GetAccountLastPosted(ctx context.Context, accountID string) } func (a *accountDB) SetAccountHeaderOrAvatar(ctx context.Context, mediaAttachment *gtsmodel.MediaAttachment, accountID string) db.Error { - if mediaAttachment.Avatar && mediaAttachment.Header { + if *mediaAttachment.Avatar && *mediaAttachment.Header { return errors.New("one media attachment cannot be both header and avatar") } var headerOrAVI string switch { - case mediaAttachment.Avatar: + case *mediaAttachment.Avatar: headerOrAVI = "avatar" - case mediaAttachment.Header: + case *mediaAttachment.Header: headerOrAVI = "header" default: return errors.New("given media attachment was neither a header nor an avatar") diff --git a/internal/db/bundb/account_test.go b/internal/db/bundb/account_test.go index 134e38940..59b51386d 100644 --- a/internal/db/bundb/account_test.go +++ b/internal/db/bundb/account_test.go @@ -93,11 +93,11 @@ func (suite *AccountTestSuite) TestInsertAccountWithDefaults() { suite.Equal("en", newAccount.Language) suite.WithinDuration(time.Now(), newAccount.CreatedAt, 30*time.Second) suite.WithinDuration(time.Now(), newAccount.UpdatedAt, 30*time.Second) - suite.False(newAccount.Memorial) - suite.False(newAccount.Bot) - suite.False(newAccount.Discoverable) - suite.False(newAccount.Sensitive) - suite.False(newAccount.HideCollections) + suite.False(*newAccount.Memorial) + suite.False(*newAccount.Bot) + suite.False(*newAccount.Discoverable) + suite.False(*newAccount.Sensitive) + suite.False(*newAccount.HideCollections) } func TestAccountTestSuite(t *testing.T) { diff --git a/internal/db/bundb/admin.go b/internal/db/bundb/admin.go index 1bda82d56..f66ed0294 100644 --- a/internal/db/bundb/admin.go +++ b/internal/db/bundb/admin.go @@ -142,6 +142,8 @@ func (a *adminDB) NewSignup(ctx context.Context, username string, reason string, return nil, err } + // if we don't require moderator approval, just pre-approve the user + approved := !requireApproval u := >smodel.User{ ID: newUserID, AccountID: acct.ID, @@ -151,7 +153,7 @@ func (a *adminDB) NewSignup(ctx context.Context, username string, reason string, Locale: locale, UnconfirmedEmail: email, CreatedByApplicationID: appID, - Approved: !requireApproval, // if we don't require moderator approval, just pre-approve the user + Approved: &approved, } if emailVerified { @@ -161,8 +163,10 @@ func (a *adminDB) NewSignup(ctx context.Context, username string, reason string, } if admin { - u.Admin = true - u.Moderator = true + admin := true + moderator := true + u.Admin = &admin + u.Moderator = &moderator } if _, err = a.conn. diff --git a/internal/db/bundb/basic.go b/internal/db/bundb/basic.go index b31a73dd7..cd80c9330 100644 --- a/internal/db/bundb/basic.go +++ b/internal/db/bundb/basic.go @@ -94,10 +94,11 @@ func (b *basicDB) DeleteWhere(ctx context.Context, where []db.Where, i interface return b.conn.ProcessError(err) } -func (b *basicDB) UpdateByPrimaryKey(ctx context.Context, i interface{}) db.Error { +func (b *basicDB) UpdateByPrimaryKey(ctx context.Context, i interface{}, columns ...string) db.Error { q := b.conn. NewUpdate(). Model(i). + Column(columns...). WherePK() _, err := q.Exec(ctx) diff --git a/internal/db/bundb/basic_test.go b/internal/db/bundb/basic_test.go index 1705ebc0d..e5ba8b36a 100644 --- a/internal/db/bundb/basic_test.go +++ b/internal/db/bundb/basic_test.go @@ -21,6 +21,7 @@ package bundb_test import ( "context" "testing" + "time" "github.com/stretchr/testify/suite" "github.com/superseriousbusiness/gotosocial/internal/db" @@ -39,6 +40,75 @@ func (suite *BasicTestSuite) TestGetAccountByID() { suite.NoError(err) } +func (suite *BasicTestSuite) TestPutAccountWithBunDefaultFields() { + testAccount := >smodel.Account{ + ID: "01GADR1AH9VCKH8YYCM86XSZ00", + Username: "test", + URI: "https://example.org/users/test", + URL: "https://example.org/@test", + InboxURI: "https://example.org/users/test/inbox", + OutboxURI: "https://example.org/users/test/outbox", + ActorType: "Person", + PublicKeyURI: "https://example.org/test#main-key", + } + + if err := suite.db.Put(context.Background(), testAccount); err != nil { + suite.FailNow(err.Error()) + } + + a := >smodel.Account{} + if err := suite.db.GetByID(context.Background(), testAccount.ID, a); err != nil { + suite.FailNow(err.Error()) + } + + // check all fields are set as expected, including database defaults + suite.Equal(testAccount.ID, a.ID) + suite.WithinDuration(time.Now(), a.CreatedAt, 5*time.Second) + suite.WithinDuration(time.Now(), a.UpdatedAt, 5*time.Second) + suite.Equal(testAccount.Username, a.Username) + suite.Empty(a.Domain) + suite.Empty(a.AvatarMediaAttachmentID) + suite.Nil(a.AvatarMediaAttachment) + suite.Empty(a.AvatarRemoteURL) + suite.Empty(a.HeaderMediaAttachmentID) + suite.Nil(a.HeaderMediaAttachment) + suite.Empty(a.HeaderRemoteURL) + suite.Empty(a.DisplayName) + suite.Nil(a.Fields) + suite.Empty(a.Note) + suite.Empty(a.NoteRaw) + suite.False(*a.Memorial) + suite.Empty(a.AlsoKnownAs) + suite.Empty(a.MovedToAccountID) + suite.False(*a.Bot) + suite.Empty(a.Reason) + // Locked is especially important, since it's a bool that defaults + // to true, which is why we use pointers for bools in the first place + suite.True(*a.Locked) + suite.False(*a.Discoverable) + suite.Empty(a.Privacy) + suite.False(*a.Sensitive) + suite.Equal("en", a.Language) + suite.Empty(a.StatusFormat) + suite.Equal(testAccount.URI, a.URI) + suite.Equal(testAccount.URL, a.URL) + suite.Zero(testAccount.LastWebfingeredAt) + suite.Equal(testAccount.InboxURI, a.InboxURI) + suite.Equal(testAccount.OutboxURI, a.OutboxURI) + suite.Empty(a.FollowingURI) + suite.Empty(a.FollowersURI) + suite.Empty(a.FeaturedCollectionURI) + suite.Equal(testAccount.ActorType, a.ActorType) + suite.Nil(a.PrivateKey) + suite.Nil(a.PublicKey) + suite.Equal(testAccount.PublicKeyURI, a.PublicKeyURI) + suite.Zero(a.SensitizedAt) + suite.Zero(a.SilencedAt) + suite.Zero(a.SuspendedAt) + suite.False(*a.HideCollections) + suite.Empty(a.SuspensionOrigin) +} + func (suite *BasicTestSuite) TestGetAllStatuses() { s := []*gtsmodel.Status{} err := suite.db.GetAll(context.Background(), &s) diff --git a/internal/db/bundb/bundb.go b/internal/db/bundb/bundb.go index 784a7d443..191350d06 100644 --- a/internal/db/bundb/bundb.go +++ b/internal/db/bundb/bundb.go @@ -409,15 +409,17 @@ func (ps *bunDBService) TagStringsToTags(ctx context.Context, tags []string, ori tag.FirstSeenFromAccountID = originAccountID tag.CreatedAt = time.Now() tag.UpdatedAt = time.Now() - tag.Useable = true - tag.Listable = true + useable := true + tag.Useable = &useable + listable := true + tag.Listable = &listable } else { return nil, fmt.Errorf("error getting tag with name %s: %s", t, err) } } // bail already if the tag isn't useable - if !tag.Useable { + if !*tag.Useable { continue } tag.LastStatusAt = time.Now() diff --git a/internal/db/bundb/notification_test.go b/internal/db/bundb/notification_test.go index d822c9a28..d79c73ad2 100644 --- a/internal/db/bundb/notification_test.go +++ b/internal/db/bundb/notification_test.go @@ -27,6 +27,7 @@ import ( "github.com/stretchr/testify/suite" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" "github.com/superseriousbusiness/gotosocial/internal/id" + "github.com/superseriousbusiness/gotosocial/testrig" ) func (suite *NotificationTestSuite) spamNotifs() { @@ -71,7 +72,7 @@ func (suite *NotificationTestSuite) spamNotifs() { TargetAccountID: targetAccountID, OriginAccountID: originAccountID, StatusID: statusID, - Read: false, + Read: testrig.FalseBool(), } if err := suite.db.Put(context.Background(), notif); err != nil { diff --git a/internal/db/bundb/relationship.go b/internal/db/bundb/relationship.go index e2e2c96b2..60dd72663 100644 --- a/internal/db/bundb/relationship.go +++ b/internal/db/bundb/relationship.go @@ -114,8 +114,8 @@ func (r *relationshipDB) GetRelationship(ctx context.Context, requestingAccount } else { // follow exists so we can fill these fields out... rel.Following = true - rel.ShowingReblogs = follow.ShowReblogs - rel.Notifying = follow.Notify + rel.ShowingReblogs = *follow.ShowReblogs + rel.Notifying = *follow.Notify } // check if the target account follows the requesting account diff --git a/internal/db/bundb/status_test.go b/internal/db/bundb/status_test.go index 3245314f8..36e329806 100644 --- a/internal/db/bundb/status_test.go +++ b/internal/db/bundb/status_test.go @@ -43,10 +43,10 @@ func (suite *StatusTestSuite) TestGetStatusByID() { suite.Nil(status.BoostOfAccount) suite.Nil(status.InReplyTo) suite.Nil(status.InReplyToAccount) - suite.True(status.Federated) - suite.True(status.Boostable) - suite.True(status.Replyable) - suite.True(status.Likeable) + suite.True(*status.Federated) + suite.True(*status.Boostable) + suite.True(*status.Replyable) + suite.True(*status.Likeable) } func (suite *StatusTestSuite) TestGetStatusByURI() { @@ -61,10 +61,10 @@ func (suite *StatusTestSuite) TestGetStatusByURI() { suite.Nil(status.BoostOfAccount) suite.Nil(status.InReplyTo) suite.Nil(status.InReplyToAccount) - suite.True(status.Federated) - suite.True(status.Boostable) - suite.False(status.Replyable) - suite.False(status.Likeable) + suite.True(*status.Federated) + suite.True(*status.Boostable) + suite.False(*status.Replyable) + suite.False(*status.Likeable) } func (suite *StatusTestSuite) TestGetStatusWithExtras() { @@ -78,10 +78,10 @@ func (suite *StatusTestSuite) TestGetStatusWithExtras() { suite.NotEmpty(status.Tags) suite.NotEmpty(status.Attachments) suite.NotEmpty(status.Emojis) - suite.True(status.Federated) - suite.True(status.Boostable) - suite.True(status.Replyable) - suite.True(status.Likeable) + suite.True(*status.Federated) + suite.True(*status.Boostable) + suite.True(*status.Replyable) + suite.True(*status.Likeable) } func (suite *StatusTestSuite) TestGetStatusWithMention() { @@ -95,10 +95,10 @@ func (suite *StatusTestSuite) TestGetStatusWithMention() { suite.NotEmpty(status.MentionIDs) suite.NotEmpty(status.InReplyToID) suite.NotEmpty(status.InReplyToAccountID) - suite.True(status.Federated) - suite.True(status.Boostable) - suite.True(status.Replyable) - suite.True(status.Likeable) + suite.True(*status.Federated) + suite.True(*status.Boostable) + suite.True(*status.Replyable) + suite.True(*status.Likeable) } func (suite *StatusTestSuite) TestGetStatusTwice() { |