Этот коммит содержится в:
коммит произвёл
Jesús Espino
родитель
cbfd68ee1f
Коммит
539de0d593
@@ -1463,8 +1463,8 @@ func (a *App) PermanentDeleteUser(user *model.User) *model.AppError {
|
|||||||
return result.Err
|
return result.Err
|
||||||
}
|
}
|
||||||
|
|
||||||
if result := <-a.Srv.Store.Post().PermanentDeleteByUser(user.Id); result.Err != nil {
|
if err := a.Srv.Store.Post().PermanentDeleteByUser(user.Id); err != nil {
|
||||||
return result.Err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
infos, err := a.Srv.Store.FileInfo().GetForUser(user.Id)
|
infos, err := a.Srv.Store.FileInfo().GetForUser(user.Id)
|
||||||
|
|||||||
@@ -382,62 +382,56 @@ func (s *SqlPostStore) Delete(postId string, time int64, deleteByID string) *mod
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *SqlPostStore) permanentDelete(postId string) store.StoreChannel {
|
func (s *SqlPostStore) permanentDelete(postId string) *model.AppError {
|
||||||
return store.Do(func(result *store.StoreResult) {
|
_, err := s.GetMaster().Exec("DELETE FROM Posts WHERE Id = :Id OR RootId = :RootId", map[string]interface{}{"Id": postId, "RootId": postId})
|
||||||
_, err := s.GetMaster().Exec("DELETE FROM Posts WHERE Id = :Id OR RootId = :RootId", map[string]interface{}{"Id": postId, "RootId": postId})
|
if err != nil {
|
||||||
if err != nil {
|
return model.NewAppError("SqlPostStore.Delete", "store.sql_post.permanent_delete.app_error", nil, "id="+postId+", err="+err.Error(), http.StatusInternalServerError)
|
||||||
result.Err = model.NewAppError("SqlPostStore.Delete", "store.sql_post.permanent_delete.app_error", nil, "id="+postId+", err="+err.Error(), http.StatusInternalServerError)
|
}
|
||||||
}
|
return nil
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *SqlPostStore) permanentDeleteAllCommentByUser(userId string) store.StoreChannel {
|
func (s *SqlPostStore) permanentDeleteAllCommentByUser(userId string) *model.AppError {
|
||||||
return store.Do(func(result *store.StoreResult) {
|
_, err := s.GetMaster().Exec("DELETE FROM Posts WHERE UserId = :UserId AND RootId != ''", map[string]interface{}{"UserId": userId})
|
||||||
_, err := s.GetMaster().Exec("DELETE FROM Posts WHERE UserId = :UserId AND RootId != ''", map[string]interface{}{"UserId": userId})
|
if err != nil {
|
||||||
if err != nil {
|
return model.NewAppError("SqlPostStore.permanentDeleteAllCommentByUser", "store.sql_post.permanent_delete_all_comments_by_user.app_error", nil, "userId="+userId+", err="+err.Error(), http.StatusInternalServerError)
|
||||||
result.Err = model.NewAppError("SqlPostStore.permanentDeleteAllCommentByUser", "store.sql_post.permanent_delete_all_comments_by_user.app_error", nil, "userId="+userId+", err="+err.Error(), http.StatusInternalServerError)
|
}
|
||||||
}
|
return nil
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *SqlPostStore) PermanentDeleteByUser(userId string) store.StoreChannel {
|
func (s *SqlPostStore) PermanentDeleteByUser(userId string) *model.AppError {
|
||||||
return store.Do(func(result *store.StoreResult) {
|
// First attempt to delete all the comments for a user
|
||||||
// First attempt to delete all the comments for a user
|
if err := s.permanentDeleteAllCommentByUser(userId); err != nil {
|
||||||
if r := <-s.permanentDeleteAllCommentByUser(userId); r.Err != nil {
|
return err
|
||||||
result.Err = r.Err
|
}
|
||||||
return
|
|
||||||
|
// Now attempt to delete all the root posts for a user. This will also
|
||||||
|
// delete all the comments for each post
|
||||||
|
found := true
|
||||||
|
count := 0
|
||||||
|
|
||||||
|
for found {
|
||||||
|
var ids []string
|
||||||
|
_, err := s.GetMaster().Select(&ids, "SELECT Id FROM Posts WHERE UserId = :UserId LIMIT 1000", map[string]interface{}{"UserId": userId})
|
||||||
|
if err != nil {
|
||||||
|
return model.NewAppError("SqlPostStore.PermanentDeleteByUser.select", "store.sql_post.permanent_delete_by_user.app_error", nil, "userId="+userId+", err="+err.Error(), http.StatusInternalServerError)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now attempt to delete all the root posts for a user. This will also
|
found = false
|
||||||
// delete all the comments for each post.
|
for _, id := range ids {
|
||||||
found := true
|
found = true
|
||||||
count := 0
|
if err := s.permanentDelete(id); err != nil {
|
||||||
|
return err
|
||||||
for found {
|
|
||||||
var ids []string
|
|
||||||
_, err := s.GetMaster().Select(&ids, "SELECT Id FROM Posts WHERE UserId = :UserId LIMIT 1000", map[string]interface{}{"UserId": userId})
|
|
||||||
if err != nil {
|
|
||||||
result.Err = model.NewAppError("SqlPostStore.PermanentDeleteByUser.select", "store.sql_post.permanent_delete_by_user.app_error", nil, "userId="+userId+", err="+err.Error(), http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
} else {
|
|
||||||
found = false
|
|
||||||
for _, id := range ids {
|
|
||||||
found = true
|
|
||||||
if r := <-s.permanentDelete(id); r.Err != nil {
|
|
||||||
result.Err = r.Err
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// This is a fail safe, give up if more than 10K messages
|
|
||||||
count = count + 1
|
|
||||||
if count >= 10 {
|
|
||||||
result.Err = model.NewAppError("SqlPostStore.PermanentDeleteByUser.toolarge", "store.sql_post.permanent_delete_by_user.too_many.app_error", nil, "userId="+userId, http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
|
||||||
|
// This is a fail safe, give up if more than 10k messages
|
||||||
|
count++
|
||||||
|
if count >= 10 {
|
||||||
|
return model.NewAppError("SqlPostStore.PermanentDeleteByUser.toolarge", "store.sql_post.permanent_delete_by_user.too_many.app_error", nil, "userId="+userId, http.StatusInternalServerError)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *SqlPostStore) PermanentDeleteByChannel(channelId string) *model.AppError {
|
func (s *SqlPostStore) PermanentDeleteByChannel(channelId string) *model.AppError {
|
||||||
|
|||||||
@@ -215,7 +215,7 @@ type PostStore interface {
|
|||||||
Get(id string) (*model.PostList, *model.AppError)
|
Get(id string) (*model.PostList, *model.AppError)
|
||||||
GetSingle(id string) (*model.Post, *model.AppError)
|
GetSingle(id string) (*model.Post, *model.AppError)
|
||||||
Delete(postId string, time int64, deleteByID string) *model.AppError
|
Delete(postId string, time int64, deleteByID string) *model.AppError
|
||||||
PermanentDeleteByUser(userId string) StoreChannel
|
PermanentDeleteByUser(userId string) *model.AppError
|
||||||
PermanentDeleteByChannel(channelId string) *model.AppError
|
PermanentDeleteByChannel(channelId string) *model.AppError
|
||||||
GetPosts(channelId string, offset int, limit int, allowFromCache bool) (*model.PostList, *model.AppError)
|
GetPosts(channelId string, offset int, limit int, allowFromCache bool) (*model.PostList, *model.AppError)
|
||||||
GetFlaggedPosts(userId string, offset int, limit int) (*model.PostList, *model.AppError)
|
GetFlaggedPosts(userId string, offset int, limit int) (*model.PostList, *model.AppError)
|
||||||
|
|||||||
@@ -589,15 +589,15 @@ func (_m *PostStore) PermanentDeleteByChannel(channelId string) *model.AppError
|
|||||||
}
|
}
|
||||||
|
|
||||||
// PermanentDeleteByUser provides a mock function with given fields: userId
|
// PermanentDeleteByUser provides a mock function with given fields: userId
|
||||||
func (_m *PostStore) PermanentDeleteByUser(userId string) store.StoreChannel {
|
func (_m *PostStore) PermanentDeleteByUser(userId string) *model.AppError {
|
||||||
ret := _m.Called(userId)
|
ret := _m.Called(userId)
|
||||||
|
|
||||||
var r0 store.StoreChannel
|
var r0 *model.AppError
|
||||||
if rf, ok := ret.Get(0).(func(string) store.StoreChannel); ok {
|
if rf, ok := ret.Get(0).(func(string) *model.AppError); ok {
|
||||||
r0 = rf(userId)
|
r0 = rf(userId)
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(store.StoreChannel)
|
r0 = ret.Get(0).(*model.AppError)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -468,8 +468,8 @@ func testPostStorePermDelete1Level(t *testing.T, ss store.Store) {
|
|||||||
o3.Message = "zz" + model.NewId() + "b"
|
o3.Message = "zz" + model.NewId() + "b"
|
||||||
o3 = (<-ss.Post().Save(o3)).Data.(*model.Post)
|
o3 = (<-ss.Post().Save(o3)).Data.(*model.Post)
|
||||||
|
|
||||||
if r2 := <-ss.Post().PermanentDeleteByUser(o2.UserId); r2.Err != nil {
|
if err2 := ss.Post().PermanentDeleteByUser(o2.UserId); err2 != nil {
|
||||||
t.Fatal(r2.Err)
|
t.Fatal(err2)
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := ss.Post().Get(o1.Id); err != nil {
|
if _, err := ss.Post().Get(o1.Id); err != nil {
|
||||||
@@ -510,8 +510,8 @@ func testPostStorePermDelete1Level2(t *testing.T, ss store.Store) {
|
|||||||
o3.Message = "zz" + model.NewId() + "b"
|
o3.Message = "zz" + model.NewId() + "b"
|
||||||
o3 = (<-ss.Post().Save(o3)).Data.(*model.Post)
|
o3 = (<-ss.Post().Save(o3)).Data.(*model.Post)
|
||||||
|
|
||||||
if r2 := <-ss.Post().PermanentDeleteByUser(o1.UserId); r2.Err != nil {
|
if err2 := ss.Post().PermanentDeleteByUser(o1.UserId); err2 != nil {
|
||||||
t.Fatal(r2.Err)
|
t.Fatal(err2)
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := ss.Post().Get(o1.Id); err == nil {
|
if _, err := ss.Post().Get(o1.Id); err == nil {
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user