diff --git a/src/lib/components/TestCaseSimulationSharingModal.svelte b/src/lib/components/TestCaseSimulationSharingModal.svelte index 63e0bfd3eafce734be297de213eaea930990c4fb..77713684b021588922bfd9cc8cc60a6545d41842 100644 --- a/src/lib/components/TestCaseSimulationSharingModal.svelte +++ b/src/lib/components/TestCaseSimulationSharingModal.svelte @@ -107,18 +107,34 @@ <iconify-icon class="block text-2xl" icon="ri-close-line" /> </button> </div> - <DialogDescription as="div" class="flex flex-col gap-5 px-44 py-3"> + <DialogDescription as="div" class="flex flex-col gap-5 px-32 py-3"> <h1 class="w-full text-center text-3xl font-bold"> Partager cette simulation cas type </h1> <span class="w-full text-lg"> - Pour partager les impacts cas type de votre réforme, copiez l'URL - suivante : + Pour retrouver ou partager votre écran de travail tel qu'il est + visible actuellement, gardez ou transmettez l'URL suivante : </span> <div class="w-full flex flex-col gap-2 pb-5"> - <div class="flex justify-center rounded bg-gray-200 p-3"> - <code class="pl-2 text-xs">{url}</code> + <div + class="group/container flex justify-between items-center rounded bg-gray-200 px-3" + > + <code + class="py-3 text-xs text-ellipsis overflow-hidden whitespace-nowrap" + >{url}</code + > + <button + class="opacity-0 group-hover/container:opacity-100 group/button p-1 rounded transition-all duration-100 ease-linear hover:bg-black hover:bg-opacity-5 active:bg-opacity-10" + on:click={copyLink} + > + <iconify-icon + class="block text-lg text-[#737278] transition-colors duration-100 ease-linear group-hover/button:text-[#535158]" + icon={!hasClickedCopy + ? "pajamas:copy-to-clipboard" + : "ri-check-line"} + /> + </button> </div> <span class="text-xs text-gray-500"> Cette URL sauvegarde la réforme et les cas types. Ce lien est diff --git a/src/lib/server/auditors/config.ts b/src/lib/server/auditors/config.ts index 564a457d397394b53b0e0fe24adf82bb55f781a4..823d0299714aa9f7793281815650df4537438087 100644 --- a/src/lib/server/auditors/config.ts +++ b/src/lib/server/auditors/config.ts @@ -74,7 +74,6 @@ export function auditConfig( "householdEntityKey", "jwtSecret", "simulationsBudgetDir", - "simulationsDir", "simulationsTestCasesDir", "taxableHouseholdEntityKey", "title", diff --git a/src/lib/server/budgets.ts b/src/lib/server/budgets.ts index 8be9c86ef8b5166b7c0a1c8eecbf3d77d32a5fcf..7936c98bfaf980b4f0e18472083363458047ce63 100644 --- a/src/lib/server/budgets.ts +++ b/src/lib/server/budgets.ts @@ -2,24 +2,24 @@ import path from "path" import config from "$lib/server/config" -export function getRequestsDirPath(digest: string) { +export function getBudgetRequestsDirPath(digest: string) { return path.join( config.simulationsBudgetDir, "requests", digest.substring(0, 2), ) } -export function getRequestsFilePath(digest: string) { - return path.join(getRequestsDirPath(digest), `${digest}.json`) +export function getBudgetRequestsFilePath(digest: string) { + return path.join(getBudgetRequestsDirPath(digest), `${digest}.json`) } -export function getCacheDirPath(digest: string) { +export function getBudgetCacheDirPath(digest: string) { return path.join( config.simulationsBudgetDir, "responses", digest.substring(0, 2), ) } -export function getCacheFilePath(digest: string) { - return path.join(getCacheDirPath(digest), `${digest}.json`) +export function getBudgetCacheFilePath(digest: string) { + return path.join(getBudgetCacheDirPath(digest), `${digest}.json`) } diff --git a/src/lib/server/config.ts b/src/lib/server/config.ts index e44521115421840bdb02624f3bd2ed6820d632e5..8a1d114ca09c9cb88fd25b2d839c08c2362a79bb 100644 --- a/src/lib/server/config.ts +++ b/src/lib/server/config.ts @@ -38,7 +38,6 @@ export interface Config { showTutorial?: boolean simulationsBudgetDir: string simulationsTestCasesDir: string - simulationsDir: string taxableHouseholdEntityKey: string territoiresUrl: string title: string @@ -89,7 +88,6 @@ const [validConfig, error] = validateConfig({ revaluationName: process.env["REFORM_REVALUATION"], showTutorial: process.env["SHOW_TUTORIAL"], simulationsBudgetDir: process.env["SIMULATIONS_BUDGET_DIR"], - simulationsDir: process.env["SIMULATIONS_DIR"], simulationsTestCasesDir: process.env["SIMULATIONS_TEST_CASES_DIR"], taxableHouseholdEntityKey: process.env["TAXABLE_HOUSEHOLD_KEY"], territoiresUrl: process.env["TERRITOIRES_URL"], diff --git a/src/lib/server/test_cases.ts b/src/lib/server/test_cases.ts new file mode 100644 index 0000000000000000000000000000000000000000..609f7a7666bcfd437b7d71d39f37af3af8965996 --- /dev/null +++ b/src/lib/server/test_cases.ts @@ -0,0 +1,25 @@ +import path from "path" + +import config from "$lib/server/config" + +export function getTestCasesRequestsDirPath(digest: string) { + return path.join( + config.simulationsTestCasesDir, + "requests", + digest.substring(0, 2), + ) +} +export function getTestCasesRequestsFilePath(digest: string) { + return path.join(getTestCasesRequestsDirPath(digest), `${digest}.json`) +} + +export function getTestCasesCacheDirPath(digest: string) { + return path.join( + config.simulationsTestCasesDir, + "responses", + digest.substring(0, 2), + ) +} +export function getTestCasesCacheFilePath(digest: string) { + return path.join(getTestCasesCacheDirPath(digest), `${digest}.json`) +} diff --git a/src/routes/budgets/+server.ts b/src/routes/budgets/+server.ts index 1689bb19159af32d74f69d053f8cdbd174c93c6d..d3d397945de1988ecb0b7f11bb0a2439184d5cbd 100644 --- a/src/routes/budgets/+server.ts +++ b/src/routes/budgets/+server.ts @@ -6,7 +6,10 @@ import { error, json } from "@sveltejs/kit" import { hashObject } from "$lib/hash" import { getParameter, rootParameter } from "$lib/parameters" import type { ParametricReform } from "$lib/reforms" -import { getCacheDirPath, getCacheFilePath } from "$lib/server/budgets" +import { + getBudgetCacheDirPath, + getBudgetCacheFilePath, +} from "$lib/server/budgets" import config from "$lib/server/config" import type { CachedSimulation } from "$lib/simulations" import type { User } from "$lib/users" @@ -82,7 +85,7 @@ export const POST: RequestHandler = async ({ fetch, locals, request }) => { ) // Path of the no-reform simulation cache - const baseCacheFilePath = getCacheFilePath(baseCacheDigest) + const baseCacheFilePath = getBudgetCacheFilePath(baseCacheDigest) // Hash digest of the current simulation const simulationCacheDigest = hashBudgetSimulationCache( @@ -91,7 +94,7 @@ export const POST: RequestHandler = async ({ fetch, locals, request }) => { ) // Path of the current simulation's cache - const simulationCacheFilePath = getCacheFilePath(simulationCacheDigest) + const simulationCacheFilePath = getBudgetCacheFilePath(simulationCacheDigest) // Indicates if the current simulation is calculated and is public const isSimulationPublic = simulationsIndexContents.find( @@ -201,7 +204,7 @@ export const POST: RequestHandler = async ({ fetch, locals, request }) => { ) if (!(await fs.pathExists(simulationCacheFilePath))) { - await fs.ensureDir(getCacheDirPath(simulationCacheDigest)) + await fs.ensureDir(getBudgetCacheDirPath(simulationCacheDigest)) await fs.writeFile( simulationCacheFilePath, JSON.stringify(responseJson.result, null, 2), diff --git a/src/routes/budgets/simulations/+server.ts b/src/routes/budgets/simulations/+server.ts index f5cf772d25faa2d986091dabb5d4f8d1f7a0ff73..1134215e361647d443ff56f2766b60d8d9ff070c 100644 --- a/src/routes/budgets/simulations/+server.ts +++ b/src/routes/budgets/simulations/+server.ts @@ -6,7 +6,10 @@ import { error, json } from "@sveltejs/kit" import type { DisplayMode } from "$lib/displays" import type { ParametricReform } from "$lib/reforms" -import { getRequestsDirPath, getRequestsFilePath } from "$lib/server/budgets" +import { + getBudgetRequestsDirPath, + getBudgetRequestsFilePath, +} from "$lib/server/budgets" import config from "$lib/server/config" import type { CachedSimulation } from "$lib/simulations" import type { User } from "$lib/users" @@ -101,9 +104,9 @@ export const POST: RequestHandler = async ({ locals, request, url }) => { * Make public the request data (parametric reform and display mode) * * */ - const requestParamsFilePath = getRequestsFilePath(hash) + const requestParamsFilePath = getBudgetRequestsFilePath(hash) if (!(await fs.pathExists(requestParamsFilePath))) { - await fs.ensureDir(getRequestsDirPath(hash)) + await fs.ensureDir(getBudgetRequestsDirPath(hash)) await fs.writeFile( requestParamsFilePath, JSON.stringify({ parametricReform, displayMode }, null, 2), diff --git a/src/routes/budgets/simulations/[simulation]/+page.server.ts b/src/routes/budgets/simulations/[simulation]/+page.server.ts index 39e26ecb0a62587e2cf709b2d40f4a0aa386f76a..4083e5ae4a0d2c1e2a8671514c0a9ac55ec1eeb8 100644 --- a/src/routes/budgets/simulations/[simulation]/+page.server.ts +++ b/src/routes/budgets/simulations/[simulation]/+page.server.ts @@ -15,7 +15,7 @@ import config from "$lib/server/config" import type { CachedSimulation } from "$lib/simulations" import type { PageServerLoad } from "./$types" -import { getRequestsFilePath } from "$lib/server/budgets" +import { getBudgetRequestsFilePath } from "$lib/server/budgets" const { simulationsBudgetDir } = config @@ -71,7 +71,7 @@ export const load: PageServerLoad = async ({ ? await fs.readJson(indexFilePath) : [] - const simulationFilePath = getRequestsFilePath(digest) + const simulationFilePath = getBudgetRequestsFilePath(digest) if ( !(await fs.pathExists(simulationFilePath)) || (locals.user === undefined && diff --git a/src/routes/test_cases/+server.ts b/src/routes/test_cases/+server.ts index 05099c33624e567716bec40ae57f832d7def82e1..3c5ff6a538c34fd825c687ee852ae401aa8bc514 100644 --- a/src/routes/test_cases/+server.ts +++ b/src/routes/test_cases/+server.ts @@ -1,13 +1,16 @@ import fs from "fs-extra" -import path from "path" import { json } from "@sveltejs/kit" import { hashObject } from "$lib/hash" import config from "$lib/server/config" +import { + getTestCasesCacheDirPath, + getTestCasesCacheFilePath, +} from "$lib/server/test_cases" import type { RequestHandler } from "./$types" -const { apiBaseUrls, simulationsTestCasesDir } = config +const { apiBaseUrls } = config export const POST: RequestHandler = async ({ fetch, request }) => { const input = await request.clone().json() @@ -24,11 +27,12 @@ export const POST: RequestHandler = async ({ fetch, request }) => { // Ignore token. variables: input.variables.sort(), }) - const cacheDir = path.join(simulationsTestCasesDir, digest.substring(0, 2)) - const cacheFilePath = path.join(cacheDir, `${digest}.json`) + + const cacheDir = getTestCasesCacheDirPath(digest) + const cacheFilePath = getTestCasesCacheFilePath(digest) if (await fs.pathExists(cacheFilePath)) { - return json((await fs.readJson(cacheFilePath)).output) + return json(await fs.readJson(cacheFilePath)) } const apiBaseUrlIndex = Math.floor(Math.random() * apiBaseUrls.length) @@ -44,14 +48,12 @@ export const POST: RequestHandler = async ({ fetch, request }) => { if (!response.ok) { return response } + const output = await response.json() + if (!(await fs.pathExists(cacheFilePath))) { await fs.ensureDir(cacheDir) - await fs.writeJson( - cacheFilePath, - { digest, input, output }, - { encoding: "utf-8", spaces: 2 }, - ) + await fs.writeJson(cacheFilePath, output, { encoding: "utf-8", spaces: 2 }) } return json(output) } diff --git a/src/routes/test_cases/simulations/+server.ts b/src/routes/test_cases/simulations/+server.ts index 058efe33d53a8f9397c33bebce0e2c37748d8b65..981141c0dedb2540015956995a6a93b210584eee 100644 --- a/src/routes/test_cases/simulations/+server.ts +++ b/src/routes/test_cases/simulations/+server.ts @@ -6,14 +6,14 @@ import { } from "@auditors/core" import { error, json } from "@sveltejs/kit" import fs from "fs-extra" -import path from "path" import { hashString } from "$lib/hash" -import config from "$lib/server/config" - -import type { RequestHandler } from "../../../../.svelte-kit/types/src/routes" +import { + getTestCasesRequestsDirPath, + getTestCasesRequestsFilePath, +} from "$lib/server/test_cases" -const { simulationsDir } = config +import type { RequestHandler } from "./$types" function auditBody(audit: Audit, dataUnknown: unknown): [unknown, unknown] { if (dataUnknown == null) { @@ -84,8 +84,8 @@ export const POST: RequestHandler = async ({ request, url }) => { const digest = hashString(bodyJson) - const simulationDir = path.join(simulationsDir, digest.substring(0, 2)) - const simulationFilePath = path.join(simulationDir, `${digest}.json`) + const simulationDir = getTestCasesRequestsDirPath(digest) + const simulationFilePath = getTestCasesRequestsFilePath(digest) if (!(await fs.pathExists(simulationFilePath))) { await fs.ensureDir(simulationDir) await fs.writeFile(simulationFilePath, bodyJson) diff --git a/src/routes/test_cases/simulations/[simulation]/+page.server.ts b/src/routes/test_cases/simulations/[simulation]/+page.server.ts index 01d4b4ccf7db4fd5fc3af8b908d966908f42688f..c647ac56e38e3102629831711d1e38d3b6dbf044 100644 --- a/src/routes/test_cases/simulations/[simulation]/+page.server.ts +++ b/src/routes/test_cases/simulations/[simulation]/+page.server.ts @@ -7,17 +7,14 @@ import { } from "@auditors/core" import { error } from "@sveltejs/kit" import fs from "fs-extra" -import path from "path" import type { DisplayMode } from "$lib/displays" import type { ParametricReform } from "$lib/reforms" +import { getTestCasesRequestsFilePath } from "$lib/server/test_cases" import type { Situation } from "$lib/situations" -import config from "$lib/server/config" import type { PageServerLoad } from "./$types" -const { simulationsDir } = config - function auditParams(audit: Audit, dataUnknown: unknown): [unknown, unknown] { if (dataUnknown == null) { return [dataUnknown, null] @@ -61,11 +58,7 @@ export const load: PageServerLoad = async ({ params: requestParams, url }) => { } const { simulation: digest } = params as { simulation: string } - const simulationFilePath = path.join( - simulationsDir, - digest.substring(0, 2), - `${digest}.json`, - ) + const simulationFilePath = getTestCasesRequestsFilePath(digest) if (!(await fs.pathExists(simulationFilePath))) { throw error(404, `Simulation ${digest} not found`) } diff --git a/src/scripts/clear_budget_simulations_cache.ts b/src/scripts/clear_budget_simulations_cache.ts index 857fd342506dcdd7d7cd3301919799825716faff..cd02c3be1b27c041f1b2791040d7f2962af2b7aa 100644 --- a/src/scripts/clear_budget_simulations_cache.ts +++ b/src/scripts/clear_budget_simulations_cache.ts @@ -3,7 +3,7 @@ import path from "path" import config from "$lib/server/config" -const { simulationsBudgetDir } = config +const { simulationsBudgetDir, simulationsTestCasesDir } = config // Remove private budget simulations from index. const indexFilePath = path.join(simulationsBudgetDir, "index.json") @@ -17,20 +17,14 @@ if (fs.pathExistsSync(indexFilePath)) { }) } -// Remove every budget simulations from cache. -for (const dirName of await fs.readdir(simulationsBudgetDir)) { - if (dirName.startsWith(".")) { - continue - } - if (dirName === "parametric_reforms") { - const privateDir = path.join(simulationsBudgetDir, dirName, "private") - if (fs.lstatSync(privateDir).isDirectory()) { - fs.removeSync(privateDir) - } - continue - } - const dir = path.join(simulationsBudgetDir, dirName) - if (fs.lstatSync(dir).isDirectory()) { - fs.removeSync(dir) - } +// Remove every budget simulation from cache. +const budgetsDir = path.join(simulationsBudgetDir, "responses") +if (fs.lstatSync(budgetsDir).isDirectory()) { + fs.removeSync(budgetsDir) +} + +// Remove every test case simulation from cache. +const testCasesDir = path.join(simulationsTestCasesDir, "responses") +if (fs.lstatSync(testCasesDir).isDirectory()) { + fs.removeSync(testCasesDir) }