diff --git a/package-lock.json b/package-lock.json index 82295e3..d07eb84 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,15 @@ { "name": "websat-planckster", - "version": "2.0.0-rc.6", + "version": "2.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "websat-planckster", - "version": "2.0.0-rc.6", + "version": "2.0.0", "dependencies": { "@maany_shr/kernel-planckster-sdk-ts": "^2.0.0-alpha", - "@maany_shr/rage-ui-kit": "^2.1.0", + "@maany_shr/rage-ui-kit": "2.2.0", "@preact/signals-react": "^2.1.0", "@tanstack/react-query": "^5.25.0", "@tanstack/react-query-devtools": "^5.51.21", @@ -1690,9 +1690,9 @@ } }, "node_modules/@maany_shr/rage-ui-kit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@maany_shr/rage-ui-kit/-/rage-ui-kit-2.1.0.tgz", - "integrity": "sha512-OHWaI1d0q4/z5tG3D7rIH/wK/lYVdJwxr5agpTfjA3ckSvhM+lXH3wBl0XHunpA2lQmsPhIyrjTwb1w50O9UoQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@maany_shr/rage-ui-kit/-/rage-ui-kit-2.2.0.tgz", + "integrity": "sha512-QxkvaJRcRVsbBwYqlwpvO5C/NiPw8jf3ClHKCEklt2dM/X53rGmDsce7agCivlAkj74WptHpb8pVc23NrQTI8A==", "dependencies": { "@faker-js/faker": "^9.2.0", "@heroicons/react": "^2.1.3", diff --git a/package.json b/package.json index 8475b38..d708316 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ }, "dependencies": { "@maany_shr/kernel-planckster-sdk-ts": "^2.0.0-alpha", - "@maany_shr/rage-ui-kit": "^2.1.0", + "@maany_shr/rage-ui-kit": "2.2.0", "@preact/signals-react": "^2.1.0", "@tanstack/react-query": "^5.25.0", "@tanstack/react-query-devtools": "^5.51.21", diff --git a/src/app/_components/create-case-study.tsx b/src/app/_components/create-case-study.tsx index b6e3931..a7557f8 100644 --- a/src/app/_components/create-case-study.tsx +++ b/src/app/_components/create-case-study.tsx @@ -3,18 +3,39 @@ import { CaseStudyForm, useToast } from "@maany_shr/rage-ui-kit"; import { CaseStudyParameters } from "@maany_shr/rage-ui-kit"; import { useRouter } from "next/navigation"; +import { useState } from "react"; +import type { TListSourceDataViewModel } from "~/lib/core/view-models/list-source-data-view-models"; +import { useQuery } from "@tanstack/react-query"; +import type { Signal } from "~/lib/core/entity/signals"; +import { querySources } from "~/app/queries"; -export const CreateCaseStudy = () => { +const METADATA_SOURCE_EXP = /^([^/]+)\/([^/]+)\/(\d+)\/metadata\.json$/; + +export const CreateCaseStudy = (props: { initialViewModel: TListSourceDataViewModel }) => { const availableCaseStudies = { "climate-monitoring": "Climate Monitoring", "sentinel-5p": "Sentinel 5P", }; + const [parameters, setParameters] = useState({ + caseStudy: undefined, + tracerId: undefined, + jobId: undefined, + }); + const { toast } = useToast(); const router = useRouter(); - const onSubmit = (parameters: CaseStudyParameters) => { - if (!Object.keys(availableCaseStudies).includes(parameters.caseStudy)) { + const [listSourceDataViewModel, setListSourceDataViewModel] = useState(props.initialViewModel); + + useQuery>({ + queryKey: ["list-source-data"], + queryFn: querySources(setListSourceDataViewModel), + refetchOnWindowFocus: false, + }); + + const onSubmit = () => { + if (!parameters.caseStudy || !Object.keys(availableCaseStudies).includes(parameters.caseStudy)) { toast({ variant: "error", title: "No case study is specified", @@ -23,7 +44,7 @@ export const CreateCaseStudy = () => { return; } - if (Number.isNaN(parameters.jobId) || parameters.tracerId === "" || parameters.jobId < 0) { + if (!parameters.jobId || !parameters.tracerId || Number.isNaN(parameters.jobId) || parameters.tracerId === "" || parameters.jobId < 0) { toast({ variant: "error", title: "Wrong parameters specified", @@ -35,9 +56,61 @@ export const CreateCaseStudy = () => { router.push(`/case-study?jobId=${parameters.jobId}&tracerId=${parameters.tracerId}&caseStudy=${parameters.caseStudy}`); }; + const getTracerIds = () => { + if (listSourceDataViewModel.status !== "success") return undefined; + if (!parameters.caseStudy) return undefined; + const tracerIds = new Set(); + + for (const source of listSourceDataViewModel.sourceData) { + const match = source.relativePath.match(METADATA_SOURCE_EXP); + + if (match) { + const caseStudy = match[1]; + if (caseStudy !== parameters.caseStudy) continue; + const tracerId = match[2]; + if (!tracerId) continue; + tracerIds.add(tracerId); + } + } + + return Array.from(tracerIds); + }; + + const getJobIds = () => { + if (listSourceDataViewModel.status !== "success") return undefined; + if (!parameters.caseStudy || !parameters.tracerId) return undefined; + const jobIds = new Set(); + + for (const source of listSourceDataViewModel.sourceData) { + const match = source.relativePath.match(METADATA_SOURCE_EXP); + + if (match) { + const caseStudy = match[1]; + if (caseStudy !== parameters.caseStudy) continue; + const tracerId = match[2]; + if (tracerId !== parameters.tracerId) continue; + const jobId = match[3]; + if (!jobId) continue; + jobIds.add(parseInt(jobId)); + } + } + + return Array.from(jobIds); + }; + + if (listSourceDataViewModel.status === "request") { + return Loading...; + } + return (
- +
); }; diff --git a/src/app/case-study/create/page.tsx b/src/app/case-study/create/page.tsx index 7ea253f..39e585e 100644 --- a/src/app/case-study/create/page.tsx +++ b/src/app/case-study/create/page.tsx @@ -1,8 +1,13 @@ import { redirect } from "next/navigation"; import AuthGatewayOutputPort from "~/lib/core/ports/secondary/auth-gateway-output-port"; import serverContainer from "~/lib/infrastructure/server/config/ioc/server-container"; -import { GATEWAYS } from "~/lib/infrastructure/server/config/ioc/server-ioc-symbols"; +import { CONTROLLERS, GATEWAYS } from "~/lib/infrastructure/server/config/ioc/server-ioc-symbols"; import { CreateCaseStudy } from "~/app/_components/create-case-study"; +import type ListSourceDataController from "~/lib/infrastructure/server/controller/list-source-data-controller"; +import signalsContainer from "~/lib/infrastructure/common/signals-container"; +import type { TListSourceDataViewModel } from "~/lib/core/view-models/list-source-data-view-models"; +import type { Signal } from "~/lib/core/entity/signals"; +import { SIGNAL_FACTORY } from "~/lib/infrastructure/common/signals-ioc-container"; export default async function SDACaseStudyServerPage() { const authGateway = serverContainer.get(GATEWAYS.AUTH_GATEWAY); @@ -11,5 +16,29 @@ export default async function SDACaseStudyServerPage() { redirect("/auth/login"); } - return ; + const clientID = sessionDTO.data.user.kp.client_id; + + const listSourceDataForClientController = serverContainer.get(CONTROLLERS.LIST_SOURCE_DATA_CONTROLLER); + const listSourceDataForClientResponseSignalFactory = signalsContainer.get<(initialValue: TListSourceDataViewModel, update?: (value: TListSourceDataViewModel) => void) => Signal>(SIGNAL_FACTORY.KERNEL_LIST_SOURCE_DATA); + const listSourceDataForClientResponse: Signal = listSourceDataForClientResponseSignalFactory({ + status: "request", + }); + + const listSourceDataForClientControllerParameters = { + response: listSourceDataForClientResponse, + clientID: `${clientID}`, + }; + + await listSourceDataForClientController.execute(listSourceDataForClientControllerParameters); + + if (listSourceDataForClientResponse.value.status !== "success") { + switch (listSourceDataForClientResponse.value.status) { + case "error": + throw new Error(listSourceDataForClientResponse.value.message); + case "request": + return
Loading...
; + } + } + + return ; }