From 56a7ce76ee758cec09590bf29591d8e5ab2715db Mon Sep 17 00:00:00 2001 From: tobi Date: Sun, 5 Jan 2025 12:46:56 +0100 Subject: [PATCH] remove count column --- internal/cache/size.go | 1 - .../db/bundb/domainpermissionsubscription.go | 34 +++++++ .../domainpermissionsubscription_test.go | 99 +++++++++++++++++++ .../domainpermissionsubscription.go | 1 - internal/db/domain.go | 4 + .../gtsmodel/domainpermissionsubscription.go | 1 - internal/typeutils/internaltofrontend.go | 6 ++ 7 files changed, 143 insertions(+), 3 deletions(-) create mode 100644 internal/db/bundb/domainpermissionsubscription_test.go diff --git a/internal/cache/size.go b/internal/cache/size.go index 49cc172df..2c8772f96 100644 --- a/internal/cache/size.go +++ b/internal/cache/size.go @@ -373,7 +373,6 @@ func sizeofDomainPermissionSubscription() uintptr { SuccessfullyFetchedAt: exampleTime, ETag: exampleID, Error: exampleTextSmall, - Count: 100, })) } diff --git a/internal/db/bundb/domainpermissionsubscription.go b/internal/db/bundb/domainpermissionsubscription.go index fb2c94be6..be22b96a3 100644 --- a/internal/db/bundb/domainpermissionsubscription.go +++ b/internal/db/bundb/domainpermissionsubscription.go @@ -318,3 +318,37 @@ func (d *domainDB) DeleteDomainPermissionSubscription( return nil } + +func (d *domainDB) CountDomainPermissionSubscriptionPerms( + ctx context.Context, + id string, +) (int, error) { + permSubscription, err := d.GetDomainPermissionSubscriptionByID( + gtscontext.SetBarebones(ctx), + id, + ) + if err != nil { + return 0, err + } + + q := d.db.NewSelect() + + if permSubscription.PermissionType == gtsmodel.DomainPermissionBlock { + q = q.TableExpr( + "? AS ?", + bun.Ident("domain_blocks"), + bun.Ident("perm"), + ) + } else { + q = q.TableExpr( + "? AS ?", + bun.Ident("domain_allows"), + bun.Ident("perm"), + ) + } + + return q. + Column("perm.id"). + Where("? = ?", bun.Ident("perm.subscription_id"), id). + Count(ctx) +} diff --git a/internal/db/bundb/domainpermissionsubscription_test.go b/internal/db/bundb/domainpermissionsubscription_test.go new file mode 100644 index 000000000..732befbff --- /dev/null +++ b/internal/db/bundb/domainpermissionsubscription_test.go @@ -0,0 +1,99 @@ +// 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 bundb_test + +import ( + "context" + "testing" + + "github.com/stretchr/testify/suite" + "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" +) + +type DomainPermissionSubscriptionTestSuite struct { + BunDBStandardTestSuite +} + +func (suite *DomainPermissionSubscriptionTestSuite) TestCount() { + var ( + ctx = context.Background() + testAccount = suite.testAccounts["admin_account"] + permSub = >smodel.DomainPermissionSubscription{ + ID: "01JGV3VZ72K58BYW8H5GEVBZGN", + PermissionType: gtsmodel.DomainPermissionBlock, + CreatedByAccountID: testAccount.ID, + CreatedByAccount: testAccount, + URI: "https://example.org/whatever.csv", + ContentType: gtsmodel.DomainPermSubContentTypeCSV, + } + perms = []*gtsmodel.DomainBlock{ + { + ID: "01JGV42G72YCKN06AC51RZPFES", + Domain: "whatever.com", + CreatedByAccountID: testAccount.ID, + CreatedByAccount: testAccount, + SubscriptionID: permSub.ID, + }, + { + ID: "01JGV43ZQKYPHM2M0YBQDFDSD1", + Domain: "aaaa.example.org", + CreatedByAccountID: testAccount.ID, + CreatedByAccount: testAccount, + SubscriptionID: permSub.ID, + }, + { + ID: "01JGV444KDDC4WFG6MZQVM0N2Z", + Domain: "bbbb.example.org", + CreatedByAccountID: testAccount.ID, + CreatedByAccount: testAccount, + SubscriptionID: permSub.ID, + }, + { + ID: "01JGV44AFEMBWS6P6S72BQK376", + Domain: "cccc.example.org", + CreatedByAccountID: testAccount.ID, + CreatedByAccount: testAccount, + SubscriptionID: permSub.ID, + }, + } + ) + + // Whack the perm sub in the DB. + if err := suite.state.DB.PutDomainPermissionSubscription(ctx, permSub); err != nil { + suite.FailNow(err.Error()) + } + + // Whack the perms in the db. + for _, perm := range perms { + if err := suite.state.DB.CreateDomainBlock(ctx, perm); err != nil { + suite.FailNow(err.Error()) + } + } + + // Count 'em. + count, err := suite.state.DB.CountDomainPermissionSubscriptionPerms(ctx, permSub.ID) + if err != nil { + suite.FailNow(err.Error()) + } + + suite.Equal(4, count) +} + +func TestDomainPermissionSubscriptionTestSuite(t *testing.T) { + suite.Run(t, new(DomainPermissionSubscriptionTestSuite)) +} diff --git a/internal/db/bundb/migrations/20241022153016_domain_permission_subscriptions/domainpermissionsubscription.go b/internal/db/bundb/migrations/20241022153016_domain_permission_subscriptions/domainpermissionsubscription.go index 7d6faaef4..851f44f15 100644 --- a/internal/db/bundb/migrations/20241022153016_domain_permission_subscriptions/domainpermissionsubscription.go +++ b/internal/db/bundb/migrations/20241022153016_domain_permission_subscriptions/domainpermissionsubscription.go @@ -35,5 +35,4 @@ type DomainPermissionSubscription struct { SuccessfullyFetchedAt time.Time `bun:"type:timestamptz,nullzero"` ETag string `bun:"etag,nullzero"` Error string `bun:",nullzero"` - Count uint64 `bun:""` } diff --git a/internal/db/domain.go b/internal/db/domain.go index 535ecaf3e..643538e7e 100644 --- a/internal/db/domain.go +++ b/internal/db/domain.go @@ -168,4 +168,8 @@ type Domain interface { // DeleteDomainPermissionSubscription deletes one DomainPermissionSubscription with the given id. DeleteDomainPermissionSubscription(ctx context.Context, id string) error + + // CountDomainPermissionSubscriptionPerms counts the number of permissions + // currently managed by the domain permission subscription of the given ID. + CountDomainPermissionSubscriptionPerms(ctx context.Context, id string) (int, error) } diff --git a/internal/gtsmodel/domainpermissionsubscription.go b/internal/gtsmodel/domainpermissionsubscription.go index 427bf709f..b6a0b8f43 100644 --- a/internal/gtsmodel/domainpermissionsubscription.go +++ b/internal/gtsmodel/domainpermissionsubscription.go @@ -36,7 +36,6 @@ type DomainPermissionSubscription struct { SuccessfullyFetchedAt time.Time `bun:"type:timestamptz,nullzero"` // Time when the domain permission list was last *successfuly* fetched, to be transmitted as If-Modified-Since header. ETag string `bun:"etag,nullzero"` // Etag last received from the server (if any) on successful fetch. Error string `bun:",nullzero"` // If latest fetch attempt errored, this field stores the error message. Cleared on latest successful fetch. - Count uint64 `bun:""` // Count of domain permission entries discovered at URI. } type DomainPermSubContentType enumType diff --git a/internal/typeutils/internaltofrontend.go b/internal/typeutils/internaltofrontend.go index 6f3bed11b..bd87a3be6 100644 --- a/internal/typeutils/internaltofrontend.go +++ b/internal/typeutils/internaltofrontend.go @@ -2160,6 +2160,11 @@ func (c *Converter) DomainPermSubToAPIDomainPermSub( successfullyFetchedAt = util.FormatISO8601(d.SuccessfullyFetchedAt) } + count, err := c.state.DB.CountDomainPermissionSubscriptionPerms(ctx, d.ID) + if err != nil { + return nil, gtserror.Newf("error counting perm sub perms: %w", err) + } + return &apimodel.DomainPermissionSubscription{ ID: d.ID, Priority: d.Priority, @@ -2176,6 +2181,7 @@ func (c *Converter) DomainPermSubToAPIDomainPermSub( FetchedAt: fetchedAt, SuccessfullyFetchedAt: successfullyFetchedAt, Error: d.Error, + Count: uint64(count), }, nil }