diff options
Diffstat (limited to 'internal/cache')
-rw-r--r-- | internal/cache/account.go | 12 | ||||
-rw-r--r-- | internal/cache/status.go | 14 | ||||
-rw-r--r-- | internal/cache/status_test.go | 26 | ||||
-rw-r--r-- | internal/cache/util.go | 31 |
4 files changed, 70 insertions, 13 deletions
diff --git a/internal/cache/account.go b/internal/cache/account.go index a71274d1c..ac67b5d07 100644 --- a/internal/cache/account.go +++ b/internal/cache/account.go @@ -103,16 +103,16 @@ func copyAccount(account *gtsmodel.Account) *gtsmodel.Account { Fields: account.Fields, Note: account.Note, NoteRaw: account.NoteRaw, - Memorial: account.Memorial, + Memorial: copyBoolPtr(account.Memorial), MovedToAccountID: account.MovedToAccountID, + Bot: copyBoolPtr(account.Bot), CreatedAt: account.CreatedAt, UpdatedAt: account.UpdatedAt, - Bot: account.Bot, Reason: account.Reason, - Locked: account.Locked, - Discoverable: account.Discoverable, + Locked: copyBoolPtr(account.Locked), + Discoverable: copyBoolPtr(account.Discoverable), Privacy: account.Privacy, - Sensitive: account.Sensitive, + Sensitive: copyBoolPtr(account.Sensitive), Language: account.Language, StatusFormat: account.StatusFormat, URI: account.URI, @@ -131,7 +131,7 @@ func copyAccount(account *gtsmodel.Account) *gtsmodel.Account { SensitizedAt: account.SensitizedAt, SilencedAt: account.SilencedAt, SuspendedAt: account.SuspendedAt, - HideCollections: account.HideCollections, + HideCollections: copyBoolPtr(account.HideCollections), SuspensionOrigin: account.SuspensionOrigin, } } diff --git a/internal/cache/status.go b/internal/cache/status.go index 7e3d85960..f3cbce779 100644 --- a/internal/cache/status.go +++ b/internal/cache/status.go @@ -102,9 +102,9 @@ func copyStatus(status *gtsmodel.Status) *gtsmodel.Status { Mentions: nil, EmojiIDs: status.EmojiIDs, Emojis: nil, + Local: copyBoolPtr(status.Local), CreatedAt: status.CreatedAt, UpdatedAt: status.UpdatedAt, - Local: status.Local, AccountID: status.AccountID, Account: nil, AccountURI: status.AccountURI, @@ -119,15 +119,15 @@ func copyStatus(status *gtsmodel.Status) *gtsmodel.Status { BoostOfAccount: nil, ContentWarning: status.ContentWarning, Visibility: status.Visibility, - Sensitive: status.Sensitive, + Sensitive: copyBoolPtr(status.Sensitive), Language: status.Language, CreatedWithApplicationID: status.CreatedWithApplicationID, - Federated: status.Federated, - Boostable: status.Boostable, - Replyable: status.Replyable, - Likeable: status.Likeable, ActivityStreamsType: status.ActivityStreamsType, Text: status.Text, - Pinned: status.Pinned, + Pinned: copyBoolPtr(status.Pinned), + Federated: copyBoolPtr(status.Federated), + Boostable: copyBoolPtr(status.Boostable), + Replyable: copyBoolPtr(status.Replyable), + Likeable: copyBoolPtr(status.Likeable), } } diff --git a/internal/cache/status_test.go b/internal/cache/status_test.go index 882e92be5..8b0621182 100644 --- a/internal/cache/status_test.go +++ b/internal/cache/status_test.go @@ -72,6 +72,32 @@ func (suite *StatusCacheTestSuite) TestStatusCache() { } } +func (suite *StatusCacheTestSuite) TestBoolPointerCopying() { + originalStatus := suite.data["local_account_1_status_1"] + + // mark the status as pinned + cache it + pinned := true + originalStatus.Pinned = &pinned + suite.cache.Put(originalStatus) + + // retrieve it + cachedStatus, ok := suite.cache.GetByID(originalStatus.ID) + if !ok { + suite.FailNow("status wasn't retrievable from cache") + } + + // we should be able to change the original status values + cached + // values independently since they use different pointers + suite.True(*cachedStatus.Pinned) + *originalStatus.Pinned = false + suite.False(*originalStatus.Pinned) + suite.True(*cachedStatus.Pinned) + *originalStatus.Pinned = true + *cachedStatus.Pinned = false + suite.True(*originalStatus.Pinned) + suite.False(*cachedStatus.Pinned) +} + func TestStatusCache(t *testing.T) { suite.Run(t, &StatusCacheTestSuite{}) } diff --git a/internal/cache/util.go b/internal/cache/util.go new file mode 100644 index 000000000..48204b259 --- /dev/null +++ b/internal/cache/util.go @@ -0,0 +1,31 @@ +/* + GoToSocial + Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +package cache + +// copyBoolPtr returns a bool pointer with the same value as the pointer passed into it. +// +// Useful when copying things from the cache to a caller. +func copyBoolPtr(in *bool) *bool { + if in == nil { + return nil + } + b := new(bool) + *b = *in + return b +} |