85 lines
3.0 KiB
Python
85 lines
3.0 KiB
Python
from datetime import datetime
|
|
|
|
from .database import BotDatabase
|
|
from .domain import Binding, OAuthCredentials
|
|
|
|
|
|
class BotOAuthRepository:
|
|
"""Транзакционные операции с OAuth-данными Битрикса.
|
|
Обертка над хранимыми функциями БД."""
|
|
|
|
def __init__(self, database: BotDatabase) -> None:
|
|
self.database = database
|
|
|
|
async def get(self, binding: Binding) -> OAuthCredentials | None:
|
|
async with self.database.transaction() as connection:
|
|
cursor = await connection.execute(
|
|
"SELECT * FROM oauth.get_credentials_v1(%s, %s)",
|
|
(binding.member_id, binding.bitrix_user_id)
|
|
)
|
|
row = await cursor.fetchone()
|
|
# pyrefly: ignore [bad-argument-type]
|
|
return self._credentials(row) if row else None
|
|
|
|
async def claim_refresh(self, credentials: OAuthCredentials) -> bool:
|
|
async with self.database.transaction() as connection:
|
|
cursor = await connection.execute(
|
|
"SELECT oauth.claim_refresh_v1(%s, %s, %s)",
|
|
(
|
|
credentials.member_id,
|
|
credentials.bitrix_user_id,
|
|
credentials.version
|
|
)
|
|
)
|
|
row = await cursor.fetchone()
|
|
|
|
# pyrefly: ignore [missing-attribute]
|
|
return bool(row and next(iter(row.values())))
|
|
|
|
async def finish_refresh(
|
|
self,
|
|
credentials: OAuthCredentials,
|
|
access_token: bytes,
|
|
refresh_token: bytes,
|
|
expires_at: datetime
|
|
) -> bool:
|
|
async with self.database.transaction() as connection:
|
|
cursor = await connection.execute(
|
|
"SELECT oauth.finish_refresh_v1(%s, %s, %s, %s, %s, %s)",
|
|
(
|
|
credentials.member_id,
|
|
credentials.bitrix_user_id,
|
|
credentials.version,
|
|
access_token,
|
|
refresh_token,
|
|
expires_at
|
|
)
|
|
)
|
|
row = await cursor.fetchone()
|
|
|
|
# pyrefly: ignore [missing-attribute]
|
|
return bool(row and next(iter(row.values())))
|
|
|
|
async def release_refresh(self, credentials: OAuthCredentials) -> None:
|
|
async with self.database.transaction() as connection:
|
|
await connection.execute(
|
|
"SELECT oauth.release_refresh_v1(%s, %s, %s)",
|
|
(
|
|
credentials.member_id,
|
|
credentials.bitrix_user_id,
|
|
credentials.version
|
|
)
|
|
)
|
|
|
|
@staticmethod
|
|
def _credentials(row: dict) -> OAuthCredentials:
|
|
return OAuthCredentials(
|
|
member_id=str(row["member_id"]),
|
|
domain=str(row["domain"]),
|
|
bitrix_user_id=int(row["bitrix_user_id"]),
|
|
access_token=bytes(row["access_token"]),
|
|
refresh_token=bytes(row["refresh_token"]),
|
|
expires_at=row["expires_at"],
|
|
version=int(row["version"])
|
|
)
|