From c2104ee514a0e024c9d57e0f83465276ae9772c6 Mon Sep 17 00:00:00 2001
From: AaronBenDaniel <144371000+AaronBenDaniel@users.noreply.github.com>
Date: Tue, 24 Jun 2025 12:59:31 -0400
Subject: [PATCH] feat: Control features with build arg
---
Dockerfile | 7 +++
src/api/src/main.py | 11 +++-
src/frontend/src/routes/+page.svelte | 86 ++++++++++++++++------------
3 files changed, 66 insertions(+), 38 deletions(-)
diff --git a/Dockerfile b/Dockerfile
index 776db64..2aff431 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -6,6 +6,10 @@ RUN rm -rf node_modules
RUN rm -rf build
RUN npm install
COPY src/frontend/. .
+
+ARG feature_flag=false
+ENV VITE_FEATURE_FLAG=$feature_flag
+
RUN npm run build
# Thanks https://stackoverflow.com/q/76988450
@@ -40,6 +44,9 @@ RUN ln -s /app/src/pdf/fonts /tmp/fonts
WORKDIR /app/src
+ARG feature_flag=false
+ENV VITE_FEATURE_FLAG=$feature_flag
+
EXPOSE 80
CMD [ "uv", "run", "main.py"]
diff --git a/src/api/src/main.py b/src/api/src/main.py
index b9243e1..fbe387d 100644
--- a/src/api/src/main.py
+++ b/src/api/src/main.py
@@ -17,6 +17,7 @@ from fastapi.responses import (
StreamingResponse,
)
from fastapi.staticfiles import StaticFiles
+from os import getenv
from create_book import (
EPUBGenerator,
@@ -36,6 +37,8 @@ from create_book.parser import clean_tree, fetch_tree_images
app = FastAPI()
BUILD_PATH = Path(__file__).parent / "build"
+feature_flag = True if getenv("VITE_FEATURE_FLAG") == "true" else False
+
class RequestCancelledMiddleware:
# Thanks https://github.com/fastapi/fastapi/discussions/11360#discussion-6427734
@@ -192,6 +195,12 @@ async def handle_download(
book = EPUBGenerator(metadata, part_trees, cover_data, images)
media_type = "application/epub+zip"
case DownloadFormat.pdf:
+ if not feature_flag:
+ logger.error("PDF downloads not enabled.")
+ return HTMLResponse(
+ status_code=403,
+ content='PDF downloads have been disabled by the server administrator. Support is available on the Discord',
+ )
author_image = await fetch_image(
metadata["user"]["avatar"].replace("-256-", "-512-")
)
@@ -215,7 +224,7 @@ async def handle_download(
yield chunk
return StreamingResponse(
- iterfile(),
+ book_buffer if feature_flag else iterfile(),
media_type=media_type,
headers={
"Content-Disposition": f'attachment; filename="{slugify(metadata["title"])}_{story_id}{"_images" if download_images else ""}.{format.value}"', # Thanks https://stackoverflow.com/a/72729058
diff --git a/src/frontend/src/routes/+page.svelte b/src/frontend/src/routes/+page.svelte
index 5ee801b..3ef6fb1 100644
--- a/src/frontend/src/routes/+page.svelte
+++ b/src/frontend/src/routes/+page.svelte
@@ -1,4 +1,6 @@