Source code for alab_management.sample_view.completed_sample_view
"""
This module contains the CompletedSampleView class, which is responsible for
saving samples to the completed database.
"""
import time
from bson import ObjectId  # type: ignore
from alab_management.utils.data_objects import get_collection, get_completed_collection
[docs]
class CompletedSampleView:
    """Sample view manages the sample status, which is a collection of tasks."""
    def __init__(self):
        self._working_sample_collection = get_collection("samples")
        self._completed_sample_collection = get_completed_collection("samples")
[docs]
    def save_sample(self, sample_id: ObjectId):
        """Saves a sample dictionary to the completed database. This should be copying a sample from the working
        database to the completed database.
        """
        # if self.exists(sample_id):
        #     raise ValueError(
        #         f"Sample with id {sample_id} already exists in the completed database!"
        #     )
        sample_dict = self._working_sample_collection.find_one(
            {"_id": ObjectId(sample_id)}
        )
        if sample_dict is None:
            raise ValueError(
                f"Sample with id {sample_id} does not exist in the database!"
            )
        if self.exists(sample_id):
            self._completed_sample_collection.update_one(
                filter={"_id": ObjectId(sample_id)},
                update={"$set": sample_dict},
                upsert=True,
            )
        else:
            self._completed_sample_collection.insert_one(sample_dict)
            # wait for the insert to complete
            while (
                self._completed_sample_collection.find_one({"_id": ObjectId(sample_id)})
                is None
            ):
                time.sleep(0.5) 
[docs]
    def exists(self, sample_id: ObjectId | str) -> bool:
        """Check if a sample exists in the database.
        Args:
            sample_id (ObjectId): id of the sample within sample collection
        Returns
        -------
            bool: True if sample exists in the database
        """
        return (
            self._completed_sample_collection.count_documents(
                {"_id": ObjectId(sample_id)}
            )
            > 0
        )