Add file saving support to NotificationServer

- Implement file saving to disk in `NotificationServer` with optional UUID-based organization.
- Use `Config` to configure `DOWNLOAD_DIR` and `PORT` for better flexibility.
- Update HTTP responses for improved clarity on file download and save operations.
This commit is contained in:
akastijn 2025-06-29 03:14:42 +02:00
parent 48a01e0a98
commit 6bb50a57b6
3 changed files with 65 additions and 4 deletions

View File

@ -21,7 +21,7 @@ import lombok.extern.slf4j.Slf4j;
public class WebInterface { public class WebInterface {
private final ProxyServer server; private final ProxyServer server;
private NotificationServer notificationServer; private NotificationServer notificationServer;
private static final int HTTP_PORT = 8080; // Default port, could be made configurable private static final int HTTP_PORT = Config.PORT;
@Inject @Inject
public WebInterface(ProxyServer proxyServer) { public WebInterface(ProxyServer proxyServer) {

View File

@ -214,4 +214,14 @@ public final class Config {
DOWNLOAD_ENDPOINT = getString("download-endpoint", DOWNLOAD_ENDPOINT); DOWNLOAD_ENDPOINT = getString("download-endpoint", DOWNLOAD_ENDPOINT);
LOGIN_CODE_ENDPOINT = getString("login-code-endpoint", LOGIN_CODE_ENDPOINT); LOGIN_CODE_ENDPOINT = getString("login-code-endpoint", LOGIN_CODE_ENDPOINT);
} }
public static int PORT = 8080;
private static void web_server() {
PORT = getInt("web-server.port", PORT);
}
public static String DOWNLOAD_DIR = "/mnt/configs/AltitudeParticles/particles";
private static void download_dir() {
DOWNLOAD_DIR = getString("download-dir", DOWNLOAD_DIR);
}
} }

View File

@ -1,15 +1,19 @@
package com.alttd.webinterface.http; package com.alttd.webinterface.http;
import com.alttd.webinterface.config.Config;
import com.alttd.webinterface.web_interact.FileDownloadService; import com.alttd.webinterface.web_interact.FileDownloadService;
import io.javalin.Javalin; import io.javalin.Javalin;
import io.javalin.http.Context; import io.javalin.http.Context;
import io.javalin.http.HttpStatus; import io.javalin.http.HttpStatus;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
/** /**
* HTTP server that exposes the /notify/<file>.json endpoint. * HTTP server that exposes the /notify/<file>.json endpoint.
@ -101,8 +105,25 @@ public class NotificationServer {
private void downloadFile(Context ctx, CompletableFuture<Optional<byte[]>> optionalCompletableFuture) { private void downloadFile(Context ctx, CompletableFuture<Optional<byte[]>> optionalCompletableFuture) {
optionalCompletableFuture.thenAccept(fileData -> { optionalCompletableFuture.thenAccept(fileData -> {
if (fileData.isPresent()) { if (fileData.isPresent()) {
ctx.contentType("application/json"); String fileName = ctx.pathParam("file") + ".json";
ctx.result(fileData.get()); String uuid = null;
try {
uuid = ctx.pathParam("uuid");
} catch (Exception ignored) {
log.debug("UUID not present");
}
boolean saved = saveFileToDisk(fileData.get(), fileName, uuid);
if (saved) {
ctx.status(HttpStatus.OK);
ctx.contentType("text/plain");
ctx.result("File downloaded and saved successfully");
} else {
ctx.status(HttpStatus.INTERNAL_SERVER_ERROR);
ctx.contentType("text/plain");
ctx.result("Failed to save file to disk");
}
} else { } else {
ctx.status(HttpStatus.NOT_FOUND); ctx.status(HttpStatus.NOT_FOUND);
ctx.contentType("text/plain"); ctx.contentType("text/plain");
@ -116,4 +137,34 @@ public class NotificationServer {
return null; return null;
}); });
} }
/**
* Saves the downloaded file to disk.
*
* @param fileData The binary content of the file
* @param fileName The name of the file
* @param uuid Optional UUID for organizing files
* @return true if the file was saved successfully, false otherwise
*/
private boolean saveFileToDisk(byte[] fileData, String fileName, String uuid) {
try {
Path basePath = Paths.get(Config.DOWNLOAD_DIR);
Path filePath;
if (uuid != null) {
filePath = basePath.resolve(uuid).resolve(fileName);
} else {
filePath = basePath.resolve(fileName);
}
Files.createDirectories(filePath.getParent());
Files.write(filePath, fileData);
log.info("File saved to: {}", filePath.toAbsolutePath());
return true;
} catch (IOException e) {
log.error("Error saving file to disk", e);
return false;
}
}
} }