修复共享链接无法被连带删除

This commit is contained in:
anian
2026-07-04 01:44:03 +08:00
parent 772a68a87b
commit 756b9f5d1c
7 changed files with 44 additions and 3 deletions
+2 -1
View File
@@ -2,11 +2,12 @@
> 基于原作者v0.29.1代码修改
#### v0.29.1-1补丁
#### v0.29.1-2
1. 置顶内容新增自动折叠;置顶效果及图标改为全局显示
2. 归档页面新增(取消)置顶、编辑、复制按钮
3. 权限图标改为全局显示
4. 修复中文目录锚点无效;优化目录显示效果
5. 备忘录被删除时显式删除其分享链接
#### v0.29.1-1
1. 修改默认配置
+3
View File
@@ -116,6 +116,9 @@ func (d *DB) DeleteMemoShare(ctx context.Context, delete *store.DeleteMemoShare)
if delete.UID != nil {
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...)
return err
}
+3
View File
@@ -137,6 +137,9 @@ func (d *DB) DeleteMemoShare(ctx context.Context, delete *store.DeleteMemoShare)
if delete.UID != nil {
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...)
return err
}
+3
View File
@@ -139,6 +139,9 @@ func (d *DB) DeleteMemoShare(ctx context.Context, delete *store.DeleteMemoShare)
if delete.UID != nil {
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...)
return err
}
+5
View File
@@ -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 {
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.
attachments, err := s.ListAttachments(ctx, &FindAttachment{MemoID: &delete.ID})
if err != nil {
+3 -2
View File
@@ -22,8 +22,9 @@ type FindMemoShare struct {
// DeleteMemoShare identifies a share grant to remove.
type DeleteMemoShare struct {
ID *int32
UID *string
ID *int32
UID *string
MemoID *int32
}
// CreateMemoShare creates a new share grant.
+25
View File
@@ -112,10 +112,35 @@ func TestDeleteMemoStore(t *testing.T) {
memo, err := ts.CreateMemo(ctx, memoCreate)
require.NoError(t, err)
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{
ID: memo.ID,
})
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()
}