candidates.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. from __future__ import annotations
  2. from cyber_agent.application.candidate import CandidateAdoptionReceipt
  3. class ReferenceCandidateRepository:
  4. def __init__(self, artifacts) -> None:
  5. self.artifacts = artifacts
  6. self.versions = {}
  7. self.adoptions = {}
  8. self.adoption_calls = 0
  9. async def put_version(self, request):
  10. self.versions.setdefault(request.operation_id, request)
  11. saved = self.versions[request.operation_id]
  12. return self.artifacts.put(
  13. artifact_id=f"candidate:{saved.candidate_id}:{saved.revision}",
  14. version=str(saved.revision),
  15. kind="candidate.output",
  16. root_trace_id=saved.root_trace_id,
  17. uid=saved.uid,
  18. content=saved.content,
  19. )
  20. async def merge(self, request):
  21. return await self.put_version(request)
  22. async def load_version(self, candidate_ref):
  23. return next(
  24. item.content for item in self.versions.values()
  25. if item.candidate_id == candidate_ref.candidate_id
  26. and item.revision == candidate_ref.revision
  27. )
  28. async def commit_adoption(self, request):
  29. self.adoption_calls += 1
  30. self.adoptions.setdefault(request.operation_id, request.candidate_ref)
  31. return CandidateAdoptionReceipt(
  32. operation_id=request.operation_id,
  33. external_id=f"published:{request.candidate_ref.candidate_id}",
  34. )