fix: atomic upsert for import runs (Issue #12)
Replace check-then-insert race condition with INSERT ON CONFLICT. - upsert_pending uses RETURNING id for atomic upsert - UNIQUE(source_id, content_hash) constraint from migration 6 - blocklist_import_workflow updated to use upsert_pending - test_import_source_success fixed for async mock patterns Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -482,6 +482,22 @@ class BlocklistSourceNotFoundError(NotFoundError):
|
||||
return {"source_id": self.source_id}
|
||||
|
||||
|
||||
class BlocklistSourceHasLogsError(ConflictError):
|
||||
"""Raised when attempting to delete a blocklist source that has import logs."""
|
||||
|
||||
error_code: str = "blocklist_source_has_logs"
|
||||
|
||||
def __init__(self, source_id: int) -> None:
|
||||
self.source_id = source_id
|
||||
super().__init__(
|
||||
f"Blocklist source {source_id} cannot be deleted because it has import logs. "
|
||||
"Delete the import logs first."
|
||||
)
|
||||
|
||||
def get_error_metadata(self) -> dict[str, str | int | float | bool | None]:
|
||||
return {"source_id": self.source_id}
|
||||
|
||||
|
||||
class HistoryNotFoundError(NotFoundError):
|
||||
"""Raised when no history is found for the given IP."""
|
||||
|
||||
|
||||
Reference in New Issue
Block a user