修复共享链接无法被连带删除
This commit is contained in:
@@ -2,11 +2,12 @@
|
|||||||
|
|
||||||
> 基于原作者v0.29.1代码修改
|
> 基于原作者v0.29.1代码修改
|
||||||
|
|
||||||
#### v0.29.1-1补丁
|
#### v0.29.1-2
|
||||||
1. 置顶内容新增自动折叠;置顶效果及图标改为全局显示
|
1. 置顶内容新增自动折叠;置顶效果及图标改为全局显示
|
||||||
2. 归档页面新增(取消)置顶、编辑、复制按钮
|
2. 归档页面新增(取消)置顶、编辑、复制按钮
|
||||||
3. 权限图标改为全局显示
|
3. 权限图标改为全局显示
|
||||||
4. 修复中文目录锚点无效;优化目录显示效果
|
4. 修复中文目录锚点无效;优化目录显示效果
|
||||||
|
5. 备忘录被删除时显式删除其分享链接
|
||||||
|
|
||||||
#### v0.29.1-1
|
#### v0.29.1-1
|
||||||
1. 修改默认配置
|
1. 修改默认配置
|
||||||
|
|||||||
@@ -116,6 +116,9 @@ func (d *DB) DeleteMemoShare(ctx context.Context, delete *store.DeleteMemoShare)
|
|||||||
if delete.UID != nil {
|
if delete.UID != nil {
|
||||||
where, args = append(where, "`uid` = ?"), append(args, *delete.UID)
|
where, args = append(where, "`uid` = ?"), append(args, *delete.UID)
|
||||||
}
|
}
|
||||||
|
if delete.MemoID != nil {
|
||||||
|
where, args = append(where, "`memo_id` = ?"), append(args, *delete.MemoID)
|
||||||
|
}
|
||||||
_, err := d.db.ExecContext(ctx, "DELETE FROM `memo_share` WHERE "+strings.Join(where, " AND "), args...)
|
_, err := d.db.ExecContext(ctx, "DELETE FROM `memo_share` WHERE "+strings.Join(where, " AND "), args...)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -137,6 +137,9 @@ func (d *DB) DeleteMemoShare(ctx context.Context, delete *store.DeleteMemoShare)
|
|||||||
if delete.UID != nil {
|
if delete.UID != nil {
|
||||||
where, args = append(where, "uid = "+placeholder(len(args)+1)), append(args, *delete.UID)
|
where, args = append(where, "uid = "+placeholder(len(args)+1)), append(args, *delete.UID)
|
||||||
}
|
}
|
||||||
|
if delete.MemoID != nil {
|
||||||
|
where, args = append(where, "memo_id = "+placeholder(len(args)+1)), append(args, *delete.MemoID)
|
||||||
|
}
|
||||||
_, err := d.db.ExecContext(ctx, "DELETE FROM memo_share WHERE "+strings.Join(where, " AND "), args...)
|
_, err := d.db.ExecContext(ctx, "DELETE FROM memo_share WHERE "+strings.Join(where, " AND "), args...)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -139,6 +139,9 @@ func (d *DB) DeleteMemoShare(ctx context.Context, delete *store.DeleteMemoShare)
|
|||||||
if delete.UID != nil {
|
if delete.UID != nil {
|
||||||
where, args = append(where, "`uid` = ?"), append(args, *delete.UID)
|
where, args = append(where, "`uid` = ?"), append(args, *delete.UID)
|
||||||
}
|
}
|
||||||
|
if delete.MemoID != nil {
|
||||||
|
where, args = append(where, "`memo_id` = ?"), append(args, *delete.MemoID)
|
||||||
|
}
|
||||||
_, err := d.db.ExecContext(ctx, "DELETE FROM `memo_share` WHERE "+strings.Join(where, " AND "), args...)
|
_, err := d.db.ExecContext(ctx, "DELETE FROM `memo_share` WHERE "+strings.Join(where, " AND "), args...)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -145,6 +145,11 @@ func (s *Store) DeleteMemo(ctx context.Context, delete *DeleteMemo) error {
|
|||||||
if err := s.driver.DeleteMemoRelation(ctx, &DeleteMemoRelation{RelatedMemoID: &delete.ID}); err != nil {
|
if err := s.driver.DeleteMemoRelation(ctx, &DeleteMemoRelation{RelatedMemoID: &delete.ID}); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
// Clean up share links for this memo. SQLite runs with foreign keys disabled,
|
||||||
|
// so it cannot rely on ON DELETE CASCADE for memo_share rows.
|
||||||
|
if err := s.driver.DeleteMemoShare(ctx, &DeleteMemoShare{MemoID: &delete.ID}); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
// Clean up attachments linked to this memo.
|
// Clean up attachments linked to this memo.
|
||||||
attachments, err := s.ListAttachments(ctx, &FindAttachment{MemoID: &delete.ID})
|
attachments, err := s.ListAttachments(ctx, &FindAttachment{MemoID: &delete.ID})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
+3
-2
@@ -22,8 +22,9 @@ type FindMemoShare struct {
|
|||||||
|
|
||||||
// DeleteMemoShare identifies a share grant to remove.
|
// DeleteMemoShare identifies a share grant to remove.
|
||||||
type DeleteMemoShare struct {
|
type DeleteMemoShare struct {
|
||||||
ID *int32
|
ID *int32
|
||||||
UID *string
|
UID *string
|
||||||
|
MemoID *int32
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateMemoShare creates a new share grant.
|
// CreateMemoShare creates a new share grant.
|
||||||
|
|||||||
@@ -112,10 +112,35 @@ func TestDeleteMemoStore(t *testing.T) {
|
|||||||
memo, err := ts.CreateMemo(ctx, memoCreate)
|
memo, err := ts.CreateMemo(ctx, memoCreate)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, memoCreate.Content, memo.Content)
|
require.Equal(t, memoCreate.Content, memo.Content)
|
||||||
|
otherMemo, err := ts.CreateMemo(ctx, &store.Memo{
|
||||||
|
UID: "test-other-memo",
|
||||||
|
CreatorID: user.ID,
|
||||||
|
Content: "other test content",
|
||||||
|
Visibility: store.Public,
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
share, err := ts.CreateMemoShare(ctx, &store.MemoShare{
|
||||||
|
UID: "test-delete-memo-share",
|
||||||
|
MemoID: memo.ID,
|
||||||
|
CreatorID: user.ID,
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
keptShare, err := ts.CreateMemoShare(ctx, &store.MemoShare{
|
||||||
|
UID: "test-keep-memo-share",
|
||||||
|
MemoID: otherMemo.ID,
|
||||||
|
CreatorID: user.ID,
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
err = ts.DeleteMemo(ctx, &store.DeleteMemo{
|
err = ts.DeleteMemo(ctx, &store.DeleteMemo{
|
||||||
ID: memo.ID,
|
ID: memo.ID,
|
||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
deletedShare, err := ts.GetMemoShare(ctx, &store.FindMemoShare{ID: &share.ID})
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Nil(t, deletedShare)
|
||||||
|
keptShareAfterDelete, err := ts.GetMemoShare(ctx, &store.FindMemoShare{ID: &keptShare.ID})
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NotNil(t, keptShareAfterDelete)
|
||||||
ts.Close()
|
ts.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user