diff --git a/README.md b/README.md index ddb1409..9a1994d 100644 --- a/README.md +++ b/README.md @@ -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. 修改默认配置 diff --git a/store/db/mysql/memo_share.go b/store/db/mysql/memo_share.go index 29c278d..5b248af 100644 --- a/store/db/mysql/memo_share.go +++ b/store/db/mysql/memo_share.go @@ -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 } diff --git a/store/db/postgres/memo_share.go b/store/db/postgres/memo_share.go index a802d3e..f773540 100644 --- a/store/db/postgres/memo_share.go +++ b/store/db/postgres/memo_share.go @@ -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 } diff --git a/store/db/sqlite/memo_share.go b/store/db/sqlite/memo_share.go index ab46679..5c9cf28 100644 --- a/store/db/sqlite/memo_share.go +++ b/store/db/sqlite/memo_share.go @@ -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 } diff --git a/store/memo.go b/store/memo.go index ce6cde2..4fd44e9 100644 --- a/store/memo.go +++ b/store/memo.go @@ -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 { diff --git a/store/memo_share.go b/store/memo_share.go index 709da93..cc69070 100644 --- a/store/memo_share.go +++ b/store/memo_share.go @@ -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. diff --git a/store/test/memo_test.go b/store/test/memo_test.go index 51a2d14..ec567ea 100644 --- a/store/test/memo_test.go +++ b/store/test/memo_test.go @@ -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() }