From 07ae2c9c8adf9c85d9ae29c4d62519103e3b37b0 Mon Sep 17 00:00:00 2001
From: logaritmi <228653256+logaritmi@users.noreply.github.com>
Date: Fri, 19 Dec 2025 13:02:03 +0200
Subject: [PATCH 01/24] feat: package auto import logic
---
src/takrmapi/api/__init__.py | 2 +
src/takrmapi/api/proxy.py | 55 +++++++++++++++++++++++++++
ui/src/components/tabs/AndroidTab.tsx | 10 +++++
ui/src/locales/en.json | 2 +
ui/src/locales/fi.json | 2 +
ui/src/locales/sv.json | 2 +
6 files changed, 73 insertions(+)
create mode 100644 src/takrmapi/api/proxy.py
diff --git a/src/takrmapi/api/__init__.py b/src/takrmapi/api/__init__.py
index c2352058..1d7c808c 100644
--- a/src/takrmapi/api/__init__.py
+++ b/src/takrmapi/api/__init__.py
@@ -14,6 +14,7 @@
from .description import router_v2 as description_router_v2
from .description import router_v2_admin as description_admin_router
from .userinfo import router as userinfo_router
+from .proxy import router as proxy_router
all_routers = APIRouter()
all_routers.include_router(testing_router, prefix="/users", tags=["users"]) # REMOVE ME
@@ -24,6 +25,7 @@
all_routers.include_router(description_router, prefix="/description", tags=["description"])
all_routers.include_router(instructions_router, prefix="/instructions", tags=["instructions"])
all_routers.include_router(takdatapackage_router, prefix="/tak-datapackages", tags=["tak-datapackages"])
+all_routers.include_router(proxy_router, prefix="/proxy", tags=["proxy"])
all_routers_v2 = APIRouter()
all_routers_v2.include_router(description_router_v2, prefix="/description", tags=["description"])
diff --git a/src/takrmapi/api/proxy.py b/src/takrmapi/api/proxy.py
new file mode 100644
index 00000000..97477203
--- /dev/null
+++ b/src/takrmapi/api/proxy.py
@@ -0,0 +1,55 @@
+from pathlib import Path
+import logging
+
+from fastapi import APIRouter, Depends, HTTPException, BackgroundTasks
+from fastapi.responses import FileResponse
+from libpvarki.middleware.mtlsheader import MTLSHeader
+from libpvarki.schemas.product import UserCRUDRequest
+
+from takrmapi import config
+from takrmapi.takutils import tak_helpers
+from takrmapi.takutils.tak_pkg_helpers import TAKDataPackage, TAKPackageZip
+
+LOGGER = logging.getLogger(__name__)
+
+router = APIRouter(dependencies=[Depends(MTLSHeader(auto_error=True))])
+
+@router.post("/client-zip/{variant}.zip")
+async def return_tak_zip(
+ user: UserCRUDRequest,
+ variant: str,
+ background_tasks: BackgroundTasks
+) -> FileResponse:
+ """Return TAK client zip file"""
+
+ localuser = tak_helpers.UserCRUD(user)
+ if not localuser:
+ raise HTTPException(status_code=404, detail="User data not found")
+
+ walk_dir = Path(config.TAK_MISSIONPKG_TEMPLATES_FOLDER) / "default" / variant
+
+ if not walk_dir.is_dir():
+ raise HTTPException(status_code=404, detail=f"Variant '{variant}' not found")
+
+ tak_missionpkg = TAKPackageZip(localuser)
+
+ target_pkg = TAKDataPackage(
+ template_path=walk_dir,
+ template_type="mission"
+ )
+ await tak_missionpkg.create_zip_bundles(datapackages=[target_pkg])
+
+ if not target_pkg.zip_path or not target_pkg.zip_path.is_file():
+ raise HTTPException(status_code=500, detail="Failed to generate ZIP")
+
+
+ background_tasks.add_task(
+ tak_missionpkg.helpers.remove_tmp_dir,
+ target_pkg.zip_tmp_folder
+ )
+
+ return FileResponse(
+ path=target_pkg.zip_path,
+ media_type="application/zip",
+ filename=f"{localuser.callsign}_{variant}.zip",
+ )
\ No newline at end of file
diff --git a/ui/src/components/tabs/AndroidTab.tsx b/ui/src/components/tabs/AndroidTab.tsx
index 9f625d71..f040426d 100644
--- a/ui/src/components/tabs/AndroidTab.tsx
+++ b/ui/src/components/tabs/AndroidTab.tsx
@@ -15,6 +15,15 @@ export function AndroidTab({ zip }: Props) {
{t("tabs.android.title")}
+
+
+
{t("tabs.android.open_atak_manual_note")}
+
{t("tabs.android.step1_download")}
{t("tabs.android.instructions_short")}