import traceback import logging import httpx class GetRepos: async def get_repos(self, user_id: int): try: db, cb = self.db, self.cb user = await self.find(user_id) if not user: return 'not exists' installation_id = (await cb.find_one({"_id": int(user_id)})).get('installation_id', None) if not installation_id: return "not exists" token = await self.gen_token(installation_id) url = "https://api.github.com/installation/repositories?page=1" headers = { "Authorization": f"Bearer {token}", "Accept": "application/vnd.github+json" } async with httpx.AsyncClient() as mano: r = await mano.get(url, headers=headers) if r.status_code == 200: data = r.json() if not data.get("repositories"): return [] ily = [] for x in data.get("repositories"): name, full_name, id = x.get('name'), x.get('full_name'), x.get('id') ily.append({'name': name, 'id': id, 'full_name': full_name}) try: pages = list(range(2, int(str(r.headers.get('Link', ''))[126])+1)) except Exception as w: logging.error(f"GetRepos 30: {w}") pages = [] for x in pages: url = f"https://api.github.com/installation/repositories?page={x}" k = await mano.get(url, headers=headers) data = k.json() if k.status_code == 200 and data.get("repositories"): for x in data["repositories"]: name, full_name, id = x.get('name'), x.get('full_name'), x.get('id') ily.append({'name': name, 'id': id, 'full_name': full_name}) return ily else: logging.info(f"Failed to get repos of user: {user_id}: {r.text}") return "failed" except Exception as w: logging.error(traceback.format_exc()) return f"Error: {w}"