import time from typing import Dict from authlib.integrations.sqla_oauth2 import ( OAuth2AuthorizationCodeMixin, OAuth2ClientMixin, OAuth2TokenMixin, ) from sqlalchemy.ext.declarative import DeclarativeMeta from fittrackee import db BaseModel: DeclarativeMeta = db.Model class OAuth2Client(BaseModel, OAuth2ClientMixin): __tablename__ = 'oauth2_client' id = db.Column(db.Integer, primary_key=True) user_id = db.Column( db.Integer, db.ForeignKey('users.id', ondelete='CASCADE') ) user = db.relationship('User') def serialize(self) -> Dict: return { 'client_id': self.client_id, 'client_secret': self.client_secret, 'id': self.id, 'name': self.client_name, 'redirect_uris': self.redirect_uris, 'website': self.client_uri, } class OAuth2AuthorizationCode(BaseModel, OAuth2AuthorizationCodeMixin): __tablename__ = 'oauth2_code' id = db.Column(db.Integer, primary_key=True) user_id = db.Column( db.Integer, db.ForeignKey('users.id', ondelete='CASCADE') ) user = db.relationship('User') class OAuth2Token(BaseModel, OAuth2TokenMixin): __tablename__ = 'oauth2_token' id = db.Column(db.Integer, primary_key=True) user_id = db.Column( db.Integer, db.ForeignKey('users.id', ondelete='CASCADE') ) user = db.relationship('User') def is_refresh_token_active(self) -> bool: if self.revoked: return False expires_at = self.issued_at + self.expires_in * 2 return expires_at >= time.time()