From b1812c1c37d1b1556d30c32e395747e41e20172b Mon Sep 17 00:00:00 2001 From: Fabian Engelniederhammer Date: Tue, 30 Apr 2024 11:11:02 +0200 Subject: [PATCH] refactor(website): move logic to TS file, properly use neverthrow Refs: #1713 --- .../[accessionVersion]/findOrganismAndData.ts | 28 +++++ .../getSequenceDetailsTableData.ts | 8 +- .../pages/seq/[accessionVersion]/index.astro | 113 +++++++----------- 3 files changed, 74 insertions(+), 75 deletions(-) create mode 100644 website/src/pages/seq/[accessionVersion]/findOrganismAndData.ts diff --git a/website/src/pages/seq/[accessionVersion]/findOrganismAndData.ts b/website/src/pages/seq/[accessionVersion]/findOrganismAndData.ts new file mode 100644 index 0000000000..a5eb0d3568 --- /dev/null +++ b/website/src/pages/seq/[accessionVersion]/findOrganismAndData.ts @@ -0,0 +1,28 @@ +import { err, ok } from 'neverthrow'; + +import { getSequenceDetailsTableData, SequenceDetailsTableResultType } from './getSequenceDetailsTableData.ts'; +import { getConfiguredOrganisms } from '../../../config.ts'; + +export async function findOrganismAndData(accessionVersion: string) { + const organisms = getConfiguredOrganisms(); + + const promises = organisms.map(async ({ key }) => { + return { + organism: key, + result: await getSequenceDetailsTableData(accessionVersion, key), + }; + }); + + const queries = await Promise.all(promises); + + for (const { organism, result } of queries) { + if (result.isOk()) { + return ok({ + organism, + result: result.value, + }); + } + } + + return err({ type: SequenceDetailsTableResultType.ERROR }); +} diff --git a/website/src/pages/seq/[accessionVersion]/getSequenceDetailsTableData.ts b/website/src/pages/seq/[accessionVersion]/getSequenceDetailsTableData.ts index 370cc8f317..b25ad479d4 100644 --- a/website/src/pages/seq/[accessionVersion]/getSequenceDetailsTableData.ts +++ b/website/src/pages/seq/[accessionVersion]/getSequenceDetailsTableData.ts @@ -15,22 +15,24 @@ export enum SequenceDetailsTableResultType { ERROR = 'error', } -type TableData = { +export type TableData = { type: SequenceDetailsTableResultType.TABLE_DATA; tableData: TableDataEntry[]; sequenceEntryHistory: SequenceEntryHistory; dataUseTermsHistory: DataUseTermsHistoryEntry[]; }; -type Redirect = { +export type Redirect = { type: SequenceDetailsTableResultType.REDIRECT; redirectUrl: string; }; +export type SequenceDetailsTableDataResult = Promise>; + export const getSequenceDetailsTableData = async ( accessionVersion: string, organism: string, -): Promise> => { +): SequenceDetailsTableDataResult => { const { accession, version } = parseAccessionVersionFromString(accessionVersion); const lapisClient = LapisClient.createForOrganism(organism); diff --git a/website/src/pages/seq/[accessionVersion]/index.astro b/website/src/pages/seq/[accessionVersion]/index.astro index efea953e53..381ad81138 100644 --- a/website/src/pages/seq/[accessionVersion]/index.astro +++ b/website/src/pages/seq/[accessionVersion]/index.astro @@ -1,106 +1,75 @@ --- -import { getSequenceDetailsTableData, SequenceDetailsTableResultType } from './getSequenceDetailsTableData'; +import { findOrganismAndData } from './findOrganismAndData'; +import { SequenceDetailsTableResultType } from './getSequenceDetailsTableData'; import RevocationEntryDataTable from '../../../components/SequenceDetailsPage/RevocationEntryDataTable.astro'; import SequencesBanner from '../../../components/SequenceDetailsPage/SequencesBanner.astro'; import SequencesDataTableTitle from '../../../components/SequenceDetailsPage/SequencesDataTableTitle.astro'; import SequencesDataPage from '../../../components/SequenceDetailsPage/SequencesDetailsPage.astro'; import { isRevocationEntry } from '../../../components/SequenceDetailsPage/getTableData'; import ErrorBox from '../../../components/common/ErrorBox.astro'; -import { getConfiguredOrganisms } from '../../../config'; import BaseLayout from '../../../layouts/BaseLayout.astro'; const accessionVersion = Astro.params.accessionVersion!; -const organisms = getConfiguredOrganisms(); -let sequenceDetailsTableData; -let organism: string | undefined; - -const promises = organisms.map(async ({ key }) => { - return { - organism: key, - result: await getSequenceDetailsTableData(accessionVersion, key), - }; -}); - -const queries = await Promise.all(promises); - -for (const query of queries) { - if (query.result.isOk()) { - sequenceDetailsTableData = query.result; - organism = query.organism; - break; - } -} - -if (sequenceDetailsTableData === undefined) { - sequenceDetailsTableData = { - isOk: () => false, - type: SequenceDetailsTableResultType.ERROR, - }; -} +const sequenceDetailsTableData = await findOrganismAndData(accessionVersion); if ( sequenceDetailsTableData.isOk() && - sequenceDetailsTableData.value!.type === SequenceDetailsTableResultType.REDIRECT + sequenceDetailsTableData.value.result.type === SequenceDetailsTableResultType.REDIRECT ) { - return Astro.redirect(sequenceDetailsTableData.value.redirectUrl); + return Astro.redirect(sequenceDetailsTableData.value.result.redirectUrl); } --- { sequenceDetailsTableData.isOk() && - sequenceDetailsTableData.value!.type === SequenceDetailsTableResultType.TABLE_DATA && ( + sequenceDetailsTableData.value.result.type === SequenceDetailsTableResultType.TABLE_DATA && (
) } { - sequenceDetailsTableData.isOk() && ( - - ) - } - - { - sequenceDetailsTableData.isOk() && - sequenceDetailsTableData.match!( - (data) => - data.type === SequenceDetailsTableResultType.TABLE_DATA && - (isRevocationEntry(data.tableData) ? ( - - ) : ( - - )), - () => null, - ) - } - { - !sequenceDetailsTableData.isOk() && ( - No data found for accession version {accessionVersion} + sequenceDetailsTableData.match( + ({ organism, result }) => ( + <> + + {result.type === SequenceDetailsTableResultType.TABLE_DATA && + (isRevocationEntry(result.tableData) ? ( + + ) : ( + + ))} + + ), + () => ( + + No data found for accession version {accessionVersion} + + ), ) }