feat: add GITHUB_TOKEN for github api calls (prevent rate-limit)

This commit is contained in:
Vlad Stan
2023-01-18 11:49:23 +02:00
parent 66d3e2fb2d
commit 12d32a4811
2 changed files with 92 additions and 105 deletions

View File

@@ -6,7 +6,7 @@ import sys
import urllib.request import urllib.request
import zipfile import zipfile
from http import HTTPStatus from http import HTTPStatus
from typing import List, NamedTuple, Optional from typing import Any, List, NamedTuple, Optional
import httpx import httpx
from fastapi.exceptions import HTTPException from fastapi.exceptions import HTTPException
@@ -128,20 +128,16 @@ class ExtensionRelease(BaseModel):
@classmethod @classmethod
async def all_releases(cls, org, repo) -> List["ExtensionRelease"]: async def all_releases(cls, org, repo) -> List["ExtensionRelease"]:
async with httpx.AsyncClient() as client: try:
releases_url = f"https://api.github.com/repos/{org}/{repo}/releases" releases_url = f"https://api.github.com/repos/{org}/{repo}/releases"
resp = await client.get(releases_url) error_msg = "Cannot fetch extension releases"
if resp.status_code != 200: releases = await gihub_api_get(releases_url, error_msg)
raise HTTPException(
status_code=HTTPStatus.NOT_FOUND,
detail=f"Cannot fetch extension releases: {releases_url}: {resp.text}",
)
releases = resp.json()
return [ return [
ExtensionRelease.from_github_release(f"{org}/{repo}", r) ExtensionRelease.from_github_release(f"{org}/{repo}", r)
for r in releases for r in releases
] ]
except:
return []
class InstallableExtension(BaseModel): class InstallableExtension(BaseModel):
@@ -304,14 +300,10 @@ class InstallableExtension(BaseModel):
) )
extension_id_list: List[str] = [e.id for e in extension_list] extension_id_list: List[str] = [e.id for e in extension_list]
async with httpx.AsyncClient() as client:
for url in settings.lnbits_extensions_manifests: for url in settings.lnbits_extensions_manifests:
try: try:
resp = await client.get(url) error_msg = "Cannot fetch extensions manifest"
if resp.status_code != 200: manifest = await gihub_api_get(url, error_msg)
logger.warning(f"Cannot fetch extensions manifest at: {url}")
continue
manifest = resp.json()
if "repos" in manifest: if "repos" in manifest:
for r in manifest["repos"]: for r in manifest["repos"]:
if r["id"] in extension_id_list: if r["id"] in extension_id_list:
@@ -337,14 +329,11 @@ class InstallableExtension(BaseModel):
@classmethod @classmethod
async def get_extension_releases(cls, ext_id: str) -> List["ExtensionRelease"]: async def get_extension_releases(cls, ext_id: str) -> List["ExtensionRelease"]:
extension_releases: List[ExtensionRelease] = [] extension_releases: List[ExtensionRelease] = []
async with httpx.AsyncClient() as client:
for url in settings.lnbits_extensions_manifests: for url in settings.lnbits_extensions_manifests:
try: try:
resp = await client.get(url) error_msg = "Cannot fetch extensions manifest"
if resp.status_code != 200: manifest = await gihub_api_get(url, error_msg)
logger.warning(f"Cannot fetch extensions manifest at: {url}")
continue
manifest = resp.json()
if "repos" in manifest: if "repos" in manifest:
for r in manifest["repos"]: for r in manifest["repos"]:
if r["id"] == ext_id: if r["id"] == ext_id:
@@ -469,44 +458,35 @@ def icon_to_github_url(org: str, path: Optional[str]) -> str:
async def fetch_github_repo_info(org: str, repository: str): async def fetch_github_repo_info(org: str, repository: str):
async with httpx.AsyncClient() as client:
repo_url = f"https://api.github.com/repos/{org}/{repository}" repo_url = f"https://api.github.com/repos/{org}/{repository}"
resp = await client.get(repo_url) error_msg = "Cannot fetch extension repo"
if resp.status_code != 200: repo = await gihub_api_get(repo_url, error_msg)
detail = f"Cannot fetch extension repo: {repo_url}: {resp.text}"
logger.warning(detail)
raise HTTPException(
status_code=HTTPStatus.NOT_FOUND,
detail=detail,
)
repo = resp.json()
lates_release_url = ( lates_release_url = (
f"https://api.github.com/repos/{org}/{repository}/releases/latest" f"https://api.github.com/repos/{org}/{repository}/releases/latest"
) )
resp = await client.get(lates_release_url) error_msg = "Cannot fetch extension releases"
if resp.status_code != 200: latest_release = await gihub_api_get(lates_release_url, error_msg)
detail = (
f"Cannot fetch extension releases: {lates_release_url}: {resp.text}"
)
logger.warning(detail)
raise HTTPException(
status_code=HTTPStatus.NOT_FOUND,
detail=detail,
)
latest_release = resp.json()
config_url = f"""https://raw.githubusercontent.com/{org}/{repository}/{repo["default_branch"]}/config.json""" config_url = f"""https://raw.githubusercontent.com/{org}/{repository}/{repo["default_branch"]}/config.json"""
resp = await client.get(config_url) error_msg = "Cannot fetch config for extension"
if resp.status_code != 200: config = await gihub_api_get(config_url, error_msg)
detail = f"Cannot fetch config for extension: {config_url}: {resp.text}"
logger.warning(detail)
raise HTTPException(
status_code=HTTPStatus.NOT_FOUND,
detail=detail,
)
config = resp.json()
return repo, latest_release, config return repo, latest_release, config
async def gihub_api_get(url: str, error_msg: Optional[str]) -> Any:
async with httpx.AsyncClient() as client:
headers = (
{"Authorization": "Bearer " + settings.lnbits_ext_github_token}
if settings.lnbits_ext_github_token
else None
)
resp = await client.get(
url,
headers=headers,
)
if resp.status_code != 200:
logger.warning(f"{error_msg} ({url}): {resp.text}")
resp.raise_for_status()
return resp.json()

View File

@@ -38,10 +38,16 @@ class LNbitsSettings(BaseSettings):
class UsersSettings(LNbitsSettings): class UsersSettings(LNbitsSettings):
lnbits_admin_users: List[str] = Field(default=[]) lnbits_admin_users: List[str] = Field(default=[])
lnbits_allowed_users: List[str] = Field(default=[]) lnbits_allowed_users: List[str] = Field(default=[])
class ExtensionsSettings(LNbitsSettings):
lnbits_admin_extensions: List[str] = Field(default=[]) lnbits_admin_extensions: List[str] = Field(default=[])
lnbits_disabled_extensions: List[str] = Field(default=[]) lnbits_disabled_extensions: List[str] = Field(default=[])
lnbits_extensions_manifests: List[str] = Field(default=[]) lnbits_extensions_manifests: List[str] = Field(default=[])
lnbits_upgraded_extensions: List[str] = Field(default=[]) lnbits_upgraded_extensions: List[str] = Field(default=[])
lnbits_ext_github_token: str = Field(
default=""
) # required due to GitHUb rate-limit
class ThemesSettings(LNbitsSettings): class ThemesSettings(LNbitsSettings):
@@ -169,6 +175,7 @@ class FundingSourcesSettings(
class EditableSettings( class EditableSettings(
UsersSettings, UsersSettings,
ExtensionsSettings,
ThemesSettings, ThemesSettings,
OpsSettings, OpsSettings,
FundingSourcesSettings, FundingSourcesSettings,