[MM-61691] Deleting drafts when permanently deleting a user (#30233)

* deleting drafts on permanently deleting user

* verified count of drafts before deleting

* i18n fix

* use ExecBuilder

* changed error message to specify user

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
Co-authored-by: Harshil Sharma <harshilsharma63@gmail.com>
Этот коммит содержится в:
Arya Khochare
2025-03-13 19:19:38 +05:30
коммит произвёл GitHub
родитель e2a7240e34
Коммит 4fbfd84957
8 изменённых файлов: 159 добавлений и 0 удалений

Просмотреть файл

@@ -25,6 +25,7 @@ func TestDraftStore(t *testing.T, rctx request.CTX, ss store.Store, s SqlStore)
t.Run("GetLastCreateAtAndUserIdValuesForEmptyDraftsMigration", func(t *testing.T) { testGetLastCreateAtAndUserIDValuesForEmptyDraftsMigration(t, rctx, ss) })
t.Run("DeleteEmptyDraftsByCreateAtAndUserId", func(t *testing.T) { testDeleteEmptyDraftsByCreateAtAndUserID(t, rctx, ss) })
t.Run("DeleteOrphanDraftsByCreateAtAndUserId", func(t *testing.T) { testDeleteOrphanDraftsByCreateAtAndUserID(t, rctx, ss) })
t.Run("PermanentDeleteByUser", func(t *testing.T) { testPermanentDeleteDraftsByUser(t, rctx, ss) })
}
func testSaveDraft(t *testing.T, rctx request.CTX, ss store.Store) {
@@ -218,6 +219,86 @@ func testDeleteDraft(t *testing.T, rctx request.CTX, ss store.Store) {
})
}
func testPermanentDeleteDraftsByUser(t *testing.T, rctx request.CTX, ss store.Store) {
t.Run("should delete all drafts for a given user", func(t *testing.T) {
userId := model.NewId()
channel1Id := model.NewId()
channel2Id := model.NewId()
member1 := &model.ChannelMember{
ChannelId: channel1Id,
UserId: userId,
NotifyProps: model.GetDefaultChannelNotifyProps(),
}
member2 := &model.ChannelMember{
ChannelId: channel2Id,
UserId: userId,
NotifyProps: model.GetDefaultChannelNotifyProps(),
}
_, err := ss.Channel().SaveMember(rctx, member1)
require.NoError(t, err)
_, err = ss.Channel().SaveMember(rctx, member2)
require.NoError(t, err)
draft1 := &model.Draft{
CreateAt: model.GetMillis(),
UpdateAt: model.GetMillis(),
UserId: userId,
ChannelId: channel1Id,
Message: "draft1",
}
draft2 := &model.Draft{
CreateAt: model.GetMillis(),
UpdateAt: model.GetMillis(),
UserId: userId,
ChannelId: channel2Id,
Message: "draft2",
}
_, err = ss.Draft().Upsert(draft1)
require.NoError(t, err)
_, err = ss.Draft().Upsert(draft2)
require.NoError(t, err)
draftsResp, err := ss.Draft().GetDraftsForUser(userId, "")
assert.NoError(t, err)
assert.Len(t, draftsResp, 2)
// Delete draft for the user
err = ss.Draft().PermanentDeleteByUser(userId)
assert.NoError(t, err)
// Verify that no drafts exist for the user
draftsResp, err = ss.Draft().GetDraftsForUser(userId, "")
assert.NoError(t, err)
assert.Len(t, draftsResp, 0)
})
t.Run("should not fail if no drafts exist for the user", func(t *testing.T) {
userId := model.NewId()
// Attempt to delete drafts for a user with no drafts
err := ss.Draft().PermanentDeleteByUser(userId)
assert.NoError(t, err)
})
t.Run("should handle empty user id", func(t *testing.T) {
err := ss.Draft().PermanentDeleteByUser("")
assert.NoError(t, err)
})
t.Run("should handle non-existing user id", func(t *testing.T) {
nonExistingUserId := model.NewId()
err := ss.Draft().PermanentDeleteByUser(nonExistingUserId)
assert.NoError(t, err)
})
}
func testGetDraft(t *testing.T, rctx request.CTX, ss store.Store) {
user := &model.User{
Id: model.NewId(),

Просмотреть файл

@@ -181,6 +181,24 @@ func (_m *DraftStore) GetLastCreateAtAndUserIdValuesForEmptyDraftsMigration(crea
return r0, r1, r2
}
// PermanentDeleteByUser provides a mock function with given fields: userId
func (_m *DraftStore) PermanentDeleteByUser(userId string) error {
ret := _m.Called(userId)
if len(ret) == 0 {
panic("no return value specified for PermanentDeleteByUser")
}
var r0 error
if rf, ok := ret.Get(0).(func(string) error); ok {
r0 = rf(userId)
} else {
r0 = ret.Error(0)
}
return r0
}
// Upsert provides a mock function with given fields: d
func (_m *DraftStore) Upsert(d *model.Draft) (*model.Draft, error) {
ret := _m.Called(d)