async def get_latest_release_for_package(package_name: str) -> Optional[Release]: async with db_session.create_async_session() as session: query = select(Release) \ .filter(Release.package_id == package_name) \ .order_by(Release.created_date.desc()) results = await session.execute(query) release = results.scalar() return release
async def create_account(name: str, email: str, password: str) -> User: user = User() user.email = email user.name = name user.hash_password = crypto.hash(password, rounds=172_434) async with db_session.create_async_session() as session: session.add(user) await session.commit() return user
async def latest_packages(limit: int = 5) -> List[Package]: async with db_session.create_async_session() as session: query = select(Release) \ .options( sqlalchemy.orm.joinedload(Release.package)) \ .order_by(Release.created_date.desc()) \ .limit(limit) results = await session.execute(query) releases = results.scalars() return list({r.package for r in releases})
async def login_user(email: str, password: str) -> Optional[User]: async with db_session.create_async_session() as session: query = select(User).filter(User.email == email) results = await session.execute(query) user = results.scalar_one_or_none() if not user: return user if not crypto.verify(password, user.hash_password): return None return user
async def get_user_by_email(email: str) -> Optional[User]: async with db_session.create_async_session() as session: query = select(User).filter(User.email == email) result = await session.execute(query) return result.scalar_one_or_none()
async def get_user_by_id(user_id: int) -> Optional[User]: async with db_session.create_async_session() as session: query = select(User).filter(User.id == user_id) result = await session.execute(query) return result.scalar_one_or_none()
async def user_count() -> int: async with db_session.create_async_session() as session: query = select(func.count(User.id)) result = await session.execute(query) return result.scalar()
async def get_package_by_id(package_name: str) -> Optional[Package]: async with db_session.create_async_session() as session: query = select(Package).filter(Package.id == package_name) result = await session.execute(query) return result.scalar_one_or_none()
async def package_count() -> int: async with db_session.create_async_session() as session: query = select(func.count(Package.id)) results = await session.execute(query) return results.scalar()