Fix storage backend extensibility by adding DeleteIssue to Storage interface

- Added DeleteIssue to Storage interface
- Implemented DeleteIssue in MemoryStorage backend
- Removed brittle type assertion from deletion_tracking.go
- Closes bd-1fkr
This commit is contained in:
Steve Yegge
2025-11-06 19:17:06 -08:00
parent f61f8dd2ba
commit e291ee078e
3 changed files with 25 additions and 11 deletions
+1 -11
View File
@@ -99,20 +99,10 @@ func merge3WayAndPruneDeletions(ctx context.Context, store storage.Storage, json
} }
// Prune accepted deletions from the database // Prune accepted deletions from the database
// Use type assertion to access DeleteIssue method (available in concrete SQLiteStorage)
type deleter interface {
DeleteIssue(context.Context, string) error
}
d, ok := store.(deleter)
if !ok {
return false, fmt.Errorf("storage backend does not support DeleteIssue")
}
// Collect all deletion errors - fail the operation if any delete fails // Collect all deletion errors - fail the operation if any delete fails
var deletionErrors []error var deletionErrors []error
for _, id := range acceptedDeletions { for _, id := range acceptedDeletions {
if err := d.DeleteIssue(ctx, id); err != nil { if err := store.DeleteIssue(ctx, id); err != nil {
deletionErrors = append(deletionErrors, fmt.Errorf("issue %s: %w", id, err)) deletionErrors = append(deletionErrors, fmt.Errorf("issue %s: %w", id, err))
} }
} }
+23
View File
@@ -406,6 +406,29 @@ func (m *MemoryStorage) CloseIssue(ctx context.Context, id string, reason string
}, actor) }, actor)
} }
// DeleteIssue permanently deletes an issue and all associated data
func (m *MemoryStorage) DeleteIssue(ctx context.Context, id string) error {
m.mu.Lock()
defer m.mu.Unlock()
// Check if issue exists
if _, ok := m.issues[id]; !ok {
return fmt.Errorf("issue not found: %s", id)
}
// Delete the issue
delete(m.issues, id)
// Delete associated data
delete(m.dependencies, id)
delete(m.labels, id)
delete(m.events, id)
delete(m.comments, id)
delete(m.dirty, id)
return nil
}
// SearchIssues finds issues matching query and filters // SearchIssues finds issues matching query and filters
func (m *MemoryStorage) SearchIssues(ctx context.Context, query string, filter types.IssueFilter) ([]*types.Issue, error) { func (m *MemoryStorage) SearchIssues(ctx context.Context, query string, filter types.IssueFilter) ([]*types.Issue, error) {
m.mu.RLock() m.mu.RLock()
+1
View File
@@ -17,6 +17,7 @@ type Storage interface {
GetIssueByExternalRef(ctx context.Context, externalRef string) (*types.Issue, error) GetIssueByExternalRef(ctx context.Context, externalRef string) (*types.Issue, error)
UpdateIssue(ctx context.Context, id string, updates map[string]interface{}, actor string) error UpdateIssue(ctx context.Context, id string, updates map[string]interface{}, actor string) error
CloseIssue(ctx context.Context, id string, reason string, actor string) error CloseIssue(ctx context.Context, id string, reason string, actor string) error
DeleteIssue(ctx context.Context, id string) error
SearchIssues(ctx context.Context, query string, filter types.IssueFilter) ([]*types.Issue, error) SearchIssues(ctx context.Context, query string, filter types.IssueFilter) ([]*types.Issue, error)
// Dependencies // Dependencies