From 655ecacb797c2d63498b10ebea1a18560e494b4d Mon Sep 17 00:00:00 2001 From: Joris La Cancellera Date: Mon, 20 Jan 2025 21:39:34 +0100 Subject: [PATCH] feat: secure clear function, refactor a new utils --- src/commands/clear.ts | 19 ++++++++++++----- src/commands/prepare.ts | 11 ++++------ src/poto-siril.ts | 5 ++--- .../__snapshots__/e2e-testing.spec.ts.snap | 6 ++++-- src/tests/e2e/e2e-testing.spec.ts | 14 +++++++++---- src/tests/fixtures.ts | 2 +- src/utils/utils.ts | 21 +++++++++++++++++++ 7 files changed, 56 insertions(+), 22 deletions(-) diff --git a/src/commands/clear.ts b/src/commands/clear.ts index c920603..02f2f63 100644 --- a/src/commands/clear.ts +++ b/src/commands/clear.ts @@ -7,11 +7,20 @@ import fs from "fs"; import path from "path"; import { logger } from "../utils/logger"; +import { isAsiAirDirectoryF } from "../utils/utils"; -export const dropThumbnails = ( - dir: string, - isRecursiveCall: boolean = false, -) => { +const clear = (dir: string) => { + if (!isAsiAirDirectoryF(dir).isAsiAirDirectory) { + logger.errorThrow("Not an ASIAIR directory!"); + } + + dropThumbnails(dir); + dropEmptyDirectories(dir); +}; + +export default clear; + +const dropThumbnails = (dir: string, isRecursiveCall: boolean = false) => { // Default parameter set to current directory const files = fs.readdirSync(dir); files.forEach(file => { @@ -30,7 +39,7 @@ export const dropThumbnails = ( logger.info("Asiair dump cleaning - Thumbnails deleted ✅"); }; -export const dropEmptyDirectories = (dir: string) => { +const dropEmptyDirectories = (dir: string) => { const isDirEmpty = (directory: string): boolean => { const files = fs.readdirSync(directory); if (files.length === 0) { diff --git a/src/commands/prepare.ts b/src/commands/prepare.ts index 05cc323..5311c11 100644 --- a/src/commands/prepare.ts +++ b/src/commands/prepare.ts @@ -8,6 +8,7 @@ import { getFitsFromDirectory, matchSetFile, getImageSpecFromSetName, + isAsiAirDirectoryF, } from "../utils/utils"; import { FileImageSpec, @@ -173,12 +174,8 @@ const getAllFitsInInputDirectory = async ( projectDirectory: string, ): Promise => { // if ASIAIR used, may stores the lights+flats files in either the Autorun or Plan directories. - - const autorunDirectory = `${inputDirectory}/Autorun`; - const planDirectory = `${inputDirectory}/Plan`; - - const isAsiAirDump = - fs.existsSync(autorunDirectory) || fs.existsSync(planDirectory); + const { isAsiAirDirectory, autorunDirectory, planDirectory } = + isAsiAirDirectoryF(inputDirectory); const logFiles = (files: unknown[]) => { logger.info(`Found ${files.length} FITS in input dir ${inputDirectory}.`); @@ -188,7 +185,7 @@ const getAllFitsInInputDirectory = async ( logger.errorThrow(`Input directory ${inputDirectory} does not exists.`); } - if (!isAsiAirDump) { + if (!isAsiAirDirectory) { const allFiles = getFitsFromDirectory({ directory: inputDirectory, projectDirectory, diff --git a/src/poto-siril.ts b/src/poto-siril.ts index 8d957ec..e4feefb 100644 --- a/src/poto-siril.ts +++ b/src/poto-siril.ts @@ -1,6 +1,6 @@ import { Command } from "commander"; import prepare, { PrepareProps } from "./commands/prepare"; -import { dropThumbnails, dropEmptyDirectories } from "./commands/clear"; +import clear from "./commands/clear"; import { generateScripts } from "./commands/preprocess.generate-scripts"; import { runScripts } from "./commands/preprocess.exec-scripts"; import { POTO_VERSION } from "./utils/const"; @@ -20,8 +20,7 @@ program .argument("", "directory to clear") .allowExcessArguments(false) .action(directory => { - dropThumbnails(directory); - dropEmptyDirectories(directory); + clear(directory); }); program diff --git a/src/tests/e2e/__snapshots__/e2e-testing.spec.ts.snap b/src/tests/e2e/__snapshots__/e2e-testing.spec.ts.snap index 7c765ea..8d66aad 100644 --- a/src/tests/e2e/__snapshots__/e2e-testing.spec.ts.snap +++ b/src/tests/e2e/__snapshots__/e2e-testing.spec.ts.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`E2E No Darks/Biases matching, multiples sequences should warn if no matching darks and biases 2`] = ` +exports[`E2E no Darks/Biases matching, multiples sequences should warn if no matching darks and biases 2`] = ` "{ "generatedAt": "2024-10-15T00:00:00.000Z", "potoVersion": "poto-siril 0.5.0", @@ -543,7 +543,7 @@ exports[`E2E No Darks/Biases matching, multiples sequences should warn if no mat }" `; -exports[`E2E No Darks/Biases matching, multiples sequences should warn if no matching darks and biases 3`] = ` +exports[`E2E no Darks/Biases matching, multiples sequences should warn if no matching darks and biases 3`] = ` [ "prompt: [ { @@ -2004,6 +2004,8 @@ exports[`E2E should be neat 8`] = ` "debug: Deleted: tmp/asiair-dump-1/Autorun/Flat/Flat_1.0ms_Bin1_H_gain100_20240511-094307_-10.5C_0002_thn.jpg", "debug: Deleted: tmp/asiair-dump-1/Autorun/Flat/Flat_1.0ms_Bin1_H_gain100_20240511-094308_-10.5C_0003_thn.jpg", "info: Asiair dump cleaning - Thumbnails deleted ✅", + "info: Asiair dump cleaning - Empty dirs deleted ✅", + "info: Asiair dump cleaning - Thumbnails deleted ✅", "info: Deleted: tmp/asiair-dump-1/empty/empty", "info: Deleted: tmp/asiair-dump-1/empty", "info: Asiair dump cleaning - Empty dirs deleted ✅", diff --git a/src/tests/e2e/e2e-testing.spec.ts b/src/tests/e2e/e2e-testing.spec.ts index 5338655..ced2da8 100644 --- a/src/tests/e2e/e2e-testing.spec.ts +++ b/src/tests/e2e/e2e-testing.spec.ts @@ -7,7 +7,7 @@ import prepare, { SelectedInputSubDirectoryChoices, } from "../../commands/prepare"; import { POTO_JSON } from "../../utils/const"; -import { dropThumbnails, dropEmptyDirectories } from "../../commands/clear"; +import clear from "../../commands/clear"; import { generateScripts } from "../../commands/preprocess.generate-scripts"; import { getRealDataFromSample, @@ -119,7 +119,7 @@ describe("E2E", () => { }); expect(files.filter(f => f.endsWith("_thn.jpg"))).toHaveLength(3); - dropThumbnails(asiAirDirectory); + clear(asiAirDirectory); files = fs.readdirSync(asiAirDirectory, { recursive: true, @@ -137,7 +137,7 @@ describe("E2E", () => { true, ); - dropEmptyDirectories(asiAirDirectory); + clear(asiAirDirectory); expect(fs.existsSync(path.join(asiAirDirectory, "empty", "empty"))).toBe( false, @@ -447,7 +447,7 @@ describe("E2E", () => { }); }); - describe("No Darks/Biases matching, multiples sequences", () => { + describe("no Darks/Biases matching, multiples sequences", () => { it("should warn if no matching darks and biases", async () => { promptMock .mockResolvedValueOnce({ @@ -806,4 +806,10 @@ describe("E2E", () => { expect(logMessages).toContain(logAfterTheCheckDirectory); }); }); + + describe("clear function tests", () => { + it("should throw not asiair directory", async () => { + expect(() => clear(bankDirectory)).toThrow("Not an ASIAIR directory!"); + }); + }); }); diff --git a/src/tests/fixtures.ts b/src/tests/fixtures.ts index 4971bd8..534bc9b 100644 --- a/src/tests/fixtures.ts +++ b/src/tests/fixtures.ts @@ -1,7 +1,7 @@ import path from "path"; import fs from "fs"; import { logger } from "../utils/logger"; -import { imageType } from "src/utils/types"; +import { imageType } from "../utils/types"; const tmpDir = "tmp"; diff --git a/src/utils/utils.ts b/src/utils/utils.ts index a9472e8..3d10d7c 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -271,3 +271,24 @@ export const getImageSpecFromSetName = (setName: string): ImageSpec => { gain: Number(setName.split("_")[3].replace("gain", "")), } as ImageSpec); }; + +/** + * Detect if ASIAIR directory structure is present. + */ +export const isAsiAirDirectoryF = ( + directory: string, +): { + isAsiAirDirectory: boolean; + autorunDirectory: string; + planDirectory: string; +} => { + const autorunDirectory = `${directory}/Autorun`; + const planDirectory = `${directory}/Plan`; + + return { + isAsiAirDirectory: + fs.existsSync(autorunDirectory) || fs.existsSync(planDirectory), + autorunDirectory, + planDirectory, + }; +};