MM-60415 ignore deactivated bots (#28184)
* ignore bot accounts when counting deactivated users * moved query to squirrel Co-authored-by: Ben Schumacher <ben.schumacher@mattermost.com> * set is null right * Run a different query depending on driver due to performance reasons. --------- Co-authored-by: Ben Schumacher <ben.schumacher@mattermost.com> Co-authored-by: Mattermost Build <build@mattermost.com>
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
9b368b9214
Коммит
dfa1d1027b
@@ -1708,7 +1708,27 @@ func (us SqlUserStore) performSearch(query sq.SelectBuilder, term string, option
|
|||||||
|
|
||||||
func (us SqlUserStore) AnalyticsGetInactiveUsersCount() (int64, error) {
|
func (us SqlUserStore) AnalyticsGetInactiveUsersCount() (int64, error) {
|
||||||
var count int64
|
var count int64
|
||||||
err := us.GetReplicaX().Get(&count, "SELECT COUNT(Id) FROM Users WHERE DeleteAt > 0")
|
query := us.getQueryBuilder().
|
||||||
|
Select("COUNT(Id)").
|
||||||
|
From("Users")
|
||||||
|
if us.DriverName() == model.DatabaseDriverPostgres {
|
||||||
|
query = query.LeftJoin("Bots ON Users.ID = Bots.UserId").
|
||||||
|
Where(sq.And{
|
||||||
|
sq.Gt{"Users.DeleteAt": 0},
|
||||||
|
sq.Eq{"Bots.UserId": nil},
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
query = query.Where(sq.And{
|
||||||
|
sq.Expr("Users.Id NOT IN (SELECT UserId FROM Bots)"),
|
||||||
|
sq.Gt{"Users.DeleteAt": 0},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
queryStr, args, err := query.ToSql()
|
||||||
|
if err != nil {
|
||||||
|
return int64(0), errors.Wrap(err, "failed to create a SQL query to count inactive users")
|
||||||
|
}
|
||||||
|
err = us.GetReplicaX().Get(&count, queryStr, args...)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return int64(0), errors.Wrap(err, "failed to count inactive Users")
|
return int64(0), errors.Wrap(err, "failed to count inactive Users")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ func TestUserStore(t *testing.T, rctx request.CTX, ss store.Store, s SqlStore) {
|
|||||||
t.Run("AnalyticsActiveCount", func(t *testing.T) { testUserStoreAnalyticsActiveCount(t, rctx, ss, s) })
|
t.Run("AnalyticsActiveCount", func(t *testing.T) { testUserStoreAnalyticsActiveCount(t, rctx, ss, s) })
|
||||||
t.Run("AnalyticsActiveCountForPeriod", func(t *testing.T) { testUserStoreAnalyticsActiveCountForPeriod(t, rctx, ss, s) })
|
t.Run("AnalyticsActiveCountForPeriod", func(t *testing.T) { testUserStoreAnalyticsActiveCountForPeriod(t, rctx, ss, s) })
|
||||||
t.Run("AnalyticsGetInactiveUsersCount", func(t *testing.T) { testUserStoreAnalyticsGetInactiveUsersCount(t, rctx, ss) })
|
t.Run("AnalyticsGetInactiveUsersCount", func(t *testing.T) { testUserStoreAnalyticsGetInactiveUsersCount(t, rctx, ss) })
|
||||||
|
t.Run("AnalyticsGetInactiveUsersCountIgnoreBots", func(t *testing.T) { testUserStoreAnalyticsGetInactiveUsersCountIgnoreBots(t, rctx, ss) })
|
||||||
t.Run("AnalyticsGetSystemAdminCount", func(t *testing.T) { testUserStoreAnalyticsGetSystemAdminCount(t, rctx, ss) })
|
t.Run("AnalyticsGetSystemAdminCount", func(t *testing.T) { testUserStoreAnalyticsGetSystemAdminCount(t, rctx, ss) })
|
||||||
t.Run("AnalyticsGetGuestCount", func(t *testing.T) { testUserStoreAnalyticsGetGuestCount(t, rctx, ss) })
|
t.Run("AnalyticsGetGuestCount", func(t *testing.T) { testUserStoreAnalyticsGetGuestCount(t, rctx, ss) })
|
||||||
t.Run("AnalyticsGetExternalUsers", func(t *testing.T) { testUserStoreAnalyticsGetExternalUsers(t, rctx, ss) })
|
t.Run("AnalyticsGetExternalUsers", func(t *testing.T) { testUserStoreAnalyticsGetExternalUsers(t, rctx, ss) })
|
||||||
@@ -4472,7 +4473,30 @@ func testUserStoreAnalyticsGetInactiveUsersCount(t *testing.T, rctx request.CTX,
|
|||||||
u1.Email = MakeEmail()
|
u1.Email = MakeEmail()
|
||||||
_, err := ss.User().Save(rctx, u1)
|
_, err := ss.User().Save(rctx, u1)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
defer func() { require.NoError(t, ss.User().PermanentDelete(rctx, u1.Id)) }()
|
t.Cleanup(func() { require.NoError(t, ss.User().PermanentDelete(rctx, u1.Id)) })
|
||||||
|
|
||||||
|
count, err := ss.User().AnalyticsGetInactiveUsersCount()
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, count, int64(0), "No users should have been inactive yet")
|
||||||
|
|
||||||
|
u2 := &model.User{}
|
||||||
|
u2.Email = MakeEmail()
|
||||||
|
u2.DeleteAt = model.GetMillis()
|
||||||
|
_, err = ss.User().Save(rctx, u2)
|
||||||
|
require.NoError(t, err)
|
||||||
|
t.Cleanup(func() { require.NoError(t, ss.User().PermanentDelete(rctx, u2.Id)) })
|
||||||
|
|
||||||
|
newCount, err := ss.User().AnalyticsGetInactiveUsersCount()
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, count, newCount-1, "Expected 1 more inactive users but found otherwise.")
|
||||||
|
}
|
||||||
|
|
||||||
|
func testUserStoreAnalyticsGetInactiveUsersCountIgnoreBots(t *testing.T, rctx request.CTX, ss store.Store) {
|
||||||
|
u1 := &model.User{}
|
||||||
|
u1.Email = MakeEmail()
|
||||||
|
_, err := ss.User().Save(rctx, u1)
|
||||||
|
require.NoError(t, err)
|
||||||
|
t.Cleanup(func() { require.NoError(t, ss.User().PermanentDelete(rctx, u1.Id)) })
|
||||||
|
|
||||||
count, err := ss.User().AnalyticsGetInactiveUsersCount()
|
count, err := ss.User().AnalyticsGetInactiveUsersCount()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@@ -4482,11 +4506,22 @@ func testUserStoreAnalyticsGetInactiveUsersCount(t *testing.T, rctx request.CTX,
|
|||||||
u2.DeleteAt = model.GetMillis()
|
u2.DeleteAt = model.GetMillis()
|
||||||
_, err = ss.User().Save(rctx, u2)
|
_, err = ss.User().Save(rctx, u2)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
defer func() { require.NoError(t, ss.User().PermanentDelete(rctx, u2.Id)) }()
|
|
||||||
|
t.Cleanup(func() { require.NoError(t, ss.User().PermanentDelete(rctx, u2.Id)) })
|
||||||
|
|
||||||
|
_, nErr := ss.Bot().Save(&model.Bot{
|
||||||
|
UserId: u2.Id,
|
||||||
|
Username: u2.Username,
|
||||||
|
OwnerId: u2.Id,
|
||||||
|
})
|
||||||
|
require.NoError(t, nErr)
|
||||||
|
u2.IsBot = true
|
||||||
|
|
||||||
|
t.Cleanup(func() { require.NoError(t, ss.Bot().PermanentDelete(u2.Id)) })
|
||||||
|
|
||||||
newCount, err := ss.User().AnalyticsGetInactiveUsersCount()
|
newCount, err := ss.User().AnalyticsGetInactiveUsersCount()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, count, newCount-1, "Expected 1 more inactive users but found otherwise.")
|
require.Equal(t, count, newCount, "Expected same inactive users but found otherwise.")
|
||||||
}
|
}
|
||||||
|
|
||||||
func testUserStoreAnalyticsGetSystemAdminCount(t *testing.T, rctx request.CTX, ss store.Store) {
|
func testUserStoreAnalyticsGetSystemAdminCount(t *testing.T, rctx request.CTX, ss store.Store) {
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user