diff --git a/internal/api/client/accounts/accountupdate.go b/internal/api/client/accounts/accountupdate.go index 5d3a3da5f..81f27e655 100644 --- a/internal/api/client/accounts/accountupdate.go +++ b/internal/api/client/accounts/accountupdate.go @@ -348,6 +348,7 @@ func parseUpdateAccountForm(c *gin.Context) (*apimodel.UpdateCredentialsRequest, form.Theme == nil && form.CustomCSS == nil && form.EnableRSS == nil && + form.HideBoosts == nil && form.HideCollections == nil && form.WebVisibility == nil) { return nil, errors.New("empty form submitted") diff --git a/internal/api/model/account.go b/internal/api/model/account.go index d34d7d519..5397ad544 100644 --- a/internal/api/model/account.go +++ b/internal/api/model/account.go @@ -104,6 +104,9 @@ type Account struct { // Account has enabled RSS feed. // Key/value omitted if false. EnableRSS bool `json:"enable_rss,omitempty"` + // Account has opted to hide boosts from their profile. + // Key/value omitted if false. + HideBoosts bool `json:"hide_boosts,omitempty"` // Account has opted to hide their followers/following collections. // Key/value omitted if false. HideCollections bool `json:"hide_collections,omitempty"` @@ -225,6 +228,8 @@ type UpdateCredentialsRequest struct { CustomCSS *string `form:"custom_css" json:"custom_css"` // Enable RSS feed of public toots for this account at /@[username]/feed.rss EnableRSS *bool `form:"enable_rss" json:"enable_rss"` + // Hide boosts from this account's profile page. + HideBoosts *bool `form:"hide_boosts" json:"hide_boosts"` // Hide this account's following/followers collections. HideCollections *bool `form:"hide_collections" json:"hide_collections"` // Visibility of statuses to show via the web view. diff --git a/internal/cache/size.go b/internal/cache/size.go index 8367e4c46..f3398dece 100644 --- a/internal/cache/size.go +++ b/internal/cache/size.go @@ -38,7 +38,7 @@ exampleURI = "https://social.bbc/users/ItsMePrinceCharlesInit" exampleText = ` oh no me nan's gone and done it :shocked: - + she fuckin killed the king :regicide: nan what have you done :shocked: @@ -277,6 +277,7 @@ func sizeofAccountSettings() uintptr { StatusContentType: "text/plain", CustomCSS: exampleText, EnableRSS: util.Ptr(true), + HideBoosts: util.Ptr(false), HideCollections: util.Ptr(false), })) } diff --git a/internal/db/bundb/migrations/20240922143734_add_hide_boosts.go b/internal/db/bundb/migrations/20240922143734_add_hide_boosts.go new file mode 100644 index 000000000..036f774e2 --- /dev/null +++ b/internal/db/bundb/migrations/20240922143734_add_hide_boosts.go @@ -0,0 +1,44 @@ +// GoToSocial +// Copyright (C) GoToSocial Authors admin@gotosocial.org +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// 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 . + +package migrations + +import ( + "context" + "strings" + + "github.com/uptrace/bun" +) + +func init() { + up := func(ctx context.Context, db *bun.DB) error { + _, err := db.ExecContext(ctx, "ALTER TABLE ? ADD COLUMN ? BOOLEAN DEFAULT FALSE", bun.Ident("account_settings"), bun.Ident("hide_boosts")) + if err != nil && !(strings.Contains(err.Error(), "already exists") || strings.Contains(err.Error(), "duplicate column name") || strings.Contains(err.Error(), "SQLSTATE 42701")) { + return err + } + return nil + } + + down := func(ctx context.Context, db *bun.DB) error { + _, err := db.ExecContext(ctx, "ALTER TABLE ? DROP COLUMN ?", bun.Ident("account_settings"), bun.Ident("hide_boosts")) + return err + } + + if err := Migrations.Register(up, down); err != nil { + panic(err) + } +} diff --git a/internal/gtsmodel/accountsettings.go b/internal/gtsmodel/accountsettings.go index 3151ba5b7..bedcb7f63 100644 --- a/internal/gtsmodel/accountsettings.go +++ b/internal/gtsmodel/accountsettings.go @@ -33,6 +33,7 @@ type AccountSettings struct { Theme string `bun:",nullzero"` // Preset CSS theme filename selected by this Account (empty string if nothing set). CustomCSS string `bun:",nullzero"` // Custom CSS that should be displayed for this Account's profile and statuses. EnableRSS *bool `bun:",nullzero,notnull,default:false"` // enable RSS feed subscription for this account's public posts at [URL]/feed + HideBoosts *bool `bun:",nullzero,notnull,default:false"` // Hide boosts from this accounts profile page. HideCollections *bool `bun:",nullzero,notnull,default:false"` // Hide this account's followers/following collections. WebVisibility Visibility `bun:",nullzero,notnull,default:public"` // Visibility level of statuses that visitors can view via the web profile. InteractionPolicyDirect *InteractionPolicy `bun:""` // Interaction policy to use for new direct visibility statuses by this account. If null, assume default policy. diff --git a/internal/processing/account/update.go b/internal/processing/account/update.go index 58e52a992..d9f00000c 100644 --- a/internal/processing/account/update.go +++ b/internal/processing/account/update.go @@ -274,6 +274,11 @@ func (p *Processor) Update(ctx context.Context, account *gtsmodel.Account, form settingsColumns = append(settingsColumns, "enable_rss") } + if form.HideBoosts != nil { + account.Settings.HideBoosts = form.HideBoosts + settingsColumns = append(settingsColumns, "hide_boosts") + } + if form.HideCollections != nil { account.Settings.HideCollections = form.HideCollections settingsColumns = append(settingsColumns, "hide_collections") diff --git a/internal/typeutils/internaltofrontend.go b/internal/typeutils/internaltofrontend.go index fe49766fa..cb7c38620 100644 --- a/internal/typeutils/internaltofrontend.go +++ b/internal/typeutils/internaltofrontend.go @@ -302,7 +302,7 @@ func (c *Converter) accountToAPIAccountPublic(ctx context.Context, a *gtsmodel.A // Bits that vary between remote + local accounts: // - Account (acct) string. // - Role. - // - Settings things (enableRSS, theme, customCSS, hideCollections). + // - Settings things (enableRSS, theme, customCSS, hideBoosts ,hideCollections). var ( acct string @@ -310,6 +310,7 @@ func (c *Converter) accountToAPIAccountPublic(ctx context.Context, a *gtsmodel.A enableRSS bool theme string customCSS string + hideBoosts bool hideCollections bool ) @@ -338,6 +339,7 @@ func (c *Converter) accountToAPIAccountPublic(ctx context.Context, a *gtsmodel.A enableRSS = *a.Settings.EnableRSS theme = a.Settings.Theme customCSS = a.Settings.CustomCSS + hideBoosts = *a.Settings.HideBoosts hideCollections = *a.Settings.HideCollections } @@ -380,6 +382,7 @@ func (c *Converter) accountToAPIAccountPublic(ctx context.Context, a *gtsmodel.A Theme: theme, CustomCSS: customCSS, EnableRSS: enableRSS, + HideBoosts: hideBoosts, HideCollections: hideCollections, Roles: roles, } diff --git a/testrig/testmodels.go b/testrig/testmodels.go index ea3d96a04..43143c902 100644 --- a/testrig/testmodels.go +++ b/testrig/testmodels.go @@ -657,6 +657,7 @@ func NewTestAccountSettings() map[string]*gtsmodel.AccountSettings { Sensitive: util.Ptr(false), Language: "en", EnableRSS: util.Ptr(false), + HideBoosts: util.Ptr(false), HideCollections: util.Ptr(false), WebVisibility: gtsmodel.VisibilityPublic, }, @@ -668,6 +669,7 @@ func NewTestAccountSettings() map[string]*gtsmodel.AccountSettings { Sensitive: util.Ptr(false), Language: "en", EnableRSS: util.Ptr(true), + HideBoosts: util.Ptr(false), HideCollections: util.Ptr(false), WebVisibility: gtsmodel.VisibilityPublic, }, @@ -679,6 +681,7 @@ func NewTestAccountSettings() map[string]*gtsmodel.AccountSettings { Sensitive: util.Ptr(false), Language: "en", EnableRSS: util.Ptr(true), + HideBoosts: util.Ptr(false), HideCollections: util.Ptr(false), WebVisibility: gtsmodel.VisibilityUnlocked, }, @@ -690,6 +693,7 @@ func NewTestAccountSettings() map[string]*gtsmodel.AccountSettings { Sensitive: util.Ptr(true), Language: "fr", EnableRSS: util.Ptr(false), + HideBoosts: util.Ptr(false), HideCollections: util.Ptr(true), WebVisibility: gtsmodel.VisibilityPublic, }, diff --git a/web/source/settings/views/user/profile.tsx b/web/source/settings/views/user/profile.tsx index 4e5fb627f..eaef94ca5 100644 --- a/web/source/settings/views/user/profile.tsx +++ b/web/source/settings/views/user/profile.tsx @@ -77,7 +77,7 @@ function UserProfileForm({ data: profile }) { maxPinnedFields: instance?.configuration?.accounts?.max_profile_fields ?? 6 }; }, [instance]); - + // Parse out available theme options into nice format. const { data: themes } = useAccountThemesQuery(); const themeOptions = useMemo(() => { @@ -114,6 +114,7 @@ function UserProfileForm({ data: profile }) { locked: useBoolInput("locked", { source: profile }), discoverable: useBoolInput("discoverable", { source: profile}), enableRSS: useBoolInput("enable_rss", { source: profile }), + hideBoosts: useBoolInput("hide_boosts", { source: profile }), hideCollections: useBoolInput("hide_collections", { source: profile }), webVisibility: useTextInput("web_visibility", { source: profile, valueSelector: (p) => p.source?.web_visibility }), fields: useFieldArrayInput("fields_attributes", { @@ -158,7 +159,7 @@ function UserProfileForm({ data: profile }) { autoCapitalize="sentences" /> - +
+
-{{- end }} \ No newline at end of file +{{- end }}