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:
@@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user