def _DocumentBase__initialize_indexes(cls): # We initialize an index in order to get users by their phone number try: logger.info( "Creating indexes for collection {c}".format(c=cls.__name__)) session().query( q.create_index({ "name": "user_by_phone_number", "source": q.collection(cls._collection_name), "terms": [{ "field": ["data", "phone_number"] }], "unique": True, "values": [ { "field": ["data", "name"] }, { "field": ["data", "country"] }, { "field": ["data", "endless_medical_token"] }, { "field": ["ref"] }, ], })) session().query( q.create_index({ "name": "all_users", "source": q.collection(cls._collection_name), "values": [ { "field": ["data", "name"] }, { "field": ["data", "phone_number"] }, { "field": ["data", "country"] }, { "field": ["data", "endless_medical_token"] }, { "field": ["ref"] }, ], })) except BadRequest: logger.info("One or more indexes already exist, skipping creation")
def __initialize_collection(cls): logger.info("Checking if collection {c} exists...".format( c=cls._collection_name)) try: session().query(q.get(q.collection(cls._collection_name))) logger.info("{c} exists, skipping creation.".format( c=cls._collection_name)) except BadRequest: logger.info("{c} does not exist, creating...".format( c=cls._collection_name)) session().query(q.create_collection({"name": cls._collection_name}))
def delete_user_by_phone_number(cls, phone_number: str): user = cls.get_by_phone(phone_number) if not user: raise RuntimeError("User not found") result = session().query(q.delete(user.ref)) if not result["data"]: raise RuntimeError( "Error deleting the user, maybe does not exist?") return UserDocument(ref=result["ref"], **result["data"])
def get_by_phone(cls, phone_number: str): result = session().query( q.paginate(q.match(q.index("user_by_phone_number"), phone_number))) if len(result["data"]) == 0: return None # The result is a list with the values ordered as the index defined below name, country, endless_medical_token, ref = result["data"][0] return UserDocument( ref=ref, name=name, country=country, phone_number=phone_number, endless_medical_token=endless_medical_token, )
def save(self): """ Saves the document in the collection, the attributes are serialized utilizing Pydantic's dict method, which traverses trough the child class attributes :return: An instance of the newly saved object. """ attributes = self.dict() logger.debug( "Saving object for collection {c} with attributes {attr}".format( c=self._collection_name, attr=attributes)) result = session().query( q.create( q.collection(self._collection_name), {"data": attributes}, )) logger.debug("Object saved with id {ref}".format(ref=result["ref"])) return self.__class__(ref=result["ref"], ts=result["ts"], **result["data"])
def delete(self): session().query(q.delete(self.ref)) return self
def update(self): updated_vals = self.dict(exclude={"ref", "ts"}) updated_vals["updated_at"] = datetime.now(pytz.timezone("UTC")) session().query(q.update(self.ref, {"data": {**updated_vals}}))