Как добавить дополнительные подпапки в ответ JSON, если они доступны? - PullRequest
0 голосов
/ 07 января 2020

У меня есть настройка API, которая, если вы выберете указанный путь c в подпапке домена api, будет проверять, существует ли этот путь в подпапке img, и если да, выдает случайное изображение (когда или ошибка.

Допустим, у меня есть папка с именем dogs, которая находится внутри var/www/html/img и содержит несколько изображений собак, если я сейчас подключусь к https://example.com/api/img/dogs, вернется ли она JSON со случайно выбранной ссылкой на изображение, которая выглядит следующим образом:

{
  "code": 200,
  "link": "https://example.com/img/dogs/dog_005.jpg"
}

Мой код такой:

public class ImageAPI{

    private Random random = new Random();
    private Logger logger = (Logger)LoggerFactory.getLogger(ImageAPI.class);
    private List<String> extensions = Arrays.asList(".png", ".jpg", ".jpeg", ".gif", ".svg");
    private File base = new File("img/");
    private FilenameFilter filter = (dir, name) -> {
        for(String ext : extensions)
            if(name.endsWith(ext))
                return true;

        return false;
    };

    public static void main(String[] args){
        new ImageAPI().boot();
    }

    private void boot(){
        logger.info("Starting ImageAPI...");
        if(!base.exists()){
            logger.info("Couldn't find base folder. Generating it...");
            //noinspection ResultOfMethodCallIgnored
            base.mkdir();
        }

        Spark.initExceptionHandler(e -> logger.error("Caught an exception", e));
        Spark.ipAddress("127.0.0.1");
        Spark.port(8001);

        Spark.get("/api/img/*", (request, response) -> {
            String path = request.pathInfo().replaceFirst("/api/img/", "").replace("../", "");

            File file = new File(base, path + "/");
            JSONObject json = new JSONObject();

            if(!file.exists() || file.isAbsolute()){
                json.put("code", 403).put("message", "Not supported API path.");

                response.status(403);
            }else{
                File[] files = file.listFiles(filter);
                if(files == null || files.length == 0){
                    json.put("code", 403).put("message", "The selected directory doesn't contain any images.");

                    response.status(403);
                }else{
                    File selected = files[random.nextInt(files.length)];
                    json.put("code", 200).put("link", generateLink(selected));

                    response.status(200);
                }
            }
            response.type("application/json");
            response.body(json.toString());
            return response.body();
        });
    }

    private String generateLink(File file){
        return ("https://example.com/" + file.getPath()).replace("\\", "/");
    }
}

Теперь мой вопрос / проблема: Я хочу изменить этот код таким образом, он будет отображать подпапки, если в той, в которой вы находитесь, есть некоторые, желательно с полным путем.
Например, когда я подключаюсь к https://example.com/api/img/animals и у него есть подпапки cats и dogs, если json содержит дополнительный JSONArray с папками, перечисленными следующим образом:

{
  "subfolders": [
    "cats",
    "dogs"
  ]
}

Было бы также полезно, если бы установленные мной ошибки намекали на доступные подпапки если доступно, но это не обязательно.

Какой самый чистый способ сделать это?

Я использую Spark java для обработки содержимого веб-фреймворка и других, чем просто простые Java методы, классы, ...
Сам сайт размещен на VPS с использованием Ubuntu с Nginx, а файл conf настроен на автоматическое изменение порта на 8001 для всех запросов к подкаталогу /api/img.

...