Enable daemon RPC support for delete operations to trigger auto-sync. This PR adds delete operation support to the RPC daemon, ensuring that delete operations emit mutation events and trigger auto-sync like other mutating operations. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
This commit is contained in:
@@ -409,6 +409,98 @@ func (s *Server) handleClose(req *Request) Response {
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Server) handleDelete(req *Request) Response {
|
||||
var deleteArgs DeleteArgs
|
||||
if err := json.Unmarshal(req.Args, &deleteArgs); err != nil {
|
||||
return Response{
|
||||
Success: false,
|
||||
Error: fmt.Sprintf("invalid delete args: %v", err),
|
||||
}
|
||||
}
|
||||
|
||||
store := s.storage
|
||||
if store == nil {
|
||||
return Response{
|
||||
Success: false,
|
||||
Error: "storage not available (global daemon deprecated - use local daemon instead with 'bd daemon' in your project)",
|
||||
}
|
||||
}
|
||||
|
||||
// Validate that we have issue IDs to delete
|
||||
if len(deleteArgs.IDs) == 0 {
|
||||
return Response{
|
||||
Success: false,
|
||||
Error: "no issue IDs provided for deletion",
|
||||
}
|
||||
}
|
||||
|
||||
// DryRun mode: just return what would be deleted
|
||||
if deleteArgs.DryRun {
|
||||
data, _ := json.Marshal(map[string]interface{}{
|
||||
"dry_run": true,
|
||||
"issue_count": len(deleteArgs.IDs),
|
||||
"issues": deleteArgs.IDs,
|
||||
})
|
||||
return Response{
|
||||
Success: true,
|
||||
Data: data,
|
||||
}
|
||||
}
|
||||
|
||||
ctx := s.reqCtx(req)
|
||||
deletedCount := 0
|
||||
errors := make([]string, 0)
|
||||
|
||||
// Delete each issue
|
||||
for _, issueID := range deleteArgs.IDs {
|
||||
// Verify issue exists before deleting
|
||||
issue, err := store.GetIssue(ctx, issueID)
|
||||
if err != nil {
|
||||
errors = append(errors, fmt.Sprintf("%s: %v", issueID, err))
|
||||
continue
|
||||
}
|
||||
if issue == nil {
|
||||
errors = append(errors, fmt.Sprintf("%s: not found", issueID))
|
||||
continue
|
||||
}
|
||||
|
||||
// Delete the issue
|
||||
if err := store.DeleteIssue(ctx, issueID); err != nil {
|
||||
errors = append(errors, fmt.Sprintf("%s: %v", issueID, err))
|
||||
continue
|
||||
}
|
||||
|
||||
// Emit mutation event for event-driven daemon
|
||||
s.emitMutation(MutationDelete, issueID)
|
||||
deletedCount++
|
||||
}
|
||||
|
||||
// Build response
|
||||
result := map[string]interface{}{
|
||||
"deleted_count": deletedCount,
|
||||
"total_count": len(deleteArgs.IDs),
|
||||
}
|
||||
|
||||
if len(errors) > 0 {
|
||||
result["errors"] = errors
|
||||
if deletedCount == 0 {
|
||||
// All deletes failed
|
||||
return Response{
|
||||
Success: false,
|
||||
Error: fmt.Sprintf("failed to delete all issues: %v", errors),
|
||||
}
|
||||
}
|
||||
// Partial success
|
||||
result["partial_success"] = true
|
||||
}
|
||||
|
||||
data, _ := json.Marshal(result)
|
||||
return Response{
|
||||
Success: true,
|
||||
Data: data,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Server) handleList(req *Request) Response {
|
||||
var listArgs ListArgs
|
||||
if err := json.Unmarshal(req.Args, &listArgs); err != nil {
|
||||
|
||||
Reference in New Issue
Block a user