From 2fc03d479d08c01912cf815221d57897eaa043cf Mon Sep 17 00:00:00 2001 From: Masterain Date: Wed, 12 Jun 2024 01:18:14 -0700 Subject: [PATCH 1/2] Update patch --- routers/patch.py | 14 ++++++++++---- utils/PatchMeta.py | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/routers/patch.py b/routers/patch.py index 0e8c622..fc55101 100644 --- a/routers/patch.py +++ b/routers/patch.py @@ -7,7 +7,7 @@ from fastapi.responses import RedirectResponse from datetime import datetime from utils.dgp_utils import update_recent_versions -from utils.PatchMeta import PatchMeta +from utils.PatchMeta import PatchMeta, PatchMirrorMetadata from utils.authentication import verify_api_token from utils.redis_utils import redis_conn from utils.stats import record_device_id @@ -79,6 +79,8 @@ def fetch_snap_hutao_github_latest_version() -> PatchMeta: sha256sums_url = asset["browser_download_url"] if github_msix_url is None: raise ValueError("Failed to get Snap Hutao latest version from GitHub") + else: + github_mirror_metadata = PatchMirrorMetadata(mirror_name="GitHub", mirror_url=github_msix_url) # Handle checksum file if sha256sums_url: @@ -109,7 +111,8 @@ def fetch_snap_hutao_github_latest_version() -> PatchMeta: validation=sha256sums_value if sha256sums_value else None, patch_note={"cn": "", "en": "", "full": ""}, url_type="GitHub", - cache_time=datetime.now() + cache_time=datetime.now(), + mirrors={"GitHub": github_mirror_metadata} ) logger.debug(f"GitHub data fetched: {github_path_meta}") return github_path_meta @@ -144,6 +147,7 @@ def update_snap_hutao_latest_version() -> dict: archive_url = [a["direct_asset_url"] for a in jihulab_meta["assets"]["links"] if a["name"] == "artifact_archive"][0] jihulab_patch_meta.url = [jihulab_url] + jihulab_patch_meta.mirrors["12345"] = PatchMirrorMetadata(mirror_name="JiHuLAB", mirror_url=jihulab_url) jihulab_patch_meta.archive_url = [archive_url] except (KeyError, IndexError) as e: gitlab_message = f"Error occurred when fetching Snap Hutao from JiHuLAB: {e}. " @@ -173,7 +177,8 @@ def update_snap_hutao_latest_version() -> dict: "cn": github_patch_meta.patch_note["cn"], "en": github_patch_meta.patch_note["en"], "full": github_patch_meta.patch_note["full"] - } + }, + "mirrors": github_patch_meta.mirrors }, "cn": { "version": jihulab_patch_meta.version, @@ -184,7 +189,8 @@ def update_snap_hutao_latest_version() -> dict: "cn": jihulab_patch_meta.patch_note["cn"], "en": jihulab_patch_meta.patch_note["en"], "full": jihulab_patch_meta.patch_note["full"] - } + }, + "mirrors": jihulab_patch_meta.mirrors }, "github_message": github_message, "gitlab_message": gitlab_message diff --git a/utils/PatchMeta.py b/utils/PatchMeta.py index f3e0abd..8970cc9 100644 --- a/utils/PatchMeta.py +++ b/utils/PatchMeta.py @@ -1,5 +1,11 @@ -from pydantic import BaseModel +from pydantic import BaseModel, Field, field_validator from datetime import datetime +from typing import Literal, Dict, TypedDict + + +class PatchMirrorMetadata(TypedDict): + mirror_name: Literal["GitHub", "JiHuLAB", "LenovoAppStore", "CodingAssets", "gh-proxy"] + mirror_url: str class PatchMeta(BaseModel): @@ -10,3 +16,28 @@ class PatchMeta(BaseModel): patch_note: dict url_type: str cache_time: datetime + mirrors: Dict[str, PatchMirrorMetadata] = Field(default_factory=dict) + + @field_validator('mirrors', mode='before') + @staticmethod + def validate_mirrors(value): + if isinstance(value, dict): + for key, val in value.items(): + if not isinstance(val, dict) or 'mirror_name' not in val or 'mirror_url' not in val: + raise ValueError(f"Each mirror must be a dict containing 'mirror_name' and 'mirror_url'. Invalid entry: {key}: {val}") + print(f"Comparing {val['mirror_name']} with {key}") + if val['mirror_name'] != key: + print(f"Mirror name in value ({val['mirror_name']}) does not match key ({key}).") + raise ValueError(f"Mirror name in value ({val['mirror_name']}) does not match key ({key}).") + else: + raise ValueError("mirrors must be a dictionary") + return value + + def __setitem__(self, key, value): + print(f"Setting {key} to {value} directly") + super().__setitem__(key, value) + if key == 'mirrors': + self.validate_mirrors(value) + + def __repr__(self): + return f"schema.PatchMeta({self.dict()})" From 831fb3c3ab8609bc06adbcffbafa42220eede94e Mon Sep 17 00:00:00 2001 From: Masterain Date: Wed, 12 Jun 2024 12:19:06 -0700 Subject: [PATCH 2/2] add validator for PatchMirrorMetadata --- routers/patch.py | 3 ++- utils/PatchMeta.py | 21 ++++++++++++++------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/routers/patch.py b/routers/patch.py index fc55101..df40988 100644 --- a/routers/patch.py +++ b/routers/patch.py @@ -147,7 +147,8 @@ def update_snap_hutao_latest_version() -> dict: archive_url = [a["direct_asset_url"] for a in jihulab_meta["assets"]["links"] if a["name"] == "artifact_archive"][0] jihulab_patch_meta.url = [jihulab_url] - jihulab_patch_meta.mirrors["12345"] = PatchMirrorMetadata(mirror_name="JiHuLAB", mirror_url=jihulab_url) + jihulab_mirror_metadata = PatchMirrorMetadata(mirror_name="JiHuLAB", mirror_url=jihulab_url) + jihulab_patch_meta.add_mirror(jihulab_mirror_metadata) jihulab_patch_meta.archive_url = [archive_url] except (KeyError, IndexError) as e: gitlab_message = f"Error occurred when fetching Snap Hutao from JiHuLAB: {e}. " diff --git a/utils/PatchMeta.py b/utils/PatchMeta.py index 8970cc9..c3d526c 100644 --- a/utils/PatchMeta.py +++ b/utils/PatchMeta.py @@ -7,6 +7,14 @@ class PatchMirrorMetadata(TypedDict): mirror_name: Literal["GitHub", "JiHuLAB", "LenovoAppStore", "CodingAssets", "gh-proxy"] mirror_url: str + @field_validator('mirror_name', mode='before') + @staticmethod + def validate_mirror_name(value): + print(f"Validating mirror name: {value}") + if value not in ["GitHub", "JiHuLAB", "LenovoAppStore", "CodingAssets", "gh-proxy"]: + raise ValueError(f"Invalid mirror name: {value}") + return value + class PatchMeta(BaseModel): version: str @@ -24,8 +32,8 @@ def validate_mirrors(value): if isinstance(value, dict): for key, val in value.items(): if not isinstance(val, dict) or 'mirror_name' not in val or 'mirror_url' not in val: - raise ValueError(f"Each mirror must be a dict containing 'mirror_name' and 'mirror_url'. Invalid entry: {key}: {val}") - print(f"Comparing {val['mirror_name']} with {key}") + raise ValueError( + f"Each mirror must be a dict containing 'mirror_name' and 'mirror_url'. Invalid entry: {key}: {val}") if val['mirror_name'] != key: print(f"Mirror name in value ({val['mirror_name']}) does not match key ({key}).") raise ValueError(f"Mirror name in value ({val['mirror_name']}) does not match key ({key}).") @@ -33,11 +41,10 @@ def validate_mirrors(value): raise ValueError("mirrors must be a dictionary") return value - def __setitem__(self, key, value): - print(f"Setting {key} to {value} directly") - super().__setitem__(key, value) - if key == 'mirrors': - self.validate_mirrors(value) + def add_mirror(self, mirror_metadata: PatchMirrorMetadata): + print(f"Adding mirror: {mirror_metadata}") + mirror_name = mirror_metadata['mirror_name'] + self.mirrors[mirror_name] = PatchMirrorMetadata(**mirror_metadata) def __repr__(self): return f"schema.PatchMeta({self.dict()})"