credential.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import json
  2. import os
  3. import time
  4. from typing import Dict, Optional
  5. from bson import ObjectId
  6. from app.bnet_retriever._plugin import Plugin
  7. from app.bnet_retriever.utils import serialize
  8. from app.bnet_retriever.utils.login import login
  9. from app.utils.db import Mongo
  10. class CredentialManager(Plugin):
  11. def __init__(self, runner):
  12. super(CredentialManager, self).__init__(runner)
  13. self._bnet_user_cred: Optional[Dict] = None
  14. @property
  15. def raw_cred(self) -> Dict:
  16. return serialize.fromstr(Mongo.db.user.find_one({'_id': self._id})['credential'])
  17. @property
  18. def bnet_user_cred(self) -> str:
  19. # Here, self.last_updated_at records if the bnet_user_cred outdated ( 1 hr expiration)
  20. # Different from the lastUpdatedAt field in mongodb
  21. if self._bnet_user_cred is None or time.time() - self.last_updated_at > 60*55:
  22. bnet_user_cred, new_cred = login(self.raw_cred)
  23. self._bnet_user_cred = bnet_user_cred
  24. self.update_raw_cred(new_cred)
  25. self.last_updated_at = time.time()
  26. return self._bnet_user_cred
  27. def update_raw_cred(self, new_cred: Dict) -> None:
  28. Mongo.db.user.update_one({'_id': self._id}, {
  29. '$set': {
  30. 'credential': serialize.tostr(new_cred),
  31. },
  32. '$currentDate': {
  33. 'lastUpdatedAt': True
  34. }
  35. })