Add the token refresher.
Signed-off-by: Jan Losinski <losinski@wh2.tu-dresden.de>
This commit is contained in:
parent
b956f1bf9c
commit
cbb9d3ac1c
|
|
@ -0,0 +1,42 @@
|
||||||
|
import asyncio
|
||||||
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
|
from logbook import Logger
|
||||||
|
from sqlalchemy import func
|
||||||
|
|
||||||
|
from models import User
|
||||||
|
|
||||||
|
logger = Logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class Refresher:
|
||||||
|
def __init__(self, session, wallabag):
|
||||||
|
self.session = session
|
||||||
|
self.wallabag = wallabag
|
||||||
|
self.grace = 120
|
||||||
|
|
||||||
|
def _wait_time(self):
|
||||||
|
next = self.session.query(func.min(User.token_valid).label("min")).first()
|
||||||
|
if next is None or next.min is None:
|
||||||
|
return 3
|
||||||
|
delta = next.min - datetime.utcnow()
|
||||||
|
if delta < timedelta(seconds=self.grace):
|
||||||
|
return 0
|
||||||
|
|
||||||
|
calculated = delta - timedelta(seconds=self.grace)
|
||||||
|
return calculated.total_seconds()
|
||||||
|
|
||||||
|
async def refresh(self):
|
||||||
|
while True:
|
||||||
|
await asyncio.sleep(self._wait_time())
|
||||||
|
|
||||||
|
ts = datetime.utcnow() + timedelta(seconds=self.grace)
|
||||||
|
refreshes = [self._refresh_user(user) for user
|
||||||
|
in self.session.query(User).filter(User.token_valid < ts).all()]
|
||||||
|
await asyncio.gather(*refreshes)
|
||||||
|
|
||||||
|
self.session.commit()
|
||||||
|
|
||||||
|
async def _refresh_user(self, user):
|
||||||
|
logger.info("Refresh token for {}", user.name)
|
||||||
|
await self.wallabag.refresh_token(user)
|
||||||
Loading…
Reference in New Issue