修复共享链接无法被连带删除
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
@@ -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.
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user