diff options
author | 2023-03-19 13:11:46 +0100 | |
---|---|---|
committer | 2023-03-19 13:11:46 +0100 | |
commit | 7db81cde444f6bc95e79527af0997de1788d48c7 (patch) | |
tree | f6c077ec298a4f018d0870798bc46bd64ba70069 /internal/db | |
parent | [docs] Update docs on how to login (#1626) (diff) | |
download | gotosocial-7db81cde444f6bc95e79527af0997de1788d48c7.tar.xz |
[feature] Email notifications for new / closed moderation reports (#1628)
* start fiddling about with email sending to allow multiple recipients
* do some fiddling
* notifs working
* notify on closed report
* finishing up
* envparsing
* use strings.ContainsAny
Diffstat (limited to 'internal/db')
-rw-r--r-- | internal/db/bundb/instance.go | 31 | ||||
-rw-r--r-- | internal/db/bundb/instance_test.go | 38 | ||||
-rw-r--r-- | internal/db/instance.go | 4 |
3 files changed, 73 insertions, 0 deletions
diff --git a/internal/db/bundb/instance.go b/internal/db/bundb/instance.go index b4bdeb1d9..4fa898639 100644 --- a/internal/db/bundb/instance.go +++ b/internal/db/bundb/instance.go @@ -156,3 +156,34 @@ func (i *instanceDB) GetInstanceAccounts(ctx context.Context, domain string, max return accounts, nil } + +func (i *instanceDB) GetInstanceModeratorAddresses(ctx context.Context) ([]string, db.Error) { + addresses := []string{} + + // Select email addresses of approved, confirmed, + // and enabled moderators or admins. + + q := i.conn. + NewSelect(). + TableExpr("? AS ?", bun.Ident("users"), bun.Ident("user")). + Column("user.email"). + Where("? = ?", bun.Ident("user.approved"), true). + Where("? IS NOT NULL", bun.Ident("user.confirmed_at")). + Where("? = ?", bun.Ident("user.disabled"), false). + WhereGroup(" AND ", func(q *bun.SelectQuery) *bun.SelectQuery { + return q. + Where("? = ?", bun.Ident("user.moderator"), true). + WhereOr("? = ?", bun.Ident("user.admin"), true) + }). + OrderExpr("? ASC", bun.Ident("user.email")) + + if err := q.Scan(ctx, &addresses); err != nil { + return nil, i.conn.ProcessError(err) + } + + if len(addresses) == 0 { + return nil, db.ErrNoEntries + } + + return addresses, nil +} diff --git a/internal/db/bundb/instance_test.go b/internal/db/bundb/instance_test.go index 4269df5ca..580a7699b 100644 --- a/internal/db/bundb/instance_test.go +++ b/internal/db/bundb/instance_test.go @@ -24,6 +24,8 @@ import ( "github.com/stretchr/testify/suite" "github.com/superseriousbusiness/gotosocial/internal/config" "github.com/superseriousbusiness/gotosocial/internal/db" + "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/testrig" ) type InstanceTestSuite struct { @@ -90,6 +92,42 @@ func (suite *InstanceTestSuite) TestGetInstanceAccounts() { suite.Len(accounts, 1) } +func (suite *InstanceTestSuite) TestGetInstanceModeratorAddressesOK() { + // We have one admin user by default. + addresses, err := suite.db.GetInstanceModeratorAddresses(context.Background()) + suite.NoError(err) + suite.EqualValues([]string{"admin@example.org"}, addresses) +} + +func (suite *InstanceTestSuite) TestGetInstanceModeratorAddressesZorkAsModerator() { + // Promote zork to moderator role. + testUser := >smodel.User{} + *testUser = *suite.testUsers["local_account_1"] + testUser.Moderator = testrig.TrueBool() + if err := suite.db.UpdateUser(context.Background(), testUser, "moderator"); err != nil { + suite.FailNow(err.Error()) + } + + addresses, err := suite.db.GetInstanceModeratorAddresses(context.Background()) + suite.NoError(err) + suite.EqualValues([]string{"admin@example.org", "zork@example.org"}, addresses) +} + +func (suite *InstanceTestSuite) TestGetInstanceModeratorAddressesNoAdmin() { + // Demote admin from admin + moderator roles. + testUser := >smodel.User{} + *testUser = *suite.testUsers["admin_account"] + testUser.Admin = testrig.FalseBool() + testUser.Moderator = testrig.FalseBool() + if err := suite.db.UpdateUser(context.Background(), testUser, "admin", "moderator"); err != nil { + suite.FailNow(err.Error()) + } + + addresses, err := suite.db.GetInstanceModeratorAddresses(context.Background()) + suite.ErrorIs(err, db.ErrNoEntries) + suite.Empty(addresses) +} + func TestInstanceTestSuite(t *testing.T) { suite.Run(t, new(InstanceTestSuite)) } diff --git a/internal/db/instance.go b/internal/db/instance.go index dff471193..3166a0a18 100644 --- a/internal/db/instance.go +++ b/internal/db/instance.go @@ -42,4 +42,8 @@ type Instance interface { // GetInstancePeers returns a slice of instances that the host instance knows about. GetInstancePeers(ctx context.Context, includeSuspended bool) ([]*gtsmodel.Instance, Error) + + // GetInstanceModeratorAddresses returns a slice of email addresses belonging to active + // (as in, not suspended) moderators + admins on this instance. + GetInstanceModeratorAddresses(ctx context.Context) ([]string, Error) } |