File size: 1,914 Bytes
d384b52
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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}"