From 76bd4862f4df12a32a00f842d47255e2b80b3980 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Lagan?= <43816355+jirkalagan@users.noreply.github.com> Date: Thu, 28 May 2026 12:54:18 +0200 Subject: [PATCH 01/16] PFDA-6949 Client Bundle Size Optimization (#3973) --- packages/client/src/AuthWall.tsx | 4 +- .../client/src/assets/precisionFDA-dp.png | Bin 143855 -> 6951 bytes .../Controls/ExternalLink/index.tsx | 2 +- .../{styles.tsx => markdown.styles.tsx} | 0 .../NavigationBar/NavigationBar/index.tsx | 2 +- .../NavigationBar/PublicNavbar/index.tsx | 2 +- .../{styles.ts => public-navbar.styles.ts} | 2 +- packages/client/src/components/NotAllowed.tsx | 2 +- .../Page/{styles.tsx => page.styles.tsx} | 0 .../src/components/Pagination/index.tsx | 2 +- .../{styles.ts => public-layout.styles.ts} | 2 +- .../{styles.tsx => table.styles.tsx} | 2 +- .../components/Table/expanderColumnDef.tsx | 2 +- .../client/src/components/Table/index.tsx | 2 +- packages/client/src/components/Tags.tsx | 2 +- .../client/src/components/form/FieldGroup.tsx | 2 +- .../form/{styles.ts => form.styles.ts} | 0 .../src/components/{ => icons}/EntityIcon.tsx | 16 +- .../icons}/FdaRestrictedIcon.tsx | 2 +- .../icons}/ProtectedIcon.tsx | 2 +- .../{styles.ts => attach-to-modal.styles.ts} | 0 .../src/features/actionModals/ScopeList.tsx | 8 +- .../{styles.ts => action-modals.styles.ts} | 4 +- .../actionModals/useAddResourceToSpace.tsx | 2 +- .../actionModals/useAssetAttachModal.tsx | 4 +- .../actionModals/useCopyToPrivateModal.tsx | 2 +- .../features/actionModals/useCopyToSpace.tsx | 4 +- .../features/actionModals/useDeleteModal.tsx | 2 +- .../actionModals/useEditPropertiesModal.tsx | 4 +- .../actionModals/useEditTagsModal.tsx | 4 +- .../actionModals/useForkAppToModal.tsx | 2 +- .../src/features/admin/AdminListPage.tsx | 2 +- .../client/src/features/admin/Breadcrumbs.tsx | 2 +- .../admin/{styles.ts => admin.styles.ts} | 2 +- .../features/admin/alerts/EditAlertForm.tsx | 2 +- .../features/admin/alerts/alerts.styles.ts | 4 +- .../modals/useEditInvitationModal.tsx | 4 +- .../invitations/useInvitationColumns.tsx | 2 +- .../admin/spaces/SpacesListActionRow.tsx | 2 +- .../src/features/admin/spaces/index.tsx | 2 +- .../admin/spaces/useRecoverSpaceLeadModal.tsx | 4 +- .../admin/users/AdminUserDetailsDrawer.tsx | 2 +- .../src/features/apps/AppExecutionsList.tsx | 2 +- packages/client/src/features/apps/AppList.tsx | 2 +- .../features/apps/SelectMultiFileInput.tsx | 2 +- .../{styles.ts => apps-spec-tab.styles.ts} | 0 .../src/features/apps/SpecTab/index.tsx | 2 +- .../apps/actionsModals/useSelectAppModal.tsx | 4 +- .../client/src/features/apps/form/AppForm.tsx | 8 +- .../client/src/features/apps/form/Fields.tsx | 2 +- .../client/src/features/apps/form/Inputs.tsx | 2 +- .../client/src/features/apps/form/Outputs.tsx | 2 +- .../src/features/apps/form/ReadMeInput.tsx | 2 +- .../src/features/apps/form/VmEnvTab.tsx | 4 +- .../form/{styles.ts => apps-form.styles.ts} | 2 +- .../src/features/apps/run/RunJobForm.tsx | 2 +- .../features/apps/run/SelectInstanceType.tsx | 2 +- .../run/{styles.ts => apps-run.styles.ts} | 0 .../apps/run/useExportInputsModal.tsx | 2 +- .../apps/useAttachToChallengeModal.tsx | 2 +- .../src/features/apps/useExportToModal.tsx | 2 +- .../features/apps/useUploadAppConfigFile.tsx | 2 +- .../client/src/features/assets/AssetList.tsx | 2 +- .../client/src/features/assets/AssetShow.tsx | 2 +- .../actionModals/useDownloadAssetsModal.tsx | 4 +- .../assets/actionModals/useEditAssetModal.tsx | 4 +- .../actionModals/useSelectAssetModal.tsx | 4 +- .../src/features/auth/AuthPickerModal.tsx | 2 +- .../features/auth/ExpiringSessionModal.tsx | 2 +- .../src/features/auth/SessionExpiredModal.tsx | 2 +- .../src/features/auth/useGenerateKeyModal.tsx | 2 +- .../{styles.ts => challenges.styles.ts} | 0 .../challenges/details/ChallengeDetails.tsx | 48 ++-- .../details/ChallengeDetailsBanner.tsx | 4 +- .../challenges/details/ChallengeNotFound.tsx | 2 +- .../challenges/details/SubmissionTable.tsx | 2 +- ...yles.tsx => challenges-details.styles.tsx} | 2 +- .../form/ChallengeCreateUpdateModal.tsx | 2 +- .../challenges/form/ChallengeForm.tsx | 2 +- .../challenges/form/CreateChallengePage.tsx | 4 +- .../challenges/form/EditChallengePage.tsx | 4 +- .../challenges/form/ProposeChallengeForm.tsx | 4 +- .../challenges/list/ChallengeListItem.tsx | 4 +- .../challenges/list/ChallengesList.tsx | 4 +- .../challenges/useChallengeDetailsQuery.ts | 10 +- .../comparators/useComparatorModal.tsx | 2 +- .../actionModals/useSelectComparisonModal.tsx | 4 +- .../details/DataPortalDetails.tsx | 8 +- .../details/DataPortalDetailsPage.tsx | 2 +- .../details/DataPortalNotFound.tsx | 2 +- ...yles.ts => data-portals-details.styles.ts} | 2 +- .../form/CreateDataPortalPage.tsx | 4 +- .../data-portals/form/DataPortalForm.tsx | 2 +- .../data-portals/form/EditDataPortalPage.tsx | 4 +- .../data-portals/list/DataPortalsListPage.tsx | 20 +- .../src/features/databases/DatabaseList.tsx | 4 +- .../databases/create/CreateDatabase.tsx | 2 +- .../databases/useEditDatabaseModal.tsx | 4 +- .../src/features/databases/useMethodModal.tsx | 2 +- .../features/discussions/AttachmentsList.tsx | 2 +- .../features/discussions/DiscussionAnswer.tsx | 2 +- .../features/discussions/DiscussionList.tsx | 2 +- .../features/discussions/DiscussionShow.tsx | 2 +- .../features/discussions/card/CardHeader.tsx | 2 +- .../discussions/card/DiscussionCard.tsx | 2 +- .../features/discussions/card/ReplyCard.tsx | 2 +- .../{styles.tsx => discussions.styles.tsx} | 0 .../discussions/form/CreateDiscussionPage.tsx | 4 +- .../discussions/form/DiscussionForm.tsx | 4 +- .../discussions/form/EditNoteEntity.tsx | 4 +- .../discussions/form/MarkdownForm.tsx | 2 +- .../{styles.ts => discussions-form.styles.ts} | 0 .../executions/ExecutionActionsRow.tsx | 2 +- .../src/features/executions/ExecutionList.tsx | 2 +- .../actionModals/useSelectJobModal.tsx | 4 +- .../executions/details/ExecutionDetails.tsx | 2 +- ...yles.tsx => executions-details.styles.tsx} | 2 +- .../features/executions/useSnapshotModal.tsx | 4 +- .../features/executions/useTerminateModal.tsx | 2 +- .../ExpertsCondensedList.tsx | 2 +- ....tsx => experts-condensed-list.styles.tsx} | 0 .../src/features/experts/ExpertsList.tsx | 4 +- .../src/features/experts/details/Blog.tsx | 2 +- .../details/ExpertAskQuestionModal.tsx | 2 +- .../experts/details/ExpertColumnRight.tsx | 2 +- .../{styles.ts => experts-details.styles.ts} | 2 +- .../src/features/experts/details/index.tsx | 4 +- .../experts/{styles.ts => experts.styles.ts} | 0 .../features/experts/list/ExpertListItem.tsx | 4 +- .../{styles.tsx => experts-list.styles.tsx} | 0 .../client/src/features/files/FileList.tsx | 2 +- .../files/actionModals/useAddFolderModal.tsx | 2 +- .../files/actionModals/useConfirmModal.tsx | 2 +- .../actionModals/useCopyFilesModal/index.tsx | 2 +- .../actionModals/useCopyFilesToSpaceModal.tsx | 2 +- .../files/actionModals/useDeleteFileModal.tsx | 4 +- .../actionModals/useDnDMoveFileModal.tsx | 4 +- .../actionModals/useDownloadFileModal.tsx | 4 +- .../files/actionModals/useEditFileModal.tsx | 4 +- .../files/actionModals/useEditFolderModal.tsx | 4 +- .../useFileUploadModal/FileUploadModal.tsx | 4 +- .../UploadConflictModal.tsx | 2 +- .../multiFileUploadCoordinator.ts | 6 +- ...styles.ts => file-upload-legacy.styles.ts} | 0 .../useFileUploadModalLegacy/index.tsx | 6 +- .../actionModals/useLockUnlockFileModal.tsx | 4 +- .../files/actionModals/useOpenFileModal.tsx | 4 +- .../files/actionModals/useSelectFileModal.tsx | 4 +- .../actionModals/useSelectFolderModal.tsx | 2 +- .../src/features/files/show/FileShow.tsx | 4 +- .../show/{styles.ts => files-show.styles.ts} | 0 .../client/src/features/home/home.styles.ts | 2 +- .../lexi/{styles.ts => lexi.styles.ts} | 0 .../licenses/useAcceptLicenseModal.tsx | 2 +- .../licenses/useAcceptLicensesModal.tsx | 2 +- .../licenses/useAttachLicensesModal.tsx | 2 +- .../licenses/useDetachLicenseModal.tsx | 2 +- .../client/src/features/modal/ModalNext.tsx | 2 +- .../client/src/features/modal/SavingModal.tsx | 2 +- .../modal/{styles.ts => modal.styles.ts} | 20 +- .../src/features/modal/useConfirm/Dialog.tsx | 10 +- .../src/features/news/ListAdminNews.tsx | 4 +- .../client/src/features/news/NewsPage.tsx | 6 +- .../features/news/form/CreateNewsItemPage.tsx | 4 +- .../features/news/form/EditNewsItemPage.tsx | 4 +- .../src/features/news/form/NewsItemForm.tsx | 4 +- .../form/{styles.ts => news-form.styles.ts} | 2 +- .../news/{styles.ts => news.styles.ts} | 0 .../features/overview/ChallengesBanner.tsx | 2 +- .../overview/ChallengesOverviewList.tsx | 4 +- .../src/features/overview/OverviewAuthed.tsx | 6 +- .../overview/OverviewExpertsListCondensed.tsx | 2 +- .../src/features/overview/OverviewPublic.tsx | 6 +- .../overview/ParticipantsOrgsList.tsx | 2 +- .../{styles.ts => overview.styles.ts} | 2 +- .../features/publishing/PublishingPage.tsx | 4 +- .../{styles.ts => publishing.styles.ts} | 2 +- .../request-access/RequestAccessPage.tsx | 2 +- .../src/features/request-access/style.ts | 2 +- .../src/features/resources/CreateResource.tsx | 2 +- .../src/features/resources/ResourceItem.tsx | 2 +- .../{styles.ts => resources.styles.ts} | 0 .../resources/useDataPortalResourceModal.tsx | 6 +- .../features/resources/useUploadResource.tsx | 2 +- .../space-groups/form/SpaceGroupForm.tsx | 4 +- .../modals/useDeleteSpaceGroupModal.tsx | 2 +- .../space-reports/SpaceReportList.tsx | 2 +- .../useDeleteSpaceReportModal.tsx | 2 +- .../useGenerateSpaceReportModal.tsx | 4 +- .../features/spaces/SpaceSelectionList.tsx | 4 +- .../src/features/spaces/form/CreateSpace.tsx | 4 +- .../features/spaces/form/CreateSpaceForm.tsx | 4 +- .../features/spaces/form/SpaceSettings.tsx | 6 +- .../form/{styles.ts => spaces-form.styles.ts} | 0 .../spaces/members/MemberEditButton.tsx | 2 +- .../spaces/members/MembersListTable.tsx | 2 +- .../features/spaces/members/members.styles.ts | 2 +- .../spaces/members/useAddMembersModal.tsx | 4 +- .../members/useBulkChangeMemberRolesModal.tsx | 2 +- .../members/useChangeMemberRoleModal.tsx | 2 +- .../features/spaces/modals/ModalSpaceList.tsx | 2 +- .../modals/useAddSpacesToSpaceGroupModal.tsx | 2 +- .../useRemoveSpacesFromSpaceGroupModal.tsx | 2 +- .../features/spaces/show/SpaceActivation.tsx | 8 +- .../src/features/spaces/show/SpaceLocked.tsx | 4 +- .../features/spaces/show/SpaceNotAllowed.tsx | 2 +- .../features/spaces/show/SpaceShowLayout.tsx | 6 +- .../features/spaces/show/SpaceTypeTabs.tsx | 2 +- .../show/{styles.ts => spaces-show.styles.ts} | 0 .../src/features/spaces/useSpacesColumns.tsx | 4 +- .../features/spaces/useUnlockSpaceModal.tsx | 2 +- .../tracks/TrackProvenanceContent.tsx | 2 +- .../workflows/WorkflowExecutionsList.tsx | 2 +- .../src/features/workflows/WorkflowList.tsx | 2 +- .../workflows/WorkflowSpec/WorkflowSpec.tsx | 2 +- .../workflows/WorkflowsDiagram/index.tsx | 2 +- ...{styles.ts => workflows-diagram.styles.ts} | 0 .../workflows/run/RunWorkflowForm.tsx | 6 +- .../{styles.ts => workflows-run.styles.ts} | 0 .../workflows/useCreateWorkflowModal.tsx | 2 +- .../src/hooks/useMutationErrorEffect.ts | 16 +- packages/client/src/pages/AboutPage/index.tsx | 4 +- .../src/pages/Account/Notifications/index.tsx | 6 +- .../{styles.ts => notifications.styles.ts} | 2 +- .../client/src/pages/NoFoundPage/index.tsx | 2 +- packages/client/src/pages/Security/index.tsx | 4 +- packages/client/src/pages/ToS/index.tsx | 4 +- .../pages/{styles.tsx => pages.styles.tsx} | 0 packages/client/src/routes/account/index.tsx | 96 ++++--- packages/client/src/routes/resource-pages.tsx | 12 +- packages/client/src/routes/root.tsx | 34 ++- .../stories/{styles.ts => stories.styles.ts} | 0 packages/client/src/styles/tailwind.css | 2 - packages/client/src/utils/useNumberParams.ts | 18 -- packages/client/vite.config.ts | 261 +++++++++--------- 235 files changed, 580 insertions(+), 563 deletions(-) rename packages/client/src/components/Markdown/{styles.tsx => markdown.styles.tsx} (100%) rename packages/client/src/components/NavigationBar/PublicNavbar/{styles.ts => public-navbar.styles.ts} (99%) rename packages/client/src/components/Page/{styles.tsx => page.styles.tsx} (100%) rename packages/client/src/components/Public/{styles.ts => public-layout.styles.ts} (98%) rename packages/client/src/components/Table/components/{styles.tsx => table.styles.tsx} (98%) rename packages/client/src/components/form/{styles.ts => form.styles.ts} (100%) rename packages/client/src/components/{ => icons}/EntityIcon.tsx (66%) rename packages/client/src/{features/spaces => components/icons}/FdaRestrictedIcon.tsx (92%) rename packages/client/src/{features/spaces => components/icons}/ProtectedIcon.tsx (91%) rename packages/client/src/features/actionModals/AttachToModal/{styles.ts => attach-to-modal.styles.ts} (100%) rename packages/client/src/features/actionModals/{styles.ts => action-modals.styles.ts} (96%) rename packages/client/src/features/admin/{styles.ts => admin.styles.ts} (94%) rename packages/client/src/features/apps/SpecTab/{styles.ts => apps-spec-tab.styles.ts} (100%) rename packages/client/src/features/apps/form/{styles.ts => apps-form.styles.ts} (98%) rename packages/client/src/features/apps/run/{styles.ts => apps-run.styles.ts} (100%) rename packages/client/src/features/challenges/{styles.ts => challenges.styles.ts} (100%) rename packages/client/src/features/challenges/details/{styles.tsx => challenges-details.styles.tsx} (99%) rename packages/client/src/features/data-portals/details/{styles.ts => data-portals-details.styles.ts} (94%) rename packages/client/src/features/discussions/{styles.tsx => discussions.styles.tsx} (100%) rename packages/client/src/features/discussions/form/{styles.ts => discussions-form.styles.ts} (100%) rename packages/client/src/features/executions/details/{styles.tsx => executions-details.styles.tsx} (90%) rename packages/client/src/features/experts/ExpertsCondensedList/{styles.tsx => experts-condensed-list.styles.tsx} (100%) rename packages/client/src/features/experts/details/{styles.ts => experts-details.styles.ts} (96%) rename packages/client/src/features/experts/{styles.ts => experts.styles.ts} (100%) rename packages/client/src/features/experts/list/{styles.tsx => experts-list.styles.tsx} (100%) rename packages/client/src/features/files/actionModals/useFileUploadModalLegacy/{styles.ts => file-upload-legacy.styles.ts} (100%) rename packages/client/src/features/files/show/{styles.ts => files-show.styles.ts} (100%) rename packages/client/src/features/lexi/{styles.ts => lexi.styles.ts} (100%) rename packages/client/src/features/modal/{styles.ts => modal.styles.ts} (85%) rename packages/client/src/features/news/form/{styles.ts => news-form.styles.ts} (94%) rename packages/client/src/features/news/{styles.ts => news.styles.ts} (100%) rename packages/client/src/features/overview/{styles.ts => overview.styles.ts} (97%) rename packages/client/src/features/publishing/{styles.ts => publishing.styles.ts} (99%) rename packages/client/src/features/resources/{styles.ts => resources.styles.ts} (100%) rename packages/client/src/features/spaces/form/{styles.ts => spaces-form.styles.ts} (100%) rename packages/client/src/features/spaces/show/{styles.ts => spaces-show.styles.ts} (100%) rename packages/client/src/features/workflows/WorkflowsDiagram/{styles.ts => workflows-diagram.styles.ts} (100%) rename packages/client/src/features/workflows/run/{styles.ts => workflows-run.styles.ts} (100%) rename packages/client/src/pages/Account/Notifications/{styles.ts => notifications.styles.ts} (98%) rename packages/client/src/pages/{styles.tsx => pages.styles.tsx} (100%) rename packages/client/src/stories/{styles.ts => stories.styles.ts} (100%) delete mode 100644 packages/client/src/utils/useNumberParams.ts diff --git a/packages/client/src/AuthWall.tsx b/packages/client/src/AuthWall.tsx index bf09e2b792..75d3443395 100644 --- a/packages/client/src/AuthWall.tsx +++ b/packages/client/src/AuthWall.tsx @@ -4,8 +4,8 @@ import { useAuthUser } from './features/auth/useAuthUser' import { useModal } from './features/modal/useModal' import PublicLayout from './layouts/PublicLayout' import NavigationBar, { NavigationBarBanner, NavigationBarPublicLandingTitle } from './components/NavigationBar/NavigationBar' -import { PageContainerMargin } from './components/Page/styles' -import { PageLoaderWrapper } from './components/Public/styles' +import { PageContainerMargin } from './components/Page/page.styles' +import { PageLoaderWrapper } from './components/Public/public-layout.styles' import { LayoutLoader } from './layouts/UserLayout' import { AuthPickerModal } from './features/auth/AuthPickerModal' diff --git a/packages/client/src/assets/precisionFDA-dp.png b/packages/client/src/assets/precisionFDA-dp.png index 17f81aee12589e014572889e36dc5a898a87bdea..9d856b74bd2a722315b6132dd4d1373c499938cd 100644 GIT binary patch literal 6951 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 literal 143855 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%0A{#e2+!q_Y6f%3*GEBf&~@@lo;?2#-e2L&zu$ zjMS=MAVBvH-|K$9aM_!^Ym{=G z@>#(o$Xkajc7q`jZ$O+Tkj)K(dJ}mH6cm_Ltp)j7N}Mn}h(zZn*(WoI?zN z7!*R1-fF9=;bqIQj}G~S!7gsfl$GF%zo;R=aOnw2lEI8#|3)J5$+uXyue6Nw*Q`0f?t3!oH`5Q9oZ7vN!T}-cvQ~VPL30 z*zn|tJ*Pj(V=qCQmo0|f5CC>fV%=GGI5oLtGRc7fTU&BM_8inHIZ{&s zVY0x$`&+;<;jpOK(B-xRunR@pw#L96iHD#UEa`?VAYF>|z}OR%hy$bntkmnk!On=` zMh$Kmo(L9Eifs%yl?0GJ{4~|VD3f@{V?$P)Hl6{jC?07z!2wR{b(?8kkva0wL|ZjT zzDRcQgp>ma%-r zropQiNzbt8{2XGA&F=|KyRcll0a{WHu&E_!R=uKaylDyQF*p^r&�y#F?@QvjQsY z49*7Yb2L~yi<4S((D7PGf5-ZX-R2MgC>e&=+gBebL})gj$4CRBC-ixFbPuDPv*Av} z!yv>4tKw?j(whxc2Q~$XFc{Mx)w4-n4F>iEOf&*>M8My6q$ngg<3I1Uk*Vo^ll?ra zhY`>U5z&i-%)mg`Y0{-^fT!vyUln3H5GDPP2*q-e@wL0Z%s`Ld5fRLGeX=?Z5A%sYvs-o=^Ak9M-lGK`` ze9J>*4R`VFlz@#vU)yu#LD>3w)er_Hci(f3k6d`cbL4}H_2l639LVv2ANOl}Q$yJ} zUhu^02^rFg?EnhYa^FKf&}-k!jEk=pSC779lzBh7Z<{z7&L|^4@kr7>paV9*p9deN zKUAc?hCMWgBr~aR$l9f*!DpL!e&d6yNGfbIK`L}Sj!Ax%F}=bTL_@a$0>hw1bQRVy z@FTGl&N!)F7tA1EIexF|vPcwmf+k1lXmTBOg%B2R5e=v-v^~$jvi3-cfFvn9-zJ<1 zpJ9`iK5>40C0<9n6F>@xDbWW=+}=@Mo3_R=bvm;00T1g#ooOe&J0UHubX_c6X2+m{ zG%u-svPLr6md{q+eg`?5)&($ZIbGeu-JTyc04atF+`vajdx)XuiE4}FC^&CUoccxUp<+zTUbtzm0GVZ%l> zcWfnXTVaPQ63F@f1$h?*d?bD2A-%5(qy=d?IFvk}Gu)ZAFEo2131&Rqw2~gK2sSfg zJ3Uf zguKH2u#TD_Bf9PUDr+KxNEgpUJ_gm@S&l|rwY!}2^lgW-02Q!jPrN1&YYu?V{WqI+ zgZ4dvH5PEBNS^8?#+0CSts#cpEOq_fcQFxgKFmXGyB}lDD(Yh$(R|JJLRQ*wVJ7`MbIG17d^R zgP&DFI6)4B{3s`1HbNhcc9k=##!zTQd2ZP z>DgnYHoQR-s}B=(w+Q6HXvfXzb=3PFyYKR`37aLcnOME;5C`nv`ljwJ{(8(+#K0kS zN9{#-qMB^;mL~>29EX$-&ux;aJC93hgb%>4c1+2ns#tV(u-I~jLe}~-W~A6)$;-Ui zT2{Biq$E}?bUItk~Ed!e3=3tld+CfR#x zx8GQotGcI*4TW<(nq^fm%^^#{Xstbk%=(4ikqf@@WB(K$PSWd+dH?7uD88Xo4U)<* ziinL}E&+2s2_7z(9H;|TIOH~R$_DtKwh&veO)AmPEZ(lx`E0USlk_nUEnu%LRAhNz z)>0b|()||U?7c|j1dHL21;#Z_f$5+3q{-#Sp#}}x%@Em^0(UUzxCVnj-NAm3wFa{& zvU|^$r5#J|)DS0!d3;9Wjv`6fWjrIO2^{Q#)RF$S<=9^(I>a1`g;l@16W_Y>1*n?*zhGQ}&%7q!p zVXB6jSH*E|=uQVX2lHZg4TuEw|KHeT0>i@SH)aq$3cBiS@yK z-Ei|zbQFh113FcSiLO)cCtvmrZOBR3gg4xl@T^Mu<~dtY62N^IM`EI^-FYS?c^@FT z(;%mw?pzf~5mLLSch7RwfP+tROHmhIsKGgrp7>6Cq$JX*y%EB0&B{ClJ%Vd;IG+N| z%!Nv=ylrdP8bl)r9l&=9f#bpZyJ#qNZ=-XC#rM=1-RrlMndLcRAoD~-ZFEQpp5wxk z8>U}liIRY~4^e!WCl*CI#tJ&9WHdt^<1MI7F=o1p9f=~V53v(iw;Iae7eWJzouYFw zl#NKr^ahfj&03%@NnL137)N$$y==ePE5rT1M-P+dF@$8wTe;kK18cAZig6}3Z0M;6 zS`69IAMG7?jEkJtN;#x9236;MXYNlZ7zUF{hY@H{f^^H%{xzp}N1nb=YOT0jcg`Bv zN(fIr2KuN}8%s6#saer`O91$Id)412yvzbmIYy%|oyA{|GYTogqb)y}a$`h=g0hyBi4SL&mF1=|yjzWwN4| z5I@3}K?=4A!bT4J0eeV;=q+)@EQT{MDt9|Xq*+2t>XfUd3&$(e7J1o!r366;B6SFO zzK8Q>bZ6tUOkxqswQ3Vu#bVmTisM4BR0zZ>jVbYu4HDf>wV{&)+#*P#7|UnuMXYXT zW!KRG6^AGNEti<=$j&fvVEQe&AUR^1t{PhnTl=DWge^_a@d_t{BnHq8B1MDF7Wvyk zla8KV<$KNeWdLrlSS29&B*$oZuoDX2*25`GqvK|Lkr$e+JnmjjNF-tp!HX;hUUQ{~ zL9hk2>t#G;VPokNLw36J5KGFEa*!i%%7-5p+QLk`J8UCvMBPNpa$bSM^Rxj$eoOL- zVc##}{qk@|JiQ|k>t8yeF|J6W>Wnz0ItMwFA;(%% zd{KtMv#?UN6#3Mm3Hkc77rQn}7RtHeqrSyrJ7ejJ9B9{|I$ja|HSG9*v(J)cxFMoI zim#Nwq7a!IZ`!Y2n92CQgOLwOj@;^&lMPD0sSc9dS{am zU1Zfq>Ls;{d9;OBIUHNF5>~+8!5AG>J%p2~{lO1rHSpFDAbT4$raB_S06&3#LdA~nL9uSkm!}%6R|G_kyMOF z2wRLYIN$f$Ss71XJhNQ$jByHSZI`|5ci0F-yj71&g&>od++861SstpeCW9db9lFc_ z++%}2JBg>(`K%4%Rhg?*bc^}m{)Y85bd!(JGsSBti*tO!;R>nQIVN;pfpZGzqkM<` zuh(@4pD7BgC|YzlP&qSe70k9fz{wi6bFb8C|>an<{zRY`FEHt5d!= zSPNU!h?Un2BfE*_Jf@xI&UjtJ83o9eFE5L_5~rGm#O=DA<5Ryq3mn=Q`Ss_dFdvzwjsM+wmI0%Dz(fv*GuZg3|G?)SVz;v#YgtmIXSzVpMh}40(C%jhO=@X}8 zP1)UH3q~pILZtJNu)Tu?PqI;qRtbIwFzw(9YfcBiUruVqq9g<5V)jm)=k}$}Q+;*M zz<3ZtdWOFq3G#D}obatbd~s1oaEumqww>MmFh-GxWK2ZBsYGFNKcI*nxR+~`ed z@td8?YIYhy(${Tno1_VMgOCtjmZo2PR4HAY%}A|pa+y)Mw63m&soW@ia|>_|@w-Nx zMQ_#2bB9*Xm+n2h!0%GS?yf|E?MY#rM@aT4o<+RvAIQ97i$g)ASNvN_puDg|8kLV4^eff+wLLA z>kr~-mq)I^CxD$w669o-cg>P{4Ypc8EbjtPE6md&sY{GKS_5RPkdysTAn#!9gSD0V z{XyuGZcgu;Cu1?)4S^Y`{3)e(*$Vt#s0F?y8FsP-kmEPb#szE)1tu=3YmPA;6$|t> z$7cw`8={rpg^e2totIvK z5pv^oZeuD3c-o9sy8he z*{M|nM}Q?E-G`jFJIpN+Y#4caqheyoJB&%|fOcd@B(o6`*SVsVvh4W;6uj?ly1uQ` zeKxJy?O`#fwrAwC)w6=`E@UZ|o)=rQZFMYTH<8V^oAoujff;-~Fk4eS^V!{3jOB=k z2x%gpk1#*72oTVa7?2v;mfhZR(b6+r z$pl8U)Bqd6<(q66V!dDHAs4D}gNv|BJ{aLNC70^m-e#(7^A*RCs+lKF<-^7p5_E?W z)4?&h)j^xWDF<~JSxu0D+)+lUC_Fas;m9zWF(q{u;NWMos|(3^18k0}qp;6|b2DT0 zNyO+gq(gr(;o#h`7>sdQx-W2KolHJv(WgpsK~jyeu2-jb05mLv?n;`wk%!$xT7Cz9 zqmEWWBhl_3YrfOvo9iC?{uVy3g`jVsB2f|@E5Gi1#7%dC-M|+i9bDzG(Q)fk9Q=}JhS{pf80v%l;p95%oz}n zr4-Z=5%2fjVI^kp;I>bqSO< z%Lx9PI7mZ#lqwDz{T3tp`D>m1X3qja?U?_Mt1nwu7TK14CHm%4L{LFNL_qH7Md_py zc={7L*WUY7t^b=fYpO__IdU{HBGUZN{f@Z3c-{Z_vm9JOkno!vmt|49EThe_rYUt_ua4ECMNUwV4%|LyzzjzQ{X zRX2;0d|+QY-W4Y4kMd;hJWDt!;VGY&=-tY>MN<kil`PQ4-T$6Nbx9p5rZ@a~^w*ZgZ%p#qvkibDP84u`jNR2Ewx z071o0lU?s5`=`~NDNbc_BtxbkOpjkq1QGB*+!XWIaOPf*STX{FFuYOt4Y z+M(U!kH+oT^o0|}<3&-3OV?166;hPquXP)k%bO67SJmi2ZXuh;pV#(cMi{T-tXJ|!weJDJ0R^pAg9$-dSG zds7gm1YV`UvTC%UHSqk|(@yCf>sYt{YEg`*wBD`C`>S5$lMQXdIE=!lFoiKSTlK>Sg{WNmC^%6`FWzPlqdeu=trqM z7jf5Z{ZPMoFyB0{k5aNcT&mIwFM$W1@!zEs#`NPk4^PLJ^8LBWD4DRk5*j1o-bjV^EzN_V3csaXG~OWRt)0wsFfKeCA}Q} zWkJx&1$IV3zy=wcG7qhL^Z~yr<6I_Ldtph#CASPbtGNa7ij%NeqE;_>r%sSb{`Yk%#^H-Z(zT!e=fRu%qN~!UMLde& zX{{%Pt_@JPF67iT>TvWKv@)=Nd=nzwf7CSiL_*Mt_rGh5T%8pke^C@i8A{{btm)tR zWaZYj|6>81`x|sF_hx-tC|91U&CmQ@nyx0ULJ5W6E!=<*p-Co>jNiB}#NL)xGCmc0 zIZrjID%}IToZoV#aBPKVuPq$mSyMWs>Xc^=eus8<45awqYuEmT)Yjd`I7oKxtzACF z1N%`%>ZGZLY5_^KlMfl2EAO;1)1*M`+@` zZh75{3|9h*u5Zjm9orJ~VU~8w9cYPW8bu9uu9X)B^>L=*(9i4bAGr);r!})HGK?Mm zjOc^WMMiuR<(Je74&A&;rhf%{m_GR<+3#+S*ZVK}l)_#a?Y?&`InhhzGI(y^4t3f>Ondd6R6U66hOxd;oHO7R<96^UNBi{j0P zzPshUdO*^|d={+? zUT7dcgpWQT-?*pkr5*V*!yL00O|&01y*TKJYr`@+g%Up^_K*^5c#?;+KMOACO0oxq zuzLA~zw+O+M2+~GH-=@Qp6V_kb9C3^I;)(_lC-7g=@EuQDAoB@{Hs?hpq!^(*PyN% zvPA3o8#d$-BYw}sD%JWMpo`L*@`Up@^!B$V;ANBm6NCR7>Ghe^^qLS_dheP z9b4;nALYHNT6QZ6uMD4ha*iWrIU494_~(jffVZMllLzdHsZByxgq^g3JK;{;+Uob% z5neMg&rhhlenulb2ka-vkURJ<-(>ojH&7|ouvo-^F@j*S$RKeK;Zt~&d+)Y*Ln0n% zj%wZ<@4I%@zkHH?ap%R_&zhGr8@ug>Lw*(w^ii+y_C0@w_H?PY+)&krF(l*OopYd$ z|Lax8HK*SqhGG%Zse8qnAIaQfHqDh%Q5 z2UJrO0@o53@?3la;Yl}GlIcuBAs#t;`_0@yGJcG0c+S{HeW;d40Yv+cvpImL-t7xu zoM=fVBoPXzs(quiAEKC51vsRCoRyjO;k~W5FY8|Baw)Wb#Ux;hbUZ}?ky~TddLVuG zT|WBv9;3w>qp;iWerZKHb>FMkbL~*VZ~w3A+J0wZDM6i|I)Rh>j>eRGDUW%%YrN@f zqdLZp1^`$%HG(A3F6nrBk=&2x{F}`-B}+~CKG(x6RQKgs!w1l;fmPKJY=5ss`$>9x zJ~H0#+A+=!`wON%Yx?)(aQS~-(KQAq6eF4NRg>)QUyf3JuJZQnC%Y?_H(x&ZCM z<(1)-xi3d_al8XiBGlR25^QS1CN^)F>18Qga!uQPtkU!URMy5zM`iCkfQ@ko3^fHIRKg~Iba!@n5T>y<-twyr*IWcGZAS2MxXw|3CZ*~n>+d;pY;L_pW zssGO}Pmk~asSQ;HH30p5IOz=bcV2U!n=yObWI+ud@5C*4^vUSvcte&x4c~Z@==|bu zk1{Pw&kp_EstjEJ|9=o3U9@PpOt`bWi+<((kfX25^wf4XLIaT>I8vZNHR2d$yT`>v zYF}&e_hnBN@&kx!l2F(1v=X(IkC(x4+pY(xvVdxBI(<0HohKdy6biPQE9c&%#6ypd zjpWPz7#-EDo`t4L`Ij$!&;O|Uw)U9mOR#b~LcAUPqfc zI%Ml*uYONp$k7wzkGHzJRnEVA&uHFh{EnkKVSOCb%W{?SzsG0oUL+;*y&<30P4D)q zeYL&dk?=YC1G+nhWnQ@DHRPi($lmRxyltS8T>I_cg8V`c3$c~>x!=FixW;?t7R4N^IDX%GTB+9&WXJ#9I28Cmp|1?0OD5DvI!RiYUR(A1KgK=MNA(AmiAvFP40n#482=8ZtU^er`7Njbh4U^zHYLf4Z%^;&2+2{qBPCrF^RyJMUh|2e?^Tv2=O%Yvp}@z55S$ zJ|RN^aV%NxPJJ{ zzjlAS%%6(*4a}qe5{o{k%AMSU&kC5RfGmY08ZR<5(SHpmTX7Fmz+cWxz=(#jro}^@?Xa%@8*J})hBR#USzs2MEf!n@>Vk(71+9(=uTQWI15K5@<=#6&;KeI4 zl#H&TN=RK+g z@ym@WZZ3&y?&(2iS9yHiX9kg(vVefn0@iywaG%@lkMfvJ_9Q`cMq27bp5prXqkwT7 zGMPXY`vq!-ckhlGA{21%@dwiz7&jkOci#5749e&Kd_JS|0>drC>-+fTQ$}Lls)AKf zuGRCq0_9ZW@BIhM$V_y(c9Z$T)!mMJ?r@woc$L$6o{iS>xUT3zQ$>{ zxl>U$1l_=+xt~5l)QhE1-YP@-?c#HZ{vvXT;7574P{vZb7^%#7JDfQ0fL_WHRGxHT zu76G!vFqyVD7>@lgO#|d zwNNbQ(FgcEYJkMYN}-5Gh6LroBe{h~>yKz3Z`sw@?JHF0(H(vGNjsVTx-ZGTFtx=} zRF6%SBkYaBMdp6{$%euDP9a)~Sg!8>z0Yy7DHT%z`UUVk^xZBj#<2v0t8twQIK>S1@we<#+c*+z`agFS)JQUmSDXHLA{wuK||2QA0td^=L=k4fS?;Um?~ABw$6 zeqOKp@fuO`O{5H@p|l|Qut9o|n9)9w#DOMa9RfYWovbR}AH&j;3xNoL!%ZcQ6W9f` zJi!o9?(?=!5CqkAVb4t*BCnz1ZIm4|bMO^aTnD~Hv~Vf=UH=RohWOsJ!ZSROFSG{~ z89*Fs43pkF*XoA`f$Z0E4?P9Ke$uSc{+8Tl+h6?0`DtmF$weA*HMUy@DU`4(2W}jU z)0%|55owcLo7t+WP3)u-1YaX7>BC!WOeInSF{`p5ZQJU#Ysym$qcm8ucDeKcbRVGUUZ*=crD4d&>jP@3tHrXT7=?uhK z(c9Z%F$V4V!cuj(KnqQ}bDBNQ@qBsiu9c+*8RU|{v6N>W&T1UDcSp>hRFIp9m<78m zDGTIbn$G{WNABpqjyw`u2|$$p;aY<}YW=$a#{&A?)x-i1uO+8pV($vUnD4T%d5NOb zQEe-n1dgduAvG0+^E-N7l^MDOfin6`pfXz*M-AF;hn6t4DC)*NGg&Wt4GVtW3e0$I zg5ww`ojbL$J_r}6aA_yYlW8<1uPn#^5@DaNx8Os{{ZGgKxM_Ib?Wk_D7LHnoflU^4 z$>5Fi5~^sgW;dX*#8-3B_5k^NG{154SC^?2EcP88W+srm3!0 zm7jY%wBW1(6s@n_?6k<;rw8upmOG!s>}@c{X=9jHZNf=?4XuJ?_(>eEGA-}TXt-Kc zMH*9-_7Ty;^rd7o%Yye{HU7Pbg4mUa2q&Bojjx%HcsBgh=PxzWqK>kRlk28CktpD5 z;YhV1NdFjbNqq0e!>iXYy@@Bu3ZGYycnpCrLjGfYINRm8Qnk3nIU081ah-Rc2>KEW ze;{^#QkGddB4Zu57#4UVpT>JXvo4em*hSX|>3lAqc^ld6hNJ9sS&~6lKXcSPt=zR` z+jXxBtWUXb@y2eMd3D&SzeMT_vJj$FIs!S$F@VM|XS9CsGwpDN%0+QB4q0$YQwUbD zhEYIXOUF&40Jcj~aq0p0m`9LOlugr`LB+h){Ks=ub=9r+>G=0Bp-YHeKfdOj4)}6@ z8y*%Bg%B5y9jm*~G~kQpZZeuglREvzVq*8K|T+cWRv-Cem(pNtV06^ zJYAGRILdZ{O3~|>?!RFD|J0Aq`C+Frq*jKU1i z&grQe=YRlhN*e#Mj*jdHNd7WbG_L3c(S4EXft?&(pa6A$I(eJ2iN468MK#A4$=xnl9WLV(ySg*qZelA4EOpDZpgqGWqB*n^5f(!?^= z2Vh&$R{AV9c#j~B@`XYLIRj40!FpTw#DWUO9+q1B9L?$TjrH?7f3j?s?p_7#NZ)xM z>+J7}<>D*v;|2W|qG3wm<*9y%-P%g`3(|mLGAA``kkmKNE4kh3eA;miXog9N(29-C z%8cG>4X;|S^KJ~Ca(RtPU;8I}P?|^l>>tAZl=P>D(&5n+&rCXWc>XqUVsSah`CSzMH#1dk(OkGtecVE$nau9iWm5aV z6XEsSb(Q%UDnu$pg?S!!t^KiBbbY;g#*OkU{TXFS-R0D6GAE?s$CIJ_$k3B)sCu+d z22Yb{Is@q6au9ia>qAFq;5%vAtO5e%3T?-y3-}%1L&J4PhT( z0~z)0b(L?2qtdQS$Jp5ATD;ZMTkoDuqr0~c+rOjis>MS^FU=NaAW-YV$4f#(B6j9? z(P&&R8CF;AqFsiwuwE+e;T*vpnJ&+7_I4Lz4+*MuSA}WsvvqmcEIXy=hfk&c$3Lj? z{n^J~kyyrHorOh05bEU0i;*g{VqK~|4X4^2|EP^=o3xy12S!jinOx`<2(l<=U77{+ zch*U6$=W2Kct1}k-lR0IXp{$`mrBu9ri{zll9;faKHUcF5 z?VsS@y!NQHQSAdeiWPSk`9F}zvG$?lAtE65o&eha7o?o2{A*>&M)9;csom9^&mII4kTHd23iu6piYwD6G@%QpEs zGk{cY4!&=)h>5jTULi%kVb+AnYrt6MC<`=sYTSOApL6MBNxQGZxIDQyd%S;(u_Z(2 z|6)EC;Oz&a6AkHbS;1+K(_0$z{E(Q`Vk_Wd%s_PU+~*d z-C;#lJm`nVKy!%RgOY_b0SO+%Ukvu?zt*g8OeU)bKE-$jQ*Q-6J8wl7<8c7uiCa=8 z{zcw9=io~ydGZ#I>uTKhwq3~8_U$?ClO6ps*n+dj8|&X1`4$(BE`XCMDAddzxq5tK z;re+3U0dzn0hn5ictEMsX z?q#b|ruR{H*IOBm*AZ-Y+2!6i4#49!2vJ1Z`F+Vr*B^u^8r!ePii@-0^DOlMjdul- zSL8vQ+X)A$zRIwztiin4nokOJI+fjVX<5Yu#k#l_=DS zIgk3RZnomrT5>3-5;8`@$(9(?^0s&LM5*3Jx6-a>M*4R+WLLe1tQjiq%#pbrEH^mu z2V&E4eoh0hZE#6d)*6U_? z@*PZBL-Iu*Q&i1SZ`S592f zI9jl`VQ;aAefo0)_jPvt9d=$)sx2=E%??ZO7`r3a|A*1#%W1@A!;c$GzwmY71PO|Y zV?F_p=^-QhyMAl$T|cdzMRk@KgZeOaUm=N#Y-EpnK-a{KDx6ZAUIT9ga7=1N5qMNo5F=>1cet+dh@sI zsIX(0rIJI-T?5#IPuI6wO#cZrpjr0@e650nL3pu~908yL%H-|!e3RuC?L?IEo~=BX zZDP1<+CV8|ne7VT1wmel_Ev#|1B4#@`asG-G$pn);d0vgl1;G6TSfMEdYG`jYjfgE@LX2()?lVzdVl{6lz3^KPnJA+is@6~)Qk zxF(bnRS^?_D}I7UgFRqZip#BFY_-PUr*T8pJ|SnO0662g{6!n|WIFMZjGL>SR~7!V zX2|sNJDzWA#BuvW4;nW<)%5s$pPRezE^!5CFP^fOG4Ib z8?1(I_}hpD=`3=<-$92ajhI9-(^=~owo{}2BuGA$frR+OAO_}^@zuGS68B`sYguYP z^33tW3Wui?Uv^)XlwShouv2{Mk06v*tkiCkn)eeg_&ybBccGm+H6Iq(h&+cR1VXP7o9c$+@L7L{^8-}3pPWL6i}`&%cdz{`j|Jd% zkLgip(mS>@TIH~#^v0Q`YUG@@QQGYdWo%@OfwI%$-+Y7pisUIFs|Z>%#cTbQ{bnKw zxLS>ve0pCvKq}l&@3F-^Wz!K(wiq-PkNiFvV~}WPcY*@qkooLFI(}y(#qp&Flv*jD ze*3A)FIDi+(eUFNp11{vkEGKGJU{E%YEQ)`K0T;l-?iycVeTY31$CrPBi;=GA~4!4 zn&!5ed1v2-?v@a93~JGAele(CKI8a!*j--S>SPFJu1IIy|1$m9il7S>JFeN}7p0 zp8fT8rL*%FrXm3k_&H*>nQd&6*i-uQ&f!bzhC57XOq4Spd?+l;3U`j%Kkn*&iP2ms zgdalBPJ56uNK!QMpa0rUl!v7#QxfH9Or37gANL;*@vakSuH<{QG#5`PH)`3l;XR1r z-}}6EVm_jb%*~;Jsto#~xF(yfSx&ujawnr+B{cSNq4XfN3|H$GeJ zg@Fl%oGJJxQhi;|dw!T45wgEhz5_I%|0_7l{1?7f-M5L9^6#bcl!?>j{bZWbTm~&u z6jcoE#aE+0vEJe!6R(c__4_1KUCBqDo~@T9-rVr9&KwgEvu#(WcrSsx+kKLohn&Yq z>+MzdvjtonM#sq=8(QkvoI$m4&90RDYj+ zJ7c?F)R&E8Dp7l(ZS~4=4mG}FvZE~}`y|_BJAM5KoPm@=1nE7zV{gPzS&k~mffel* z3{EW{gTs+czU`v#_327YaCHy~gT>nR?R}0Mhpj&7tMfeQ;znP{=pv;osS;^O`KAkdwwqM&gbov)2F?FV+QA`9&?Zc9I8$ac1O@#&BK${vaxWU=I8!b?_;B$HRk(=4c z+-|!Pci|`CwS1WQU>?O|+%7Xh33Oc^V$#B)<-NG?xu!Yh{Y%@= z`Z@V%*NK%0gP(G%i^wwHLXmId=}N}OeFWSSnde*5n8p+qc6oh$g;#wE*XR{DPpIGQ z>scqUnO{l?$03^J=cP{RAm+>M`~bW z*BsLCbI3ZV85~aKIjs*%o`g%XEbYaZEBnk7`*Bwdq=K>pK!O*O>`)#YM-irVjRL6X z=~mSp?LbxnR{wp>KB?H;Ms_9@`>7fSVN>TI09A3oc-Ysup*!fVYPv^Pzv< z9FQAnk~;3SWPa1g_Cnlz0SwKMqiBZ`(LOgD+Xk5zZ2yK$45UBI{d;;|2lwYvtHQpZ zSIsB-hX^-mUmoVPi^J%TQ~eT6gIe zL7s7^V-hx!C2720c!L=rYMAl$QswdaR=scD_?CkGb6=@`(B(#)jV+K!mni<4@|H1z zMCoF*WnRM2*ax-D+Az8E%^a7uX3+hEH=WVSCx&%U(18X=aZAOc`-Zs00@TII4BZw+ z^e4sgq`;hj(Fruf;_>FmOKxDIYE2v!lk)w7yFuTXuYs0tkAyvSO|gIee5T6*b z&Dab!g$GfSO!LR*(ZVjY9w1(c0S4P{9h+Lz4FtL@Yi33)S^%TnFXFu*s`1)7$($-G z+l$N#bM;x4S48tMoeV|Rf8x-q-1TW|CjEKlan&D8zRl4Wwu)C$6m;Hf~X^Kb7FOU%2q~JiSK6+=F+qs4 z4L_IU)w8H)o{@l)U%61`7l<)%QoydXI2K-`txu#AdsFj<+l|_h=O7s}Q_?wWD95&JoaI@GaL@ zJiWswBC9zS%j)E$%};vLq|5fTzGFR`cArE(|=Gm5f84By5mp(tXVV$wp>DTM8&iD|_WbY|d*X+kYY;AUw~#nBKe1{b|X> z;0Fq+j9%Hx&-cDQ6J9I@`b|KE<OuESh{EAoN+}kZS!MlyM+kK{4$P%t@%X;vA4} zpTA|hL_Vg#a;xjI-!sDOpreTzMRP_D;}HomaZHY~C#yI|%{*L$B!CbojI{zbri3MY zOVswAArr^53~|NK5nLMQBi7G}T-MSOBO<5p*I~JQ0R8w z@6DFaW+X&USl2W}Cp)sF=mR9z@%)L^<^Zv<^dtSIc2B}T6pI?MTq_Pxj+ZOM*|Q$8kK6chw6a>dZ($_!9= zf8OC8rT(4xFqAmCv_HA!$Zb0{6NtK*s!HzpN7&FOUd!L>!^tiHSQ|9uh02ExzXI&)y^B5Ffu{)rk4SI;`=gGfoq`5pi{ekZ=ypGYhti$IDgOz`!4lKL zo}`zy)D5che}XmTgN(HJd4Rw*z0OH1Z?=!VbG*sahrqp^%ZFT_3QvW$eTamOmhMkr z*`OLS5tSZ-*>5)}t{9L%-9r|gcur!?{@dDMpSkgjB8&5)V% z0}?qgXb|I%GWd=ZGPIt;GusVS^*Czdtp;WOO1bvAm%IDsWq;86i$Ch4jeD!4?^$Au z{ZFCpu@go=kZI}|NPr68$aBMA))&7TlN_btZ_#%r${ zc5*qG)tcuA^bZtwT2kIJj%$$F9?bwsT|TZTZ9k-FcN}wa&_Fi)fyD!O7z$MVgY`1iPW=juit>z1@3$S7D*N2+swW{EygYG52;UGzXIq#UM zOVrZP5A)=6j?aP;9oK=cUhGU|4!`_reI=Ej8TD|-yFJ66ZgaET0s-(Z=rhiPyc>b} z%MB?cu|N22hx5)*-qD0tn%Zq^B%s0W32O(r4`hdBlC&d(xfJm0iPS8A1$`XO6z{*T zz%J=BFl=OBc+lu8`P~w?@NYu^W_R~aZ@W1nhUUom(5`ijWxe>ka=fH!|3YfoD~D(e zK1>^y@>Db1{)SA1>Mq6i%R+9dP;Ww%ei!gjKAV3Pj@t5-)Ta{T_-kmw z2!nif`5c)gx;g#D4f)6CaKu;@VGkHG8O-gxDO2~5K1}D4Tp#b%)Emq#)~n>x`+GMX zJQ>33&A4u6@VJG#Bz;<9>zt}Ro?P*9#huX7^PkT{osrh;#bjCc=!FC$o^UqQZe(o% zVrbmi$>H{6>%3CWTrP^&{H}3h;|6qgZ~nYH%zx#4$Q<~uKE__EqLC0$1M!zCR63K8 z^>UB9RLG$>Dj~lMUURYK!FS(?XHUAwz(~55Sg~FI@zc44JbWC!E^D%Ro8+jU7NCOg z7A;+R^Ed`He$+ZX#O?V;>VE)%HA{LGi^dF}ydD8v^*j`>6u6McWZ$}`lz1b|* z^v&Jytq9ay=DDekexwNE4Cu}D*XhKXNztDBDv9oS{!>1eMIC|1+;5gDQK z`kyY)c!lbZpvC1`X~1-gJrA40u()Z9zV+w`yP)DVbBDAMS<&2P$;RT7!eTm09sD&ZJ}eXUR18b@ z@@X%Ji2+ek2+jLjF-#>f>LzefIHeZ7`nz7B&#TP}vpjtE$*3wN2cSYS$-|d8NFmtE zAPiQ9zwR9hEb(^hjM9iNtpzV|RA@BFtE%QyJ!xR5@a}M+6$e4A22nh8+GzCcL6dJ) zg-)nEG?c1a08r&87f!To^cYUSnI8Pp=dT5~!IHWia(gQujO?KTqR*nR{UA=d)(_oDL`J`|@VcYn_H})!~f$qHDexivb`C$HzLT zc|bE~GGa7!N>4{cr;Ka&wr};vXExLLfcLHMH~=d$t9f`J+`0j~3~oXjna-dmK3#j5 z87|(cNJby+X#+f+LJz{5=O6Q578E73s#3vjasN&|@xZkBP~RR47z_ZoN~7oXS~n1b z1=|;?uS=BySO>{o{H+)>jiSnyo@?(zo$Z9N0Qq@H`G51zN3G(Yaq3eGc1fTOHT%M-XgrVXr@ z3SUooOna8LZT@rB6)#Fl#%PUN34i@))bqPhgUaR2)q$I*{7HSEk$q8aslR%Jxm0sG z`%-@8m@OKb{ToHU2Y8!=9u#1AsfSD;Hi849*=+8e9d;I8zEF`x0UT2H;TpPqhCY(d>2O%FGXAaTUkBX$(h~&u%~JzgQc_9d(>|K%Op~Ncg>M!*RC@X@U&k}M z3Ucdi(wy4)(r3Mi0zw5-jA!r{nXHepwWUv%1Z?$0jGD-bqBgPQuXGHM@ z2sSH6AT~xJ(BXc#6Olr(6#tFb_|6ZxcQnw#)a>-rJ=!&7mVcqU`0$c&7^-G*pna@* zxN(ZN)vhNvSXsX^aBbN^83z4jj_?g4Q2tOlwUl&mFgUteyi<&CMCiHjA>WfrKNX-H zR{g$BVwq|BbsdbjT4;wBP4~q!1BUU+;*vPOf{cPJ^qo1 zFV_BJq#wQIk^XHP{f-oS=ZQTY1j3r86&CBM6jXLX3CikyZSYrG3VqkQvmZ0^6N3-J z%(y(B=VOCIgS5q#;{;g<%RL0|r+)lCxYxfk@ z&vA?&#P_&XA~oj6KmFus7LMCkg4H`6eWj^d)=9;hETm(9l1hIXXwhlLh~bX1xI@|geOq^Eo8_L zj>vL|D)`11yW%9YLS8do)J~sWLh`9XS>9yv0jbBRcz^YxVZN98Pv%hgAxc28w!Wsc zl*dN=`2J2Ax*>60N#K<1T_`*hgpL&uCDwhJ|R<1`=<|lJG2QcILl`L^+Sw+_|>uX4`B8{>HB<30> zn|_$Q+IBigKP!2(@t(30LR@Tv4bBe~>zbs3XsbAanB4!4{bn<#q9s-`*T6(foewpcQbQlKYowGj_jnXyG5J zSq7QkNAu9tDYe#%4J6XQGz88R&9%KpnUJ{1`61Fk&g96hKAMW`CX~2e8YqOJu zm?3l3_$ZdG?|&n-FjTSt_1oR<$Gh$+kxx(IvhOrs><`alj1;a<{R#0jAiY9A-ER~u z-Qqd z&BukR;D%j!EO9YThhsCPcl2a_twcO3DDwInp0B3<`h1IC7xmP2=M`@--Z<}$OD2#2 z^`e0CG>*qdKsmddx36*gNqGnG7Q|A<5$KXnj;@I;IIm>g@=2GKt*hzScQ-bpT>+5E z3gn@DCy4v6RKi(u&cVE#hd&cari9oR>0~~2zxBvnn~A-7H}m)N)0lYU+tcm}+7=4P zGJ$vVNch8_+FCT4(cUJeU-l{jA_Q`Hq?wv`*{0kR&w;Fs^0@E(kd=b>x)-&aj%T|A z5)`R}OKj$-6BpxDoS62MsYMaidx77X%oXfGO}rl76SWAlUZU4kf2WoDDzjPM(I?{` z%MU-HY2L+3@;W}j%E(nt#Xlu1hLnwCXX)4PjSr={`M6h}d-OjJPVY#nLc3_|C0Rnr z(LL{8lbHgppV%8KtJx*sMvRAi%(fLiWH0tz?Yqcf&j}jCjs6IF1|l4c$=8wN`^^5^=2!+7mF7H ztIYNyhup7vA6>w8ua4b$-93fvJ^?-!o%Xn!npeim<2w5V6rMiWWVO!)l#)UnC>m5>=+PlI9PzmooeDM+55M%9ff?__ zSvMa=xIq9x7#V)*Zbn4>hJSeNv!!c+ZN8}VS8d*y)I=kd9UxJAB`ll3OPVs`u^yoV z2#Nxm42ilbrK67eA_uDL=J?1Y)+z--IO)m3m>=iha!M^|u5+!I&dX+78F~pws!}gl z(F^CM2%*u!3$IQXf0L}Pix<$T{K!uQ_egZEL+0ju=P$z-;fuOFc;T_uD}&5Kr*1Sj zF}=X6jof)dnjJ05;EtP^GRs`_TA!*AlykY$h^Nw*Ke+wq_Kn}c9ql_v9H=`mZbeNM zu&nhZR?*+eR-|qIxjH3rR><7l;&R3UrX0oDo66KKjs$~ECDvgyZG=L~8yXD?GP>LE zakH~WaPf_xxl9tx$w=|9_9zR=c3+zj^y9kP(yfb$gp zczCw`&xa2~UBE_(r9cs?bh3g$+XFp`upLqud18V>C+>0c(7>#h?EM~~ja+7K(-$^P zdpjd4`OXP0ltSiHV8eSh z)pmuu{g_+gb0ph%)Qew2Jv-D^R8p?GknBJ8AI~8d6-dUf>w5Sy>>#`GlTl%|PL?2W z;~o8HraO-U1J(;b$bjyCshJCn^J)^F`={AgbY4X+D9+WxwLW)P5WpsQjCSdU4v6RQ zv;1qf-6wW`nZ}-fWFm2iJ?=Uy&J!&)J9M{2=Jk9|(vH1=RT{;(0s6?reIi~21W$TU z)OM5j|9HBtMOBq;`AZ}TkK~|$2uOHSqM(Q(f_(k0o@<{w_u4ZUuz~K;Bh;uGjVo~+ zXYk5hwm5>_%g}_I+#t&JkNCFFY;pN9&IWqa*(Mehiit-Mt3?4o6_} zyCt|5dan6<{;+cC%udH5x!7*r8i;?4!bgA#u6-QrSEyUw{1H=&+X(RGBa^=$KZ_HX z_RsPyyc$9GXNiVBq#5L2;92He|DM(O(CCLNgiN4f*JaoHz&z~la8f`ax#m z*~-M3UUlC?X%f5c9#6#4Q=ll%RX4~|c_r8UQ1K=t4DSQz6e z;C;j=iLr|Zv;!`O{UScHZ+^9FUvIR_O`py%bjLx-=I15APPu(F94a(C`ub>J&Wt5J6&Y#`DJkNbaUu(e+CFml~U>5NF%PgJV_l~=9^3!JgN9Uvq za-A}A&2TP3EOg5ZO%4hx=Fxq0eE+>ZL43OX3 zB9?wU0=#ZZmygCawu2_NA->F+qX?r`?Gxg%ou1Ua?5<;!csZY*OKj-e3Y7QO9@En* z=+gccq*pN1KgyW-J*WBNa(l2y4|DRTlcxT5z-uCVwOyGCty_``DfsK0k(9}s)1cU?;v&nQi_U0D*Cx81pF9n{5~K$ zaFizTzzRD*9_}aVIPfjIgrC@Z6E79@cY6l6(0hZ<0*!O>DJ27K9Jp%nY^vWymE4sm zze*3czdHS=w%y$&CI;obEaERrL2zhZYJVCJ``7aE7kU?*on!M8RMqybDfxC0PD^@ z;hjEs(yWK#%-cP>!+Awp%$-Xoa#tzzQ9t)pnrMAT+EWVcGZx|Zan=7n~Kzp6LLQ-EH}@~$oM+eau0OxlJ!evu zr$>E~efPI}0#m!Q;eOpfpZL~Hk~pZj>2mrxUNfFA31BKOuI2)_=hL1DutZ4e| z_Qdik;km3yvclw|_pdyAdxi(gDnvh1k8P$?ZzhJb(@DyJ4N(}$Fgcl5HmJPviW4Zk zf@IB6)w6SrL0PFNYKT`pgz@PD23J-3?o6kc=}PRjlJzBb?2r^Xyq(qr29tdWqGgLO zUm{kMMWb2RCH|}Kwe_+C3jbV{A!rZq{&gP?(CIlJc>4>jqYY|dBUu(5_B7=K@m4JT)i){y!qCIq>uLPE@DCE`x{PC24Cd&yKN!emE0c%KtpV2`i}hD z7d<*ZpLh3D_v@k0aWl2Fzs|CgX9LM9Fo{xdV3x+~+e7@$!-jTh{(;SOQtzD;Zl7Sd zd!!Cv?3O*r`@Wv-WQgUDSVc1Xq)%QTjli%u><4oJ^)^O*8Xjux1Xq6Bzg;Fb88mZ2 z00b|uEiiM@&ZUAxj=)F6A*{il>H2;rD`2+&oO$}*=$=hFO8Epe6t)(|IHGtNSO0L+7zi!!W@I;dRR79(SRPJQ}%_3OCgzvzT zXS}ioR@-h!Y_RMO?Rw^+j@MTgAWWnMn{wG4pITX;6)2;Lz!ddPdO?CV@$dWd@W}4u zeQLHVKf|b+EsMbNdiKao6OL028rO`z{fgJCmR(4gJwSqer%-0P(_q0w^}~5{Mb(hu zozQ&p2HPdoPhg}mf9SF3hFX99k$`>)!tEebqEX|v!O;Pa!Q&^`oVLBM;O|CT{&NoZpu-rF(t>mj9AfJ@narLELjxB_m81`AKITtVcu4Upa_4 zXaB7{KA{Ru`}n>rlC`1zUBXe7^S$A^N0LEW{)QeTHJA?qm=#|Srg_bGO6Ht0PD|-I zGyQ?wuXNzm&r#p{J??|)C3inCv|f2pmGji|QcLcQn;t%o{rvM6ZW?Ssem4A{TGx{p z2vr3u=ImF=e^=j~N^;Z6r_-6`BjbK)evwgpBmY?rr^n@XAmE}X3)82NX4%g;I%_CSzAb2T)fcj>CPhH=lYxDAP zkkD(($hhJ#qOLli(#)94XBJ(bg&~E4+i^=^l1`c=HP`<@#Db@ zujH4%*b?#j4(#e?bP?Lw`ks=uHO2*R+R~PKj3?0aDNDjN3fNU;{Ste|HF38fG2iSn#O z7+QdF?WeI1+hBuIsjbGXO!a+!2c%p$n!@)3KrUTSzZzu=;&Fc3tcrjEs1%3!AptL? zrxpU^u5_>jZrMqYAZrJNN-?KzI+&F9$^o;d-QH%RTmsxmvJb@kvoyZBX*YmT1;L$P+DC=o?Y=_(Z$O`-|qm^bn z99t7iaGzoIg7lD#5G%;jEAW-~^t-UBU>O(f_ynWZa--X%xAR(woRV5B=%%>yrikfr z$LsZ-Y28N?Rb}36vio!0hbL&$WF)ofry6r?U~g+auaVYe&szbBKxMw*CFdI$htOYM-pBX~nNH$j zkjyp|$%(rz(Zm^UQu)QP#D-9RHUup}#K_N27EZu%er0lpuC1th*q&9qc4grV3zLn} z&}3RkoozX@s#A&9;Fh9aQh)nBKlL#$AQJ%Hvoh*Y)C{B`TLq0c>md$ZZvBMj#888; zu5FC=iMLAtPDhGWRqIt;Z9nH+{&I&X60v`vM57L9?Y6RS0Se8!ab=jE!n}6Y{bl{W zX1bUuw~>?kVisKw9iTdVMr;P&O=0!*+8OvsT{;Vw-K3|mkADpo(s>2jcH)ChE^7{{ z>*~^mPQ)XGIFC>Z^tI^u;?c->$pLHwE)jP}3M}Ty9r}UWtM~u~zN_4TF#b0B32P-_ zmXoK+8kM&!vSYOC${R{#@py~hhmRVhu6khhAjABl^)?O~;>akAc+?hufBdMC)gB&2 z^)0VTD_tR!Vwmb!9)t7P%juixDtZsd&X(c?{9?}e;ed1n_n<+)g@+(&bU~S4zKF7d zG;si}MEk^Er?-n=`-$JJBPgd=o08M;}#_J*InK3g%*dH&iNR+d~ z8Wy0fS(xD299D`)Kid4(gsfO(iS=sUG+vwjMJH2vP0=`aig)I1M|3{`iB`qz>sQ~L za8MZl;!Vp>TA1MwlE0N|)hx~`m?3>$hxrA5Ea+zsPExfBC~o)CTLy+LyzZCU*LFbU3yonK?sy1@exG zh!`)@)5VmaP>&1sKvyar5lKZA|Ah1Rp{8R(ht)dm$RkXdz461JNd6A5)Z=qMR1>*N z--dILGeXDdgCWHrEg|Uff-zSsNz=L`UeOFavPyJU8!kcH16#o z28Z?ljsw{|cqRDdN&~A(E|%A^B&&eWJm4nR|Wja5vCAVUm%JbVO(7Y@1EsM_>lAFX(~5qjfyu z``;@R;j6eZntnf=34hjD_|^v{lRv4Yn0VoVT+MO3_JIX=k;O*4x7e0*v@J?I0ZrR$;J*9%C{~gA(+{b#8*l3xI zCLiDwsN=cJJzB3Z+dM!P+JGImMc}t1Q&-_1pQqeP&%gyrN_G`!HzYljO-_5tH5RUI zp?%MNO$Uyjsog%h+^(9i@P}4x5TUq`(!QDLZ@Rar#00JHHFBhxgO^F(z{u{~ zsBc63Y~J?(BY;$o8TQ=4-6Ia8%i~^w_YDx|I+gM zxr?3$m;3e~)>JWL zphdSQ@cbPCEq%56dl;xTz9_HkHz}(J@Av&nn3v`-KxP-l#Hq4pUrmbMN8og;>#x1N zC^-|?5ycGMusK?w&hFB^?yge$^z(=&V4s~=W>1V>K$=AW!>O4k&QhrWIeUC}M7G$d zC|FG65BvV8p07GFKg}Og%?sL?;pZ{&9Jw&Vc}hDN2lNTy#0iv)oazxBV2$LuBa|O; z+`oSY&$F08pcDMtxc)u-C8CqcDgR`xJl-xNxWUWu2CmS9=^HchDtjqP^wj+#b~ zRVs*6AE>q9pwqfnl1-;yWb&T1EFVv8W)8$T+-~dS9jO>gUH6y0d_ey4yq^M`ILHpp z9Di32vT3<)(=ZL43#-6fi2(;8$6;>kJNtvUDL4}kE~x%KPtm*9uBKM7n+Cg;$SFG@ zHD+6Pov$tSXBZ8Gp@oq1kDum`Uaih`vklTehLa!SNpf-;djOv$ek10={qHJ}S-#uO zonL6t(C+0EHSgm)nq)zIQSXaupZftDb~oPg0BBP3 z9$j=t|8@ROB>gSAoD^Km^Bo~_K_*&y14WWlZuya(J4u@)FZvTCLh4Y;=ZTfyk zNMBjL@Kj#P&&3dwBK=+eths!DCfDu|ea_zXG~)O2RM@mf_MeZrS-!}SDZe5VSIw9>jesQkK zMcl|L4O(<)$op1KcJp-9l8G+d+$z*#4 zH85(w%3{lnf=&V3>A#7#ko9Z)HKWxkqp`L71!_SQ$6wokYGecmzuOOyer@>xo0s-0 zWt}H-ACan0g$5p6d-0vfq=9m5yth$#o}VkWTah+k<8by~E0{314r`^tITK zJ9>QP^QMBX85WGLM>ZLst@ZknRUiNaMC@MF&uHcR)Zcu!r*T=742j?yau_FxG-N5v z^2$3aLT?z8r6h#Xnihm<{YA@yXfHChpKNc3S`ebu@Vo)yDC`+O`--@z$~z>p)1l-Z z`tPKL2Bap&PbYE1!`!XB4RI77ji(KC#fI}$-|Xlv;I0t1E>MuEal80X+HF zFD!h&?@#-g{2Q^C`1ksEMGWf6SPdxtcFLs<)ShvabLXNeF@*)A4o>}nfigc%6`z>R zx=s)M+{=dg(NT*aTWRx0&%M&yS^Dbif&c|nTGQ;hJJ48~?uF^q#u}JEHDOM-KcHgx zWVQ8imp?j*ux@ixJ=D|pSw|x98`td})!%zXI97ybU20~tL@2&I8S83b|tr2xlF^fL^9@9d^PwTG$; zsHJWkq#P!&?jDytQ)wNCbpg5qMPHPdzSq-9=hQkzX6gYI#pG~1{2pThNG$q)Sr*w7 z?C$QwfbR>vhJ?FF`DX>rP+P8Ou@%>on15^P^LjjpN9uHhwi^?Yk|OI}8Fe{)kcMVVbXXPbp?v~)Jc?(Z z+}PNX(a6B_Qb$%w@jh(-s0Wk8A|8{}#w&J2@bC}fPx$o@1&6q)v3ZV5H- zjn#Q|daAM^Yia?~T)de+q}R{WmA?s+h}RwT(SLwC=$EuFRdAEPSn%nBtom}&WhB10 znED--A?C!kh6TYr)8vy7x~y6H1@~7ynJ4Ed;?v((eI?el{_<+^$Ne?bl9YX7rn-tG z=Opm2APVt{KNSr8{3PTeN%YZn86P zkaUQhw6(Kjv_+o4B3A=Uf~Lm2a5V=Gwxk+1Q4HlCJA_oM$1AL$iASGbjXHTF7B}p} z*O>zI1UfH^->r@#0Hf*nkWRbDqs9pr620V_w!d*?<#pUG)(|Kq_Xmz7HG zu=Q6EkH?SaVu77@$F+WR?t6w09kQr3aKA1MP{b9L-lTlJH%BPz9%RTYA z?T**qC8o)&!@tfd!xQz6s_x*G;!qRUe=A?ly#&jeERdB@+TX&MZGkw%%tQn1B6OcOhG|&;I6OaZJP#cVnr3Mz z!e3j^^1tsl5|*##c&j0(G}($2px^jsA4qmOdrZWCATvq~cxc(5+Qg{s00{tdT0yUs z2rf_j3YvOGUBuwvf21SVWGncfo$#-GYCq^8sMC&nO5+8O@Mq$zjDup9mQlW$tW zjs1N>YD+n-=chZ(IVT3W`+CLG@v0B)`K~LC=HWDq$??a|7moo*E(QMUc##x5S+FfX z`;E0Ni#D>ulaV@=ngUcpQ{-caeP9#V2jWZj`2U-6qi(S72X;cfB9OW@56mSf+3qT~ zn`!Vf2ocEN->A-vkhSf@cN!n}m8`U#U19?okMvL1;?tA|o(A418}z9AyHRyJR6c|g z5|b9Npd8Sp{i?6M!VGy@<%GY-;G^~u3!Utrrb{ze9w;XE*N)*`h({AU4LSAm^|4H& zE6lE8-3Pf2`9gXcZd)Iu{X*K_j7StYvj3o)^W=H6dhwF(Gwy9<)_sh!`JSPBlA`o( zLyU@HlD(`EXIWN-!0zZ5^H>m!LUr`K+=-FSZc9+7c){_^%mVeAMS-f!hq57S8@QUe zM++e~U@|%xDRo@Q8okEdML4H9UDFOm+4N-2N1)yjOzwd(k_g-<>sCA}OLh#`T0ZO;jxN+nvlCMA))DUs_>A|riYx*xgdWdE6MjgN|^uCVjS{II+kXNAG*$yFru!-vdfC=7Z$jsR-2^^Z-SW zC%E(0gqw$+$puGakSsZOUkRPFZS&5c7|1YSoI=eWhcVb-kgeVslhqaHAAnK&8BPS%nbhu@yCuBa<|AZ50WPZqV*ShQI}>?;;b|1fUTQaGJFFE};FD9M?hb!?HVm zV&ey8Cs(gTW^guQBib~69=}TTo zqW6&V^n1w32R(0q&{gLXiP2@nW56beHtLUqum>81KbVC`WjCE-tj&qYOg_&(1R;c0 z@_%m+es1@cl2^m4+V1lO-NNVMl0i+-|3&kUxg1ZoA=Lu1w&s(1$`(|l;=b?QQ#2=Q zwo%vu6cPQdZzsNx;k|Q*2?v1Ke~tz4=wN*)Z(IfYTy*Pf25>35M~U1z{Z0|&$?{X* zpaH`?zOAL+@X0$Ku~_1J;ADSmZ!{GoQM=0u;>(l@^u`(2-Lu@MXCvO|mmPFd)`doR zj~W&}osHgg#3fC$OTg4tn*06Nh?z(5rM<=Pngxo;iXvFF)orS-JcI) zCzi``&#E(=NhOAQ>Oemrzms-tn-`xtjlf$>sLIf*LcV23|2;%d)4iU48(q~$c50jb z5vskPZ@B`~?m>^QGW+)Fd{sj|Dpy+$mF&ww@cM@J(@*+Mhc$yI0fjnzB*adIBua&1 zpIlh}BC)$PaJnHdt@#ltg%+Qun|iw%twu(!$x?{k^dB0vm(O;ypCZ7|`e%A+zZnXA zUv`|qULD&5qP!e_6gxlo zr8=L7|Bp??0Pg`?ifyCHGlULuvyCF&j6KfTR;iwArjndi?&SeMhHaul`- zxGcZ_g@`y9SUgA#nrgSoP3y`Px+Pb0Vr=WI57-y$J8^Kw8I-P zbn{hBSHFHdK>gX}ivOrPLa?O}Z8u|hv%m(Y48Xd4zLHZI^i}8`kSVEr z@U`1}3plTOcthtyg*72Z$GDS22#)^Xo%x!=9`tKb;{akr48uJ8U#Q*Qz0N+>UOT_p zDB~wbM$|t_F10bZa`DQcgM?M$2{y@CuwTtG9vhTAhg6th6lMgEJ&D_^)pe#3|iiU-=4&A2U!#XNys#zzHy!~-}?{H!~{{f z*G@}eYG5R#agdXA#rMCv43U93?RN<#oYA~|3J1ArqL% zq4BE!E`zN+ru%&OE?9cTFNeYlyDw^xtv||nw?ToF%n9%maShH7lqo(u=p#t!Jek~6^ta|cp6}97%_m!cS!|n%%Qoa4{ga3Uxm-3m{<8~y^?dSVu`((O`&1(luluxvh-Ak5V zrb3i)fw{n&f`fuyLyq5!6*Ry;R61PKn45PvSrMcbb>UV4PRT=J6{Mmj+cUEFpBlB> zTvb4hWbI}tmL*)ovPQ}cnWM+?yGW>~6_4Vj&kFl<9kAf*J@}##}2~Xx@}wK`r^mm*;i%j zhLtq6Q?sCmv<#D=eqO8DM>SGha7poE8CpM(j4E*^ z{s=A3KfMTjN;K%3x_c^WY^EO+5txs|6= zDQo<#*SuO`ueWk}NVooPuaGU@y^tMASvQdHv3$&1-Al=Lm#5_%*PVdW^7Gy!`K@v9 zO;k$h?{Y5BIxoaWHFEVw_<4nXQ_BQ)^ec`?uoIX1cl`86?CSPrCz+%HPvpb`>}7i+ zAI6x_*9|_hG7fPDm5}QnlV7lT4G@v=Lg2Uv-Q)q4@q$@IHo8ZQ7^rk*2Uvd!l21Zg zaM&y1Wg4V94oapvs|5)Zt_m@9BGe*8o@A&`7Vr$SzmU0jLHeDS_a|0(5f@AEeMBNB z<}^ytqR8)t!(0nykQyTQ@K-A~rw+oZ$97kOtvXD{SI$ria;fcu{#jiA0>j!>{=?bH z?$QetDkR9I$1I&lzq@;&fqSm|s^oq_P?_91@4Ib6t@AZe)9 z^_6=d$&>zM8>eA#oF7}3m899LtJAgp+c>Qk{Ig?rks-*p{g$tKysBQbCdmDO&!q$~ z#JMp6a#(VgtXo62VevzD4jE9|?TVzzMrQp7VSVP|T4f;U&qQgcEY!>&EJ$1mrbe%d zzU+$qfxL7F=Siv0qvrpch4qSszC(2Y2`Era?RRFbWJ&B&o|#8F049qZ>Vum`s9#~{ zhejEYzGxUZkkE|mT1QEw?@0Uk(7|cugv@95Y~`G~_qq3Bw4~6G-`t~0b4|ps;SVGf zIsl4Pyl zUT3xBs-}rGILX+&kB7S~;@{9G-%Ez+jX?)_D_#(hlzvkXpSmTUiTFF@iG9BP1 zisOYTKt!bF>(Pk~HFa+V;hd5)s7`R{7tC5MN9p3UA(sX0$kJB{FP{c$AN*y4M<~j` zp*q&s0w4|dWEh=U4nguOenX;A69rkyy#`f9y>3>qrj%{P8Oe7&AYL={6hGJfvu6;| zAZpw7#onWDF^i|*?ie%v2WyAFz}a)9^46|{f7I7#`c>#^J5kQ<$V2#*3|CgO5UfYc z;H@6(yYIMJHqzqqw9MMbmVAu01u*_`}P2#18-Z!w9)u{5I@P+;oIBS11dd z()dZbr-%xX@zi8T)q5z&9O1LF1>hY#dICPo?Y=jrLBH4f#v&Z{x3#q%!l5c zRy6S^MS2_;rshpiBe6JW!8P^M$$bn9^$E&0bh4zrT3d{b0_Jf zT);vE<`ZXd55BA3t}z1@qE1TGMQ=9#n-Oyb$#Uol^(uk*Ju&m;aOiYx|aJB&n;Q^UWJ zEEnwVi+lCl2?jo-59`=}U(o_9iS@zQOE<$}pTR z;>(e*hmA81sq4nMx3LHjpiU&2SD2l;MKke9gje4%$LM)>?hS$IDt|trNN$+eVz(nk z;2M*CQ~If0MR?(C^5GSf@o; zl&yhE2qD2YqybW?fm$A>xXO>+zR8O?G>`-@B=O3t_iUxQYQJi9<2k@yu3^orC(`L- zISW!e4JqSi6UD`k-dw!7RGd=>2H&gqYo#hI^97Ki6Kzsjk5{LHWKXw^* z_Owev^D3>0b4Ob|-Zxdz(LKv&>#z@!flTK|I$zGTlRO12`@VKK4y3QKLzB75fvB2T zesYuTZuj1R>?L06gr#fHgG9w=fgFRpoZM4@0j|&z^(g#KE)7}X-}kt2(K&`vPY~em z+7%304-Eo(sp87B8~W#)Iu!QM%y8fb+^@49B=z$OGHkA|nyH|I9UK>UpaJY=& z&j4vuM^AgCPJ?9hDl}50B8H(g?C=W6IUYMnKtgn*N7?uL*({NzXT#%)W#ABTJC#=*y z2moaU_>Ed+j)Nv`dbx$9krCYtA@`JTP|J4yz_;xJ8o#1K=ZP%)b$xQK>i5r|?OIT# zja9IS%?6z741zSUU)WQrqf_x;$xZXQsSZib#^^kpLzA=mk9Z-E;I#{ofWHjOM!)W7 zVf10lRy?y#ObP9EL=xSCo84(Qj!Bv<`0SDYg|?NPb>tdYHknJu!{O~X>P!udprQWo zhE=5-_L1Ce)Pyx}Z$eihd^3~y-Bc@%heOMwPK2liUs@xj^T0!$z_|q?RLz!i#VurI z*0FvHs%J4Bp;=z+sk{8V!p=T?da!Rmy^zTc?hMI8`U*-(+GrvBoHZw66;VSu6+Qjlrp$;vfysZN8+=F7;*tm)W4dx}g9mxA>O*9eGA;-o86V7-ne zO&4ilGu_L7*e6K|>veeSKq|uCj5Y4t>wQB*kO%C^8#On-bx*VJ-962F#boDHj20W4gB(@X#!Q=C+Pf?cTAl;o~^bX;nw*brqE{hU4VC(rAZQGX{q$}4sR!>RS zvU}ao-Ucu;*4v$haBwyB%Tbmb{&hO->2(i>2E26Od+dy8DH<`;qsQwmWEzaq1o}`O z${x*l6=!rL(R$y!oLvhL7C!uhOL22zwN5+zBmK(vMn2WnzG4{RYqDu>aEMP1}DReyx8>r8JT%}xQ^Q5IxuZMwcRUI}wxT<$xpV?{~>2*Y+3lHti zlvLBSCvC%wIPFk@zhdWr0lj^jcNzl{hFXmkX3gReiHF|{WIFN%0vX^-$c0w;C9;`C z%;9*soffCUc#~BKhTF%7jD!JEpmw`C^?XygX?Gt;OuG;lN0EPZ*B`q3>Wue|q56dl zrJ%H-c+aK$8IDAnF8iif-)tSRu`USLjxUst60_;MCxhoa_bZA?IF6rL`u6@k-u*pjlhvQV+-NImvaiIeA-S_bJrB*{zPqXvGDM*6Ytsv^ zl%WRdLX(a8ORjhPJ$~*d>s6cROg#01p+M9(n}l1JWIO)P6?f$HxbcY}!iOq^G-TNA zA4Tb(8&iY$feI8S9tJxAfji`L4o=(q8&E4~`INJ#&i`1f=Cq@rc@RI@N{yQrgr>*- zq53WoxmaBaa#^RzXTm4asJ~oazpg6B?Z|w>X;grzQ8|cEu{1;GnP~Oq4{q0(C-bji=I(_5?5H*t zSwFQ-#O@s+ZQc)GTexaG-e$<2cDovSYy#Q0f3tr*qaa+SnKo?v`x-O%5flB$R)PiV zDG=rYBO>(53ST`1(+9Ms9@~op*zB8FiZKEs>~!bn zMDnEcnBXC7#^ibz^ZVduw%e-3p5ym{c1`9sd_22F%Rh2Zmd2A-?Eo~Vcu)3JZY}&K z3X}mIl--bx)a3iuX?ExFDWZn4;E1pFuN6V>i_W%VJ&v)z|1~w*N3cTp#Nm{X>$byS zwm=etO-_J*-yJb${U>2~gD_K=)m`=Fl_{#uCRvJcwtK$5=ds1_kCYfT;l1$Ry@BMg z^%v+mdi<9@jy-oY7Y*!L`7&wk&@55hl-OR6W?5}R#nXcBAeX6xier9W>?gUiWX6G- zi-V}#UU?P4QwFP}wz43y0EQGk6R|(Sw*-qUe&L0@&GYfaU$Y~GoQ zsGb5{r~YEx(SR_^1nH}SFyFBM0!A=qWRE!_>^%mlCPH?FPlXeROR|G7RUL!VyezW- z=Al1SyZs7FD|q2ig}S;Mr^R3Xr&?rAv=Dl1pe&1D(NhZEL+dOwobY??U5a0;efPw> zz+D9Hv$>ya>Ue%qkNLJ{jM~IOSwSlNEWWm?11s`a(XwIcsyAQO={@6(f^_l#CgLD$ z2Xa)W(q+~Q4m!;K0puLS0wvv9j}`4xzEQ{d>$Kqy zH_c5@(QrBg#eL{Z{wzS?$eJprTmmlTZhN`Vi|6GiFyspJ`JLp_?HU?JHq7-iI#Ri&cb>%!`OA zL4PRgC^`#C0kZJGBwLoPVjpjZoe_Y56_LgEd6dkL-o?}ojObkL9UotI`n@qUrsBd4 zA}6B)MJ#TJ9(7wfwSLo}TPI385-5CPsiXnUCNHOiLn=_HQ`3F=;_cy3mVfZ95?dlh zC%eIYtcKfN_MVjC2kp(hK@1}^!IpaZLP&bJ%E|CS{_=Ku7rxVgi$z-hR6KN)v#~Yw zDR$;YUYznNj{3m_!_s-wT{RCtnNd=dpf;~n{A?V`gt&_kB*}$O6`O)k0H4d`YyTVJ z886Tb%fGpYS9N}!=U-D`Q3&m!p45MsD%sa0`moNCY#D*=NVhk1)!vXEjyyD>+iyj` z@UN}TX6n|!-(8d89Y;Ugchw|n!U6V$2v#WJonpa7R3E{L7X_IGq!Auf=^v4hnA&|r zSXTE?ZbAF1mT@6~t=##G47-`+Vwk_Iy95ojUFtVa`f0u9;{)Cn2!}t})x%FU+S625|z0?RIXshljAxzJ6Z%Gn4;HOM?&%ei1N2QcFAdhk^H;RC>PmGY!6zW*vKKkW`GH`m~Nd2rR`scG}+0w06y z#laxNE@u!#GmOM7I0SIsl@n%444my>MyA=n?b$om6j_a5pUA)u_CRL|i3IL<4zd^= zHFP^Ez3JjgEF;`BlO#73b0wL1|MGs?+FiU$*qQc*7GKmy0PMkX0WZj*I9I~Zzpf|nn&M#WknyEv zy|7^$BBCtj_KN2F^Kw0kq|l&rCwCD`)T7Um=Zk%sEvLiK@ClGh8qMO zQmuPDz$t<|O(B-$QA)vD%p@fuSM5>$;;a z=f`@N?HaajFZ}TEo+2L5zuY-t%rycsQ}EDS^TgY`RZrvJwE)F>Fu?_`n`F6G7w%P6 zp^}T>!m)5gm7SsK`DNRW_m8h$_w9K2aqriqI%o%K5xy^n&?*C-X*hPs`|A+yBI@YFMloZUQp+r0z z??;kG%)JV`wTqQIB}zO`#!0TL(kIyWja`B5$7soP`J^v{k_WSB`!twa;79_4(Lio; zIEnG9@*(u|9L*#ag}>nw?zh82j8*}5zmbcLL@f9H+pWsRRv(Y%3-gMdOSxrGT>^jM z;UZXCrMPFtvU#I9frvc&Tc5=(?c!9zy;9;SsjtFYxfM|JT!W6LbKd!blzv1Cnrq(^ zMBJ^3A+p3qR}GxF9)JCH5n7v^MsUCBqpxl>4Gul)!aZU#CDH#A7RW*v6^Cz8MA=(b1ydHRQaJ5?krW&U}L6-OzjT%7QKCWlq5K+g$m~W*4t81W++> z;l~c4pnKY}@3V_tg_LeSwjO9Z4sG^Zo0oYqkm7KLdV5vRs`~*WHg$)-l3iu!-h>t2 zb*gc(i(4b%CZNKAZ#*wtq&sv}lj)@}WVJ(3<+EGU$f#O!s~6L(kKhmX-rDPR^+&cn z=0}fw`Z!Z&z}9p`FXCM$r7NmG`w~M*;~{xv@V$&rPOJhwY6)8+sbLVVfxq1c%tPpf z+bJ2iZ!*aSA;A4XV3LN(-yx>KcvK#uLrehM*gN)^eI(+d8%x>l8WKbZiN{3G? zh#-Upx^ti8iYvTM8(}q`_Q0*3%=R@gp*Y70w8!(y`hV=bd%Po6l{TDi8*LiU12!O{ za=0`$S1YNcDp8S>N~Kb%T&hy3T)}~)Dz{2fNve`m5-;>YP;7N*i8??m z$%1-n0(Xe3aZay~M=WP9kzOH)Z8orV z^5k9laibR2xe|%1%BB=<3c?sU$BpGYm5jhm$(1cY;8~(JCkmg>Yf{E!Aol=XQ`5sm z&gqgax5jp<5cRjkRK1f0?YR@`ys%JK}2H^h9T8b1T(6#t1?c>XHhnXPMkoCz> zx+F_Y!1a2~IZ?c-mH!Fasd`dUS!r9}!*x6%QoaRG7Ghjjd zU7U>*Rja1VEbNQZg(8A%5LRv#mCCeV!gg$!i)!#5P)fI**Rz%qWUNG7mjr&2?jSNJ zQgS58Mh*`d9d5&^08f}hOqK=IShd|_I&rEh#iKQ1WoNvzMhAe&nIR&HW?rJsz?Fme z$95E0WwTIJ=ulm+RshD<1X7Y?uj7w+l7Of-fsnqH+|Olv_of>70oZcWo_sIAv3q_d;Jc}^*tk6W{G z60nR0sgqqE42`ZS3{780D0Lhi0uVDyCy6cvwo5uOiGbKv^vwN5@^Q>@;T#1AZ=L40QWIsy{*aW-8aUDyUIBdOpb#Nbb`W=bwn^3m9Nr`l`kS5!qk6)EnNx(}2BCmHm-e#V zoKI_(MqqfrFmJ1qgwOUuT@9%5P|V0dXckVXk;o+C{vgvIM|@t(wIb6&l^%>Hq&l^v zOh)m1eFZ}yG2L}bs)=f`zzs7hGOKXKq3d$MH_(A6m=6`Z?Qtk2)yoLl0{#uah&mF3 zM1amDp(vD|_Xo-`M~e7zq=#BCwtykxXQ*IcnlQCg948BE-Hw4cE~|t9&Dr)#!9YVt z)~t#7KI?;{FByyTNhK%E;v_?nqdH9;RMRjVIJMTD7=?0=F@cEF2QEgwgn7;(i{IOa zcO-`V1-g(3w(<(7RIx?W;N6;^*b&GbV$jckJsU698-BV{Xa)EQs9DQ`Rw$<@IkTqK zXp5@}M6tTHwBzm92*(1ip&iX+fGD#>pBNB`UE={`+5-NjUxT4R`?QWtn;I-T&da2y ztM}nje~h_c~If%-Y~6DR6gL$s#CIN)rj7SWwm&s*Nl_86%nx^$`v-))6|*} z(Ywg9Ee>H;P7#us@TqQG@@DxAj6=bsSU~Kg(}heHN!jI$uUQfcA#nBqpk+A8cA6CU z_7XW#-Len=S`{Q803KdRP?ng2Ed<1aCIetWAL(_(W3ZHfjLOz}0g9Z6!H z^cf=b2A6Ze36+&iGhei`y6qIX30}^!)C|<1_b?w?bk#!QjTGs+7DHoNUyllj(%f+94NL$rpaeUg#mxKcnCS!W=6V0xl5=`$P?} zGT<;CS_vkm*?`b528xE?O8K;qcSTDB_XEdW$yhTusx{c`K2o%(kQDl9Be7 z{gYzf9}>G()g6O!Nl%x9I6A_+NGBAH9M(FH>8Wl(31g-x?$M3WJl4Hgnzh(zG} zP}`WDh!%$%0sj{W$CuENyxl12RJYl#v|<=!+*Cw&=w5RyrLemzVP5&zo~q*Xmhiwd z8o^kOV)as42$2bs1js^HD0YGR&}Pe+okA&wjiRE~dPPfUF)20Y&q+NB+9U1F>%gD! z3%a+MF6YcdDQI+6Gh2}bB>Dy`Wgzt1Y=a%=hD2|Nc{f~ck7vG)8jye)ilUJ#o~%Uu zX@qX$H}9-8-|I*!^8A_6*p7mf8P|L01t2CN4@H~Sih0MMc9U$-;mWa6)1{pj69&?9 zB^8WJ2Fldz$udjvfu1H%cx;TlU0#9;K-0!X#4iIoq*0f2voT3n6=<+_)i(XfR-=ye zT2Avu+T}h?NWVBaH<|V)SzMX3Brt1@INR$7kP8K$e# z>L`{7YGlDNom?5vP-eHUYX~s2TnCFoc$SO=Iujth@l>qq&YBMLlB%>)1ZqPi9B5av zBI#6ckcXuK&u2gn&X6b&j`KCxDqk&jLGY29NODApm@R;K09V|I^Uz@2Ky_=qRC+k* z6!qw!pB5;mX=`PPjDdER=d8L{vLg|Pkf1%V;CXgIvoP&x1wa@S>Hz7%s^}M7tvJbKs8}qR8Q^f! zTL_w1-N@NaD%uP<@mMe<2h^++F`GK5l<8D+8l?(2pz0^tOe{7t#jIwU!4ZH#j2@V5 zvD@Mbd9r6iwv`-$zX7NQCLPNls2qT1YB5(KdL}=lyEKyxVV76SIYV!*YtER)$}ZE@ zvF+uv$xtl`G~G@+I2aa`x`c(4gUMa(fpudX3;HA8xRe>$WTA9`FHsOvp-e3#wV9qs zck6UsWu2Uq=491!k?2g=oU&qTVt9>7)OK{7S&(-2y_s&yU*Ky zrch(`9M*$Q4Ct`}*^Rh1iQnbQW&+8i!+xeSn3__nnk&tzB@!_jk-39pCD|Nxv}8U8 zWGxLC;Y1stPv)*S*~C_}J@ikpZv(#@FpsM%2q>mDE+k5zH}v*`9W@)NOnNB{-cVTx zH=C6d5|E-|k%Q~1k{gE_T2jeGv<{i)QN)!s5cY^1|M-CQWg5j|oyog;ol}X54Dv|J z)l)4{MjlhIZoS7N8w zpOD7uqHRfvUS9Eu@ZmV?q?4n*qqk?3Hd&ft(*R-vf_{^o!E!)eFH9&dH#0jK9Ku)P zGhe1w8OLC!Pi;M)Ba$2evI7s+E4@aX4?=FNH)fASu(#A^&Y-0Xbk-;12s9IL{TVIX zHWHLwAK7J2i01(t!l#=FVzs18Ij!5Z0idTZy1EtC+4Q`B0AH2GY2N?|Pb#~zwDD2E zGE`WzM~*pgXhrwLh9ZmQ5ebkE1eB5-n5cSpMq$QTy#{b+E9r46m1ZXSk?NQQ#m;5g zQjnyT3gA4p<#M*rYUbho;IUB0u`A$gIo`>VolhoEZ86DoJJqGrfvJpnuBISaL3I87 zL18v9yJASsfwQoX55=8OZBT9C@t85_7M*A`RIutyhQ<|vAEo@2aa!}|;dT?eLIGs( zOm^tC0**XVaGC)WSR-7=imA`AbqKgbk?>*AQS-c>N#YQJmejz+R786+LV>7*cYrj^ zh$wctvqY*GM~a}|>lSr3IA*YZP>O`S1FT6n`Dd1m%RIybMBF(zQ7@(>h49Ghevt^8EP8$zeGjIwbw^*E((^4IPWB67p zM0p`~z;=;1XuW9NVp*p?oAgKGtd3oH%|Fe$Og?E82i*xWZ<%~uDtfy}t^o#z*iP1v zyJK~gGzdG;jS-oVOmYY{(WU^kSJo2$=kSE=t#H#HeG% z@mOlp4O;af0k}&ASfJE!*?}?B4Laixo(Um03wcQoKsV{_MlIUz0!yRYPP-b@%%`&T zQJePmum(hRqig~xu9?k66Fpz9+#~v;J?`~vCNEY1p#xN|e!6XjS0ZfjWjW-;kuzO% zD&t_eX=Y4%jvE`ujaVO(tLMhNN-R{f1F#y@03Yi!@Nfbr%mPyv59p(&-zZe-HWeKY zTxuM%Ciy|uQ6ljMpK5AsJi;deL}6PKBhV_x1k#5L$YzX6*lCAa!=@W%I?#i$coG9b z&bF5H*&B()_>8CPDGO2@%%MQ$-#`a=<*IzBvvQmQ8aIhI034u`ssa;y# z?s6HrFNPV!!Ug?pHJk=hm7%7kkWRxyK0dWM@Vky(svSDPU0}Ck`M#5Eu$^>I+ALCN-Q4#Ft6kC#l zWv_%pz>?0jf#q835ZfItrcBXkau6r{$4FtFP6vQ+gD*8(lm|*$88w{V80Q?4M0bg$ zl}?oEiE&9L%dZYJrJ0oyiILzHD(Z-=#jT0er()ui>E^g8;w^xXj-OaWZweR5PVsNX(E`1#>-1>0-7w4LYF`Uuwo=F9T4u zJYF$sAz#y*IEGd%T$3=8K+jR(K;lj{Sp-U}k_6X*P!?+9EJL2cFAVEqpb!H< z{Z@WBb*J?>5p2~S+jS~qk7-{b?p0aeAjX7|0HDYSmzz3bW_}3n>c)Vxdtx>Z zh-mLbN`$PuuahZutIctnt9L`H6t_e96bb|=lsHz(tr3qb$hKq3F}gmL{R7R=jY-Mn z>)`PSq{CvT)V29sPa*zEWKBj98r_21d74!sPF|vAA(x3}8r51}Esbdb2bb51LZCJL(k;!sdy@?uecSKXfRd=3HChK_(w?g_##96$TRw6(-{}N2$Un zRo7UYvhgn6E6@Rx8zFUStkTJ3uuj);9}Zk2%@#l`<7AxW;v!2ci0cc}fNtt1WGg{N zLff&tl&=wG5g%qo5Db88DY;`*Y)wx=xlG&j3_ZD3daQ9#BRuMZO;~8dkj&j~jxKZ8i;fU4gl>W=*`3eu&}b`w3tVF{apPd^+{dpa6n41QJwLC7#3tRr~rOg zO3_kC9S4Xxjy(kD>o+>Rfe^JQ;Gx7bgA7icIWE|jWwn*1E5kPOaSGtxh&RkxFkdyf zT&~YQ* zFvR;cQBaj_joNMNNIdzaIOa{~tF=^SsSWlH=Nua#=69tP{cJ;2J z)D2)TPeK)#iX40xuIBazSg*=SuRY>3xR{%XH7ieBb*+#YyLq8fYY%2n6Pz@)MoCf6 zRAQ=X@I4sOoQPzTaKV?LDuY-(OhV2$zS9RDh>0a*gdF7yBTgQ>~8uL>0EG zk{+5g+v$9qu18&}I)KZRYo%qYEVY8^c&}FOPF1Sg0zNmTBYspL@e#O3fPc+6z>G9C zsl|eTClz8kzyU?h% zNd~Yl>u8aBMaMP-4;S$_Hiu;l*y<3!q;XXcONm0cQ_TC?oj`pSV;*EIh1I zN;a0R8$o&$$c%A}nwz9uWJBaDT{_pCjp9Joi?p0tx6l>1mHhbuBqya?4cEu!GckJD zU|qjPN1M&;Bnt+Xh}RtC%8}v_+e~0UPv}Z55FR`ENIMFDML)~)y{cCwy~*@KB}Oue zV7rU49Gb{=dt5g(Nylvi0sAd|n&D_TAmpB5fXb~sW?I8U40Mf=9PTAqAD9UOI9XK7 zHuZ6n1wA7Xz)+$aNenR|vw}FmH99e-Oz{ycJf(nHz&A-=Pj&$j8Px*KVmC)D=P=Yf zJW@nm0{}{`(Y3Y~4j8G)uo=os^Lii!g2iCKQb*}9V{#2UNwK_X$WtpZLze+TFN5H} zUW~42oeajY$_AvKQyPKQH5{j)w7E_aq-JEl610M`$SBl~gOARc0YEXC3UR<0$~9qJ zGnr`#VO=cFFXf4o5mkxPt|S<1iMy>tcqq64(G=C@q$)BkkdYgD zHkKo2CY)5}z>IDYCrWzc+PWJXG!tVVKdo5`)lcW`mchoV7M5i|>|+L|!j*#2@|Ucv z22BsB39-s@eln~QLY!c#3&r$o3=)r^O%F(Fnhu6KvuIDfRp=&PBr$+@Kc{q%-rJzV z;ATpT(`Ep$c zYgP>=Q!_-8^@@|`?4V!FB?=>n4ub9`Q|@Kry|Eprh9s~8mpe?bS*$iw2?4>RHK{x` zK@?!q6;Mg|=!O%F@?CmrmPz5`RNgez9x=YNN}-dFiXbS!4*+OjoKhvL6Jp#VPvCZm z))>R1CbSd1`4LZbOr%*1B{D5RvCCaewjGwpS_4U?0Yj4qwku!u2V79jjC|4Xq=pRR zVJA~-yXbReQc0V#+qO$ZV^A@WeKG)DQn!(<)l%3(A>JQtYxt z9>gA1K!YG25`JJnMwIAkt2s)scG=_$LUhzD_K6DfH~iH;97tt9Q|n^K+t;Wu_`pk) zI**$O!@7VA7UE#_+QD4CCP|1Dl-{tCQ!)93Bw%37kmL&XbRcn*9rxv0L_qk11G|7l zK1V8MkxkD7p@BRqhb!e8B6P^qqxq$(a zm^@V>^Gb}0brSicF#c{G`CCaON)9lCxlu}-=!r623lzg?B*mp8@VIy5-60Nf8{KRJ zg>e9tA9^R??ya^<`Sy@0))S=|V3nB$X@}&ujCjI8SU#vz1d;E`{hT%<%W*1AR8>_n z_(VM(jnx3O>leKKMgU<-9V-#&bb(MtPdhznMv3{dE{|nZ@Zxw~&v=VOE$O-+d}EGO zs?%YAk_9bm*~)^G1Y?kEc#B~%U`T$&o)CwH5~%wJqc8x1*%1^6^oOr1fbkYt&iag! zWDv$zh9Sw)T2&UFpdvpGi;;Z87f;62crG!hjR#70VDV1cn23H1$!eeyR9cy75suqL zrBMTBPNozdbo~gOqD!-y>g&rO+%^WXk{b@y5c0!8j94B=d@(nx1~?UAz+megu%ouZ zg7!sYyRuQ{$&qz+7);A_XH+m)qy%MS9R!IwAV#RPXSKMjl@(u|YrCyvM>dl=y-K;W zwtwQ2!*bGJP_q(Uj1;^hP;#5#3G6VwSTEw$!H=7Qu<{TE6RytM$fP236_`ks5);i6 z)qtH)o}I&(;FF&W4a$FWj#ccBnDcd?+;)-8;VQ@Je2aV9G&tY`~o*$ zxQZYmuyvYx%T)6zSo7XqIWO{kJ17pSZgQZTA*JT+D5;2wlWe{+6E)uy;B9F>uZ`3x z1&m@S=77sq%xQv_Bc)+g#wK7S&H8={@Cr4C$xM*xSSoYSe<5K^j99QNh*+KlI>gpT zaHZm-KBcKhxuAi`*-N%cTm`|Rm3RTm6-SmVaI#F8LSU-+oKzK=kJ<7p)t>mfMl)GY zxFID>WwQxUZd1j8WpKq=%olXbW>%Ph<}Wl!0>@(-3hQig6beA?%<~AsktsH&R!hVo zDBhxw!8vKk;Vyy^;Cm8kHV!R^m07J@7xWg(L~L5r{Go80Z~=n7T4(@SPq4kcbRj%O zoM3WX2<4eUTes9&HW+Fa!{rDVD?5`?G+mxlusISnI#P`E>w{velQIZG8kfzh1trtK zM7lC+{FiiW_1Q3vv&nr?5n4V3T@PZLduufSElxWN7gibOYxVgGR9{1DtI4e+m1aqk!y6fi#p z=tlwD-x6eMmHGOd;S9-GG*GU4YSL~>`M8`6keIece_K z)(r#_O|b95xy*;yk~%Y*l?Y30S1QI7BVbLWT+ATA1oOnJo6d6sujEyI0d7L2lBK#` zZjccOF!zuVZvz}D!;}k!cCpi*g$A(Z{RNP*rV2C^#$YCQslEtf~5#Ap5g$6EdBhq!& zH|c&RJy4TPha@)vTbA}(h{DJZbHwO#jG1f3e0n;~%+0?#&GXd`JCxx>ZTUNGC(sO( zk%&F0@?3#0X1Y0NF2_RcuaFrZHwxPQ#B;g&OuK zJt!MfOfXL7BH@&8J^QIS^rQ@)fE7-(03v#4fB3r^4!e2AM80f}A zrKUPfd#8yMkZ7bTgH2?=%``>V&cj}InpT{4Lr&G(18Rv|^4qatN*wob`akUH%xoN* zue~7*bfm~n`eOk7hPa^;Dub)9SeWLBdnQW%i<_5 z!POHLUFC-(wvr_LGJt2$MsY-Qn0gZ+mf=V_#7}b;A*SKDK6c_0N_QkTgFF3XwJA&^ zia!#RIKgepAdl!8<;W1ckTW^}Os1OH^HW2`>$bo*ns;22sG2|&Nwuf|N4EOpmC;_1 z?(vD14+)jIR=0M(DvEAEKs;Xo#Z$<6GREng0+e~&IjWJNKvGJX>agyzwpmq}Uc@m& zdatETl@RiR)$*j=>=kEn1~iAH7xjQR909*Duh7VP%a<#2x37Yb-Jx44dqvtvr7OWI z!V?Jw8wA%NzztI66t0u5nOz&~s;)X15QosbudRMqx$TH-_C1~fW)6ltOPV5%~cN}X9$ zEaV`MPJNlziOJ0rLyWRot`2dJu^LBJ{1a{QK)8`j|JfH}i)veTM{RHTWv zd0-xCmB>&{b3>%ka6>>#hsdr8W+-Qah_^L@@tK-}sF;NTDRh~T6w3tj0O|)VMK7|V zN5f*OYCFRQFW;77bfpBOlKutR$5 zy$T~W0p4YE`7TZ}?L-syPQ8tcUMXvviB7YWm;o`@g{I(obLAgSfqtOQ7D@=xwWlb^ z1h{p{Y{bhX)I&f}{;U+0b4Z4;ZMLQ43L_lNG(z#ThJ%HmS<4EeNftTnnIT}~j5z^zHp&MAWuSg`D;Xn<9TjDlvy#7oQ!BMQofQzX z!H^}qIhHday^+exiPCs(My2L%C%Kjw#|*Pw>qLtt7i6b3m}epYB<8v?I3nX9QE>S| zEs@q5f*F|9giNVwVLQjeUDC{FG!6K32`g(5Gh+}|QWh<@TzQOSvl6H%+T1YJz=9!E z;BcCB;`B5MP#qZzl>$@LyM8g6o`ySFD4WOxEQrx!!KcLnCO-y_HUk7oGO|Lt|#GG8cEx0P@r9*|c3tyW|JqMtm_#auTqEmfNFwj-D-3!-AJ6&^2*BV$+4EL8y-Afx7gJW(^wuLXOQtO855pRH1I1vlG$T2C>6&22qO~fb z=VEoPO3fyQFF&dT%5-KdjS-WEm=6cX`~3oe4&m4dQ^AhSU(oHAM5Qffq;y*WP?`i2 zxf)z4k#wUL=Y9DWnK2=7AI-wClq?|f=E7*VxE9zpVt3f(3kbXRDEt9B!dL<_T{I-nfD>H9=wm|`&F zS;Lj zU73nv*X^-UV0KM{%*-cZjc6dP)rqynj0QASVZZ`|EymOvC1jSAMYG~+-f7sU<0#zD zl)!g_vpUmIDJv?I=sM1E?2;DsHd2<@b?WUF;F!fk-CFS_Hh^bV#mR>l=+@#Oh|mCt z4@z-g7spR%t}@H(Jw@ZkRiil>`=;2|A>$)dZVtFwM1z3vyHH^Lb>MtQ!KF7Y#+tT6 zt|D!9o*Pl?gJh{)hKDE5_QK_sJ43{I2{s8a%1V)L0yYcBC{7(It@BSU@EYfM9l>yj zG9H5YCo&l!f_4zB^OO<-IEX9(j|8_?4Sy{&OQq9gsGoA%I&h*MD|zXNMfwYj**Uu& zso``_XPOQ`NVy1&m0bw1j0%LBw37}GYlbH4GHC9H*^s}{Pv!aUZUv8Ie@jL5JPXc|;EmoJ78mSn_ONQ-rRZVU+$k%1L! zL=-PkEYnJmO5lT#Y%^?blng|R~gLB2J7Rooaal&63XylYE_Ya55@& zu;m9m7e{PqDxB6z)v>1gm4<7K)O2S$YmHP!#xb-hPa;j4wuET0l_8mSTy9b*h7B=q zGMQ4cTI*Dq3SEUwT?NzWsGc&V0?znS;E*oQbKv-RGch&V^)6Emrn&+@beyz|G|d^Y zo@b+A36OSUUln~x!s-PV3ri+o>K3ieEUG%~#lTt&9(1-5p^|xGHxhK1Y}y|9aek1@ zaOvU1K~62v`A*&mwAx}O#m(T}9rV;u#@~-LLjD?b9mO$#OFMV<=n_HGvf0h zcVfBoA#H+Qp^am)iPslwj!W$j=d`H=Czc{ogPP_DT)!2gjB+z=&b+f+En?)`jXa|? z^Hdldn@S^s%Ac$nh;6K7^d=kV zW%8vk4y%(0Vx!wuf6~rRr4liVxoD6pMJEazJT#|tR!-UD0zrfqS~%iYIlY&v*iE8S zLO|=|+a-=HqN8DeY$59a|C7Cd{n0~Vte;>A8iSA6%lK0GlB_7%;-FQ zH-d~;u#4m3P_)fL@ykx&si08+-c$P?*MrIqd>wKM@dYi79pZ598&}vk*feM?> zKLxWQQHIe-A|QFojK=C_xvBA@%92f0Bt%4vKVvW51|vixAk|wVsz|mmgQ2&ElqEBb zjLJAL>j4|mLjvkJlsCaAJ1b}M6`7rm%w*t2A8_M-&RalrQ;nI{pUBZ#00(bE05EcZ zzG8`DYzSJsu2f7HSn${9_zj`t!7aju!bgmE*~@o{HO?|%u;Ie#X3R~+ap1F!*mc3tyG$^BAb#;FAfGl z_v1?%6WC<}j_-lSF2o{cvFV0Fm2e)l=owk8R6wl=lF<)Fm8t21Q!Svkh-Sl|Xx0*> z2A0MUrNrT!HT;o&xY8|xG}w#rFdN1kD(q{H?Qx~5!!L{Es!`R}_(=r-c!(>@)Ge8U zAC0G5Nk47RG{y%WqY)wv;;{^-7MI|7vTGMgUN2Hj1W2oZ0FlS`*GT=&*?Ko-2Bv$j1 zZFZ%KURCKHe62MZAf#FF>Ev43A+eB3VKQuB5$L&?t&V*OKG)KmksZSGGg5p#C7NRj zhNWd!hJa-Pe+BWKkz!Z=>(D_Jb2LOYJCZ3E%7a$4R0DmmH`JBJHNXHPEHWwdu;Y%= zq9D^Tu_;d6)C4G^d0_lzQ=zsXiligi-dGjG*qQYbIUFgq+F_Fet5VcIv$H;AIiWi6 z(ny<{;#*0t1#gL?XOWSe1Uwlz)kGRlF%@9*6MXhJ1NBJCZOIkB zR_m(%NINM@(@2VIHuT&e7>=ba&^66(rG_Jn22l@!)* z`23;BB+9koMRW$|nCXn^PDfs~YKn0>mp~2j(J&Pvy-Ol$k<~hoVNQ5S(}r!(T}zBe zT87%{g|bwc=bDmzlmcEk1N>;wa6aQrz*Pli>kj8<^i0P=v~DEdCL8E@%v*@es;XSZ zx-o9X`#52#MF;{j=%yx7-2y@;a8-bfVDvg6-6RqjM|8UhUSzi88c5HInBjy`Q;0*N zZ7M^vU}n8BS&nCDHC`A;eRKw*7Yh8i39ktU54&Z%DKg%(J=aGJKd%XQ63|PmY^P{V zOxN<&0jxvDx&m6@@qoel6ICRTsA-7VEz(uiof6Z$Pfxw@f3Jw2Z`F{^2<|N-NYN_m z@qsa|yVl1bJ%B4;Hio z=+LVd|NbT{AKJ>6V)Z7FNd8Sp|Ert8R~%jOI~{s3^Y?8GM-KpWuiljb&dTa9^A8~N z`P-Yq;pX4m1PcY|=YR9__cw*(?wng>&5gkC17^> ze{&O74r{fL10VhuH$jEXJpgNN{l9&mrhbwaU-#ZThc~da!d}BpZVtZBPSuRq` zX8wMvPyS}Igu|eQ{+pjj>i^j1qR{xWY)$M`>l4a1Z&$Pf%ChVz(~U&7(Xg3dmQmwM zXH?rpV->}3^9wb5SevX|fpfvPjgD@k!npJQ>kl32!v5-YYeRBg1B$~|qd7cKh96Io zg58z@;?nt>7+>gI*j(i5fj6DQ5Tqt@VY+e)O;QlZ?-gg|LSwafauqAj|4+qe;&1MP z>=r1z|8Gs0-(&ZBsOsM}^1$;kyV7r_dIpmJ*WNS#)@W54Ht0oHzBuqey@j0a`IVP_ z_Svs_JPRJIVcKNF6F)lq&s(28>Av57``T|Dee{{}$FI2T!jtc^@B7JHj{W#YzW)AW ze)*m7b&Hk3D+YW0JV@JKNrQ$^GBIxp=YQx%-m`L|r|8 z&s&K=LnzUH*%wKL4+`k&O@ICs=lSU;?|J>fOZal9h7!dSKVYsa@s{!q&&9XD;IF5w z$onH3A0#rl;+RFx6&owZtQP56t}a}Wd(p-nMc)IlHE-ICuGo1?X74c@uiThi?YO^g zS@8V1{jaZEdHc@9j)zGXzX5&uhV2hG^PkR>Rchn9H0#b{uAA;nr3~c{? zcv0PP#=#cgvuE*pZ#(e&&d823Dbu@Yv!{ADb>f?tlisj&%E=#?cjke?#pC7C z2d~x+TQiV6%R6!P*woc4y|MH!hiyL(owX3dn_m3lcOB~Bh0X6<+I8zOo=urkj#@L6 zqNiXeopw|_u&`z*Ej)evqUUM1a_-8FKij(JLDEYb(My|_&KA}*{>Y8tZ-|}+ZRc=p zX<^Z`c?W;YK@p+sEv3Z|-Fmd=v`<9K zYp!zVE_oK7dEvFsZ|1j9mmeH@UqeN&c=k3DCx$L%|ZD-bvr+-B+UmCh{WwtKgvvrR~M0yoo6~FY#SFCxQ zTM%zQa+7E8{hxi+ntnQYE96x9M8?>3%3)Wp4!=u}SnzDR^OS8XH(tJNsf7+--ilYL zOZu^Er1#7jyS{bD;hyh(SAXN0tK8|3>8&sP#J{YQ>1nTC^6dJ^@q1Tv#`YsONJJ9X zZpYPAUh%2b39@-{*Gra%cg8)tKE3$sHN$k_6bNb|a9lLHuJ?&` zM5;$_Uho*6E6-jtrS@IFbo#TWd-h#>`gDz0l%Jwg5Bu@b)|ad+^}q41?>(z`50rZ9 z-T8T`hojWZS9R8w`u3&kpFPd9@3!rKSX=7dq|`@)TaQ{_D(d<@_OutRlzQt~OTQt* z>V>%KyCR-nGbs&q@x=@s_LZOk_H8_~wC4F;|G32bV4G*(_2*94^r3PwDfOYntuI<%DyEz9(EA=eQ0luq zcM%O!ItHa4bN2qVrS4q1;|C{u_T54KVQr~Pq|^srwspN$eSoy}$Gcy#A}dkeK}><= zv&p-T{@_h3SLchTC@db|I^1J_`~hZ-T(&O|xwba%TwW*FG30vdFQiYe$o1OO?=Iuh z(g)C6w;q}N-9hnV2yZ%iU+(1_cU&0%+$+~if-Or}{yZ;VK4o#uBE7ilJiP0P{a4Lx z6VJx4AHM75m`?kM5`OWn{hQV(k>75z?|Qdq@q-U{j#x9{UXP|ecGrd&U-6o|iQ-;-2YMj%wfgGtL;H6hzwf>`ZQSwZ8$Nen7S5k|<}?)g>Iw6%b%k1_ zPQQ47OeeJJ>EkaZ%hoO(LV3m8J{MY3r_*+Q=J*XuUw&-=fpu*z?=W{5oyr zqDpstuAW%wk^?KwV___+FZr*|A(LXyZHGNmBK7>$=MK#4c_r+#QBS?kykmVm(RlmU z-+XALp2c(S{tD^*e?sk_+4SxDp&=z@7k_d)w2FJgEpJ&4 z{cV z&Ri?QQoVr~sk<5w=<8X}HHS>6?ME$hd$(;^`uJ^|9$#DNi%6kM^_Q+MR7Rnf{H}8X z8F_mi+;jsmXcZ4`J?uN1w{BP+k9+>*uq}JXn>?34`10L{tzN~{BNOt3tDjhF@-FQA z3^wrnlmjH@?Cx4&fdDzpR<)G6nd zPF**jEuPn zXZvFheY|r}Dk$54iN5&NJ;wTxT7jb8ntzk>ax(mut4Hs76_MdGl;76oSCz9@2jy~q z%huW6!#!KRbous^4ptQJKY@sK@$}LE2*Yoqmw zorjFIg>#oFY+n|SyqQ1Y(5zV4M>^o`i(h}?I_-ZCUbX#!@yCgF@@%XeyXVn)RWVq$ zPF|2Xw0BtUZ@%oh-J3j>)*1J|b5*EVDKS=jJH+GGjn%E6#;bmI$5Gqn`@+rFcpfJ^ z6Artsg-eBhzT%MlExoq$4+s|6l{uU&4?cw`=wZ2ed|5omN$#pA*zRUAC zPYPYNYgR|VSgHv;H@~1BC`3ey2KLJh$HHd7KQ@ zL&oBvnx4GykP2h>_Q$u+_pt}$dIqWKj(||O6B$4XnbC$EvX&PkYWy*wFieP zOvB5jzeYz{=iUF0s~z>+b<@1(fG^;X)x2&b^f72J`_z}VpF=ug>EoM~7n5OjEe74m z-QdpmtQNKFq~%+B@AoV|agO+hL-JV=In?j)v#&a3ttwb}14if5x1X?Wu1WXZ>3M`` zKMv}B;phMMiT^q@5bip5``d3m+OsusmU_Sxo402p2EwMxPB~%Soc$SOzPa&*j7j=o z`OSylLQL|-$4EtcOFIv3Pj;QST;0EA!_sGOJMFo(>U9Tt$8*|M>ui99e;^gTmR!IfOR+j?li1|qUUSXbt>zgbI{J; z{O%L~J#Xh-$6Wk6BH1g^yIbQC^{CZhwEV>8trvWHljq)t{`tYR8=)YYgv8U!)~$li zW5K%TCvSfc)kCWv+4vY~@YXBQrlSL==ME{?eK#$6|3mO7@4i|3=)tjpN3J*-b$Y?u z_pcjUTgiYO+;-~ib207vfM;%uMo)(pG>(!+haUHxs@!xJs^9*G`kK}1Z`kx^D1kRC zSFc}Le@ogaU!cB}+_;=PVi(bH%4KL%^oKWShm-2BwBfwv>OWlL*>m*;AN>3peZ7F? zW8tuSPFvUY_u`^*;gj+1{8`_&r8mqaN)&7BtLixii}Wl%xM}BG&e^!5+N;bLp9B53 z>L*!itL%9mwcq)f)ZU}#1OM|IZ<923u^(vyWHelc$(==|pVs(NpT(oER2afUV zR@>RaYCV^)BJcjgdp(}DPMUi$LX}6KOguT4=cQYAy_ghvG%2#xyz!8p|LJQK(>dHD z-F)xfLn?JCj#Xm!@Y(Di4*BIg%ReXY`3rOX+vl}>=cXc2Lc7V@b9jKs9r93Jv32{s zXKdV|c1FK?_iELZTQNMgJ@Vh$>(_XF_W033(kDK;cfL(uI(x%^oC?jijf~FfQR&ek z9h5&}_piRP$#dPq&pdd@8MNm#Oc?3b{d(G?DFMMD2XKUO2y<_n3&A+?;j`_p2jejOh zm59HMKk=VTQsem-*PW^S>bcWB+nGe()a; zzHD`_?756I=3johcW$teA{BGvgFkq;XNSCDwSJHd?0kiLPb&9~Bc3LMWaS+xyyJTv z*CeWZ_oqDp@_LE5Ex&fYM*0ib@A4%p6(l9^%U-1OyldK4<@0Pb;${y@z&&GRCUwX@#C{XiPUc9!BXQ7U_r4sk9bs8;TFduYL zZ~crXFxL=QU;((|rx$NLD8{8d#Z5Q7<14uHD@QnohUmg}3BB;oo&1@{uIcF=OT^vz zp-q>}Z`>*Gc==orYAExDrF)J%G>LCHLix)N(Gj2R7B5|$G&`2QOYF@zzEA!5x^~}B zrsofSO5B+{mVUcgnJeNA7eSU69ao>5CUdD=mfK<9he>}>9qFQ3kD{MoU49-Ds{U}*jPnOhbP7P+)|_Qu`x)hK{^wYp}VP_{xI(eJ)n zJ7vwl^eh*Nl#HwA)&Q&!X|7{-DX>vaKKk%O18K_}cRX_#8o$|!N~>aqg@UoU@W<1y zUAOpb{@P0+rB8m8Y>0`lH96by*gb{>YQU0e2`Qw|i6lTOVot;=Z4Bk2vn^TXLVu@BiZT+0KJE zT=2x(UUK~>cVG17eDw=^F?O%D?)&h;!L#&Vo4)*)Keqq$n=d?d%Kcw5zJAP8H!XcF zdHT*g25Iw}JG3)}^A1e1#S=Chwc(Gy{>)d-yvgVO=Fu(BUY+>}Dt_<&PtQ*^h&IAf zdB)+L&;RoJJH9KNm@m4&cn|w&>b)o23%958ktd~_SBJ+%%h#u_DSzVw=iF?5|HdEN z_YEH1aq+3`AN{f4d+m{bRsL=Yfpxqu{jPB==t!oH{!Hs`L@Gu)b>_yH@|;t^j*j8KeljT z>&b^dTKUh9{@}Yu9hv^z&%PS_;d{?NH~yv*4drUc;PUQ0 zkI&ut%YXmm1*OmYb?32XJ@MK5PT#*{!wWjU{rSD6*FdPmx?`r(h^r8Rw_C*WqQAd3B)tF*mWm2mA@%HFG9y8T@jUGhH{?HS%BevR=#pYJ*$X0KYm+_vxR z2}dqy-+cQqADBM-&0lXzMlLIb~&C#zO^q%*!WO(_-e|~PqEzf@I zb>IHokKfe$_wLejQaf@&@k3|(AdFq1guUto;kNB*dtQ9re=EQK$yYw}(ecB3$LN~k zHB9#=`C~sGKj4jh=r>#awfoQd-Ou0knuj0U`_xQ6>fFaJzW5K%{N#y0J$1<~haGX; z!%uzXudllCj(xQXoU41kd53Rt>9~Wz__?sb~Il(}L&uz0^yHw%+sfrtPq$ALD=eNbf)QAH}}=w%Dtt z4}SUipC6I^%pdQ6|5;rOuHXIck*9w6!_VqZ{`gH#-G2UGoZtSGbz3w;vLht+4whzADv*)o7e`L$5E%ld;GwO$z9sbfU zzIxMruf6-CJDxcHsk84svG>JazVW1=ek@!6&okNohpO+6OS*geFH0>;ZK<~_>uy+? zS~=5jG_1^3=ALDW+e{Dz#Z}sJG@RrpbL8G6ikOz>9=H*-+#=!v5=DQ9`}yAA-}C%i zzLd}ToO508bsZQh`9UEZhQ)V(kq=i^+m*8GZ_KsY>u>blQA{*k!F~Xx@A7`if2(ZP z`3oqfCyF^dbLi0KpNUvzt6cF=nRDBrY(uqgJ_L@74EoO-2&0dvir$2%K4`d(TK=&; zvbnyB*KwTd&0>P{8c5H?{*ZqC>4v%S;T;A3<6|a!Om1;cELfSJ+4b*?wcO?}3ztR5 zYHtm}mZVR5<+&YkHTV!fV9-ON1&?0&zF50zB&p<5V27gZki7IL>C1j8e`Ng_2PZ}}m>))`qxj4BQ z69W3c|3+;ly*%2Sij$8yDxwY(^j*bqj~eK88=Z@ImKO0qhGjmQ!x&Wc8c`;B6hpik zo}y?k<#1LxMq)#MmM3awBxe_N3gCAFwRY;9#cIL-i+)@8-Y>K+9KFAZm2eEhxFvfg8Ey*c{nFcNS zAFvY!%HMZhso+@gbzr{aZxBQ}KjbJpZ2_Jv9#v zKM|_axm!qcp+pBVqp?JBiY0qxMym?gs*)efMoQ`-`PoV??Ut)jJINGN=j29AdyxJ?&$?m3EON7in)ip2X;69MY1lEe zIjHzg-QsnOC#5x+su&G;-rR5dj#ucyx)MYlWMe^z@(d3SO~j3y7is2J2$I*}?686C zzY@iN+FQo`-7uYyo*StJ{(KT%gUe^knulO@D85pLql#ksRbT`3Im^h*k|wafR_{wMoN0SMjb^yw?hY7kif&% z@`ugUZCW^xn+-#%)rz(|HJgXupEdnE?NmluFu7I9b$zBQoz5$QD}*L0Bo2d>cQnhp zzsz$eKGP^w!+-M4&7tm(*Z%hAh%1NmCLi3f1o}ESegDBhm&I~H<)+~g`{+6ZpE0e) zuwVynk!8#gNsw;(!)Qq#C$-VXnSzq4ql+~@;lZ2BvWw!Ofy{6GGD85^OdL&ephF7o zG@|eS0VQFeZhcx3FSu!4<(WKKUi<_`M^B|(TBDD3Az6#giMCHl`wMMkAEQsc2ITVj z+JDm~+^|ZsZ|yHN-0AW9T{c$v=7j};tJB#wA^vnqqkX_H-i^7O^q|x=*!WGE;P$oM z4tC=kH0A?5%hqTg2ZoW^(_>Z#c#Y|CR62_Kw|uPi^suTR@l z0f=Sl_y*QgP@)&Q!%>jeN5C}nU)Zg4d{59yi!2jVQGSJ&3i}5%B+BXPMi~sL=F(uM zn;W$d%USm#B2b5 zF=}K&HhVNp2;<=~lpFZ`8TPhKrkQ{L7e7?Q$CU{nHU!Uy^=Mhlr3!Y4!ThtA9)?A-_S8y|S(Z7D@1}2SC z)25(_>XJ~OdjF1=;=!(&8@L3yu+VSeP@b#=MUu$A&C&~NL}MigMhD6#ba~QIlQrt+ zx!R#7Y`wd8eb4=s&G{J%%8K`!Gs zB=*XR>nQlcBXj0yfat(c^VlV!rnc$kjeN@XbO!=^+At+aXqM6YEqEO+s%Y=orL8@@ zhTYsOW8qYPMXOQHU?zS34I?BUIrgvU`ZJ-vz{&yXv=uSA4e(xo@R-JI#x6rVQ+J@p zOB@vcoeJZ#bG+D^UCb`@1QD*D&+&9X9IYRlLAzC9zf$Sq|(#>r4af%rGst?x4bYr zD81zK^;cx}0|@B%A3y^TBa(wZ5sPaUasKmPyu3gqDf?nNrb2#j3;)M?t^)t#RY=9g zBF0g%?$4(}ygx$#dZe{?o{ppzdK6kqXJBhDaaD&0CT0JXZ3S*P_JCfaxcMcgYITuT zEW4WLiKC;tYuL)3L-pG<|SllvWRcsGgNJBM|K1LmN zeqh{Q^^H`xP4FHB zSZKAA@5~w3k%}+Te_b4zZLs;O8_GqY@4c%q>GK%lMd+hER^23q$aJxbV8_f*eMpW(5}=~ zaW_+M7!dnK>G7M;+#Ei_pWh(>WxmL+cbsY!>A4-01GoDI`q{iZQC<%_;x0#mrY8(k z%rVU~n~+kQs7u2eQ9F*IswV%-Bqwj^i2W+Eu53k+B+`qIt4ov-iydT$L}Z(6fo-6? z=34i)0vl`**miwQV#vDk)EM>Z*ca2B5x`V!rdrKf6<@BS>3EwYg_Y>!P+lvb z(f>TBm@KPUFYzziDyrXH*FO34VfT&~{LG{2jc8Nnjcsn({t~v@SDytl{ zCmlsCT%;$Y?!8nl6Jq-ihyaBuZe?~2QO^nqTWtStywZoATUP#0gy!vmV`qU0ZJ=|_ z6WpVXN5bjhHspcTL5C2A(5Od$p0n4;hlew%h$7U1vF{aIp!d4USromFH~hXSB4<9- zn{|g)(kP^2*DYCEGWs2?-NRH3ctwXQsbJKWG7VJVV}rjv{~>k%@Ru?jKnovwe*}Hl z9J}bkY?AaD>HauKst+5iF4pxY!y{;*B3Su}r2{DQLz-=h-W4+u(6zVQOH;9?pxleV zVN%5THfFSWB_+l}emzTF7>^L%f-Vw50upTiS{y}|tNgcgQ+fEMVUFK-1`PA{mlK+g zcF^*R>&mFbGTu0^8PM+l(Iu!wGh{$<@oE)k9z>q}nFk1&+e}qO`DDNtL&{(7v-8}dh4evw0$sK5d%S0b)=}s zO*6TDLne6b1p<+AjDI0!V#r97Hp#ccrn&tcFNiemFtMcRa&wLUD5+tecLOGV2gorS zTh+qb`l$7(vlOKru#jK~_^OjXb7KTTDr)iaqIg&y6Rg+W*vJsGm^sleZ;=~`XUcG;eH^sShIRMgfhvMC|T2<2mkqFT+W+R5Af?F+w1mgeqRJ;z0vPR(Fzk7XwuVWuZS_m|V$c^>1;x@0J6iUJu}Icj z-1P%izumA;5jV#ka!!O-ZgGm2dEQ$FUeewGZDm-^Wnb9t|BA0)_H1shc8M$wWJU#^ zRh0he@jPzJolPfL3?y;9x9?8*lPP_o zkS058{h9S5tTjtxn@RGigAc^IXatsf>x5l7Mcmo5y~WZVtBT#)6kCDC(X$tO(%hwC zx?ct?ipzwgrn2dVX({qhjG0~Hd8>!Z4%%j4pQ}Q7&ts315rijGtsc__SPHI+>~FXL zAZD3XFnc5!T7^9dK_dA_0smp9?JPN6+9heXS<`QBlPt7S832w&rKFFP8`$+_cND6J zifUH`BsKjjK%XGG4^r;m4szJCj(7W43m|N+yo#29zrt^^B}EdbLf3?^Ea_x8er{-O zzXfcWV_sJ;>0|`#hSlfSXph2(9ip6G&Zq6I4f^jd3)(6@JIAjHLu^0RFOVNfS%LD3|Xp=px8a) z!WP!}BAg3X@T6M`4qG<5QU_#L_LOa=BC2=r3=_q`VW-iq9TeL$eAgK;oXX&pD9G8E~&2nfbd1X-n%#=-YfhovvC=+SlW?c&=H zLq!xAlIi7A(-o1!}j(y{$4=X z%ioxPNUm{sAe$ak23h`o7*P6#=Y}3^z$~lCh%quO%;$SU$Z44NwyCj~2gb{sm45jP zrzg4JjhJ1X9+v*wrNrHA^vC)3x1dfYIJT&Y@9g~tCLY0sMsjj3Eb!G5LZ5flI=3YZ z|NilcY`+vpNp;RP3LXUS@p27^skxAskF+FJb-3%f|ggstBU_J)_wbbHr72+*Hq#9CZ+(CT1Q2TOD#_=f5> z7M&z!9MD!}bhy76R-%9A^Z-uMvn0%`q9?LcR7v|4C=FKMPl1^bP*ivGoLAtA*73Xo z5|JyvqGU#ZCb=f0UIVY`wGUb*P#z!WJ^0KrFq$)Xtz^xl@Yob_n1}pJk0JC{3*#o$ zysXeFYomfRLPk*!Poy-x&J-f<*#)ywzhUuksolRHF;2 zbI7RSuzP?isWg5msCCAGZi>w|)zcW;=f)7}cY>Iq0Q-QY-%wF@~RY5H9Ca*U8;B*QZwp^*O z7Tp;#lZqJzuTd1DDM!>;(q8#FFo1)55K&&&CpaXm51p)60RVc+4>@D74FbcV#>-0!BSCxdg z-ub5UsUq2at3@{5(yF?Wv%V^pq)AEZM(`Rz*r#q&rkykqHqQntSjB>HW-m zFIP#&cuQhp%SsHDcy?&<1|D%FK09NQrEf-$x~eTY<-k6E_WMe<&FN;}0wiO;4sI@N zjax6*;@NXjwgfhJkN&_(<1fV!6O64wOU}SI6t3|e%pwyQ0e8?7ZbdzxTl_sDnFRp< zRuPRftqNX+5=Zar=TlQ&0;`6+Hu`);d=r>`Q?h~S*TVEKkBVZh?g--%%QY`d;hGwT zDQm9J5}V$MPV6jg%ANnFhK5ssHodR*$5q?f1EP4{2>As-tJ%Y6F&kAG>`xdmVTrhE6MoPq*uY-+p%#3w)cOX@S#L)b5XXGJ3W%?aTA-5n=|N+p|ImXdT-YzYfehVU ztn)W)xDr-v)Eno9uq)h*)Gf+ul}mr?oCY&sKsMY1r27&vhoGL*Mzv$gF8;u!t|j0! zTiO(jO92x|7P=3MJBZgJ?wK^L_ceDgE}u$>HfW3-!DGOrfv)jNGP$FA7ve)LaE;N}H(x z<2Ba4tnI#n*Bxv)5q!ttbbBe6>;erF3MAGfk3S_q0`~*%ollMSem?_j4rOEm0$9%KlaIRrvc=xn0>&T zFYPlQ{EA5B#5P)LZHMNbmg^Ut)qN;e=sLeTHR)vvb~q$SgR`atS~_l|a!{xQ@b5*5 z7#J#n?`uwSja7|*jtxdN2T5_${)$)8?NVTJIfA)Yv<)JqI}kj4A**JVAw+LgSy46DH0_PIJ3LV$OIy?K+cc3EF-dzNA59h`0t&SWvZOM@y! zW3;_Ql)19eQ z451DsU@KBW)y(H)Xf=a}bc^7#n+a};+Als|$q1Z*uhmV6**^XlEuqr7PvAWr#4UnX zU0l?8RVe{ZHJd9%i>yCu?-y?rb7Jc@l8f+lcUmU%9~kSlW}sG#)3wN==PeJM3~Y6) z(C*oyw#wCzhDx!+Ki{a~Hi&Jb<q*GI*K=<{!eNv5@Tu4mh&t{K91H z!yf{yiY*KKt}3+D28-^49lbOHR!fk6e>>%=c+e{NIg8xPc}@x`)3UC1KCmbDtB?uc z%+M!))`;SiZ&1Eh6O6_A`c;6ZmV^$lao>o5c$ITC^ooc9BLxaGLBYoqy3=f{@gG!;rG;N%Z%6p2yluok~6xC5au2CC+z#7k{-m9yv?J5lQ#-f_Ub4a{m zAAAJ%ydB1c>jx)PC>prnue&iMfg$E_Qh!?B0YQcvB8HYv^K2^lP0vtD!IF!= zck!sa{e@4vvUK8aCC!fQ9=VvOX2ajKi{E}m5MdGwH`(;bo1}b!+VZ#M3t#0MO1g+0 z`Tb)(a3o{I6dDW8eiJqMZt>ipL)Y!Ujx^<$qW5S6|Jo<1d%o+ZPBF`Z-(h*6jdiKA zQi~+;1kQ8k6?F~Hq<6t~jT$RiUxS~UZTE{a09lEfnwv}4@HQEI zw~HO808(4l_!|D%_*67AYIU@Hx`*1C1|ex}U$JyNjQ6g}hSylyU8w{69~izHP!FX^ zNp2+Z*nQX~>Bk`GpqZ^HJsYKe*DE`uTMWp0K#0e2nGaA^>vS4-eQHaduMlGPQ;SQ7 zMqXs47}qi?uB8L+PmKH2d=&F&iw;E(v1L4-pHT?&3{ea?{TI8<#9}5P5DORY$aY zaL!Bs{a2Z5&qI1m+KaA4oBgczjq|3^aEdJQa*UJ4W3pp}AXhZje;?Gba@I6E09rcO z{&PvP+4pbnVz=$hoUwa?Dx1)0&B;X= z-w=?v#C`LW2Q=o|x5u^Kz4vKl z?$d3E?QLue*Ssc1Br-?+gh^glJN$+-^`OD?A{rmS9!bvOp-`)gwO#w#OT zUL4(;Qhzfh%ZcpEtGs*8$^|C9el89e0b&MTIh;hMpE!9>au%1Yp2ReLkCjyG^sb&t zc$za*nF%C~lx*oyuJW_J-u1?R)VFzLudEcEV@7W-s#$!9oPF7(*Ch9{?mDhJ$2c9m zXcabC<{y?{wfg;wFN*j8lCU^LL)cOG9rYO`@a;Rk+)ibP&$J~OJKBavaeWu z*nX5RT@cB8cE{QG$8@v@B$zAx7UfO}6c7h6c)U7YV`C*rt@)J3W!;_beU^&TIO_~A zSJyW@`whh!@)yQK7KUsl>_6mp{mI67ySs0fcg{On*!ot32-#1)*ME68MmZ3sv*yBf z@mtPxCL$-|0I5R|lO_Y;sal+CJ_h)rte%+@_9OQbILpoH6uWwuU#R7JJ{E*wJ(44h zXIsiZuxB(SI3pV|;wDRa^v=*=?sxoyUkx{keh7LC|Gp+p;5$q4w@QG70ofe4QR`G| z6q{j_4B7D504*=#bZoK_e-<5t+1jUi_Q942>(h+d;Sneu_)V0JW81R^IJ9K=XG7KK z#R6hp|4z~1k};4UBGxGlZ(d5>8g$tHM+zkg&ozlk49CrR#W}e1#NV?iR37XV#x+%G zE!AK1MSbim|Cpx9F=0^$2a(JLH-NepnLPHtA!lwF8`S>!{fe9CDnPO13PEggpa!8x z+&KnZE-3^wcSB?>XjMMj)%u$4CGsKMM$_lp?}AV_z`H}|#`;AhX$2SgcZII`8m~Jz zgPchMD%AXh$z6c-Ja7RfjXA%iGtM2m=Xktvi?dN33AxgEM`3+%>Fpf_=Hj`Y%$vdh zu*bStL$YukmIVzz4fvaJ`@Uht>u8wpYpIt5K?!xTzfkmqThqo(QLOp?Mz3ux|9&%a zA;?DAORueeU1~6*pvWqj7R71a95#|=l5qPI<*=QpZ<~B3o_aPs#>=d_Z26w?8W#ov zf%lLSO8R@+lh)fsjr|}`WII19wJpj)8DhHE3N?es4ktG?MIgK5|wZ<0-h<#Zop2o8?W+`K{)h~ zNi#r>c(%R3Z$aOMTAN+$p8ztUO}UHa4}9V};PUg*23P)!U$dg_eo@3v92T*Zp7fCn zIH57I22Re#mL6}%^>jNsOjeg^9DEJ+IVL;B8~VQ2BfTHQ1iupc^(~kw+97rLwcb0< z@5DLz!PkMZUvMo-sOpEPO%n4B2zfx~4RR;^d!1oUJ1@N}42KIkm}?f=RyWiPT!U=0 z(bU&BLOpN2-35%u(4TA*2w|!vznR9;{a9M=T{RL=49IEGnPgK|&G3MY&y?Ow zr9oI&@9Y|WYyOo9hzpn+hYt|HEhb&eEVQdJ_2Mu*{v;Sob&G7x-wg)uB#8J~$&{5k zn5d>9-0Zs$cTK1Y<1H~K{e1p)6IW%L|JD=7%Ne>^d>B%g>IHlY{KbZ4p)HV=nP!IC z&(!e^mo^`rkXU5L{?aRY0H^QJjnp_WAXE*^IQtafk`ENsc*g+?=N(ic-(dbrU()jN zYmt`OO}FN+765Mao2+{?>>-TYmR))Hem#uj<%AFA=I`z41piU%Y>hA8?4a43H>)&e zO?AGMAH5c7JHreYTJ1!t8%>@aEAyHyZW@xa4F2=$rUC!2l*HIXWST>uvwpi_{-FN1 zfBaPqNpq~X9X5K9Ibz9ospr}==72Y^(WA8z^>1BbK$ZMw?xq7&h()P+CV9nvt`27dLfY}hWz%@3IPNbK{9}y+ zR^`V!)Np>W;ZksYSIMbz(sx=9fjv)AeKNU66NnzQRsGP~NXhTHb`0@i^TNDA-wa16 zkc|VSkAWS*V5YK-G-C+Q>Kxd%!1a1xA;c5CEpSzbzW_ur&F?t}g79&#JBrifHg<%H zy@Ij$4a)Hl%wxgROA|LP6Lf)0E2wFZEDP#4gBT(vOdnr*(153)^_`>bqvkfj zNZM}Lpf0v)d7S~9YqoS+T8lt*sBr$#;_iN(=5MD^Z*!H+vk&P*rI`q}1AaJVCNWAV zn_p030bM#~M2)%B6PO=WyBS+Op-$PQw|4Sozp?fJdnZC_TV`fVl}sx*ZF=lXf>KL1f`u(CY(3?M9|Ndc?U8*lzsP)n9OD5dge&u>lDoUyl!$v zlr_9+-K00EBRsT6BDU9a;8M+kvjf-@G3pH<1MH2>$;PXV-teNTf0J&T#{x?Pa8#$- zkAJ%hcf?Y%0r)j!yq_N^THnJ{VVL^G`rrh5Q3D2(=qd+i-=7XBp6|~`U90Q7 zJmc9#RHT(T6OuX=3N1?;e0+_j-5fr?GM}Pjb%Tpk`ltgo%|js6E0(*6UVq;~gxceC z8zTi7b!r;wXKl=x7U_4$A7?<7Y9HFVIyN!Oc{buZ7R-VZLe!Abe0d%PT~Mpx)~$II zZV^Ydd?kvi4(l-iV7{^T_!H;0wr#tzM=ua!1(*G%6Vf|2;skO#M2_*v*F_#yut^vp zGuNv7#aqCC?k0cmsv1WO733W@mBoF5m~vh8*Iv8ZfP1~+N9Bg zv0s|D4aCW_EYDwN-ZMkvuWdE&q9^8mnmT?Yq!gKamP zWRf*u_7^ZRc9L}Y1JO={eXoiywgD}7M*72UPU)QrE9t-XOKW^L(k%39x91C92C5j9 z%&Vup^kT)pzZx9}A2H?MF0{ci!{0wzH9^w$C^PLL3Mnz@xq9#PU~8c2*n7+`5Bg^k zPihwKIw)v1Pr=uqOe$)8hT)-k_SXgXo+E{ws*x_tvG1Nq!$|qvx(b%Lw*0gm4#q4p zyX7y5o^yuv-Mtxj?Iw4uf!?4@fPwhfTBNIM!0WLU&rVaH@+Rs$zZz2W9HFTM>p9$8 zb3qFkSm0KO0F4k6d38Ojr%L&?p%~wWd>8Xd^eUHXjLOuWs>Ae(r-E^snc$;+`xY^0 zek5xg6TdKSO_vbh2d|SOY#E01Xm0` z>;!@D&pm%hq-9*Jk(kI64wSH3FUmXm8-%idNVnzK>p^ati4Cw_-u^ad_Vvs!th&VL zUR+?R=OjfVGCmS3^M%W{3*w@MBw!aSie7Y^d=c2&oAfa?HZp!T^fR2=7%Z$jm6JNO zFkGr=5^b?t+EVW83x?AtnLVlfCO$6NC~c4~1yfE)r|JGoDY-wJKn-3LVoSkQq5oA zFtlX1ZgphinG0Z&p_23VGsIZ>&`f$rn%W1wjo8`!DwDd6JV#F6P`rb%h8|a5v>e2K z#v~4Kb&bN{4JEQs9I^KJgA|LcQ**B^%3_9`wx(B9NEotKGWMyU-Bc%^<5lNSP8ND4 z5-2sDAUJBMM*a@sC(4fpB#b1~eXF0E<`}6666Mt77HtHLdsXDoFH%&=6nQ^s!i~Ds zIu28k9w<7m%QB1$O9nZoyY04XsDdt|_T4*0U0)Nty)!U|v)C+85kqa@UHkt$9yJ8C zOh+KiU=XV@+1|486ZbdC@;0%A^~2y*eFGFrvDIsEvEnOY?ACFQF*8`n=Y2tI*JfD} zMX4}C-Jv|30uY9>)me_(80DI;gl zJqbg(=~IH{bO4snW+2Vq(^ht|@S`5PmRh|Ny>5(Q)*+7l#-1Mz1ZkLO?E+Wc+Ns?_ zMoVi=CpnGU|6td(z+c@+ZCSPZ+1|aUpu7{exK$Rz%kiPqPWtfX1;0&e`^A!Gkct3y zkoVvuxTR@r2rMwPep11l$0a*CFca|hSPS@;c=Vna2fq2FWsCzljY$FlZ&q4Hafa?U zm*ioveDkP8O?ivZf(a2`12FjJ+ZE$k;_}C9eKXMEFP<;kJYst5tM>#LTJAqzYRy)k z4>cBbSW@3&thKx$={Vw&i~!gd!&2VI~Wn+lDW%NI+xF|7>2u+v}m2h(zR!I zbc>G$xCyH}Zhx*L;m(*t<9<&icU~g@`FnspB9m`an&44)^h%zG2jBj`TmeR{O7-ik zR(<&W77FBs48|%?En2D32=P^$cLJ$=QZc5b5rsh-6tS4l?P9-Q?~BLv%Rp))0PEAI zd$VX?&MzTQhrQcxx&rKbXRnNr=;wAYTH>JBwBU9#XJ3T5&+1r+bFPi`xjlan-rf|q z(dx*<>PA0O-#4vNdGd~(x~mv7W_J?w4KUx>v6h*^6nJZKn&>+8CLC*O4Cx=K@;bb% zG57i1=+W7EkupO@>9lUW~^2fn7Pv`ym#gR(MpB)vYYdJM`vlNdGEX2xQ~y1YT&Y6 zJ=o3nzude0!GO28szlM1@H^TJQcftT$k;c_i$tc)~y>=d%(9zijl-OJ9VZF+|t73asf+Vlg5!=<-@-=JFcb23<#?>f8`R4is3KzPlXa z)?6SX5Ao2!w!IEYbrx8ZYHqn*y>{(zn{E?MKC9`S3pMJ3Z2Ttlgd$L9BJMLO!AhUZ#JD>?uX(k;n`PxYE; z;Gu441(M-@+bj6Sp+UAm`qoG8hZ0j6CS*RsmnW6Ifx>+45h-C^1M{@zu| z+vT@DwKc#V0Jd|oM+hhPOyOkVZ|41zrPg}y=6CqSLQ*hwp=fcc6)$=Pft-!yHGQ?Jy~fG zD{F`Uh|ImazE+KPU|!23Z;GhHigcYPpapKocV+WxpnQK*&ZhYvDGZU0}`n| zMLA~vcAHczIolA64d6plA0g8sdDaD;EK46g3kGS1I&G$ITL}pJ;P@pg!%rK_r3(Fo z**qi|9I4I6_WFpgHk`E8XKbFahRx$+U_$-Jzkjp(kxOu zJ6=Ch!o45^OvL$snHnkX@OI?}J$;-L4V_AqSzQ6Q7Q|hbT=+T>BkB`mcgQL${=UPK zw7=^-sx$|ASvgX%Uof}%o~~XVHL)<~*MX4-?+p_<{ojBcK{r!P#u9M3)|zFrJniX( zdYGdGgs`~=1pRi!TaTrhAvN7qLA`I$boH1@Z}JH0jQ#mNc3&x#)G214sWHYD&Yy1S zwhvyXr8tJRSq{I>Yh#$Ayj*1V6FQv#6^ie38@J%&-7%L$<=K)@8DO<($gNflXP5fa zKbZ``_9_YqWq3G-f18VD!J}t#BjOUwgp7d?7ior$ju` zgc@eLj5!*)mh0~4>om?W4C0((E{~uxDB!DDS>6YFiXB40?129O)+YoQt8$~P92BDG zZ4H`uMCyC1#VVM!`<+UA7ps8-gIe`9*`2;p^3x)hxVn#Ewr~)b@>$(-D*El7lk>`J z&4M`PAn_#A7dbU^YSli_o&RmS2HFi+?eCtHZwKd(pBfl`6=LeVox0f6+Y2rDyeLBe zDa$17BN8qdsh`K}Zq5%BdUT}F-g6qFT=%W01A;k`5YY1Wlxo1zfg0w>&TLYiQSzl9 z3E#hVpZC@awEl})Ui82P_aJm)lGS{7L%}Yts4Gah2h1Dfz@_!T=14`ptXY(pNxSjkO^=O0^N7}}64-_Zy6?-d z`2^=@oJVmE2eHF0m?Yu5`Ys=wU=)zHW;IUr#1-a=bc(L5wuE+&2laF-QHbo zYbL68p8mjA8ZonAlyD~|r)!|jTbrxJ;VOLxP7@mDyiII8d+L4ecFxR&x_}5}QHhWe|{uS$C>H=wzu>`LbLyiz{&(0Th0h z&3C6E-XjEeZAm*Jju40#WLClEdcPu+xU+bMkS%@fhu`-Qzit0nMqrr3I1Ut6XCTJC znyy~8*G@q>`?BLofo#4*$Z8V8p!+Yz{e33YPvUhn`vcZJpa=40XTXF~={sX@(*wm| zzWE2XX#VWIW8)Uh{o41o_zes(-gK;fOP8tfA8xONQQqhxC96k&{xX$V9T{DIJ8(?g%{3_Ba+wbDT_;Y4Y zkZt{zjnS~U%%lARB9HW3cZ0djkn9>aUilJaWyI%xaT`KS&kq}mZ{b2oIfj^NW(q&b zEj{a_>+(vpefHQqFv~9>{q=Gf`0jGy3ZLlsR|BBlv9ooW6V0h&wu-VB_ru z7A#^;=wZm#dd}c#as38Riz|qQttkuqk?}ufMfUg(j*C*4NUmK? z6=SxCtgH$LoYhBg{&fBl0bK!mj0MBcHNPU?aIaxNIa#O}+?rTqoVfoWORDQRe0dIV ztPjlL3InqnIdqlUE=BEN3TK)hlSukyX!N0DuKZ9z`xI z)8bn@i@uaMl`;#_Kl(3N64s|?+ZnM9%vFM*%0~`XL)6PgKm~R@d6;Fk$pVMYq$A1-1`FNm}x+yDFsNYtL+n*Q_O}w z@vQ7OrN zR2%gPr12r8mVQs6G0)5e`E@wyq7%OJpxr16_$9Pgigjz@p*{q|pqie_0qZs}_UFbg z6BGxh4s;l4<5O9{uFDks>v6Q$ZddJ(I+^#f^tqR@80dZ*|2A0tt=_&4+G|>LKyDgb zH+t+?rPdnzpkUG!*%oE{F`sK8o6AviQ`qxjtI9#A+jDj&g0UgK3tLW|mAf{n#V^}H zak0IC$5*>f+{b?W2+R5Kqzq0+XCd^!9Tzs1prGGtH9{Qdz0rt#IHlBe1@k7yG3Q^;H?(nPu>$^H^c^TXhCTYjzhb3ZOy(BsP^*!M z2NkV5lYV{?B`V6jZnU1+(|KKtkJljW-J`a|?Jk6-N1@qpjYToNL8|@!j&b!ZfY8-* zLHVeiIeTQ@AyvRkI7%koDBe8Z9N+M_^z$YOfqTar5J?3;U8s}p%HQc6cu{~Q5IaZ}yH|T@bng$wp@55j% zj~`zX&d5wX!eq&2CDY)6NhRpNQ==y&9YuNtN-3(!Rt&&QX6#QUm zjPWN6g?&8!Up2O5iJc4z#Gw2cO)4Cdy|Dz*>% zBP++Vb<@pi`2JU={*nZcTdj0Fw~Qqbt6kr0(;8uMsa@d%K-r!PJMJQKr>8C$RRdBM z0&Gw?2a^=W3oMbVLV8Zoc+Rh=b#(p(#l1UI?`eS{Wv`)WhO zav!tSO4XcsG2PyiJud=kbr$yZoaXhrw+A+GnA252wT))ujplPBhYep7vlI zdp>a$h-p(0OG7-Ohg1lZH?Ojm(>>)%N`?x1z8^FxW=yuc!;?IlZks>23vNX5BpObH zxb(|ufjbQZsG=*cfxy)F7H{`u{xB7*-v$$tp(%nH^gYFi4%kazx*axPHuw-e4-3PC z*;&KEyMj^ysT+tm$kw036fJ)c8LwIiq-OIqA4R>MdmXkiErRBPVy|2oKfBx`7Xk;~ zxs8q$6WGE#N1n9lS&gA<1!oh!l!nKZ$ei@}e^p&~AeG-6zivcIC?zY>B0`xFU8HQX zO0rjWWR#VwO@w4d_J|@ggvM7XduLZDu2r%nzvsA@-}R3_UiUrkbDr~@=RD^*=lOhI z7kJA4CFI;xuUx2AF;0Mf^c_9z#@B>Oi)jBd8+sN$!E7||RJ%{`WxI-7g+TltgYzDb zVx+`ZsQ0n1tiUzTd70nEuuFBMH`T5DE=-TlrX4nd%jG>!TjzAB3!s`UEAtVr-Z!QT zuVH)Sm^0h(GK^`^n~LyIdiFxIW#EiK)`OyMN2%rCALihcWs8_q?a|faxL_$q@$s`T zsZLBT9P#XX+f#D2+++;A+;42?CVG3zI4NU7yn~GyEf=5+SUxx4-0RUl>M-{7#=Q3Y z>cNYmbRgkeV`i0Kmc`L%cP6-SPI0II3?wPvI=QR=tdiu3IW~}=;y!=ksHnP1RT_KV`3Rs)>V!{~UD?=n z*i#;y_{G_~Lwm`L&az3;)YIn1F}P{{O2G)WteKDG`|S?4vM??SjQA`>3J_o`;57N; zU@6D5VCH9f&uwY|ziM$@Td|AkswH~~69$nTErQX*~*xw@IJn)Y0EP56hZ ze2TlKRg&`AU^R@5^DsK=HQn^_b^Yy9x6x~JlaU&ol9Jj!0Jl|EbH1}2%JUGs+TkZx z!n%|DtNtzZN4_?vHvF1pem~Fc^Gcf`eT~MS3JIvS54(Jxt_-RpG z3f<2C*QNdD$WSvHo5Q`*j>^K ziqA}TM+0U}wBy5gnX4=Hb-hwEMSXy*Q$fu{YXRwhhGKEip|Ct|>^ZDTudoX$6`*66 zXq>~gWDM>)B;Nlz9)JfzoloT~`dnY05%<1Zrd$2%DU0L<$L^x%9&<0@P{L|@Qi0iU zc=lDtlC{eHm0{KrdYLH4my)czxQ4}58n(ZJ6ED^G?jmBw%nSd1o;vHvp-mft$|9f? zo3q8kc0iU@iAX=womvOrgO_aw`@}unOSP<`Jv<#g`9Cgx+tRzL~jo zG%3H0;=T<1qUl4Uh`Q6~lU*yQ-!3|q{n4sc9%P+PoH{PKN)ta_8$n3>0uYTF7l z__`x6_b27^UNn|ZmUJJxEZ%qRrU!K)9RGf5{r%O$?wnf%c;|s4C{?v^ci+-&bZNSN))x0Xx|N-YUpJ0^5Nkk+Dff_Z*Y8PyuG!+z&g$j+hJrfExR>ec>%UVqY2VD6 zX6ma7JY%2~Pjt!k|D0axL_P+osBU;b;l_Msyg1D7S* zcOQEM)p7w*HOI?w%m?8F^j}4%daPL8^z}KzsH*72?1wB@v&1(`cnTkx-0LMWx4i9a zx+N>#g3`5JDbAv+xB?(+R!be=LRBHc_JLCTcvU^4i*RcOEL@nXv+se#%1OBCk=Eez ze4JDK@{o*cbZXDhWW|LC5-KAP|ke3nqJ zp+-YTlV~7Rg*&S{#W8;I9Chf)-x>RSppO2c zx2+~p3=Sz71$#TL!|GPs`oru;vJ3x(+(zjj!{4dSm5WUQB`#rGnI2SKJg7&1K6`qk zHs{AblOo%~N-tX9WZKTlr<_~V#5>bC%=2!-;o$XP=Ij-FGPJ{17AF|K5WI z7L)@C4Fwf|TBegzFe@tg=6r6JkJn_MkE(e+T+y=p^P}$1c&>6mP~OmL0bHF%r)zd4 z+^d>$v|+I;>G$TCw;O)YpQl=<{m?UeU-HYM->?&o>5tygOQlr)CwL&r_YY)=&U-D5 zdu018<@fY=4UEBM>^Xt2y0QF*r6PK>dZ<#c^9X1qlkLK|xmQWtU8qPY^71~`XxrY? z*s7G?9iJu7Yjud9rW^utTD1(0el_u+JgCA~wfh)Ro92c~y?L(_yxlN@pMv$}y?d9< zN6{v4*BEa#PM7L^dO1erw6Ps;=ZBk;$6>BN%jIVip1vsx=t$t~&#INLG<7%9zm2wz z|K=qgIb0Cq&i--v9O3H(zn$&z@2L)I=pLAltbj*CX~rmA#D009I7@ms;U*+Q;@U*TRrl#@+2MAA;Dd3A=vry@)^ERXSsu_VR&m z&7TuF5bLIK;pp801U@Dy1op<&Dz-?+!a0rSBC08aI+spV7aLpXYvJk)+pj&skN-`# zbT4c+lnjDHusN^yRc6`oO`VG;w{u9=!ac+uabxM%Lp@g;wzGeox7u+fP3CSXn{M`? zhV+bTwt`Y!2k#V%^Tc%i^M<(VVO_Ye`@2r>y*|izj9$-`BL0Oi;9aSQoj4qMN%jLA z5SVTDhg-*tj*}}BpDdLLVLKWNRV8nxY+9ZYq{6IjT)K-#{96%t*|azFjD+2=Mk)2O zWusk=Vefd8%m=z>2J@TSEJvo#4=qpLFmCOBlfx=%`=#mZ%Hb=Et~;Re?XA+OE0gyR z$7c(vwmY*U9MW;v2w!c;Wp`o?%kGYk5R8?4C9`Co=5_Kb=NAA>tb$U_TcTMR@;DA% zv~4uJv3wAi37`^!IoepCCpOq}rZ34~(NXqgb#H@0^QPG8w8*1NRig)6WS`0i_SN$LP3G(m=8(Gn z-uEvd{bgLKx%%syQ>wdF%5_*(Sos=YJX>1jIqa@CE=b~<9>y6jb`^>j!foQkqn`<{ zIo!XzUE*JGI4x}hw}^v1n1gR`WnMg}L!3@uDUE+=tmU{>ZoI0DZ1a&X5`>IF ze>%6n0GXJ-E3c!fl3>#8yF8lnQ)kcZ1Ti=rdJH9HWl=>2GMixG0WeS@H>1Z-bMikx zk=f-g!Aze*)$uI#-9za%MpX#THdk%N)qsxo-o&SP08X6K=_x@NdDbFY?aWR9578qy zs+(q@65+#}99RbB%$?VN#yx6&Yv*bd9sMFo1uoC4N{2AR81-l$LOQ{|?7L4&5K1{_|9S{?TV;jt9Np zQZakVYGz{&>6QQe!KX3PjCPalnJo%^jaw^S7ylth7haw@gZh({w6Z1$>JsWV`=FXP zEcd7JP@Au29Bt`@LW`^st4dCA{v}^#*bfP{Oe%y-Jx*=n_|G-hSnT;eNr*C%;;w!F z1gV30TIzY_^fw7-f@V3rfgn(Gx$d`I7mk4Cr`u4 zU$w#-2uCS;FH>4zoA=JmPcj?seXt^krGc$kl)mb4(p_d4{{CVhSV}Cdtlx8_9^eUE zclH6i)v^3$s&UCbfBr3TMiF)jo3>*038jod=^a;YW>od1_~yEvu?Mx!rd?fr=-H7| zN>Fa8x)H2>j7R4>zyLT&d(GxGC4Y=@G>EEw8`v)BmFc1Wlxp0|vEsT;?PSoM!*QOr z2I360Q=(j!R0D!oUYgctx;1QpeVHv(6Z+2zu|o;JCp^W}6aHH{&|INZ%;3(xGWqk= zr{jy(0E1e<<#GH-WfRrbA70E05p~*!qp{d=K~(D7QlTFA$g*ap7!ID(f@R(QxkAA{ z9ji#=;&e&Zooy^*d;fBN?>>f#yb1_0kptO%cR8O$6M4)y(s3-pZ zKo5uZ5Ut%v!pd!Cqbrpb?_Zk$T+gRn+yq*_$FaW=LY}c}(7;}iVM!06ebLA`7q~m5^={a9Foe&X- z{9=VnlV--d`_Gi73%hNV9OqeX9{oBG3(fC48Y6ynf@+P|KaT=@K=D?A;XU~tGjLc@ z1bMpuq`$I_8w#a67s7s4bjFIhH`x8JXF#$&bk(*rIn=Y#?0F7n3FOW@2n&~PaoEMF z*5$x)gva>V?7f189k4;}DXQobIjt<~n&iNDrJ2fc|Ct8`Ctk!Ed-~M7devCfxqlwj zKgMxo^iM9VAB($MV$)~60c*hi*VlcHS0t*#I<1Fm--6NE!MU;cxNyPbIbWj>=T?UQ zJTG&$;W2_D`{an@_i?5)!~VuW4o)p;K}&3mV^^Q`8}|0dc3>!<->%pMg)>!G@wgmUSOMs+p_a)bKp>s?BBd$wma0}oAjywnzr#IaHtBy-@xyPp@k@((?=q+xJ4ix}o4} zK6be+03OYvWMrgt2@QK=jqb+MgeZ&rK@pw3F#P3=HMe4BRvbp zC;y}ft3B$?XIp$Sa+S$kIIZkt#?N#JgRY-o&@HP8cq^0)4PpF4R*GO|5 zrF-`}_e!7kc%#|<31_Y)O8EkAg28>seAR(}qDHzk%Y+wi3CFADU zldJX4H)^)e-C>S%`TVIJpd?co=8eYO57|D=q<#*o$9+KZs2JJuPIABCK;HQ8;#a`v z5oWK!@#T_h)9t?AElJ5g^0Hm8Ou=g9#oRi~`$RHCSLoN%6?O+W;>qY1_Kf0iYdtpc zaDHTh1LnzE$Uj-!L&~b zUKlF@0`k!ohZa?rbV zp{O8Sh1!bj%zlW^o#2*Nut%0O6^-Pcc9x(EGunNN57^-r&BWVp3|Vjq)oN(G5bodh zdK%hxJN5r3J=6Z4_R_ZQ%T4(lVk7b8wkTrL(lHmqmr*J6wqB-L$OIx2}_>wtVOR?ft__3nToV&aUfV&no^j;c2>BN)kE4=;W zFF#Rv7ZH(krALQ~J{@8+c)0g`C&UXs{_Qmy-1|3YAX2U8I%M|m7XO1|l+q=p{Q9`E zs9-~cIR%@hkFQ4agb)%xZ$X^97VE{Pv^w5Cn?f%A;WtL7eo0n$s7%fzb6Oa}X-r(Q zVOAR|Ch1S-3NU{-T875y^-HqT8q)QHs{W~4tk;@qux!rF&+|Dgd zMz^1bt5{-Tm$(&MATRU%-u|9A=U;vN<6m`i^3ETh(WY`;@$oq$=~2-tJ>RXFKlM+G zA!$j~ZY-;dOA-HBYSL!j!^Jf?o*T9{{@|_187F_5Y_5fCNs@ z14<4Usl8V!cwhQGz!7%c>0PiQ#9d2eNNJP>Sm=qqW!jcaYJ`rQr-fQs;uTPe_qvaf z?rC%VaXYrF!XTJ*U0KkGoLH}m8oj|epI!z11!L<}k)AW%w%tW)UlT<5ZvXz|3U@V} zfl1`KTC5lgz3OywN1mk$f=lR&g9DA)rjZCXk99I?kj`pre^L6Z%+Pb>pd+>B)yX%)kLl_GcXX6R!^$u& zu}zIFO#g6;joYlO^}euA9zSZM)2O9wZ=~0MjF-+iPM6x|dVJx4vXotWWRZQR-~>yz za{IG3{DjOBlhfsMNizjc&Lcvx=F7rCx+lN-!TyUAR+baV@&c}JG6KEO4FFb`0x-3d z*U75M0s4k*&g?lJvID#CZY!yG{hD;MQ`JF-I-c3+%O{cDM$9;ZYyQCC1m;|^SfxuoNQq z?35+18h)lD#}q(AUzI&&wE(c!ccZ_~{nP*ei!e#H-Oo+G3B|1C0z3flDB6*oQTkM$ z>)q|+!ZOpseY1ZfM#RRK8#q{CHe-1Kypg6YI-|LPm{R$S=V^Z-z5OI=6o z2~k&{)Q%LKxK}@`Nnb_LQq;9s!*x3`Jdew!>W!1Jy}+2pbBr zZiTO@A0ou1v~Nt1a+;kzcz;UKy=43MLB?gR=tp&Yanr#A^F@zjHh~T`Bu9_v9x1a< zwO#zdVt8IHeThS{)Q{y-;vKIy&m}D;bZguUmYao&Ay9ZF>!95deRxKToU?$cHEvUoludt@vm^@P)Eg_HDcB^(;)(n4_@wk><9>c<#spn z^c8!LO+eo77~OKyzba>~{v50PCxdY;c;)C%cP@c546|BS$($?&q=W|1K^%>(RSR|CDQiFf%N) zPx!HZv0C{^S|}vW7>YkGs;jh^n5<~r;401!1}Y%A_Vwdp_5m%SuklFu20R}Ci{LY?9Im-%n(^mv*W z?1zBkE1%vjLI})kr+lB-ylT)haEJ~qy081gvA0yeASlhP`;1c@`*JduR(Fsu@2d!d zysD7VTvK_U(cR^AYFSqgbviI9FV@Ei(p}PM6YW!ZDrNY}3o7ZN1lZ#we#=0nqkMZX z6qo#l-dYovH7xntUkWjZz1n&(S{tG?DJz{B-0c8^;!a5MNCIm@{4 z*FilsK3n?>tk?RNIcIi^oLvgnR)0Csn~$4Y4Ds#Xf?9 zNsd+t^;!ChZVYL0m#0;vqP!;$!2Q{JPkT5c?!(7#zXCOI4pU*Ub`ys73T0X=Rji_5 z#<_-NQtQymeUi(!;#XPtY$)&U>h-~B!dl*KxGgJk#$`06^l`c8a=xnDsma$@%W;a< zPuLGjJ!J%3hny*e%HuxE_orH}UE<)+@Xez0)SHjbj_-fZgc+s~m)!bYB08(GOaAH7 z@S<(0^5e0Gi5;38GYN$0vOC$IMD+mzBQiXYhdyCe&p+!xTc?S3rB=n zoC0KOO0F~&O~)zyNS*qTWG`F1ugv0ePQf#e#=lpigB@-o;;q2(9}<$f##K^7IZKbS z&KtjHo^ICU57a$AB}$3f2Wz;~>?Uj=3|Z zdKQD3EWQa};wf~7ZKWFZg}lpf@58#Oak;G1%B_6sRKP;M$=_8fv5=hr+}BCV#_K}y zZ1uq^-yp+oINQoCU|J>lr9J0&d>?vzOC9>;s&)oXBKyMN|8CXv{{_T-w~EJk5DVez z%kW1D2*eJkeV`?0yQH~=K>AgmE9k@Pc)1-3{HwoDM0~QA`R6XLLr>qp+MnnFtNiA8 zN_mw*j@T+r3++ptLnSuQqUAyX-x}AjCJi=xm5O_vmu;O63XqYH-Z6&n|8-ELTSH?8 zfMgmtUt)*~xV2Hxb3log-qv?*Kr|3i4?V)}|1qAOPqEq!J=8SA>M$dCWv*5bC(%)c zc3s3lb-$y#?!qz2I+rUE^_dINZ*m>lp+HMUm&l-pG+e|!g!tg5_Pr5X)#*C(-I^+K zvs7Q?HgLI;pq+Ps)(;%umL;Rr1On;Zpv$YH=iHHeky!h!=*I~>5D*0wOc~8 zouQ{p)@53JYX$LA+ao1FkuwrBqEhPh=1aQZy$5vfM-HXyTSubPVHG*W2)e>$sF ziK`0b#|1P4JswY7QCiyChd^C>C@`GB4YXDYHA8= zZ{q{7wY&%hw%P8g?K%Sim*zX@%)y@dP+jsSnUFw*PFaS zb?tl%yr0@R(aO56$%NA&kaEGd{aJNPYaQ~#WrA&nE30U0fWm=slgPGt5KR{sHTBzT zO;QMNQ$7zWa_x?f*}vvXX~Gj=ytasWT0D+k=Qm;CIS8H6vUMN?fTqKlNj#%UFjvAY z^0jS9p~;7Y?U25K9_%Q!62(v|f<9E;fa z0FpR3URq6Sc$viMN}4%xNQ)yGY(*E*Zx#FmFC5>g3)IV9COo?pQNsp3M{lKcIZZ`dv6)OJqt| z{agYKnsmA6_GkU~fBV5;SHSxI+Py{oFX0ts1|8A-Wne62cxu;8_Z>g3lkpx1%Aj$V zIJJmAg9)+lhKgRcaEn_1EjV&;wOq|Nc~P4Zlo?dSHjjY`n!OQP=b5HS##o-=LNx5$ z`y&27bGS4SzpFxPRH&}${|yNP&VUlLODzhG#w`QCX5tGBXW>iRw+F772VQ84rXHm~ z!UZ|UP3p_4qzc?%N(bmz^y$b2Pq=fIi?~^Dv=9_YYV)7 zAXgE&D`JnsFqX1hyWpu#>jhxMSyy`qSkbM5Z`^@o{u6_J3nT7-A{31xk1B;SkuMh) z2A@*$4`p9_orjX*vmfpmJk9+4axdvi=yUr}lxdo*usa%A(%PKyhZUQ$m>V&hYhJ*H zZ(eN%kKDf&&V1L}54oOV?b-0I@U*$fe05zVeNOHW=rnJ0Ain^)P7i=-hdg0MjJx=E z3<*rc?xrB(0&e!Kbx*OtU=mA{0u0w7FStg@OqK!Nzhe;9vp7fQ?QvYl&kfdH*aV-h z&cTpqOStIZsmQMjyVm+&or>v}SSZ8v&<-11cVRI8G@ui?M#WGCGB=IEw}Mq@6`QNU z=edfp_H;z8ZUdXNz=ZOz$%MD34H3rzs}`m@<G|5j;24r8Ms?5Qr`Sy)##wE70M+9MIFu(4H;wORZCHIlUqJ4oCw z;MO?5i28tz9-^w=inm8SkbeveU29rp;L(Huz&b=#n;j!(aJB-y93M~=fcJ6kl-0!H z!EXa=v)B_pwl1qGO$ar%6MSxU1pmS+v%~7l;L=1Bkm?IhsDc@}25M1X>%*SF`}kVg z5H_ND>w`C_#vajMe}9A~R{-0I^qMAceSHi;116}|cCOH>4Zg4zrkh3kqn_1PX+pM= zT18Ur;O|^-HIpWHJGK+)wMb}zyj2`(wRKOZ!p2rnU;Dz@(Il9ryg+o+_zmny=z|uN zih(!*(3VSLt=O7gU}Sj^g*MjaUbPw7mI>*S29r0S`~vCK7E2<{#znvw=514*T^}t5 zie|15K4{^RQa%USB%sB?Qix&Qmq$as6vA!@>o?XJ25|~k$P)~SDZ3guzk(4 zKyVPPMv+~_jTO-f@F$_GgC!K);tk|$VJD)ZdLdYXRP~lpk>sy}QCBJJtk%1FisHw< z5IZDlV7@e&s8h&Yoc&v^CQNQuv#6&|wY!n(=CS-lLIJM3Fajt3vs$0nxa$;s`$OoV zQSXd=Gz-_vbqZlS9-gnRJ5JuHBa&&LRuBE|2E`BJh=-WN>+Co4PprL;0>bJ@&`HH$ zCtBm6TdRMFOgx^0hcC>!{7?GMpFauV_#);h>Hj5rzjh&NRu)_gepT6yMXM}V{5Jtd84b$F=N$g z8ycNJjXKruX2d15QlXd)b?iEtJo{y0Nvk%#c}GGK4U<1~eqRCBa$TL^GR`8^`v>=I zTUS1)We^1trzY%S+AHh&c@if}h&A-{q&Oy)6h`5j84@CBm;#{D!~)78@1PBft7>;=eyh~39)JbW`?*QOu&IkX;b#`Y$gpeQ#z(lE};=UeXhWRHmz%eua6YP z?P$@yVLsh}p8hSSI0)lp#+=|w{5ca!f>4NVRv;w|@ZWbNh|xe~0ZJ{RwIq-DR6u-v z|Df6k@}-(q9_Fr47hVgd{!3a-5)~sYR0JlxVZHU8BofYB06y`~UYJ zuA#%IyiW-2++b9u;Ha7Oyfj(Ck?p1+5b1YucyP2#m)~oWC^{Kv(lM!L5*on(Y0Gc( zpzZ6LT3L`RlKyc57J5DlKk1iFQFWDi&i)>gyBTWF?jdw!aQ zG%Jt;s73>DhiiZS20#4{KE+e(o~Q#+s~*K?Qq+nEV_~|s>D<~rg61wJ^)weh2w-Z% z`*}65LX;J^8LZ;C-=1hHa$99Wg~8v7=nl$b@VQ$wjfk^Q4t8J+{%4ZzkvgjR1slE{ zf^3NPG7EY5$og*sno8NSr$ll?qbL?OEvAQf5}!+>sZMH?7}q34tu-2j4X1^V{y!n>OhXG(veRK=lLp zJpG1rZ(VlI7VJ0@(@k3V29cmnxPY}SNeQC~9}QC=X#ZuwftmFd!B6|aGfYbLfenHh zAwi2c4xYu}FKx{wt-b*`@EtU)p+`u=fpe#-=D?fnfN7G}o`NDe(!xh`00J*X3{y!I zxtn?iyzmSYv&qvCOYl(?5rbu1DC(z@yw*Bpa4@EXThkuIuWCsHHW$y5>_GC_29X3-2WBIaBm;TwCRwG7`Z($ zAtNOws`2()LP)6+g+uVV1)Z|nn&%V74*G+?1@Y}_v`9{O^?%+l@x3*J}G?3(Al!O5JYFi`C{vB5=G!9&eU<4O)N zjM~`2HH{*XY~E`fC0UN5nqMKxjzF^3$&{2LSsf@+o+Q+XJU&T4cLV}*)G`^dumyXw zNYdy_q)~AJUE+=v14K=VK{zxU!{zw2&yv~bKgf2@Q*%$zZ_sEu(r6K1A#fn+P+cJM zcH+5Vhs`s!In8sekE(t;Xt9MPQGp0)#a%W1HxMvhVdP%fFhReg3~XOfsuh@1HfDt6 z^C_U4J1$#1yGJs`-&7X@aJ(>=!?o{#>>njBp-Jg&OsoL2;!P$X4kP){^`iX2Zff6Q|a&A-RaiWB&0=Q*H9!vbnCJbg}B}ukp5re^OMhe}8 YsmmU(): ColumnDef { return { diff --git a/packages/client/src/components/Table/index.tsx b/packages/client/src/components/Table/index.tsx index 4a18e84e88..734cd674d0 100644 --- a/packages/client/src/components/Table/index.tsx +++ b/packages/client/src/components/Table/index.tsx @@ -23,7 +23,7 @@ import { import React, { type DragEventHandler, useMemo } from 'react' import CustomTable from './components/CustomTable' -import { TableStyles } from './components/styles' +import { TableStyles } from './components/table.styles' import { useComponentWidth } from './useComponentWidth' function Table({ diff --git a/packages/client/src/components/Tags.tsx b/packages/client/src/components/Tags.tsx index 0969609329..024e07ecbf 100644 --- a/packages/client/src/components/Tags.tsx +++ b/packages/client/src/components/Tags.tsx @@ -1,5 +1,5 @@ import styled from 'styled-components' -import { compactScrollBar } from './Page/styles' +import { compactScrollBar } from './Page/page.styles' export const StyledTags = styled.div` display: flex; diff --git a/packages/client/src/components/form/FieldGroup.tsx b/packages/client/src/components/form/FieldGroup.tsx index c4b2a42b12..fb4405bbb4 100644 --- a/packages/client/src/components/form/FieldGroup.tsx +++ b/packages/client/src/components/form/FieldGroup.tsx @@ -1,6 +1,6 @@ import React, { ReactNode } from 'react' import styled from 'styled-components' -import { FieldGroup as StyledFieldGroup } from './styles' +import { FieldGroup as StyledFieldGroup } from './form.styles' const Row = styled.div` display: flex; diff --git a/packages/client/src/components/form/styles.ts b/packages/client/src/components/form/form.styles.ts similarity index 100% rename from packages/client/src/components/form/styles.ts rename to packages/client/src/components/form/form.styles.ts diff --git a/packages/client/src/components/EntityIcon.tsx b/packages/client/src/components/icons/EntityIcon.tsx similarity index 66% rename from packages/client/src/components/EntityIcon.tsx rename to packages/client/src/components/icons/EntityIcon.tsx index aa40d664c5..7ec2b50877 100644 --- a/packages/client/src/components/EntityIcon.tsx +++ b/packages/client/src/components/icons/EntityIcon.tsx @@ -1,12 +1,12 @@ import React from 'react' -import { AreaChartIcon } from './icons/AreaChartIcon' -import { CogsIcon } from './icons/Cogs' -import { CubeIcon } from './icons/CubeIcon' -import { DatabaseIcon } from './icons/DatabaseIcon' -import { FileIcon } from './icons/FileIcon' -import { FileZipIcon } from './icons/FileZipIcon' -import { StickyNoteIcon } from './icons/StickyNote' -import { FolderIcon } from './icons/FolderIcon' +import { AreaChartIcon } from './AreaChartIcon' +import { CogsIcon } from './Cogs' +import { CubeIcon } from './CubeIcon' +import { DatabaseIcon } from './DatabaseIcon' +import { FileIcon } from './FileIcon' +import { FileZipIcon } from './FileZipIcon' +import { StickyNoteIcon } from './StickyNote' +import { FolderIcon } from './FolderIcon' export type EntityType = 'file' | 'app' | 'job' | 'database' | 'comparison' | 'note' | 'asset' | 'folder' diff --git a/packages/client/src/features/spaces/FdaRestrictedIcon.tsx b/packages/client/src/components/icons/FdaRestrictedIcon.tsx similarity index 92% rename from packages/client/src/features/spaces/FdaRestrictedIcon.tsx rename to packages/client/src/components/icons/FdaRestrictedIcon.tsx index 665bd38a62..33182319ca 100644 --- a/packages/client/src/features/spaces/FdaRestrictedIcon.tsx +++ b/packages/client/src/components/icons/FdaRestrictedIcon.tsx @@ -1,7 +1,7 @@ import React, { useId } from 'react' import { Tooltip } from 'react-tooltip' import styled from 'styled-components' -import { FdaIcon } from '../../components/icons/FdaIcon' +import { FdaIcon } from './FdaIcon' const StyledFdaRestrictedIcon = styled.span` flex-shrink: 0; diff --git a/packages/client/src/features/spaces/ProtectedIcon.tsx b/packages/client/src/components/icons/ProtectedIcon.tsx similarity index 91% rename from packages/client/src/features/spaces/ProtectedIcon.tsx rename to packages/client/src/components/icons/ProtectedIcon.tsx index ca03505100..603ea5164e 100644 --- a/packages/client/src/features/spaces/ProtectedIcon.tsx +++ b/packages/client/src/components/icons/ProtectedIcon.tsx @@ -1,7 +1,7 @@ import React, { useId } from 'react' import { Tooltip } from 'react-tooltip' import styled from 'styled-components' -import { LockIcon } from '../../components/icons/LockIcon' +import { LockIcon } from './LockIcon' const StyledProtectedIcon = styled.span` flex-shrink: 0; diff --git a/packages/client/src/features/actionModals/AttachToModal/styles.ts b/packages/client/src/features/actionModals/AttachToModal/attach-to-modal.styles.ts similarity index 100% rename from packages/client/src/features/actionModals/AttachToModal/styles.ts rename to packages/client/src/features/actionModals/AttachToModal/attach-to-modal.styles.ts diff --git a/packages/client/src/features/actionModals/ScopeList.tsx b/packages/client/src/features/actionModals/ScopeList.tsx index 0275266ace..20d06709e4 100644 --- a/packages/client/src/features/actionModals/ScopeList.tsx +++ b/packages/client/src/features/actionModals/ScopeList.tsx @@ -5,12 +5,12 @@ import { Button } from '@/components/Button' import { InputText } from '@/components/InputText' import { HomeIcon } from '@/components/icons/HomeIcon' import { Col, ColBody, HeaderRow, Table, TableRow } from '../modal/ModalCheckList' -import { ModalScroll } from '../modal/styles' -import { FdaRestrictedIcon } from '../spaces/FdaRestrictedIcon' -import { ProtectedIcon } from '../spaces/ProtectedIcon' +import { ModalScroll } from '../modal/modal.styles' +import { FdaRestrictedIcon } from '@/components/icons/FdaRestrictedIcon' +import { ProtectedIcon } from '@/components/icons/ProtectedIcon' import { type EditableSpace, fetchEditableSpacesList } from '../spaces/spaces.api' import { findSpaceTypeIcon } from '../spaces/useSpacesColumns' -import { ColScopeTitle, ModalSearchBar, ScopeIcon } from './styles' +import { ColScopeTitle, ModalSearchBar, ScopeIcon } from './action-modals.styles' export const MY_HOME = { title: 'My Home', diff --git a/packages/client/src/features/actionModals/styles.ts b/packages/client/src/features/actionModals/action-modals.styles.ts similarity index 96% rename from packages/client/src/features/actionModals/styles.ts rename to packages/client/src/features/actionModals/action-modals.styles.ts index 198cf6391b..fb363b79cd 100644 --- a/packages/client/src/features/actionModals/styles.ts +++ b/packages/client/src/features/actionModals/action-modals.styles.ts @@ -1,6 +1,6 @@ import styled from 'styled-components' -import { compactScrollBarV2 } from '../../components/Page/styles' -import { SearchBar } from '../resources/styles' +import { compactScrollBarV2 } from '../../components/Page/page.styles' +import { SearchBar } from '../resources/resources.styles' export const StyledSubtitle = styled.div` color: var(--c-text-500); diff --git a/packages/client/src/features/actionModals/useAddResourceToSpace.tsx b/packages/client/src/features/actionModals/useAddResourceToSpace.tsx index dd4cfece24..de4e01dbdc 100644 --- a/packages/client/src/features/actionModals/useAddResourceToSpace.tsx +++ b/packages/client/src/features/actionModals/useAddResourceToSpace.tsx @@ -10,7 +10,7 @@ import { selectColumnDef } from '../../components/Table/selectColumnDef' import { getSelectedObjectsFromIndexes } from '../../utils/object' import { useListSelect } from '../home/useListSelect' import { ModalHeaderTop, ModalNext } from '../modal/ModalNext' -import { ButtonRow, Footer, ModalScroll } from '../modal/styles' +import { ButtonRow, Footer, ModalScroll } from '../modal/modal.styles' import { useModal } from '../modal/useModal' import { Empty } from '../home/home.styles' import { toastError } from '../../components/NotificationCenter/ToastHelper' diff --git a/packages/client/src/features/actionModals/useAssetAttachModal.tsx b/packages/client/src/features/actionModals/useAssetAttachModal.tsx index faf32c0d00..5c6865731e 100644 --- a/packages/client/src/features/actionModals/useAssetAttachModal.tsx +++ b/packages/client/src/features/actionModals/useAssetAttachModal.tsx @@ -6,7 +6,7 @@ import { CrossIcon } from '@/components/icons/PlusIcon' import { SearchIcon } from '@/components/icons/SearchIcon' import { Loader } from '@/components/Loader' import { ModalHeaderTop, ModalNext } from '../modal/ModalNext' -import { ButtonRow, Footer, HeaderText, ModalScroll } from '../modal/styles' +import { ButtonRow, Footer, HeaderText, ModalScroll } from '../modal/modal.styles' import { useModal } from '../modal/useModal' import { LeftBar, @@ -15,7 +15,7 @@ import { NotesMarkdown, SearchInput, StyledAttachToModal, -} from './AttachToModal/styles' +} from './AttachToModal/attach-to-modal.styles' import { type Asset, useListAssetsQuery } from './AttachToModal/useListAssetsQuery' interface AssetAttachModalProps { diff --git a/packages/client/src/features/actionModals/useCopyToPrivateModal.tsx b/packages/client/src/features/actionModals/useCopyToPrivateModal.tsx index bd0e2da6ca..148eb95dda 100644 --- a/packages/client/src/features/actionModals/useCopyToPrivateModal.tsx +++ b/packages/client/src/features/actionModals/useCopyToPrivateModal.tsx @@ -4,7 +4,7 @@ import styled from 'styled-components' import { AxiosError } from 'axios' import { Loader } from '../../components/Loader' import { ResourceTable } from '../../components/ResourceTable' -import { ButtonRow, Footer, ModalScroll } from '../modal/styles' +import { ButtonRow, Footer, ModalScroll } from '../modal/modal.styles' import { useModal } from '../modal/useModal' import { APIResource } from '../home/types' import { resourceCountString } from '../../utils/formatting' diff --git a/packages/client/src/features/actionModals/useCopyToSpace.tsx b/packages/client/src/features/actionModals/useCopyToSpace.tsx index 1fc287117b..74077a4911 100644 --- a/packages/client/src/features/actionModals/useCopyToSpace.tsx +++ b/packages/client/src/features/actionModals/useCopyToSpace.tsx @@ -12,10 +12,10 @@ import { displayPayloadMessage, type Payload } from '@/utils/api' import { useConfirmModal } from '../files/actionModals/useConfirmModal' import type { APIResource, ApiErrorResponse, ApiResponse } from '../home/types' import { ModalHeaderTop, ModalNext } from '../modal/ModalNext' -import { ButtonRow, Footer, ModalScroll } from '../modal/styles' +import { ButtonRow, Footer, ModalScroll } from '../modal/modal.styles' import { useModal } from '../modal/useModal' import { SpaceSelectionList } from '../spaces/SpaceSelectionList' -import { ModalSearchBar } from './styles' +import { ModalSearchBar } from './action-modals.styles' export interface CopyToSpaceProperties { createAppRevision?: boolean diff --git a/packages/client/src/features/actionModals/useDeleteModal.tsx b/packages/client/src/features/actionModals/useDeleteModal.tsx index 15db33e2b7..220d2bc969 100644 --- a/packages/client/src/features/actionModals/useDeleteModal.tsx +++ b/packages/client/src/features/actionModals/useDeleteModal.tsx @@ -6,7 +6,7 @@ import { toastError, toastSuccess } from '@/components/NotificationCenter/ToastH import { ResourceTable } from '@/components/ResourceTable' import { itemsCountString } from '@/utils/formatting' import { ModalHeaderTop, ModalNext } from '../modal/ModalNext' -import { ButtonRow, Footer, ModalScroll } from '../modal/styles' +import { ButtonRow, Footer, ModalScroll } from '../modal/modal.styles' import { useModal } from '../modal/useModal' export interface DeleteResponse { diff --git a/packages/client/src/features/actionModals/useEditPropertiesModal.tsx b/packages/client/src/features/actionModals/useEditPropertiesModal.tsx index e1b8a69a37..4b640ff6bb 100644 --- a/packages/client/src/features/actionModals/useEditPropertiesModal.tsx +++ b/packages/client/src/features/actionModals/useEditPropertiesModal.tsx @@ -9,14 +9,14 @@ import { Tooltip } from 'react-tooltip' import styled from 'styled-components' import * as Yup from 'yup' import { Button, TransparentButton } from '@/components/Button' -import { FieldGroup } from '@/components/form/styles' +import { FieldGroup } from '@/components/form/form.styles' import { CrossIcon } from '@/components/icons/PlusIcon' import '../../utils/yupValidators' import { toastSuccess } from '@/components/NotificationCenter/ToastHelper' import { InputTextS } from '../apps/form/Fields' import type { ServerScope } from '../home/types' import { ModalHeaderTop, ModalNext } from '../modal/ModalNext' -import { ButtonRow, Footer, ModalScroll } from '../modal/styles' +import { ButtonRow, Footer, ModalScroll } from '../modal/modal.styles' import { useModal } from '../modal/useModal' import type { RequestResponse } from './useFeatureMutation' diff --git a/packages/client/src/features/actionModals/useEditTagsModal.tsx b/packages/client/src/features/actionModals/useEditTagsModal.tsx index c4c87467d0..ed53e4b4e5 100644 --- a/packages/client/src/features/actionModals/useEditTagsModal.tsx +++ b/packages/client/src/features/actionModals/useEditTagsModal.tsx @@ -2,10 +2,10 @@ import { useMutation } from '@tanstack/react-query' import React, { useMemo } from 'react' import { useForm } from 'react-hook-form' import styled from 'styled-components' -import { FieldGroup } from '../../components/form/styles' +import { FieldGroup } from '../../components/form/form.styles' import { InputText } from '../../components/InputText' import { ModalHeaderTop, ModalNext } from '../modal/ModalNext' -import { ButtonRow, Footer } from '../modal/styles' +import { ButtonRow, Footer } from '../modal/modal.styles' import { useModal } from '../modal/useModal' import { APIResource } from '../home/types' import { Button } from '../../components/Button' diff --git a/packages/client/src/features/actionModals/useForkAppToModal.tsx b/packages/client/src/features/actionModals/useForkAppToModal.tsx index 85787359e1..987ad1c02f 100644 --- a/packages/client/src/features/actionModals/useForkAppToModal.tsx +++ b/packages/client/src/features/actionModals/useForkAppToModal.tsx @@ -6,7 +6,7 @@ import { getSpaceIdFromScope } from '@/utils' import type { IApp } from '../apps/apps.types' import { getBaseLink } from '../apps/run/utils' import { ModalHeaderTop, ModalNext } from '../modal/ModalNext' -import { ButtonRow, Footer, ModalContentPadding } from '../modal/styles' +import { ButtonRow, Footer, ModalContentPadding } from '../modal/modal.styles' import { useModal } from '../modal/useModal' import type { EditableSpace } from '../spaces/spaces.api' import { ScopeList } from './ScopeList' diff --git a/packages/client/src/features/admin/AdminListPage.tsx b/packages/client/src/features/admin/AdminListPage.tsx index 325489cf92..098730b964 100644 --- a/packages/client/src/features/admin/AdminListPage.tsx +++ b/packages/client/src/features/admin/AdminListPage.tsx @@ -4,7 +4,7 @@ import { HoverDNAnexusLogo } from '@/components/icons/DNAnexusLogo' import { hidePagination, Pagination } from '@/components/Pagination' import { Button } from '@/components/ui/button' import type { MetaV2 } from '@/features/home/types' -import { AdminContentFooter, AdminStyledPageTable, Title, Topbox } from './styles' +import { AdminContentFooter, AdminStyledPageTable, Title, Topbox } from './admin.styles' import { AdminTablePlaceholderLoader, getAdminTableLoadingState } from './tableLoading' type ListShape = { data: unknown[]; meta: MetaV2 } diff --git a/packages/client/src/features/admin/Breadcrumbs.tsx b/packages/client/src/features/admin/Breadcrumbs.tsx index 989b33a6a7..bd754cb6ee 100644 --- a/packages/client/src/features/admin/Breadcrumbs.tsx +++ b/packages/client/src/features/admin/Breadcrumbs.tsx @@ -1,6 +1,6 @@ import React from 'react' import { Link } from 'react-router' -import { AdminSectionBreadcrumbDivider, AdminSectionBreadcrumbs } from './styles' +import { AdminSectionBreadcrumbDivider, AdminSectionBreadcrumbs } from './admin.styles' export type BreadcrumbItem = { path: string diff --git a/packages/client/src/features/admin/styles.ts b/packages/client/src/features/admin/admin.styles.ts similarity index 94% rename from packages/client/src/features/admin/styles.ts rename to packages/client/src/features/admin/admin.styles.ts index d6b6e75568..aca070b5c8 100644 --- a/packages/client/src/features/admin/styles.ts +++ b/packages/client/src/features/admin/admin.styles.ts @@ -2,7 +2,7 @@ import styled from 'styled-components' import { BreadcrumbDivider, StyledBreadcrumbs } from '@/components/Breadcrumb' import { Svg } from '@/components/icons/Svg' import { ContentFooter } from '@/components/Page/ContentFooter' -import { StyledPageTable } from '@/components/Table/components/styles' +import { StyledPageTable } from '@/components/Table/components/table.styles' export const Title = styled.div` display: flex; diff --git a/packages/client/src/features/admin/alerts/EditAlertForm.tsx b/packages/client/src/features/admin/alerts/EditAlertForm.tsx index 666b6ffadd..f2fc22f6a8 100644 --- a/packages/client/src/features/admin/alerts/EditAlertForm.tsx +++ b/packages/client/src/features/admin/alerts/EditAlertForm.tsx @@ -7,7 +7,7 @@ import { useForm } from 'react-hook-form' import { getBackendErrorMessage } from '@/api/types' import { AlertBanner } from '@/components/AlertBanner' import { Button } from '@/components/Button' -import { FieldGroup, FieldLabel, InputError, InputSelect } from '@/components/form/styles' +import { FieldGroup, FieldLabel, InputError, InputSelect } from '@/components/form/form.styles' import { InputDateTime, InputText } from '@/components/InputText' import { toastError, toastSuccess } from '@/components/NotificationCenter/ToastHelper' import { createAlertRequest, deleteAlertRequest, updateAlertRequest } from './alerts.api' diff --git a/packages/client/src/features/admin/alerts/alerts.styles.ts b/packages/client/src/features/admin/alerts/alerts.styles.ts index 49a1ee6105..cd4ce22f9b 100644 --- a/packages/client/src/features/admin/alerts/alerts.styles.ts +++ b/packages/client/src/features/admin/alerts/alerts.styles.ts @@ -1,6 +1,6 @@ import styled from 'styled-components' -import { InputSelect } from '@/components/form/styles' -import { ButtonRow } from '../../modal/styles' +import { InputSelect } from '@/components/form/form.styles' +import { ButtonRow } from '../../modal/modal.styles' export const Form = styled.form` align-self: center; diff --git a/packages/client/src/features/admin/invitations/modals/useEditInvitationModal.tsx b/packages/client/src/features/admin/invitations/modals/useEditInvitationModal.tsx index 424f6f4482..531cd07849 100644 --- a/packages/client/src/features/admin/invitations/modals/useEditInvitationModal.tsx +++ b/packages/client/src/features/admin/invitations/modals/useEditInvitationModal.tsx @@ -6,11 +6,11 @@ import { useForm } from 'react-hook-form' import * as Yup from 'yup' import { getBackendErrorMessage } from '@/api/types' import { Button } from '@/components/Button' -import { FieldGroup, InputError } from '@/components/form/styles' +import { FieldGroup, InputError } from '@/components/form/form.styles' import { InputText } from '@/components/InputText' import { toastError, toastSuccess } from '@/components/NotificationCenter/ToastHelper' import { ModalHeaderTop, ModalNext } from '../../../modal/ModalNext' -import { ButtonRow, Footer, StyledForm, StyledModalScroll } from '../../../modal/styles' +import { ButtonRow, Footer, StyledForm, StyledModalScroll } from '../../../modal/modal.styles' import { useModal } from '../../../modal/useModal' import { editInvitationBasicInfo, type Invitation } from '../../users/api' diff --git a/packages/client/src/features/admin/invitations/useInvitationColumns.tsx b/packages/client/src/features/admin/invitations/useInvitationColumns.tsx index 1310cf3149..1f0891dbd1 100644 --- a/packages/client/src/features/admin/invitations/useInvitationColumns.tsx +++ b/packages/client/src/features/admin/invitations/useInvitationColumns.tsx @@ -5,7 +5,7 @@ import { selectColumnDef } from '@/components/Table/selectColumnDef' import { convertDateToUserTime } from '@/utils/datetime' import DateTimeRangeFilter, { dateRangeFilterFn } from '../../../components/Table/components/DateTimeRangeFilter' import SelectFilter, { selectFilterFn } from '../../../components/Table/components/SelectFilter' -import { StateLabel } from '../styles' +import { StateLabel } from '../admin.styles' import type { Invitation } from '../users/api' export const ProvisionStateCell = ({ provisionState }: { provisionState: string }) => { diff --git a/packages/client/src/features/admin/spaces/SpacesListActionRow.tsx b/packages/client/src/features/admin/spaces/SpacesListActionRow.tsx index ada7708038..c60e8237c9 100644 --- a/packages/client/src/features/admin/spaces/SpacesListActionRow.tsx +++ b/packages/client/src/features/admin/spaces/SpacesListActionRow.tsx @@ -5,7 +5,7 @@ import { getBackendErrorMessage } from '@/api/types' import { Button } from '@/components/Button' import { toastError, toastSuccess } from '@/components/NotificationCenter/ToastHelper' import type { MetaV2 } from '../../home/types' -import { ModalScroll } from '../../modal/styles' +import { ModalScroll } from '../../modal/modal.styles' import { useConfirm } from '../../modal/useConfirm' import type { ISpaceV2 } from '../../spaces/spaces.types' import { useSpaceHiddenMutation } from '../../spaces/useSpaceHiddenMutation' diff --git a/packages/client/src/features/admin/spaces/index.tsx b/packages/client/src/features/admin/spaces/index.tsx index 7c3dee8336..d366279328 100644 --- a/packages/client/src/features/admin/spaces/index.tsx +++ b/packages/client/src/features/admin/spaces/index.tsx @@ -12,7 +12,7 @@ import { type Params, prepareListFetchV2 } from '../../home/utils' import { type ISpaceV2, columnFilters as spaceListColumnFilters } from '../../spaces/spaces.types' import { useSpacesColumns } from '../../spaces/useSpacesColumns' import { AdminListErrorState } from '../AdminListPage' -import { AdminContentFooter, AdminStyledPageTable, Title, Topbox, TopLeft } from '../styles' +import { AdminContentFooter, AdminStyledPageTable, Title, Topbox, TopLeft } from '../admin.styles' import { AdminTablePlaceholderLoader, getAdminTableLoadingState } from '../tableLoading' import { SpacesListActionRow } from './SpacesListActionRow' diff --git a/packages/client/src/features/admin/spaces/useRecoverSpaceLeadModal.tsx b/packages/client/src/features/admin/spaces/useRecoverSpaceLeadModal.tsx index bd3c521899..ac8bda040d 100644 --- a/packages/client/src/features/admin/spaces/useRecoverSpaceLeadModal.tsx +++ b/packages/client/src/features/admin/spaces/useRecoverSpaceLeadModal.tsx @@ -7,7 +7,7 @@ import { Controller, useForm } from 'react-hook-form' import * as Yup from 'yup' import { getBackendErrorMessage } from '@/api/types' import { Button } from '@/components/Button' -import { FieldGroup, InputError } from '@/components/form/styles' +import { FieldGroup, InputError } from '@/components/form/form.styles' import { InputText } from '@/components/InputText' import { toastError, toastSuccess } from '@/components/NotificationCenter/ToastHelper' import { @@ -19,7 +19,7 @@ import { ComboboxList, } from '@/components/ui/combobox' import { ModalHeaderTop, ModalNext, useModalFloatingPortalHost } from '../../modal/ModalNext' -import { Footer } from '../../modal/styles' +import { Footer } from '../../modal/modal.styles' import { useModal } from '../../modal/useModal' import { fetchSpaceMemberships } from '../../spaces/members/members.api' import { StyledFields } from '../../spaces/members/members.styles' diff --git a/packages/client/src/features/admin/users/AdminUserDetailsDrawer.tsx b/packages/client/src/features/admin/users/AdminUserDetailsDrawer.tsx index 41319d8da2..4e26588ea9 100644 --- a/packages/client/src/features/admin/users/AdminUserDetailsDrawer.tsx +++ b/packages/client/src/features/admin/users/AdminUserDetailsDrawer.tsx @@ -12,7 +12,7 @@ import { relativeTimeAgo } from '@/utils/datetime' import { formatDate } from '@/utils/formatting' import { useAuthUser } from '../../auth/useAuthUser' import { formatNumberUS } from '../../home/utils' -import { ModalScroll } from '../../modal/styles' +import { ModalScroll } from '../../modal/modal.styles' import { useConfirm } from '../../modal/useConfirm' import { bulkDeactivate, diff --git a/packages/client/src/features/apps/AppExecutionsList.tsx b/packages/client/src/features/apps/AppExecutionsList.tsx index c56262d13c..e095a19e6b 100644 --- a/packages/client/src/features/apps/AppExecutionsList.tsx +++ b/packages/client/src/features/apps/AppExecutionsList.tsx @@ -9,7 +9,7 @@ import type { import { useEffect, useMemo } from 'react' import { ContentFooter } from '@/components/Page/ContentFooter' import { hidePagination, Pagination } from '@/components/Pagination' -import { StyledPageTable } from '@/components/Table/components/styles' +import { StyledPageTable } from '@/components/Table/components/table.styles' import { useColumnWidthLocalStorage } from '@/hooks/useColumnWidthLocalStorage' import { useHiddenColumnLocalStorage } from '@/hooks/useHiddenColumnLocalStorage' import { useLastWSNotification } from '@/hooks/useLastWSNotification' diff --git a/packages/client/src/features/apps/AppList.tsx b/packages/client/src/features/apps/AppList.tsx index 26fe8fcbd7..0283632696 100644 --- a/packages/client/src/features/apps/AppList.tsx +++ b/packages/client/src/features/apps/AppList.tsx @@ -13,7 +13,7 @@ import { PlusIcon } from '@/components/icons/PlusIcon' import { ActionsMenu } from '@/components/Menu' import { ContentFooter } from '@/components/Page/ContentFooter' import { Pagination } from '@/components/Pagination' -import { StyledPageTable } from '@/components/Table/components/styles' +import { StyledPageTable } from '@/components/Table/components/table.styles' import { getSelectedObjectsFromIndexes, toArrayFromObject } from '@/utils/object' import Table from '../../components/Table' import { ActionsMenuContent } from '../home/ActionMenuContent' diff --git a/packages/client/src/features/apps/SelectMultiFileInput.tsx b/packages/client/src/features/apps/SelectMultiFileInput.tsx index c0bbe0ecd1..7b75965e81 100644 --- a/packages/client/src/features/apps/SelectMultiFileInput.tsx +++ b/packages/client/src/features/apps/SelectMultiFileInput.tsx @@ -5,7 +5,7 @@ import { pluralize } from '../../utils/formatting' import type { IAccessibleFile } from '../databases/databases.api' import { useSelectFileModal } from '../files/actionModals/useSelectFileModal' import type { DialogType } from '../home/types' -import { ButtonRow } from '../modal/styles' +import { ButtonRow } from '../modal/modal.styles' const StyledButtonRow = styled(ButtonRow)` justify-content: flex-start; diff --git a/packages/client/src/features/apps/SpecTab/styles.ts b/packages/client/src/features/apps/SpecTab/apps-spec-tab.styles.ts similarity index 100% rename from packages/client/src/features/apps/SpecTab/styles.ts rename to packages/client/src/features/apps/SpecTab/apps-spec-tab.styles.ts diff --git a/packages/client/src/features/apps/SpecTab/index.tsx b/packages/client/src/features/apps/SpecTab/index.tsx index 71a7d649a7..c45c178a39 100644 --- a/packages/client/src/features/apps/SpecTab/index.tsx +++ b/packages/client/src/features/apps/SpecTab/index.tsx @@ -3,7 +3,7 @@ import { COMPUTE_RESOURCE_LABELS } from '@/types/user' import { MetadataKey } from '../../home/show.styles' import { AppSpec } from '../apps.types' import { SpecTable } from './SpecTable' -import { StyledSpecTab } from './styles' +import { StyledSpecTab } from './apps-spec-tab.styles' export const SpecTab = ({ spec, spaceId }: { spec: AppSpec; spaceId?: string }): React.JSX.Element => { if (!spec) { diff --git a/packages/client/src/features/apps/actionsModals/useSelectAppModal.tsx b/packages/client/src/features/apps/actionsModals/useSelectAppModal.tsx index 79d819b746..66f9193d1b 100644 --- a/packages/client/src/features/apps/actionsModals/useSelectAppModal.tsx +++ b/packages/client/src/features/apps/actionsModals/useSelectAppModal.tsx @@ -10,7 +10,7 @@ import { Tabs } from '../../../components/Tabs/Tabs' import { FileIcon } from '../../../components/icons/FileIcon' import { useAuthUser } from '../../auth/useAuthUser' import { ModalHeaderTop, ModalNext } from '../../modal/ModalNext' -import { ButtonRow, Footer, ModalScroll } from '../../modal/styles' +import { ButtonRow, Footer, ModalScroll } from '../../modal/modal.styles' import { useModal } from '../../modal/useModal' import { ButtonBadge, @@ -22,7 +22,7 @@ import { StyledRow, StyledSubtitle, Tab, -} from '../../actionModals/styles' +} from '../../actionModals/action-modals.styles' import { DialogType, ServerScope } from '../../home/types' import { fetchFilteredApps } from '../apps.api' import { IApp } from '../apps.types' diff --git a/packages/client/src/features/apps/form/AppForm.tsx b/packages/client/src/features/apps/form/AppForm.tsx index d78d199c5a..7e2eceac26 100644 --- a/packages/client/src/features/apps/form/AppForm.tsx +++ b/packages/client/src/features/apps/form/AppForm.tsx @@ -6,13 +6,13 @@ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@ import { type ComputeResourceKey, RESOURCE_LABELS } from '@/types/user' import { cn } from '@/utils/cn' import { Button } from '../../../components/Button' -import { FieldGroup, InputError } from '../../../components/form/styles' +import { FieldGroup, InputError } from '../../../components/form/form.styles' import { InputText } from '../../../components/InputText' import { ArrowLeftIcon } from '../../../components/icons/ArrowLeftIcon' import { Loader } from '../../../components/Loader' import MonacoEditor from '../../../components/MonacoEditor/MonacoEditor' -import { PageTitle } from '../../../components/Page/styles' -import { ButtonRow } from '../../../components/Public/styles' +import { PageTitle } from '../../../components/Page/page.styles' +import { ButtonRow } from '../../../components/Public/public-layout.styles' import { PfTabContent } from '../../../components/Tabs/PfTab' import { APP_REVISION_CREATION_NOT_REQUESTED, APP_SERIES_CREATION_NOT_REQUESTED } from '../../../constants' import { CONFIRM_APP_REVISION, CONFIRM_APP_SERIES } from '../../../constants/consts' @@ -43,7 +43,7 @@ import { TopFieldGroup, TopFieldGroupTarget, TopFieldGroupUbuntu, -} from './styles' +} from './apps-form.styles' import { VmEnvTab } from './VmEnvTab' type SelectedSection = 'io' | 'vm' | 'script' | 'readme' diff --git a/packages/client/src/features/apps/form/Fields.tsx b/packages/client/src/features/apps/form/Fields.tsx index 8dc6cf0bde..10e44c8265 100644 --- a/packages/client/src/features/apps/form/Fields.tsx +++ b/packages/client/src/features/apps/form/Fields.tsx @@ -7,7 +7,7 @@ import styled, { css } from 'styled-components' import { Button } from '../../../components/Button' import { BoolButton, BoolButtonGroup } from '../../../components/Button/BoolButtons' import { Checkbox } from '../../../components/CheckboxNext' -import { InputError } from '../../../components/form/styles' +import { InputError } from '../../../components/form/form.styles' import { InputText } from '../../../components/InputText' import { PlusIcon } from '../../../components/icons/PlusIcon' import Menu from '../../../components/Menu/Menu' diff --git a/packages/client/src/features/apps/form/Inputs.tsx b/packages/client/src/features/apps/form/Inputs.tsx index fe7dbfb43e..1674a1f6b4 100644 --- a/packages/client/src/features/apps/form/Inputs.tsx +++ b/packages/client/src/features/apps/form/Inputs.tsx @@ -21,7 +21,7 @@ import { SpecProps, StringInput, } from './Fields' -import { SectionTitle, SectionTitleRow, StyledClassTd, StyledInputOutputBox, StyledRemove, TableStyles } from './styles' +import { SectionTitle, SectionTitleRow, StyledClassTd, StyledInputOutputBox, StyledRemove, TableStyles } from './apps-form.styles' import { CreateAppForm, IOSpec } from '../apps.types' import { removeArrayStringFromClassType, setClassVal } from './common' import { useSkipFirstRenderUseEffect } from '../../../hooks/useSkipFirstRender' diff --git a/packages/client/src/features/apps/form/Outputs.tsx b/packages/client/src/features/apps/form/Outputs.tsx index 314aca7671..87e9bda0a7 100644 --- a/packages/client/src/features/apps/form/Outputs.tsx +++ b/packages/client/src/features/apps/form/Outputs.tsx @@ -21,7 +21,7 @@ import { StyledInputOutputBox, StyledRemove, TableStyles, -} from './styles' +} from './apps-form.styles' import { CreateAppForm, IOSpec } from '../apps.types' import { removeArrayStringFromClassType, setClassVal } from './common' diff --git a/packages/client/src/features/apps/form/ReadMeInput.tsx b/packages/client/src/features/apps/form/ReadMeInput.tsx index 37a99b2d82..f2235a9497 100644 --- a/packages/client/src/features/apps/form/ReadMeInput.tsx +++ b/packages/client/src/features/apps/form/ReadMeInput.tsx @@ -2,7 +2,7 @@ import React, { useState } from 'react' import styled from 'styled-components' import { Button } from '../../../components/Button' import { Markdown } from '../../../components/Markdown' -import { FormFields, Help, StyledMarkdownAppShow } from './styles' +import { FormFields, Help, StyledMarkdownAppShow } from './apps-form.styles' import ExternalLink from '../../../components/Controls/ExternalLink' import MonacoEditor from '../../../components/MonacoEditor/MonacoEditor' diff --git a/packages/client/src/features/apps/form/VmEnvTab.tsx b/packages/client/src/features/apps/form/VmEnvTab.tsx index c2fdfbec85..a267ddd09c 100644 --- a/packages/client/src/features/apps/form/VmEnvTab.tsx +++ b/packages/client/src/features/apps/form/VmEnvTab.tsx @@ -3,7 +3,7 @@ import { type KeyboardEventHandler, type ReactNode, useRef } from 'react' import { type Control, Controller, type FieldErrors, type UseFormTrigger } from 'react-hook-form' import { Link } from 'react-router' import { Checkbox } from '@/components/CheckboxNext' -import { FieldGroup, FieldLabelRow, InputError, SelectFieldLabel } from '@/components/form/styles' +import { FieldGroup, FieldLabelRow, InputError, SelectFieldLabel } from '@/components/form/form.styles' import { ArrowLeftIcon } from '@/components/icons/ArrowLeftIcon' import { CrossIcon } from '@/components/icons/PlusIcon' import { Button } from '@/components/ui/button' @@ -12,7 +12,7 @@ import ExternalLink from '../../../components/Controls/ExternalLink' import { useAssetAttachModal } from '../../actionModals/useAssetAttachModal' import type { CreateAppForm } from '../apps.types' import { InstanceTypeSelect } from './InstanceTypeSelect' -import { FormFields, Help } from './styles' +import { FormFields, Help } from './apps-form.styles' const SectionLabelRow = ({ label, diff --git a/packages/client/src/features/apps/form/styles.ts b/packages/client/src/features/apps/form/apps-form.styles.ts similarity index 98% rename from packages/client/src/features/apps/form/styles.ts rename to packages/client/src/features/apps/form/apps-form.styles.ts index 998a4e1b86..16a60a03cb 100644 --- a/packages/client/src/features/apps/form/styles.ts +++ b/packages/client/src/features/apps/form/apps-form.styles.ts @@ -1,5 +1,5 @@ import styled, { css } from 'styled-components' -import { FieldGroup } from '../../../components/form/styles' +import { FieldGroup } from '../../../components/form/form.styles' import { PfTab } from '../../../components/Tabs/PfTab' import { StyledMarkdown } from '../../../styles/commonStyles' diff --git a/packages/client/src/features/apps/run/RunJobForm.tsx b/packages/client/src/features/apps/run/RunJobForm.tsx index df4004a3eb..58a43b3c96 100644 --- a/packages/client/src/features/apps/run/RunJobForm.tsx +++ b/packages/client/src/features/apps/run/RunJobForm.tsx @@ -28,7 +28,7 @@ import { SelectContext } from './SelectContext' import { SelectInstanceType } from './SelectInstanceType' import { SelectSpaceScope } from './SelectSpaceScope' import { SetOutputFolder } from './SetOutputFolder' -import { RightGroup, StyledActionsContainer, StyledGrid, StyledJobName } from './styles' +import { RightGroup, StyledActionsContainer, StyledGrid, StyledJobName } from './apps-run.styles' import { useExportInputsModal } from './useExportInputsModal' import { useRunJobMutation } from './useRunJobMutation' import { diff --git a/packages/client/src/features/apps/run/SelectInstanceType.tsx b/packages/client/src/features/apps/run/SelectInstanceType.tsx index ae9a3bdf9d..26545af971 100644 --- a/packages/client/src/features/apps/run/SelectInstanceType.tsx +++ b/packages/client/src/features/apps/run/SelectInstanceType.tsx @@ -7,7 +7,7 @@ import { cn } from '@/utils/cn' import type { ComputeInstance, RunJobFormType } from '../apps.types' import { getVisibleComputeInstances } from '../instanceTypeAvailability' import { ErrorMessageForField } from './ErrorMessageForField' -import { StyledMaxRuntime } from './styles' +import { StyledMaxRuntime } from './apps-run.styles' export const SelectInstanceType = ({ control, diff --git a/packages/client/src/features/apps/run/styles.ts b/packages/client/src/features/apps/run/apps-run.styles.ts similarity index 100% rename from packages/client/src/features/apps/run/styles.ts rename to packages/client/src/features/apps/run/apps-run.styles.ts diff --git a/packages/client/src/features/apps/run/useExportInputsModal.tsx b/packages/client/src/features/apps/run/useExportInputsModal.tsx index 13faa82fb9..27a04b6709 100644 --- a/packages/client/src/features/apps/run/useExportInputsModal.tsx +++ b/packages/client/src/features/apps/run/useExportInputsModal.tsx @@ -6,7 +6,7 @@ import MonacoEditor from '../../../components/MonacoEditor/MonacoEditor' import { toastSuccess } from '../../../components/NotificationCenter/ToastHelper' import { useFetchFilesByUIDQuery } from '../../files/query/useFetchFilesByUIDQuery' import { ModalHeaderTop, ModalNext } from '../../modal/ModalNext' -import { ButtonRow, Footer, ModalScroll } from '../../modal/styles' +import { ButtonRow, Footer, ModalScroll } from '../../modal/modal.styles' import { useModal } from '../../modal/useModal' import type { IApp } from '../apps.types' import { generateCopyUrl } from './utils' diff --git a/packages/client/src/features/apps/useAttachToChallengeModal.tsx b/packages/client/src/features/apps/useAttachToChallengeModal.tsx index 8c36209acd..09cbd3a894 100644 --- a/packages/client/src/features/apps/useAttachToChallengeModal.tsx +++ b/packages/client/src/features/apps/useAttachToChallengeModal.tsx @@ -8,7 +8,7 @@ import { breakPoints } from '../../styles/theme' import { displayPayloadMessage, Payload } from '../../utils/api' import { CheckCol, ColBody, HeaderRow, Table, TableRow, TitleCol } from '../modal/ModalCheckList' import { ModalHeaderTop, ModalNext } from '../modal/ModalNext' -import { ButtonRow, Footer, ModalScroll } from '../modal/styles' +import { ButtonRow, Footer, ModalScroll } from '../modal/modal.styles' import { useModal } from '../modal/useModal' import { APIResource } from '../home/types' import { assignToChallengeRequest, fetchApp } from './apps.api' diff --git a/packages/client/src/features/apps/useExportToModal.tsx b/packages/client/src/features/apps/useExportToModal.tsx index c0bb699e45..728e2eb9b5 100644 --- a/packages/client/src/features/apps/useExportToModal.tsx +++ b/packages/client/src/features/apps/useExportToModal.tsx @@ -2,7 +2,7 @@ import React from 'react' import styled from 'styled-components' import { Button } from '../../components/Button' import { ModalHeaderTop, ModalNext } from '../modal/ModalNext' -import { ButtonRow, Footer, ModalScroll } from '../modal/styles' +import { ButtonRow, Footer, ModalScroll } from '../modal/modal.styles' import { useModal } from '../modal/useModal' import { IWorkflow } from '../workflows/workflows.types' import { IApp } from './apps.types' diff --git a/packages/client/src/features/apps/useUploadAppConfigFile.tsx b/packages/client/src/features/apps/useUploadAppConfigFile.tsx index e67d48223d..99373f74e9 100644 --- a/packages/client/src/features/apps/useUploadAppConfigFile.tsx +++ b/packages/client/src/features/apps/useUploadAppConfigFile.tsx @@ -7,7 +7,7 @@ import { Loader } from '../../components/Loader' import MonacoEditor from '../../components/MonacoEditor/MonacoEditor' import { toastSuccess } from '../../components/NotificationCenter/ToastHelper' import { ModalHeaderTop, ModalNext } from '../modal/ModalNext' -import { Footer } from '../modal/styles' +import { Footer } from '../modal/modal.styles' import { useModal } from '../modal/useModal' import { uploadAppConfigFileRequest } from './apps.api' import { FileType } from './apps.types' diff --git a/packages/client/src/features/assets/AssetList.tsx b/packages/client/src/features/assets/AssetList.tsx index 03712e9a52..58a4d3a3a9 100644 --- a/packages/client/src/features/assets/AssetList.tsx +++ b/packages/client/src/features/assets/AssetList.tsx @@ -12,7 +12,7 @@ import { QuestionIcon } from '@/components/icons/QuestionIcon' import { ActionsMenu } from '@/components/Menu' import { ContentFooter } from '@/components/Page/ContentFooter' import { Pagination } from '@/components/Pagination' -import { StyledPageTable } from '@/components/Table/components/styles' +import { StyledPageTable } from '@/components/Table/components/table.styles' import { getSelectedObjectsFromIndexes, toArrayFromObject } from '@/utils/object' import Table from '../../components/Table' import { useGenerateKeyModal } from '../auth/useGenerateKeyModal' diff --git a/packages/client/src/features/assets/AssetShow.tsx b/packages/client/src/features/assets/AssetShow.tsx index b861608bdc..010dfbf7a6 100644 --- a/packages/client/src/features/assets/AssetShow.tsx +++ b/packages/client/src/features/assets/AssetShow.tsx @@ -6,7 +6,7 @@ import { FileIcon } from '@/components/icons/FileIcon' import { Markdown, MarkdownStyle } from '@/components/Markdown' import { ActionsMenu } from '@/components/Menu' import { toastInfo } from '@/components/NotificationCenter/ToastHelper' -import { Filler } from '@/components/Page/styles' +import { Filler } from '@/components/Page/page.styles' import { type ITab, TabsSwitch } from '@/components/TabsSwitch' import { StyledPropertyItem, StyledPropertyKey, StyledTagItem, StyledTags } from '@/components/Tags' import { ActionsMenuContent } from '../home/ActionMenuContent' diff --git a/packages/client/src/features/assets/actionModals/useDownloadAssetsModal.tsx b/packages/client/src/features/assets/actionModals/useDownloadAssetsModal.tsx index 730d03749a..1b500dbd3a 100644 --- a/packages/client/src/features/assets/actionModals/useDownloadAssetsModal.tsx +++ b/packages/client/src/features/assets/actionModals/useDownloadAssetsModal.tsx @@ -3,7 +3,7 @@ import styled from 'styled-components' import { Button } from '../../../components/Button' import { DownloadIcon } from '../../../components/icons/DownloadIcon' import { FileIcon } from '../../../components/icons/FileIcon' -import { VerticalCenter } from '../../../components/Page/styles' +import { VerticalCenter } from '../../../components/Page/page.styles' import { ResourceTable, StyledAction, @@ -11,7 +11,7 @@ import { } from '../../../components/ResourceTable' import { itemsCountString } from '../../../utils/formatting' import { ModalHeaderTop, ModalNext } from '../../modal/ModalNext' -import { ButtonRow, Footer, ModalScroll } from '../../modal/styles' +import { ButtonRow, Footer, ModalScroll } from '../../modal/modal.styles' import { useModal } from '../../modal/useModal' import { IAsset } from '../assets.types' diff --git a/packages/client/src/features/assets/actionModals/useEditAssetModal.tsx b/packages/client/src/features/assets/actionModals/useEditAssetModal.tsx index f405398d4f..dcfb695fdd 100644 --- a/packages/client/src/features/assets/actionModals/useEditAssetModal.tsx +++ b/packages/client/src/features/assets/actionModals/useEditAssetModal.tsx @@ -2,9 +2,9 @@ import { ErrorMessage } from '@hookform/error-message' import React, { useMemo } from 'react' import { useForm } from 'react-hook-form' import { useMutation, useQueryClient } from '@tanstack/react-query' -import { FieldGroup, InputError } from '../../../components/form/styles' +import { FieldGroup, InputError } from '../../../components/form/form.styles' import { InputText } from '../../../components/InputText' -import { ButtonRow, Footer, StyledForm } from '../../modal/styles' +import { ButtonRow, Footer, StyledForm } from '../../modal/modal.styles' import { useModal } from '../../modal/useModal' import { editAssetRequest } from '../assets.api' import { IAsset } from '../assets.types' diff --git a/packages/client/src/features/assets/actionModals/useSelectAssetModal.tsx b/packages/client/src/features/assets/actionModals/useSelectAssetModal.tsx index 520a2d4d27..6afe0265b9 100644 --- a/packages/client/src/features/assets/actionModals/useSelectAssetModal.tsx +++ b/packages/client/src/features/assets/actionModals/useSelectAssetModal.tsx @@ -12,7 +12,7 @@ import { FileIcon } from '../../../components/icons/FileIcon' import { GlobeIcon } from '../../../components/icons/GlobeIcon' import { useAuthUser } from '../../auth/useAuthUser' import { ModalHeaderTop, ModalNext } from '../../modal/ModalNext' -import { ButtonRow, Footer, ModalScroll } from '../../modal/styles' +import { ButtonRow, Footer, ModalScroll } from '../../modal/modal.styles' import { useModal } from '../../modal/useModal' import { ButtonBadge, @@ -27,7 +27,7 @@ import { StyledRow, StyledSubtitle, Tab, -} from '../../actionModals/styles' +} from '../../actionModals/action-modals.styles' import { DialogType, ServerScope } from '../../home/types' import { fetchFilteredAssets } from '../assets.api' import { IAsset } from '../assets.types' diff --git a/packages/client/src/features/auth/AuthPickerModal.tsx b/packages/client/src/features/auth/AuthPickerModal.tsx index 8521432eaf..fe8485b7e7 100644 --- a/packages/client/src/features/auth/AuthPickerModal.tsx +++ b/packages/client/src/features/auth/AuthPickerModal.tsx @@ -1,6 +1,6 @@ import React from 'react' import { ModalHeaderTop, ModalNext } from '../modal/ModalNext' -import { Content, Footer } from '../modal/styles' +import { Content, Footer } from '../modal/modal.styles' import { UseModal } from '../modal/useModal' import { onLogInWithSSO, useSiteSettingsQuery, diff --git a/packages/client/src/features/auth/ExpiringSessionModal.tsx b/packages/client/src/features/auth/ExpiringSessionModal.tsx index 30201ac6f1..050a2e1048 100644 --- a/packages/client/src/features/auth/ExpiringSessionModal.tsx +++ b/packages/client/src/features/auth/ExpiringSessionModal.tsx @@ -6,7 +6,7 @@ import { getSessionExpiredAt } from '../../utils/cookies' import { pluralize } from '../../utils/formatting' import { useSessionRefresh } from '../../utils/useSessionRefresh' import { ModalHeaderTop, ModalNext } from '../modal/ModalNext' -import { Content, Footer } from '../modal/styles' +import { Content, Footer } from '../modal/modal.styles' import { UseModal } from '../modal/useModal' import { useAuthUserQuery } from './api' import { onLogInWithSSO, useSiteSettingsQuery } from './useSiteSettingsQuery' diff --git a/packages/client/src/features/auth/SessionExpiredModal.tsx b/packages/client/src/features/auth/SessionExpiredModal.tsx index 3c93bae035..99ff6447f5 100644 --- a/packages/client/src/features/auth/SessionExpiredModal.tsx +++ b/packages/client/src/features/auth/SessionExpiredModal.tsx @@ -1,6 +1,6 @@ import React from 'react' import { ModalHeaderTop, ModalNext } from '../modal/ModalNext' -import { ButtonRow, Content, Footer } from '../modal/styles' +import { ButtonRow, Content, Footer } from '../modal/modal.styles' import { UseModal } from '../modal/useModal' import { onLogInWithSSO, useSiteSettingsQuery } from './useSiteSettingsQuery' import { Button } from '../../components/Button' diff --git a/packages/client/src/features/auth/useGenerateKeyModal.tsx b/packages/client/src/features/auth/useGenerateKeyModal.tsx index 8b52540e9d..f7481842f3 100644 --- a/packages/client/src/features/auth/useGenerateKeyModal.tsx +++ b/packages/client/src/features/auth/useGenerateKeyModal.tsx @@ -6,7 +6,7 @@ import { Svg } from '../../components/icons/Svg' import { Loader } from '../../components/Loader' import { theme } from '../../styles/theme' import { ModalHeaderTop, ModalNext } from '../modal/ModalNext' -import { ModalScroll } from '../modal/styles' +import { ModalScroll } from '../modal/modal.styles' import { useModal } from '../modal/useModal' import { generateKeyRequest } from './api' import { Button } from '../../components/Button' diff --git a/packages/client/src/features/challenges/styles.ts b/packages/client/src/features/challenges/challenges.styles.ts similarity index 100% rename from packages/client/src/features/challenges/styles.ts rename to packages/client/src/features/challenges/challenges.styles.ts diff --git a/packages/client/src/features/challenges/details/ChallengeDetails.tsx b/packages/client/src/features/challenges/details/ChallengeDetails.tsx index 74cface7ed..b4ca5ab1b5 100644 --- a/packages/client/src/features/challenges/details/ChallengeDetails.tsx +++ b/packages/client/src/features/challenges/details/ChallengeDetails.tsx @@ -1,15 +1,18 @@ -/* eslint-disable no-nested-ternary */ -import React, { useCallback, useRef, useState } from 'react' +import { useCallback, useRef, useState } from 'react' import { Link, Navigate, Route, Routes, useParams } from 'react-router' -import { Loader } from '../../../components/Loader' -import { AddIdsToHeaders } from '../../../components/Markdown/AddIdsToHeaders' -import { PageContainerMargin } from '../../../components/Page/styles' -import { usePageMeta } from '../../../hooks/usePageMeta' -import { cleanObject } from '../../../utils/object' +import { Loader } from '@/components/Loader' +import { AddIdsToHeaders } from '@/components/Markdown/AddIdsToHeaders' +import { MDStyles } from '@/components/Markdown/markdown.styles' +import { PageContainerMargin } from '@/components/Page/page.styles' +import { usePageMeta } from '@/hooks/usePageMeta' +import { cleanObject } from '@/utils/object' import { useAuthUser } from '../../auth/useAuthUser' -import { IToCItem, ToC } from '../../markdown/TocNext' +import { type IToCItem, ToC } from '../../markdown/TocNext' +import type { Meta } from '../types' import { useChallengeByIDQuery } from '../useChallengeDetailsQuery' import { ChallengeDetailsBanner } from './ChallengeDetailsBanner' +import { ChallengeMyEntriesTable } from './ChallengeMyEntriesTable' +import { ChallengeSubmissionsTable } from './ChallengeSubmissionsTable' import { ChallengePageRow, ChallengeRightSide, @@ -18,17 +21,12 @@ import { NoInfo, StyledChallengeNavigation, StyledChallengeNavigationItem, -} from './styles' -import { ChallengeSubmissionsTable } from './ChallengeSubmissionsTable' -import { ChallengeMyEntriesTable } from './ChallengeMyEntriesTable' -import { useNumberParams } from '../../../utils/useNumberParams' -import { MDStyles } from '../../../components/Markdown/styles' -import { Meta } from '../types' +} from './challenges-details.styles' export const ChallengeDetails = () => { usePageMeta({ title: 'Challenge - precisionFDA' }) - const { challengeId } = useNumberParams() + const { challengeId } = useParams<{ challengeId: string }>() const user = useAuthUser() const { data: challenge, isLoading, error } = useChallengeByIDQuery(challengeId!) @@ -70,7 +68,8 @@ export const ChallengeDetails = () => { const userIsChallengeAdmin = isLoggedIn && canCreate - const userCanSeePreRegistration = challengePreRegistration || (userIsChallengeAdmin && challengeSetupOrPreRegistration) + const userCanSeePreRegistration = + challengePreRegistration || (userIsChallengeAdmin && challengeSetupOrPreRegistration) // Introduction is visible to: // - everyone when a challenge is not in pre-registration phase @@ -84,7 +83,8 @@ export const ChallengeDetails = () => { // Results are visible to: // - challenge admins // - everyone when results are announced or challenge is archived - const userCanSeeResults = userIsChallengeAdmin || challenge.status === 'result_announced' || challenge.status === 'archived' + const userCanSeeResults = + userIsChallengeAdmin || challenge.status === 'result_announced' || challenge.status === 'archived' let regions: { intro: string; results: string; preReg: string } if (challenge.meta) { @@ -150,13 +150,23 @@ export const ChallengeDetails = () => { } + element={ + + } /> + ) } /> diff --git a/packages/client/src/features/challenges/details/ChallengeDetailsBanner.tsx b/packages/client/src/features/challenges/details/ChallengeDetailsBanner.tsx index dff0021506..7a4d461bdc 100644 --- a/packages/client/src/features/challenges/details/ChallengeDetailsBanner.tsx +++ b/packages/client/src/features/challenges/details/ChallengeDetailsBanner.tsx @@ -6,7 +6,7 @@ import { Link } from 'react-router' import styled from 'styled-components' import { Button, OutlineButton } from '../../../components/Button' import NavigationBar from '../../../components/NavigationBar/NavigationBar' -import { PageContainer, pagePadding } from '../../../components/Page/styles' +import { PageContainer, pagePadding } from '../../../components/Page/page.styles' import { ArrowLeftIcon } from '../../../components/icons/ArrowLeftIcon' import { CogsIcon } from '../../../components/icons/Cogs' import { ObjectGroupIcon } from '../../../components/icons/ObjectGroupIcon' @@ -28,7 +28,7 @@ import { RightColumn, StartEnd, StyledChallengeDetailsBanner, -} from './styles' +} from './challenges-details.styles' const ChallengeActionRow = styled(PageContainer)` ${pagePadding} diff --git a/packages/client/src/features/challenges/details/ChallengeNotFound.tsx b/packages/client/src/features/challenges/details/ChallengeNotFound.tsx index 3253f82306..137f5904e3 100644 --- a/packages/client/src/features/challenges/details/ChallengeNotFound.tsx +++ b/packages/client/src/features/challenges/details/ChallengeNotFound.tsx @@ -3,7 +3,7 @@ import styled from 'styled-components' import { BackLink } from '../../../components/Page/PageBackLink' import { PageContainerMargin, -} from '../../../components/Page/styles' +} from '../../../components/Page/page.styles' export const Warning = styled.div` border: solid 1px #f0ad4e; diff --git a/packages/client/src/features/challenges/details/SubmissionTable.tsx b/packages/client/src/features/challenges/details/SubmissionTable.tsx index a6ad8fe306..ac84b2da3f 100644 --- a/packages/client/src/features/challenges/details/SubmissionTable.tsx +++ b/packages/client/src/features/challenges/details/SubmissionTable.tsx @@ -3,7 +3,7 @@ import styled from 'styled-components' import { Button } from '../../../components/Button' import { Markdown, MarkdownStyle } from '../../../components/Markdown' import { IUser } from '../../../types/user' -import { ButtonRow, Footer } from '../../modal/styles' +import { ButtonRow, Footer } from '../../modal/modal.styles' import { useModal } from '../../modal/useModal' import { SubmissionInputFile, SubmissionV2 } from './submission.types' import { ModalHeaderTop, ModalNext } from '../../modal/ModalNext' diff --git a/packages/client/src/features/challenges/details/styles.tsx b/packages/client/src/features/challenges/details/challenges-details.styles.tsx similarity index 99% rename from packages/client/src/features/challenges/details/styles.tsx rename to packages/client/src/features/challenges/details/challenges-details.styles.tsx index 57a90aa01d..48c7ee7ade 100644 --- a/packages/client/src/features/challenges/details/styles.tsx +++ b/packages/client/src/features/challenges/details/challenges-details.styles.tsx @@ -1,6 +1,6 @@ import { Link } from 'react-router' import styled, { css } from 'styled-components' -import { PageContainer, pagePaddingLR } from '../../../components/Page/styles' +import { PageContainer, pagePaddingLR } from '../../../components/Page/page.styles' import { breakPoints, colors, theme } from '../../../styles/theme' import { TimeStatus } from '../types' import { Button } from '../../../components/Button' diff --git a/packages/client/src/features/challenges/form/ChallengeCreateUpdateModal.tsx b/packages/client/src/features/challenges/form/ChallengeCreateUpdateModal.tsx index bae6c88428..1dd7aab43f 100644 --- a/packages/client/src/features/challenges/form/ChallengeCreateUpdateModal.tsx +++ b/packages/client/src/features/challenges/form/ChallengeCreateUpdateModal.tsx @@ -1,6 +1,6 @@ import React from 'react' import { ModalHeaderTop, ModalNext } from '../../modal/ModalNext' -import { Content } from '../../modal/styles' +import { Content } from '../../modal/modal.styles' export const ChallengeCreateUpdateModal = ({ isEditMode, diff --git a/packages/client/src/features/challenges/form/ChallengeForm.tsx b/packages/client/src/features/challenges/form/ChallengeForm.tsx index d0e5da5979..a10af68551 100644 --- a/packages/client/src/features/challenges/form/ChallengeForm.tsx +++ b/packages/client/src/features/challenges/form/ChallengeForm.tsx @@ -6,7 +6,7 @@ import { Controller, useForm } from 'react-hook-form' import styled from 'styled-components' import { unstable_usePrompt } from 'react-router' import { FieldGroup } from '../../../components/form/FieldGroup' -import { FieldLabel, InputError } from '../../../components/form/styles' +import { FieldLabel, InputError } from '../../../components/form/form.styles' import { InputDateTime, InputFile, InputText } from '../../../components/InputText' import { Loader } from '../../../components/Loader' import { Challenge } from '../types' diff --git a/packages/client/src/features/challenges/form/CreateChallengePage.tsx b/packages/client/src/features/challenges/form/CreateChallengePage.tsx index e57ff59b2b..1577c097e4 100644 --- a/packages/client/src/features/challenges/form/CreateChallengePage.tsx +++ b/packages/client/src/features/challenges/form/CreateChallengePage.tsx @@ -4,10 +4,10 @@ import { useNavigate } from 'react-router' import NavigationBar from '../../../components/NavigationBar/NavigationBar' import { NotAllowedPage } from '../../../components/NotAllowed' import { BackLinkMargin } from '../../../components/Page/PageBackLink' -import { PageTitle } from '../../../components/Page/styles' +import { PageTitle } from '../../../components/Page/page.styles' import { UserLayout } from '../../../layouts/UserLayout' import { useAuthUser } from '../../auth/useAuthUser' -import { StyledPageCenter, StyledPageContent } from '../../spaces/form/styles' +import { StyledPageCenter, StyledPageContent } from '../../spaces/form/spaces-form.styles' import { ChallengePayload, createChallengeRequest } from '../api' import { IChallengeForm, ChallengeForm } from './ChallengeForm' import { mapFormToPayload, subtitle, title } from './common' diff --git a/packages/client/src/features/challenges/form/EditChallengePage.tsx b/packages/client/src/features/challenges/form/EditChallengePage.tsx index cb1d43dc93..6d91b8adcc 100644 --- a/packages/client/src/features/challenges/form/EditChallengePage.tsx +++ b/packages/client/src/features/challenges/form/EditChallengePage.tsx @@ -5,11 +5,11 @@ import { useNavigate, useParams } from 'react-router' import { Loader } from '../../../components/Loader' import { NotAllowedPage } from '../../../components/NotAllowed' import { BackLinkMargin } from '../../../components/Page/PageBackLink' -import { PageTitle } from '../../../components/Page/styles' +import { PageTitle } from '../../../components/Page/page.styles' import { UserLayout } from '../../../layouts/UserLayout' import { dateToInput } from '../../../utils/datetime' import { useAuthUser } from '../../auth/useAuthUser' -import { StyledPageCenter, StyledPageContent } from '../../spaces/form/styles' +import { StyledPageCenter, StyledPageContent } from '../../spaces/form/spaces-form.styles' import { ChallengePayload, editChallengeRequest } from '../api' import { useChallengeDetailsQuery } from '../useChallengeDetailsQuery' import { ChallengeForm, IChallengeForm } from './ChallengeForm' diff --git a/packages/client/src/features/challenges/form/ProposeChallengeForm.tsx b/packages/client/src/features/challenges/form/ProposeChallengeForm.tsx index 99bfbea1fc..94899fec88 100644 --- a/packages/client/src/features/challenges/form/ProposeChallengeForm.tsx +++ b/packages/client/src/features/challenges/form/ProposeChallengeForm.tsx @@ -5,14 +5,14 @@ import React, { useEffect } from 'react' import { unstable_usePrompt } from 'react-router' import { Controller, useForm } from 'react-hook-form' import styled from 'styled-components' -import { FieldGroup, InputError } from '../../../components/form/styles' +import { FieldGroup, InputError } from '../../../components/form/form.styles' import { InputText } from '../../../components/InputText' import { Loader } from '../../../components/Loader' import { useMutationErrorEffect } from '../../../hooks/useMutationErrorEffect' import { MutationErrors } from '../../../types/utils' import { RadioButtonGroup } from '../../../components/form/RadioButtonGroup' import { proposeValidationSchema } from './common' -import { SectionTitle } from '../../../components/Public/styles' +import { SectionTitle } from '../../../components/Public/public-layout.styles' import { Button } from '../../../components/Button' diff --git a/packages/client/src/features/challenges/list/ChallengeListItem.tsx b/packages/client/src/features/challenges/list/ChallengeListItem.tsx index d787bd9da1..5fa565a275 100644 --- a/packages/client/src/features/challenges/list/ChallengeListItem.tsx +++ b/packages/client/src/features/challenges/list/ChallengeListItem.tsx @@ -2,8 +2,8 @@ import { format } from 'date-fns' import React from 'react' import { Link } from 'react-router' import styled from 'styled-components' -import { Content, ItemBody } from '../../../components/Public/styles' -import { DateArea, ItemImage, ViewDetailsButton } from '../styles' +import { Content, ItemBody } from '../../../components/Public/public-layout.styles' +import { DateArea, ItemImage, ViewDetailsButton } from '../challenges.styles' import { Challenge } from '../types' import { getChallengeTimeRemaining, getTimeStatus } from '../util' diff --git a/packages/client/src/features/challenges/list/ChallengesList.tsx b/packages/client/src/features/challenges/list/ChallengesList.tsx index 819c04dd53..fccc340a08 100644 --- a/packages/client/src/features/challenges/list/ChallengesList.tsx +++ b/packages/client/src/features/challenges/list/ChallengesList.tsx @@ -6,7 +6,7 @@ import styled from 'styled-components' import { Button } from '../../../components/Button' import { Loader } from '../../../components/Loader' import NavigationBar from '../../../components/NavigationBar/NavigationBar' -import { PageContainerMargin } from '../../../components/Page/styles' +import { PageContainerMargin } from '../../../components/Page/page.styles' import { hidePagination, Pagination } from '../../../components/Pagination' import { ButtonRow, @@ -20,7 +20,7 @@ import { RightSide, RightSideItem, SectionTitle, -} from '../../../components/Public/styles' +} from '../../../components/Public/public-layout.styles' import { usePageMeta } from '../../../hooks/usePageMeta' import { usePaginationParamsV2 } from '../../../hooks/usePaginationState' import { useLastWSNotification } from '../../../hooks/useLastWSNotification' diff --git a/packages/client/src/features/challenges/useChallengeDetailsQuery.ts b/packages/client/src/features/challenges/useChallengeDetailsQuery.ts index a2a8336b1a..7540c1560d 100644 --- a/packages/client/src/features/challenges/useChallengeDetailsQuery.ts +++ b/packages/client/src/features/challenges/useChallengeDetailsQuery.ts @@ -1,9 +1,9 @@ import { useQuery } from '@tanstack/react-query' -import { AxiosError } from 'axios' -import { challengeByID, challengeDetailsRequest, ContentType } from './api' -import { Challenge, ChallengeOld } from './types' -import { ApiErrorResponse } from '../home/types' -import { toastError } from '../../components/NotificationCenter/ToastHelper' +import type { AxiosError } from 'axios' +import { toastError } from '@/components/NotificationCenter/ToastHelper' +import type { ApiErrorResponse } from '../home/types' +import { type ContentType, challengeByID, challengeDetailsRequest } from './api' +import type { Challenge, ChallengeOld } from './types' export const useChallengeDetailsQuery = (id: string) => useQuery>({ diff --git a/packages/client/src/features/comparators/useComparatorModal.tsx b/packages/client/src/features/comparators/useComparatorModal.tsx index 90fe74f13d..09247efbce 100644 --- a/packages/client/src/features/comparators/useComparatorModal.tsx +++ b/packages/client/src/features/comparators/useComparatorModal.tsx @@ -1,7 +1,7 @@ import React from 'react' import { useMutation } from '@tanstack/react-query' import { ModalHeaderTop, ModalNext } from '../modal/ModalNext' -import { ButtonRow, Footer, StyledModalContent } from '../modal/styles' +import { ButtonRow, Footer, StyledModalContent } from '../modal/modal.styles' import { useModal } from '../modal/useModal' import { FileLicense } from '../assets/assets.types' import { Button } from '../../components/Button' diff --git a/packages/client/src/features/comparisons/actionModals/useSelectComparisonModal.tsx b/packages/client/src/features/comparisons/actionModals/useSelectComparisonModal.tsx index 213bbc584a..5676e96c90 100644 --- a/packages/client/src/features/comparisons/actionModals/useSelectComparisonModal.tsx +++ b/packages/client/src/features/comparisons/actionModals/useSelectComparisonModal.tsx @@ -12,7 +12,7 @@ import { FileIcon } from '../../../components/icons/FileIcon' import { GlobeIcon } from '../../../components/icons/GlobeIcon' import { useAuthUser } from '../../auth/useAuthUser' import { ModalHeaderTop, ModalNext } from '../../modal/ModalNext' -import { ButtonRow, Footer, ModalScroll } from '../../modal/styles' +import { ButtonRow, Footer, ModalScroll } from '../../modal/modal.styles' import { useModal } from '../../modal/useModal' import { ButtonBadge, @@ -27,7 +27,7 @@ import { StyledRow, StyledSubtitle, Tab, -} from '../../actionModals/styles' +} from '../../actionModals/action-modals.styles' import { DialogType, ServerScope } from '../../home/types' import { fetchFilteredComparisons } from '../comparisons.api' import { IComparison } from '../comparisons.types' diff --git a/packages/client/src/features/data-portals/details/DataPortalDetails.tsx b/packages/client/src/features/data-portals/details/DataPortalDetails.tsx index be56e87304..cc36646fc6 100644 --- a/packages/client/src/features/data-portals/details/DataPortalDetails.tsx +++ b/packages/client/src/features/data-portals/details/DataPortalDetails.tsx @@ -1,19 +1,19 @@ import React, { useCallback, useRef, useState } from 'react' import { Link, Route, Routes } from 'react-router' import { Button } from '../../../components/Button' -import { ListItem, NoContent } from '../../../components/Public/styles' +import { ListItem, NoContent } from '../../../components/Public/public-layout.styles' import { DataPortalCard } from '../DataPortalCard' import { DataPortal } from '../types' import { AlertText } from './DataPortalNotFound' import { AddIdsToHeaders } from '../../../components/Markdown/AddIdsToHeaders' -import { Filler } from '../../../components/Page/styles' -import { StyledInnerHTML } from '../../lexi/styles' +import { Filler } from '../../../components/Page/page.styles' +import { StyledInnerHTML } from '../../lexi/lexi.styles' import '../../lexi/themes/PlaygroundEditorTheme.css' import { IToCItem, ToC } from '../../markdown/TocNext' import { useDataPortalResourceModal } from '../../resources/useDataPortalResourceModal' import DataPortalContentEditPage from '../form/DataPortalContentEditPage' -import { BodyContent, DataPortalPageMainBody, DPSettings, PageWrap, RightSideItem, RightSideScroll, Row } from './styles' +import { BodyContent, DataPortalPageMainBody, DPSettings, PageWrap, RightSideItem, RightSideScroll, Row } from './data-portals-details.styles' export const DataPortalDetails = ({ portal, diff --git a/packages/client/src/features/data-portals/details/DataPortalDetailsPage.tsx b/packages/client/src/features/data-portals/details/DataPortalDetailsPage.tsx index 2bc479ac7f..9356a8cdb6 100644 --- a/packages/client/src/features/data-portals/details/DataPortalDetailsPage.tsx +++ b/packages/client/src/features/data-portals/details/DataPortalDetailsPage.tsx @@ -2,7 +2,7 @@ import { useQueryClient } from '@tanstack/react-query' import React, { useEffect } from 'react' import { useNavigate, useParams } from 'react-router' import { Loader, LoaderMargin } from '../../../components/Loader' -import { PageContainerMargin } from '../../../components/Page/styles' +import { PageContainerMargin } from '../../../components/Page/page.styles' import { UserLayout } from '../../../layouts/UserLayout' import { useAuthUser } from '../../auth/useAuthUser' import { NOTIFICATION_ACTION } from '../../home/types' diff --git a/packages/client/src/features/data-portals/details/DataPortalNotFound.tsx b/packages/client/src/features/data-portals/details/DataPortalNotFound.tsx index 49e117cfa0..bc8b603469 100644 --- a/packages/client/src/features/data-portals/details/DataPortalNotFound.tsx +++ b/packages/client/src/features/data-portals/details/DataPortalNotFound.tsx @@ -1,6 +1,6 @@ import React from 'react' import styled from 'styled-components' -import { PageContainerMargin } from '../../../components/Page/styles' +import { PageContainerMargin } from '../../../components/Page/page.styles' export const Warning = styled.div` border: solid 1px #f0ad4e; diff --git a/packages/client/src/features/data-portals/details/styles.ts b/packages/client/src/features/data-portals/details/data-portals-details.styles.ts similarity index 94% rename from packages/client/src/features/data-portals/details/styles.ts rename to packages/client/src/features/data-portals/details/data-portals-details.styles.ts index b3b2a62a75..59c05e08db 100644 --- a/packages/client/src/features/data-portals/details/styles.ts +++ b/packages/client/src/features/data-portals/details/data-portals-details.styles.ts @@ -1,5 +1,5 @@ import styled from 'styled-components' -import { compactScrollBarV2 } from '../../../components/Page/styles' +import { compactScrollBarV2 } from '../../../components/Page/page.styles' export const RightSideItem = styled.div` display: flex; diff --git a/packages/client/src/features/data-portals/form/CreateDataPortalPage.tsx b/packages/client/src/features/data-portals/form/CreateDataPortalPage.tsx index cbd939f03e..762351d963 100644 --- a/packages/client/src/features/data-portals/form/CreateDataPortalPage.tsx +++ b/packages/client/src/features/data-portals/form/CreateDataPortalPage.tsx @@ -5,11 +5,11 @@ import { useNavigate } from 'react-router' import { NotAllowedPage } from '../../../components/NotAllowed' import { toastError, toastSuccess } from '../../../components/NotificationCenter/ToastHelper' import { BackLinkMargin } from '../../../components/Page/PageBackLink' -import { PageTitle } from '../../../components/Page/styles' +import { PageTitle } from '../../../components/Page/page.styles' import { UserLayout } from '../../../layouts/UserLayout' import { useAuthUser } from '../../auth/useAuthUser' import { ApiErrorResponse } from '../../home/types' -import { StyledPageCenter, StyledPageContent } from '../../spaces/form/styles' +import { StyledPageCenter, StyledPageContent } from '../../spaces/form/spaces-form.styles' import { createDataPortalRequest } from '../api' import { CreateDataPortalData } from '../types' import { CreateDataPortalForm, DataPortalForm } from './DataPortalForm' diff --git a/packages/client/src/features/data-portals/form/DataPortalForm.tsx b/packages/client/src/features/data-portals/form/DataPortalForm.tsx index 0b58ac6eca..3f6e92a965 100644 --- a/packages/client/src/features/data-portals/form/DataPortalForm.tsx +++ b/packages/client/src/features/data-portals/form/DataPortalForm.tsx @@ -11,7 +11,7 @@ import { InputFile, InputNumber, InputText } from '../../../components/InputText import { Loader } from '../../../components/Loader' import { FieldGroup } from '../../../components/form/FieldGroup' import { FieldInfo } from '../../../components/form/FieldInfo' -import { InputError } from '../../../components/form/styles' +import { InputError } from '../../../components/form/form.styles' import { useAuthUser } from '../../auth/useAuthUser' import { ApiErrorResponse } from '../../home/types' import { SavingModal } from '../../modal/SavingModal' diff --git a/packages/client/src/features/data-portals/form/EditDataPortalPage.tsx b/packages/client/src/features/data-portals/form/EditDataPortalPage.tsx index a26dabd651..5901896858 100644 --- a/packages/client/src/features/data-portals/form/EditDataPortalPage.tsx +++ b/packages/client/src/features/data-portals/form/EditDataPortalPage.tsx @@ -6,11 +6,11 @@ import { Loader } from '../../../components/Loader' import { NotAllowedPage } from '../../../components/NotAllowed' import { toastError, toastSuccess } from '../../../components/NotificationCenter/ToastHelper' import { BackLinkMargin } from '../../../components/Page/PageBackLink' -import { PageTitle } from '../../../components/Page/styles' +import { PageTitle } from '../../../components/Page/page.styles' import { UserLayout } from '../../../layouts/UserLayout' import { useAuthUser } from '../../auth/useAuthUser' import { ApiErrorResponse } from '../../home/types' -import { StyledPageCenter, StyledPageContent } from '../../spaces/form/styles' +import { StyledPageCenter, StyledPageContent } from '../../spaces/form/spaces-form.styles' import { editDataPortalRequest, UpdateDataPortalRequest } from '../api' import { useDataPortalByIdQuery } from '../queries' import { UpdateDataPortalData } from '../types' diff --git a/packages/client/src/features/data-portals/list/DataPortalsListPage.tsx b/packages/client/src/features/data-portals/list/DataPortalsListPage.tsx index 22e6ec728f..4d09b9876a 100644 --- a/packages/client/src/features/data-portals/list/DataPortalsListPage.tsx +++ b/packages/client/src/features/data-portals/list/DataPortalsListPage.tsx @@ -1,18 +1,18 @@ import { useQuery, useQueryClient } from '@tanstack/react-query' -import React, { useEffect } from 'react' +import { useEffect } from 'react' import { Link } from 'react-router' import styled from 'styled-components' -import { Button } from '../../../components/Button' -import { Loader } from '../../../components/Loader' -import { PageContainerMargin, PageTitle } from '../../../components/Page/styles' -import { PageLoaderWrapper } from '../../../components/Public/styles' -import { usePageMeta } from '../../../hooks/usePageMeta' -import { useLastWSNotification } from '../../../hooks/useLastWSNotification' -import { UserLayout } from '../../../layouts/UserLayout' -import { theme } from '../../../styles/theme' +import { Button } from '@/components/Button' +import { Loader } from '@/components/Loader' +import { PageContainerMargin, PageTitle } from '@/components/Page/page.styles' +import { PageLoaderWrapper } from '@/components/Public/public-layout.styles' +import { useLastWSNotification } from '@/hooks/useLastWSNotification' +import { usePageMeta } from '@/hooks/usePageMeta' +import { UserLayout } from '@/layouts/UserLayout' +import { theme } from '@/styles/theme' import { useAuthUser } from '../../auth/useAuthUser' import { NOTIFICATION_ACTION } from '../../home/types' -import { StyledPageCenter } from '../../spaces/form/styles' +import { StyledPageCenter } from '../../spaces/form/spaces-form.styles' import { dataPortalsListRequest } from '../api' import { AlertText } from '../details/DataPortalNotFound' import { DataPortalListItem } from './DataPortalListItem' diff --git a/packages/client/src/features/databases/DatabaseList.tsx b/packages/client/src/features/databases/DatabaseList.tsx index 18e11da4ec..55cf1fb42d 100644 --- a/packages/client/src/features/databases/DatabaseList.tsx +++ b/packages/client/src/features/databases/DatabaseList.tsx @@ -9,9 +9,9 @@ import { SyncIcon } from '@/components/icons/SyncIcon' import { ActionsMenu } from '@/components/Menu' import { ContentFooter } from '@/components/Page/ContentFooter' import { BackLink } from '@/components/Page/PageBackLink' -import { Refresh } from '@/components/Page/styles' +import { Refresh } from '@/components/Page/page.styles' import { Pagination } from '@/components/Pagination' -import { StyledPageTable } from '@/components/Table/components/styles' +import { StyledPageTable } from '@/components/Table/components/table.styles' import { useLastWSNotification } from '@/hooks/useLastWSNotification' import { getSelectedObjectsFromIndexes, toArrayFromObject } from '@/utils/object' import Table from '../../components/Table' diff --git a/packages/client/src/features/databases/create/CreateDatabase.tsx b/packages/client/src/features/databases/create/CreateDatabase.tsx index a11408a951..8a6763ad15 100644 --- a/packages/client/src/features/databases/create/CreateDatabase.tsx +++ b/packages/client/src/features/databases/create/CreateDatabase.tsx @@ -9,7 +9,7 @@ import { useCreateDatabaseMutation } from '@/api/mutations/database' import { Button } from '@/components/Button' import { FieldGroup } from '@/components/form/FieldGroup' import { RadioButtonGroup } from '@/components/form/RadioButtonGroup' -import { InputError } from '@/components/form/styles' +import { InputError } from '@/components/form/form.styles' import { InputText } from '@/components/InputText' import { Loader } from '@/components/Loader' import { SelectContent, SelectItem, SelectTrigger, SelectValue, Select as UiSelect } from '@/components/ui/select' diff --git a/packages/client/src/features/databases/useEditDatabaseModal.tsx b/packages/client/src/features/databases/useEditDatabaseModal.tsx index a9c62d86d1..9e37d2a78a 100644 --- a/packages/client/src/features/databases/useEditDatabaseModal.tsx +++ b/packages/client/src/features/databases/useEditDatabaseModal.tsx @@ -2,9 +2,9 @@ import { ErrorMessage } from '@hookform/error-message' import React, { useMemo } from 'react' import { useForm } from 'react-hook-form' import { useMutation, useQueryClient } from '@tanstack/react-query' -import { FieldGroup, InputError } from '../../components/form/styles' +import { FieldGroup, InputError } from '../../components/form/form.styles' import { InputText } from '../../components/InputText' -import { ButtonRow, Footer, ModalScroll, StyledForm } from '../modal/styles' +import { ButtonRow, Footer, ModalScroll, StyledForm } from '../modal/modal.styles' import { useModal } from '../modal/useModal' import { EditDatabasePayload, editDatabaseRequest } from './databases.api' import { IDatabase } from './databases.types' diff --git a/packages/client/src/features/databases/useMethodModal.tsx b/packages/client/src/features/databases/useMethodModal.tsx index 7d88338d2b..d46ce6cdb9 100644 --- a/packages/client/src/features/databases/useMethodModal.tsx +++ b/packages/client/src/features/databases/useMethodModal.tsx @@ -6,7 +6,7 @@ import { Loader } from '../../components/Loader' import { ResourceTable } from '../../components/ResourceTable' import { pluralize } from '../../utils/formatting' import { ModalHeaderTop, ModalNext } from '../modal/ModalNext' -import { ButtonRow, Content, Footer } from '../modal/styles' +import { ButtonRow, Content, Footer } from '../modal/modal.styles' import { useModal } from '../modal/useModal' import { databaseMethodRequest } from './databases.api' import { MethodType } from './databases.types' diff --git a/packages/client/src/features/discussions/AttachmentsList.tsx b/packages/client/src/features/discussions/AttachmentsList.tsx index 23909fcc82..ee7846f33c 100644 --- a/packages/client/src/features/discussions/AttachmentsList.tsx +++ b/packages/client/src/features/discussions/AttachmentsList.tsx @@ -11,7 +11,7 @@ import { FolderIcon } from '../../components/icons/FolderIcon' import { TrashIcon } from '../../components/icons/TrashIcon' import { Attachment, AttachmentKey, AttachmentType, FormAttachments } from './discussions.types' import { areAttachmentsEmpty, typeAttachmentKey } from './helpers' -import { AttachmentsLabel } from './styles' +import { AttachmentsLabel } from './discussions.styles' const StyledAttachmentsContainer = styled.div`` diff --git a/packages/client/src/features/discussions/DiscussionAnswer.tsx b/packages/client/src/features/discussions/DiscussionAnswer.tsx index aadcc1d3f3..2cdf33c57d 100644 --- a/packages/client/src/features/discussions/DiscussionAnswer.tsx +++ b/packages/client/src/features/discussions/DiscussionAnswer.tsx @@ -3,7 +3,7 @@ import { NoteScope } from './api' import { ReplyCard } from './card/ReplyCard' import { Answer } from './discussions.types' import { CreateReplyEntity } from './form/CreateReplyEntity' -import { StyledCardList } from './styles' +import { StyledCardList } from './discussions.styles' export const DiscussionAnswer = ({ canEdit, diff --git a/packages/client/src/features/discussions/DiscussionList.tsx b/packages/client/src/features/discussions/DiscussionList.tsx index c6dbfafd80..8565afe8e6 100644 --- a/packages/client/src/features/discussions/DiscussionList.tsx +++ b/packages/client/src/features/discussions/DiscussionList.tsx @@ -11,7 +11,7 @@ import { Button } from '@/components/Button' import { DiscussionIcon } from '@/components/icons/DiscussionIcon' import { ContentFooter } from '@/components/Page/ContentFooter' import { Pagination } from '@/components/Pagination' -import { StyledPageTable } from '@/components/Table/components/styles' +import { StyledPageTable } from '@/components/Table/components/table.styles' import { toArrayFromObject } from '@/utils/object' import Table from '../../components/Table' import { ActionsRow, QuickActions } from '../home/home.styles' diff --git a/packages/client/src/features/discussions/DiscussionShow.tsx b/packages/client/src/features/discussions/DiscussionShow.tsx index 1f3fb72eba..ced73bb6dc 100644 --- a/packages/client/src/features/discussions/DiscussionShow.tsx +++ b/packages/client/src/features/discussions/DiscussionShow.tsx @@ -26,7 +26,7 @@ import { ReplyCard } from './card/ReplyCard' import { Attachment } from './discussions.types' import { CreateReplyEntity } from './form/CreateReplyEntity' import { EditDiscussionTitle } from './form/EditDiscussionTitle' -import { CommentCount, DiscussionTitle, PageContent, StyledCardList, StyledTitle, UsernameLink } from './styles' +import { CommentCount, DiscussionTitle, PageContent, StyledCardList, StyledTitle, UsernameLink } from './discussions.styles' interface DiscussionContextType { attachments: Record diff --git a/packages/client/src/features/discussions/card/CardHeader.tsx b/packages/client/src/features/discussions/card/CardHeader.tsx index 03ccbf4ccb..ccd2120891 100644 --- a/packages/client/src/features/discussions/card/CardHeader.tsx +++ b/packages/client/src/features/discussions/card/CardHeader.tsx @@ -3,7 +3,7 @@ import Menu from '../../../components/Menu/Menu' import { StarIcon } from '../../../components/icons/StarIcon' import { ThreeDotsIcon } from '../../../components/icons/ThreeDotsIcon' import { formatDiscussionDate } from '../helpers' -import { CardLeft, CardRight, StyledAnswerLabel, StyledCardHeader, StyledEditButton, UsernameLink } from '../styles' +import { CardLeft, CardRight, StyledAnswerLabel, StyledCardHeader, StyledEditButton, UsernameLink } from '../discussions.styles' import { CardType } from '../discussions.types' import { SimpleUser } from '../../../types/user' import styles from '../styles.module.css' diff --git a/packages/client/src/features/discussions/card/DiscussionCard.tsx b/packages/client/src/features/discussions/card/DiscussionCard.tsx index 80013c36bf..fc4313b1cb 100644 --- a/packages/client/src/features/discussions/card/DiscussionCard.tsx +++ b/packages/client/src/features/discussions/card/DiscussionCard.tsx @@ -9,7 +9,7 @@ import { deleteDiscussionRequest } from '../api' import { Attachment, Discussion } from '../discussions.types' import { EditNoteEntity } from '../form/EditNoteEntity' import { groupByAttachmentType } from '../helpers' -import { StyledCommentCard, StyledReplyButton } from '../styles' +import { StyledCommentCard, StyledReplyButton } from '../discussions.styles' import { CardHeader } from './CardHeader' export function DiscussionCard({ diff --git a/packages/client/src/features/discussions/card/ReplyCard.tsx b/packages/client/src/features/discussions/card/ReplyCard.tsx index 9c70ee319d..1e5135242a 100644 --- a/packages/client/src/features/discussions/card/ReplyCard.tsx +++ b/packages/client/src/features/discussions/card/ReplyCard.tsx @@ -11,7 +11,7 @@ import { deleteReplyRequest, NoteScope } from '../api' import { DiscussionReply } from '../discussions.types' import { EditNoteEntity } from '../form/EditNoteEntity' import { groupByAttachmentType } from '../helpers' -import { StyledCommentCard, StyledReplyButton } from '../styles' +import { StyledCommentCard, StyledReplyButton } from '../discussions.styles' import { CardHeader } from './CardHeader' export function ReplyCard({ diff --git a/packages/client/src/features/discussions/styles.tsx b/packages/client/src/features/discussions/discussions.styles.tsx similarity index 100% rename from packages/client/src/features/discussions/styles.tsx rename to packages/client/src/features/discussions/discussions.styles.tsx diff --git a/packages/client/src/features/discussions/form/CreateDiscussionPage.tsx b/packages/client/src/features/discussions/form/CreateDiscussionPage.tsx index 7138deb3c6..85ea05c58a 100644 --- a/packages/client/src/features/discussions/form/CreateDiscussionPage.tsx +++ b/packages/client/src/features/discussions/form/CreateDiscussionPage.tsx @@ -2,10 +2,10 @@ import { useMutation, useQueryClient } from '@tanstack/react-query' import React from 'react' import { useLocation, useNavigate } from 'react-router' import styled from 'styled-components' -import { PageTitle } from '../../../components/Page/styles' +import { PageTitle } from '../../../components/Page/page.styles' import { getSpaceIdFromScope } from '../../../utils' import { StyledBackLink } from '../../home/home.styles' -import { FormPageContainer } from '../../news/form/styles' +import { FormPageContainer } from '../../news/form/news-form.styles' import { createDiscussionRequest, NoteScope } from '../api' import { DiscussionForm as DiscussionFormType } from '../discussions.types' import { pickIdsFromFormAttachments } from '../helpers' diff --git a/packages/client/src/features/discussions/form/DiscussionForm.tsx b/packages/client/src/features/discussions/form/DiscussionForm.tsx index 5cd1661e80..8e01f8c098 100644 --- a/packages/client/src/features/discussions/form/DiscussionForm.tsx +++ b/packages/client/src/features/discussions/form/DiscussionForm.tsx @@ -8,12 +8,12 @@ import { Button } from '../../../components/Button' import { InputText } from '../../../components/InputText' import { MarkdownEditor } from '../../../components/Markdown/MarkdownEditor' import { FieldGroup } from '../../../components/form/FieldGroup' -import { InputError } from '../../../components/form/styles' +import { InputError } from '../../../components/form/form.styles' import { AttachmentsList } from '../AttachmentsList' import { NoteScope } from '../api' import { AttachmentKey, DiscussionForm as DiscussionFormType, NoteForm } from '../discussions.types' import { Attachments } from './Attachments' -import { StyledPage } from './styles' +import { StyledPage } from './discussions-form.styles' import { NotifyMembersSelect } from './NotifyMembersSelect' const StyledAttachments = styled.div` diff --git a/packages/client/src/features/discussions/form/EditNoteEntity.tsx b/packages/client/src/features/discussions/form/EditNoteEntity.tsx index 15f0483645..c69e338e7d 100644 --- a/packages/client/src/features/discussions/form/EditNoteEntity.tsx +++ b/packages/client/src/features/discussions/form/EditNoteEntity.tsx @@ -10,8 +10,8 @@ import { NotePayload, NoteScope, editDiscussionRequest, editReplyRequest, fetchD import { Button } from '../../../components/Button' import { MarkdownEditor } from '../../../components/Markdown/MarkdownEditor' import { toastError, toastSuccess } from '../../../components/NotificationCenter/ToastHelper' -import { InputError } from '../../../components/form/styles' -import { ButtonRow } from '../../modal/styles' +import { InputError } from '../../../components/form/form.styles' +import { ButtonRow } from '../../modal/modal.styles' import { AttachmentsList } from '../AttachmentsList' import { AttachmentKey, NoteForm } from '../discussions.types' import { groupByAttachmentType, pickIdsFromFormAttachments } from '../helpers' diff --git a/packages/client/src/features/discussions/form/MarkdownForm.tsx b/packages/client/src/features/discussions/form/MarkdownForm.tsx index 6ba01da5f0..3573e65a0d 100644 --- a/packages/client/src/features/discussions/form/MarkdownForm.tsx +++ b/packages/client/src/features/discussions/form/MarkdownForm.tsx @@ -9,7 +9,7 @@ import { Button } from '../../../components/Button' import { Checkbox } from '../../../components/Checkbox' import ExternalLink from '../../../components/Controls/ExternalLink' import { MarkdownEditor, StyledMarkdownHelper, WeMarkdown } from '../../../components/Markdown/MarkdownEditor' -import { CheckboxLabel, InputError } from '../../../components/form/styles' +import { CheckboxLabel, InputError } from '../../../components/form/form.styles' import { MarkdownIcon } from '../../../components/icons/MarkdownIcon' import { AttachmentsList } from '../AttachmentsList' import { NoteScope } from '../api' diff --git a/packages/client/src/features/discussions/form/styles.ts b/packages/client/src/features/discussions/form/discussions-form.styles.ts similarity index 100% rename from packages/client/src/features/discussions/form/styles.ts rename to packages/client/src/features/discussions/form/discussions-form.styles.ts diff --git a/packages/client/src/features/executions/ExecutionActionsRow.tsx b/packages/client/src/features/executions/ExecutionActionsRow.tsx index 34f302922b..24a5f3a835 100644 --- a/packages/client/src/features/executions/ExecutionActionsRow.tsx +++ b/packages/client/src/features/executions/ExecutionActionsRow.tsx @@ -12,7 +12,7 @@ import { useAuthUser } from '../auth/useAuthUser' import { ActionsMenuContent } from '../home/ActionMenuContent' import { ActionModalsRenderer } from '../home/ActionModalsRenderer' import { HomeScope } from '../home/types' -import { StyledRefresh, StyledStatusText } from './details/styles' +import { StyledRefresh, StyledStatusText } from './details/executions-details.styles' import { IExecution } from './executions.types' import { getOpenExternalUrl, isOpenExternalAvailable } from './executions.util' import { useExecutionSelectActions } from './useExecutionSelectActions' diff --git a/packages/client/src/features/executions/ExecutionList.tsx b/packages/client/src/features/executions/ExecutionList.tsx index 282218e7b8..706cf5bc74 100644 --- a/packages/client/src/features/executions/ExecutionList.tsx +++ b/packages/client/src/features/executions/ExecutionList.tsx @@ -11,7 +11,7 @@ import { useEffect, useState } from 'react' import { ActionsMenu } from '@/components/Menu' import { ContentFooter } from '@/components/Page/ContentFooter' import { Pagination } from '@/components/Pagination' -import { StyledPageTable } from '@/components/Table/components/styles' +import { StyledPageTable } from '@/components/Table/components/table.styles' import { useLastWSNotification } from '@/hooks/useLastWSNotification' import { ErrorBoundary } from '@/utils/ErrorBoundary' import { getSelectedObjectsFromIndexes, toArrayFromObject } from '@/utils/object' diff --git a/packages/client/src/features/executions/actionModals/useSelectJobModal.tsx b/packages/client/src/features/executions/actionModals/useSelectJobModal.tsx index 160f0e0819..74f7ac8f53 100644 --- a/packages/client/src/features/executions/actionModals/useSelectJobModal.tsx +++ b/packages/client/src/features/executions/actionModals/useSelectJobModal.tsx @@ -12,7 +12,7 @@ import { FileIcon } from '../../../components/icons/FileIcon' import { GlobeIcon } from '../../../components/icons/GlobeIcon' import { useAuthUser } from '../../auth/useAuthUser' import { ModalHeaderTop, ModalNext } from '../../modal/ModalNext' -import { ButtonRow, Footer, ModalScroll } from '../../modal/styles' +import { ButtonRow, Footer, ModalScroll } from '../../modal/modal.styles' import { useModal } from '../../modal/useModal' import { ButtonBadge, @@ -27,7 +27,7 @@ import { StyledRow, StyledSubtitle, Tab, -} from '../../actionModals/styles' +} from '../../actionModals/action-modals.styles' import { DialogType } from '../../home/types' import { fetchFilteredJobs } from '../executions.api' import { IJob } from '../executions.types' diff --git a/packages/client/src/features/executions/details/ExecutionDetails.tsx b/packages/client/src/features/executions/details/ExecutionDetails.tsx index 132b183772..b273b61247 100644 --- a/packages/client/src/features/executions/details/ExecutionDetails.tsx +++ b/packages/client/src/features/executions/details/ExecutionDetails.tsx @@ -36,7 +36,7 @@ import { getUserLink } from '../executions.util' import { InputsAndOutputs } from '../InputsAndOutputs' import { Logs } from '../Log' import { StateCell } from '../StateCell' -import { FailureMessage, TitleLeft } from './styles' +import { FailureMessage, TitleLeft } from './executions-details.styles' const calculateCost = (durationInSeconds: number, instanceType: string): string => { const runtimeHours = durationInSeconds / 3600 diff --git a/packages/client/src/features/executions/details/styles.tsx b/packages/client/src/features/executions/details/executions-details.styles.tsx similarity index 90% rename from packages/client/src/features/executions/details/styles.tsx rename to packages/client/src/features/executions/details/executions-details.styles.tsx index b66f8bcb69..0efe352172 100644 --- a/packages/client/src/features/executions/details/styles.tsx +++ b/packages/client/src/features/executions/details/executions-details.styles.tsx @@ -1,5 +1,5 @@ import styled from 'styled-components' -import { Refresh } from '../../../components/Page/styles' +import { Refresh } from '../../../components/Page/page.styles' export const StyledRefresh = styled(Refresh)` margin-right: 16px; diff --git a/packages/client/src/features/executions/useSnapshotModal.tsx b/packages/client/src/features/executions/useSnapshotModal.tsx index 991d3f8f78..afcb1ae863 100644 --- a/packages/client/src/features/executions/useSnapshotModal.tsx +++ b/packages/client/src/features/executions/useSnapshotModal.tsx @@ -9,13 +9,13 @@ import * as Yup from 'yup' import { Button } from '../../components/Button' import { Checkbox } from '../../components/Checkbox' import { FieldGroup } from '../../components/form/FieldGroup' -import { CheckboxLabel, InputError } from '../../components/form/styles' +import { CheckboxLabel, InputError } from '../../components/form/form.styles' import { InputText } from '../../components/InputText' import { Loader } from '../../components/Loader' import { toastError, toastSuccess } from '../../components/NotificationCenter/ToastHelper' import { colors } from '../../styles/theme' import { ModalHeaderTop, ModalNext } from '../modal/ModalNext' -import { ButtonRow, Footer, ModalScroll } from '../modal/styles' +import { ButtonRow, Footer, ModalScroll } from '../modal/modal.styles' import { useModal } from '../modal/useModal' import { workstationSnapshotRequest } from './executions.api' import { IExecution } from './executions.types' diff --git a/packages/client/src/features/executions/useTerminateModal.tsx b/packages/client/src/features/executions/useTerminateModal.tsx index 03e2c8b974..20ea37a71d 100644 --- a/packages/client/src/features/executions/useTerminateModal.tsx +++ b/packages/client/src/features/executions/useTerminateModal.tsx @@ -4,7 +4,7 @@ import styled from 'styled-components' import { Loader } from '../../components/Loader' import { ResourceTable } from '../../components/ResourceTable' import { ModalNext } from '../modal/ModalNext' -import { ButtonRow, Footer, ModalScroll } from '../modal/styles' +import { ButtonRow, Footer, ModalScroll } from '../modal/modal.styles' import { useModal } from '../modal/useModal' import { terminateJobsRequest } from './executions.api' import { IExecution } from './executions.types' diff --git a/packages/client/src/features/experts/ExpertsCondensedList/ExpertsCondensedList.tsx b/packages/client/src/features/experts/ExpertsCondensedList/ExpertsCondensedList.tsx index 627ff4a3c9..c624adeecb 100644 --- a/packages/client/src/features/experts/ExpertsCondensedList/ExpertsCondensedList.tsx +++ b/packages/client/src/features/experts/ExpertsCondensedList/ExpertsCondensedList.tsx @@ -3,7 +3,7 @@ import { Link } from 'react-router' import { Loader } from '../../../components/Loader' import { usePaginationState } from '../../../hooks/usePaginationState' import { pluralize } from '../../../utils/formatting' -import { ExpertImageCircleSmall, ExpertMeta, ExpertRow, StyledCondensedList } from './styles' +import { ExpertImageCircleSmall, ExpertMeta, ExpertRow, StyledCondensedList } from './experts-condensed-list.styles' import { useExpertsListCondensedQuery } from '../useExpertsListQuery' export const ExpertsCondensedList = ({ pick }: { pick?: number }) => { diff --git a/packages/client/src/features/experts/ExpertsCondensedList/styles.tsx b/packages/client/src/features/experts/ExpertsCondensedList/experts-condensed-list.styles.tsx similarity index 100% rename from packages/client/src/features/experts/ExpertsCondensedList/styles.tsx rename to packages/client/src/features/experts/ExpertsCondensedList/experts-condensed-list.styles.tsx diff --git a/packages/client/src/features/experts/ExpertsList.tsx b/packages/client/src/features/experts/ExpertsList.tsx index ce74b61088..2eaabba58c 100644 --- a/packages/client/src/features/experts/ExpertsList.tsx +++ b/packages/client/src/features/experts/ExpertsList.tsx @@ -7,7 +7,7 @@ import { Button } from '../../components/Button' import { LightBulbIcon } from '../../components/icons/LightBulbIcon' import { Loader } from '../../components/Loader' import NavigationBar from '../../components/NavigationBar/NavigationBar' -import { PageContainerMargin } from '../../components/Page/styles' +import { PageContainerMargin } from '../../components/Page/page.styles' import { Pagination } from '../../components/Pagination' import { ButtonRow, @@ -23,7 +23,7 @@ import { RightSideItem, SectionTitle, Title, -} from '../../components/Public/styles' +} from '../../components/Public/public-layout.styles' import { usePageMeta } from '../../hooks/usePageMeta' import { usePaginationParamsV2 } from '../../hooks/usePaginationState' import PublicLayout from '../../layouts/PublicLayout' diff --git a/packages/client/src/features/experts/details/Blog.tsx b/packages/client/src/features/experts/details/Blog.tsx index 51a09c186c..cd19058612 100644 --- a/packages/client/src/features/experts/details/Blog.tsx +++ b/packages/client/src/features/experts/details/Blog.tsx @@ -5,7 +5,7 @@ import { Markdown, MarkdownStyle } from '../../../components/Markdown' import { IUser } from '../../../types/user' import { ExpertDetails } from '../types' import { ExpertColumnRight } from './ExpertColumnRight' -import { ExpertPageRow } from './styles' +import { ExpertPageRow } from './experts-details.styles' import { useMarkdownToc } from '../../markdown/Toc' const ExpertName = styled.span` diff --git a/packages/client/src/features/experts/details/ExpertAskQuestionModal.tsx b/packages/client/src/features/experts/details/ExpertAskQuestionModal.tsx index 68ce887992..65b40fe396 100644 --- a/packages/client/src/features/experts/details/ExpertAskQuestionModal.tsx +++ b/packages/client/src/features/experts/details/ExpertAskQuestionModal.tsx @@ -6,7 +6,7 @@ import { GoogleReCaptchaV3 } from '../../../components/ReCaptchaV3' import { theme } from '../../../styles/theme' import { getRuntimeEnv } from '@/utils/runtimeEnv' import { ModalHeaderTop, ModalNext } from '../../modal/ModalNext' -import { ButtonRow, Footer as ModalFooter } from '../../modal/styles' +import { ButtonRow, Footer as ModalFooter } from '../../modal/modal.styles' const Asking = styled.div` display: flex; diff --git a/packages/client/src/features/experts/details/ExpertColumnRight.tsx b/packages/client/src/features/experts/details/ExpertColumnRight.tsx index ab84c6c7d9..bf22f74ff7 100644 --- a/packages/client/src/features/experts/details/ExpertColumnRight.tsx +++ b/packages/client/src/features/experts/details/ExpertColumnRight.tsx @@ -9,7 +9,7 @@ import { useModal } from '../../modal/useModal' import { askQuestion, deleteExpertRequest } from '../api' import { ExpertDetails } from '../types' import { ExpertAskQuestionModal } from './ExpertAskQuestionModal' -import { StyledPageRightColumn } from './styles' +import { StyledPageRightColumn } from './experts-details.styles' import { Button } from '../../../components/Button' import { useConfirm } from '../../modal/useConfirm' import { toastError, toastSuccess } from '../../../components/NotificationCenter/ToastHelper' diff --git a/packages/client/src/features/experts/details/styles.ts b/packages/client/src/features/experts/details/experts-details.styles.ts similarity index 96% rename from packages/client/src/features/experts/details/styles.ts rename to packages/client/src/features/experts/details/experts-details.styles.ts index 6a6448a321..8575216951 100644 --- a/packages/client/src/features/experts/details/styles.ts +++ b/packages/client/src/features/experts/details/experts-details.styles.ts @@ -1,5 +1,5 @@ import styled from 'styled-components' -import { PageContainer, PageLeftColumn, PageRightColumn, pagePadding, PageContainerMargin } from '../../../components/Page/styles' +import { PageContainer, PageLeftColumn, PageRightColumn, pagePadding, PageContainerMargin } from '../../../components/Page/page.styles' import { breakPoints } from '../../../styles/theme' import { StyledToC } from '../../markdown/Toc' diff --git a/packages/client/src/features/experts/details/index.tsx b/packages/client/src/features/experts/details/index.tsx index 71fe509d80..2ba3e77406 100644 --- a/packages/client/src/features/experts/details/index.tsx +++ b/packages/client/src/features/experts/details/index.tsx @@ -4,7 +4,7 @@ import { Link, Navigate, Route, Routes, useParams } from 'react-router' import 'react-toastify/dist/ReactToastify.css' import styled from 'styled-components' import { Loader } from '../../../components/Loader' -import { PageContainerMargin } from '../../../components/Page/styles' +import { PageContainerMargin } from '../../../components/Page/page.styles' import { usePageMeta } from '../../../hooks/usePageMeta' import { colors } from '../../../styles/theme' import NavigationBar from '../../../components/NavigationBar/NavigationBar' @@ -15,7 +15,7 @@ import { expertDetailsRequest } from '../api' import { ExpertDetails } from '../types' import { ExpertAbout } from './About' import { ExpertBlog } from './Blog' -import { ExpertData, ExpertImage, ExpertRow, Filler, StyledTab, StyledTabList } from './styles' +import { ExpertData, ExpertImage, ExpertRow, Filler, StyledTab, StyledTabList } from './experts-details.styles' import { NavLink } from '../../../components/NavLink' const StyledNavigationBar = styled.div` diff --git a/packages/client/src/features/experts/styles.ts b/packages/client/src/features/experts/experts.styles.ts similarity index 100% rename from packages/client/src/features/experts/styles.ts rename to packages/client/src/features/experts/experts.styles.ts diff --git a/packages/client/src/features/experts/list/ExpertListItem.tsx b/packages/client/src/features/experts/list/ExpertListItem.tsx index 156a660a1e..91924d4230 100644 --- a/packages/client/src/features/experts/list/ExpertListItem.tsx +++ b/packages/client/src/features/experts/list/ExpertListItem.tsx @@ -2,9 +2,9 @@ import { format } from 'date-fns' import React from 'react' import { Link } from 'react-router' import { Button } from '../../../components/Button' -import { Content, ItemBody, Title } from '../../../components/Public/styles' +import { Content, ItemBody, Title } from '../../../components/Public/public-layout.styles' import { Expert } from '../types' -import { ExpertButtonRow, ExpertButtonRowWrap, Info, ItemImage, Name, StyledExpertListItem } from './styles' +import { ExpertButtonRow, ExpertButtonRowWrap, Info, ItemImage, Name, StyledExpertListItem } from './experts-list.styles' export const ExpertListItem = ({ expert, isAdmin = false }: { expert: Expert, isAdmin?: boolean }) => ( diff --git a/packages/client/src/features/experts/list/styles.tsx b/packages/client/src/features/experts/list/experts-list.styles.tsx similarity index 100% rename from packages/client/src/features/experts/list/styles.tsx rename to packages/client/src/features/experts/list/experts-list.styles.tsx diff --git a/packages/client/src/features/files/FileList.tsx b/packages/client/src/features/files/FileList.tsx index 769d600436..9098a5a8c4 100644 --- a/packages/client/src/features/files/FileList.tsx +++ b/packages/client/src/features/files/FileList.tsx @@ -19,7 +19,7 @@ import { toastInfo } from '@/components/NotificationCenter/ToastHelper' import { ContentFooter } from '@/components/Page/ContentFooter' import { Pagination } from '@/components/Pagination' import Table from '@/components/Table' -import { StyledPageTable } from '@/components/Table/components/styles' +import { StyledPageTable } from '@/components/Table/components/table.styles' import { Button, buttonVariants } from '@/components/ui/button' import { cleanObject, getSelectedObjectsFromIndexes, toArrayFromObject } from '@/utils/object' import { ActionsMenuContent } from '../home/ActionMenuContent' diff --git a/packages/client/src/features/files/actionModals/useAddFolderModal.tsx b/packages/client/src/features/files/actionModals/useAddFolderModal.tsx index 407198f484..df703a1eff 100644 --- a/packages/client/src/features/files/actionModals/useAddFolderModal.tsx +++ b/packages/client/src/features/files/actionModals/useAddFolderModal.tsx @@ -11,7 +11,7 @@ import { DialogHeader, DialogTitle, } from '@/components/ui/dialog' -import { FieldGroup, InputError } from '../../../components/form/styles' +import { FieldGroup, InputError } from '../../../components/form/form.styles' import { InputText } from '../../../components/InputText' import { toastError, toastSuccess } from '../../../components/NotificationCenter/ToastHelper' import type { HomeScope } from '../../home/types' diff --git a/packages/client/src/features/files/actionModals/useConfirmModal.tsx b/packages/client/src/features/files/actionModals/useConfirmModal.tsx index b7600fe6cb..b63448efc1 100644 --- a/packages/client/src/features/files/actionModals/useConfirmModal.tsx +++ b/packages/client/src/features/files/actionModals/useConfirmModal.tsx @@ -2,7 +2,7 @@ import React from 'react' import styled from 'styled-components' import { useModal } from '../../modal/useModal' import { ModalHeaderTop, ModalNext } from '../../modal/ModalNext' -import { ButtonRow, Footer } from '../../modal/styles' +import { ButtonRow, Footer } from '../../modal/modal.styles' import { Button } from '../../../components/Button' const StyledMessage = styled.div` diff --git a/packages/client/src/features/files/actionModals/useCopyFilesModal/index.tsx b/packages/client/src/features/files/actionModals/useCopyFilesModal/index.tsx index b24812376d..fc801222e0 100644 --- a/packages/client/src/features/files/actionModals/useCopyFilesModal/index.tsx +++ b/packages/client/src/features/files/actionModals/useCopyFilesModal/index.tsx @@ -15,7 +15,7 @@ import { copyFilesRequest, fetchSelectedFiles, validateCopyingFiles } from '../. import { IExistingFileSet, ISelectedFile, ISelectedFolder, SelectedNode } from '../../files.types' import { ScopeAndFolderSelection } from './ScopeAndFolderSelection' import styles from './CopyFilesModal.module.css' -import { Footer } from '../../../modal/styles' +import { Footer } from '../../../modal/modal.styles' import { toastError, toastSuccess } from '../../../../components/NotificationCenter/ToastHelper' interface FileListItemContentProps { diff --git a/packages/client/src/features/files/actionModals/useCopyFilesToSpaceModal.tsx b/packages/client/src/features/files/actionModals/useCopyFilesToSpaceModal.tsx index c4897c2208..b88f9badda 100644 --- a/packages/client/src/features/files/actionModals/useCopyFilesToSpaceModal.tsx +++ b/packages/client/src/features/files/actionModals/useCopyFilesToSpaceModal.tsx @@ -8,7 +8,7 @@ import { BackendError } from '@/api/types' import { Button } from '@/components/Button' import { toastError } from '@/components/NotificationCenter/ToastHelper' import { ModalHeaderTop, ModalNext } from '../../modal/ModalNext' -import { ButtonRow, Footer, StyledModalScroll } from '../../modal/styles' +import { ButtonRow, Footer, StyledModalScroll } from '../../modal/modal.styles' import { useModal } from '../../modal/useModal' import { findById } from '../file.utils' import { copyFilesRequest, fetchFolderChildren } from '../files.api' diff --git a/packages/client/src/features/files/actionModals/useDeleteFileModal.tsx b/packages/client/src/features/files/actionModals/useDeleteFileModal.tsx index 6ecbbb99e0..dfa8697366 100644 --- a/packages/client/src/features/files/actionModals/useDeleteFileModal.tsx +++ b/packages/client/src/features/files/actionModals/useDeleteFileModal.tsx @@ -4,13 +4,13 @@ import React, { useEffect, useMemo, useState } from 'react' import styled from 'styled-components' import { Button } from '../../../components/Button' import { Loader } from '../../../components/Loader' -import { VerticalCenter } from '../../../components/Page/styles' +import { VerticalCenter } from '../../../components/Page/page.styles' import { ResourceTable, StyledName } from '../../../components/ResourceTable' import { FileIcon } from '../../../components/icons/FileIcon' import { FolderIcon } from '../../../components/icons/FolderIcon' import { itemsCountString } from '../../../utils/formatting' import { ModalHeaderTop, ModalNext } from '../../modal/ModalNext' -import { ButtonRow, Footer, ModalScroll } from '../../modal/styles' +import { ButtonRow, Footer, ModalScroll } from '../../modal/modal.styles' import { useModal } from '../../modal/useModal' import { ApiErrorResponse, DownloadListResponse } from '../../home/types' import { deleteFilesRequest, fetchFilesDownloadList } from '../files.api' diff --git a/packages/client/src/features/files/actionModals/useDnDMoveFileModal.tsx b/packages/client/src/features/files/actionModals/useDnDMoveFileModal.tsx index 4b3097b226..e441293b54 100644 --- a/packages/client/src/features/files/actionModals/useDnDMoveFileModal.tsx +++ b/packages/client/src/features/files/actionModals/useDnDMoveFileModal.tsx @@ -5,13 +5,13 @@ import { Link } from 'react-router' import styled from 'styled-components' import { Button } from '../../../components/Button' import { Loader } from '../../../components/Loader' -import { VerticalCenter } from '../../../components/Page/styles' +import { VerticalCenter } from '../../../components/Page/page.styles' import { FileIcon } from '../../../components/icons/FileIcon' import { FolderIcon } from '../../../components/icons/FolderIcon' import { itemsCountString, pluralize } from '../../../utils/formatting' import { getBasePath } from '../../home/utils' import { ModalHeaderTop, ModalNext } from '../../modal/ModalNext' -import { ButtonRow, Footer, ModalScroll } from '../../modal/styles' +import { ButtonRow, Footer, ModalScroll } from '../../modal/modal.styles' import { useModal } from '../../modal/useModal' import { moveFilesRequest } from '../files.api' import { IFile } from '../files.types' diff --git a/packages/client/src/features/files/actionModals/useDownloadFileModal.tsx b/packages/client/src/features/files/actionModals/useDownloadFileModal.tsx index a4509ed483..bf4c83ed35 100644 --- a/packages/client/src/features/files/actionModals/useDownloadFileModal.tsx +++ b/packages/client/src/features/files/actionModals/useDownloadFileModal.tsx @@ -2,13 +2,13 @@ import { useQuery } from '@tanstack/react-query' import React, { useMemo, useState } from 'react' import styled from 'styled-components' import { Button } from '../../../components/Button' -import { VerticalCenter } from '../../../components/Page/styles' +import { VerticalCenter } from '../../../components/Page/page.styles' import { ResourceTable, StyledAction, StyledName } from '../../../components/ResourceTable' import { FileIcon } from '../../../components/icons/FileIcon' import { FolderIcon } from '../../../components/icons/FolderIcon' import { itemsCountString } from '../../../utils/formatting' import { ModalHeaderTop, ModalNext } from '../../modal/ModalNext' -import { ButtonRow, Footer, ModalScroll } from '../../modal/styles' +import { ButtonRow, Footer, ModalScroll } from '../../modal/modal.styles' import { useModal } from '../../modal/useModal' import { DownloadListResponse, ServerScope } from '../../home/types' import { fetchFilesDownloadList } from '../files.api' diff --git a/packages/client/src/features/files/actionModals/useEditFileModal.tsx b/packages/client/src/features/files/actionModals/useEditFileModal.tsx index c2ddacd96b..12c1f5d1b0 100644 --- a/packages/client/src/features/files/actionModals/useEditFileModal.tsx +++ b/packages/client/src/features/files/actionModals/useEditFileModal.tsx @@ -4,9 +4,9 @@ import { useForm } from 'react-hook-form' import { useMutation, useQueryClient } from '@tanstack/react-query' import { ErrorMessage } from '@hookform/error-message' import { yupResolver } from '@hookform/resolvers/yup' -import { FieldGroup, InputError } from '../../../components/form/styles' +import { FieldGroup, InputError } from '../../../components/form/form.styles' import { InputText, InputTextArea } from '../../../components/InputText' -import { ButtonRow, Footer, StyledForm, StyledModalScroll } from '../../modal/styles' +import { ButtonRow, Footer, StyledForm, StyledModalScroll } from '../../modal/modal.styles' import { useModal } from '../../modal/useModal' import { editFileRequest } from '../files.api' import { IFile } from '../files.types' diff --git a/packages/client/src/features/files/actionModals/useEditFolderModal.tsx b/packages/client/src/features/files/actionModals/useEditFolderModal.tsx index d792afa49d..c3cb725685 100644 --- a/packages/client/src/features/files/actionModals/useEditFolderModal.tsx +++ b/packages/client/src/features/files/actionModals/useEditFolderModal.tsx @@ -2,10 +2,10 @@ import { ErrorMessage } from '@hookform/error-message' import React, { useMemo } from 'react' import { useForm } from 'react-hook-form' import { useMutation, useQueryClient } from '@tanstack/react-query' -import { FieldGroup, InputError } from '../../../components/form/styles' +import { FieldGroup, InputError } from '../../../components/form/form.styles' import { InputText } from '../../../components/InputText' import { ModalHeaderTop, ModalNext } from '../../modal/ModalNext' -import { ButtonRow, Footer, StyledForm } from '../../modal/styles' +import { ButtonRow, Footer, StyledForm } from '../../modal/modal.styles' import { useModal } from '../../modal/useModal' import { editFolderRequest } from '../files.api' import { IFile } from '../files.types' diff --git a/packages/client/src/features/files/actionModals/useFileUploadModal/FileUploadModal.tsx b/packages/client/src/features/files/actionModals/useFileUploadModal/FileUploadModal.tsx index 676cb3f3b1..00af3f4639 100644 --- a/packages/client/src/features/files/actionModals/useFileUploadModal/FileUploadModal.tsx +++ b/packages/client/src/features/files/actionModals/useFileUploadModal/FileUploadModal.tsx @@ -3,11 +3,11 @@ import clsx from 'clsx' import { useDropzone } from 'react-dropzone' import { useNavigate } from 'react-router' import { Button } from '@/components/Button' -import { InputError } from '@/components/form/styles' +import { InputError } from '@/components/form/form.styles' import { itemsCountString } from '@/utils/formatting' import { HomeScope, MetaPath } from '../../../home/types' import { ModalHeaderTop, ModalNext } from '../../../modal/ModalNext' -import { ButtonRow, Footer, ModalScrollAutoHeight } from '../../../modal/styles' +import { ButtonRow, Footer, ModalScrollAutoHeight } from '../../../modal/modal.styles' import { MAX_UPLOADABLE_FILES } from './constants' import styles from './FileUploadModal.module.css' import { FileUploadStore } from './FileUploadStore' diff --git a/packages/client/src/features/files/actionModals/useFileUploadModal/UploadConflictModal.tsx b/packages/client/src/features/files/actionModals/useFileUploadModal/UploadConflictModal.tsx index dcf7846c92..3c9957ca16 100644 --- a/packages/client/src/features/files/actionModals/useFileUploadModal/UploadConflictModal.tsx +++ b/packages/client/src/features/files/actionModals/useFileUploadModal/UploadConflictModal.tsx @@ -1,7 +1,7 @@ import React from 'react' import { Button } from '@/components/Button' import { ModalHeaderTop, ModalNext } from '@/features/modal/ModalNext' -import { ButtonRow, Footer } from '@/features/modal/styles' +import { ButtonRow, Footer } from '@/features/modal/modal.styles' interface UploadConflictModalProps { isShown: boolean diff --git a/packages/client/src/features/files/actionModals/useFileUploadModal/multiFileUploadCoordinator.ts b/packages/client/src/features/files/actionModals/useFileUploadModal/multiFileUploadCoordinator.ts index db7efa9e95..92175bcf79 100644 --- a/packages/client/src/features/files/actionModals/useFileUploadModal/multiFileUploadCoordinator.ts +++ b/packages/client/src/features/files/actionModals/useFileUploadModal/multiFileUploadCoordinator.ts @@ -9,7 +9,7 @@ import { Micro } from 'effect' import type { HomeScope } from '@/features/home/types' import { MAX_UPLOAD_WORKER_CONCURRENCY, type PauseReason } from './constants' -import { createFileUpload, FileUploadController, type FileUploadConfig, type UploadState } from './fileUpload' +import { createFileUpload, type FileUploadConfig, type FileUploadController, type UploadState } from './fileUpload' import { extractDirectory, RemoteFolderManager, RemoteRootFolderExistsError } from './remoteFolderManager' export interface UploadFileDescriptor { @@ -48,7 +48,6 @@ export class MultiFileUploadCoordinator { private disposed = false private readonly maxConcurrency: number private readonly isSingleFileUpload: boolean - private uploadEffect: Micro.Micro | null = null private uploadAbortController: AbortController | null = null constructor(private readonly config: MultiFileUploadConfig) { @@ -130,8 +129,6 @@ export class MultiFileUploadCoordinator { ) }) - this.uploadEffect = uploadProgram - let caughtError: unknown = null try { @@ -140,7 +137,6 @@ export class MultiFileUploadCoordinator { caughtError = error console.error('Coordinator encountered an error:', error) } finally { - this.uploadEffect = null this.uploadAbortController = null } diff --git a/packages/client/src/features/files/actionModals/useFileUploadModalLegacy/styles.ts b/packages/client/src/features/files/actionModals/useFileUploadModalLegacy/file-upload-legacy.styles.ts similarity index 100% rename from packages/client/src/features/files/actionModals/useFileUploadModalLegacy/styles.ts rename to packages/client/src/features/files/actionModals/useFileUploadModalLegacy/file-upload-legacy.styles.ts diff --git a/packages/client/src/features/files/actionModals/useFileUploadModalLegacy/index.tsx b/packages/client/src/features/files/actionModals/useFileUploadModalLegacy/index.tsx index da55970f39..c1c57bbe3a 100644 --- a/packages/client/src/features/files/actionModals/useFileUploadModalLegacy/index.tsx +++ b/packages/client/src/features/files/actionModals/useFileUploadModalLegacy/index.tsx @@ -1,5 +1,5 @@ import { Button } from '@/components/Button' -import { InputError } from '@/components/form/styles' +import { InputError } from '@/components/form/form.styles' import { Done, Failed, Running } from '@/components/icons/StateIcons' import { TrashIcon } from '@/components/icons/TrashIcon' import { UploadIcon } from '@/components/icons/UploadIcon' @@ -13,7 +13,7 @@ import { useDropzone } from 'react-dropzone' import { useImmer } from 'use-immer' import { HomeScope } from '../../../home/types' import { ModalHeaderTop, ModalNext } from '../../../modal/ModalNext' -import { ButtonRow, Footer, ModalScroll } from '../../../modal/styles' +import { ButtonRow, Footer, ModalScroll } from '../../../modal/modal.styles' import { useConditionalModal } from '../../../modal/useModal' import { FILE_STATUS, FilesMeta, FileStatusTypes, IUploadInfo, MAX_UPLOADABLE_FILES } from './constants' import { multiFileUpload } from './multiFileUpload' @@ -31,7 +31,7 @@ import { StatusWrapper, UploadFilesContainer, UploadFilesHeader, -} from './styles' +} from './file-upload-legacy.styles' interface FileUploadTableProps { filesMeta: FilesMeta[] diff --git a/packages/client/src/features/files/actionModals/useLockUnlockFileModal.tsx b/packages/client/src/features/files/actionModals/useLockUnlockFileModal.tsx index f0779e6a61..a145f1a47d 100644 --- a/packages/client/src/features/files/actionModals/useLockUnlockFileModal.tsx +++ b/packages/client/src/features/files/actionModals/useLockUnlockFileModal.tsx @@ -5,11 +5,11 @@ import styled from 'styled-components' import { FileIcon } from '../../../components/icons/FileIcon' import { FolderIcon } from '../../../components/icons/FolderIcon' import { Loader } from '../../../components/Loader' -import { VerticalCenter } from '../../../components/Page/styles' +import { VerticalCenter } from '../../../components/Page/page.styles' import { ResourceTable, StyledName } from '../../../components/ResourceTable' import { itemsCountString, pluralize } from '../../../utils/formatting' import { ModalHeaderTop, ModalNext } from '../../modal/ModalNext' -import { Footer, ModalScroll } from '../../modal/styles' +import { Footer, ModalScroll } from '../../modal/modal.styles' import { useModal } from '../../modal/useModal' import { ApiErrorResponse, DownloadListResponse, ServerScope } from '../../home/types' import { fetchFilesListLockingRequest, LockUnlockActionType, lockUnlockFilesRequest } from '../files.api' diff --git a/packages/client/src/features/files/actionModals/useOpenFileModal.tsx b/packages/client/src/features/files/actionModals/useOpenFileModal.tsx index 100114ed06..e8cf49cb30 100644 --- a/packages/client/src/features/files/actionModals/useOpenFileModal.tsx +++ b/packages/client/src/features/files/actionModals/useOpenFileModal.tsx @@ -4,12 +4,12 @@ import { useState } from 'react' import styled from 'styled-components' import { Button } from '@/components/Button' import { FileIcon } from '@/components/icons/FileIcon' -import { VerticalCenter } from '@/components/Page/styles' +import { VerticalCenter } from '@/components/Page/page.styles' import { ResourceTable, StyledAction, StyledName } from '@/components/ResourceTable' import { pluralize, sanitizeFileName } from '@/utils/formatting' import type { DownloadListResponse } from '../../home/types' import { ModalHeaderTop, ModalNext } from '../../modal/ModalNext' -import { ButtonRow, Footer, ModalScroll } from '../../modal/styles' +import { ButtonRow, Footer, ModalScroll } from '../../modal/modal.styles' import { useModal } from '../../modal/useModal' import { fetchFilesDownloadList } from '../files.api' import type { IFile } from '../files.types' diff --git a/packages/client/src/features/files/actionModals/useSelectFileModal.tsx b/packages/client/src/features/files/actionModals/useSelectFileModal.tsx index ab762c4c07..0ce1cb7663 100644 --- a/packages/client/src/features/files/actionModals/useSelectFileModal.tsx +++ b/packages/client/src/features/files/actionModals/useSelectFileModal.tsx @@ -38,13 +38,13 @@ import { SyledFilterWrapper, SyledUid, TabContent, -} from '../../actionModals/styles' +} from '../../actionModals/action-modals.styles' import { fetchFilteredFiles } from '../../apps/apps.api' import { useAuthUser } from '../../auth/useAuthUser' import { IAccessibleFile } from '../../databases/databases.api' import { DialogType } from '../../home/types' import { ModalHeaderTop, ModalNext } from '../../modal/ModalNext' -import { ButtonRow, Footer } from '../../modal/styles' +import { ButtonRow, Footer } from '../../modal/modal.styles' import { useModal } from '../../modal/useModal' import { noAccessText } from '../file.utils' import { useFetchFilesByUIDQuery } from '../query/useFetchFilesByUIDQuery' diff --git a/packages/client/src/features/files/actionModals/useSelectFolderModal.tsx b/packages/client/src/features/files/actionModals/useSelectFolderModal.tsx index a800675b49..2486831845 100644 --- a/packages/client/src/features/files/actionModals/useSelectFolderModal.tsx +++ b/packages/client/src/features/files/actionModals/useSelectFolderModal.tsx @@ -4,7 +4,7 @@ import styled from 'styled-components' import { useImmer } from 'use-immer' import { Button } from '../../../components/Button' import { ModalHeaderTop, ModalNext } from '../../modal/ModalNext' -import { ButtonRow, Footer, ModalScroll } from '../../modal/styles' +import { ButtonRow, Footer, ModalScroll } from '../../modal/modal.styles' import { useModal } from '../../modal/useModal' import { ServerScope } from '../../home/types' import { fetchFolderChildren } from '../files.api' diff --git a/packages/client/src/features/files/show/FileShow.tsx b/packages/client/src/features/files/show/FileShow.tsx index f441c02d66..d922d7f138 100644 --- a/packages/client/src/features/files/show/FileShow.tsx +++ b/packages/client/src/features/files/show/FileShow.tsx @@ -8,7 +8,7 @@ import { FileIcon } from '@/components/icons/FileIcon' import { LockIcon } from '@/components/icons/LockIcon' import { ActionsMenu } from '@/components/Menu' import { toastInfo } from '@/components/NotificationCenter/ToastHelper' -import { Filler } from '@/components/Page/styles' +import { Filler } from '@/components/Page/page.styles' import { type ITab, TabsSwitch } from '@/components/TabsSwitch' import { StyledPropertyItem, StyledPropertyKey, StyledTagItem, StyledTags } from '@/components/Tags' import { theme } from '@/styles/theme' @@ -44,7 +44,7 @@ import { getOriginHref } from '../file.utils' import type { IFile } from '../files.types' import { normalizePermissions } from '../normalizePermissions' import { useFilesSelectActions } from '../useFilesSelectActions' -import { FileDescription, HeaderActions } from './styles' +import { FileDescription, HeaderActions } from './files-show.styles' const FileActionsDropdown = ({ homeScope, diff --git a/packages/client/src/features/files/show/styles.ts b/packages/client/src/features/files/show/files-show.styles.ts similarity index 100% rename from packages/client/src/features/files/show/styles.ts rename to packages/client/src/features/files/show/files-show.styles.ts diff --git a/packages/client/src/features/home/home.styles.ts b/packages/client/src/features/home/home.styles.ts index 41dc1284a3..cc2eadc24e 100644 --- a/packages/client/src/features/home/home.styles.ts +++ b/packages/client/src/features/home/home.styles.ts @@ -3,7 +3,7 @@ import styled, { css } from 'styled-components' import { Svg } from '../../components/icons/Svg' import { NavLink } from '../../components/NavLink' import { BackLink } from '../../components/Page/PageBackLink' -import { compactScrollBarV2 } from '../../components/Page/styles' +import { compactScrollBarV2 } from '../../components/Page/page.styles' export const StyledBackLink = styled(BackLink)` margin: 16px 16px; diff --git a/packages/client/src/features/lexi/styles.ts b/packages/client/src/features/lexi/lexi.styles.ts similarity index 100% rename from packages/client/src/features/lexi/styles.ts rename to packages/client/src/features/lexi/lexi.styles.ts diff --git a/packages/client/src/features/licenses/useAcceptLicenseModal.tsx b/packages/client/src/features/licenses/useAcceptLicenseModal.tsx index 1ebafa5d53..577dc8aac1 100644 --- a/packages/client/src/features/licenses/useAcceptLicenseModal.tsx +++ b/packages/client/src/features/licenses/useAcceptLicenseModal.tsx @@ -1,7 +1,7 @@ import { useMutation } from '@tanstack/react-query' import styled from 'styled-components' import { ModalHeaderTop, ModalNext } from '../modal/ModalNext' -import { ButtonRow, Footer } from '../modal/styles' +import { ButtonRow, Footer } from '../modal/modal.styles' import { useModal } from '../modal/useModal' import type { APIResource } from '../home/types' import { acceptLicenseRequest } from './api' diff --git a/packages/client/src/features/licenses/useAcceptLicensesModal.tsx b/packages/client/src/features/licenses/useAcceptLicensesModal.tsx index 8168fd9919..9059938e08 100644 --- a/packages/client/src/features/licenses/useAcceptLicensesModal.tsx +++ b/packages/client/src/features/licenses/useAcceptLicensesModal.tsx @@ -5,7 +5,7 @@ import { Checkbox } from '../../components/Checkbox' import { SideTabs } from '../../components/SideTab/SideTabs' import { colors } from '../../styles/theme' import { ModalHeaderTop, ModalNext } from '../modal/ModalNext' -import { ButtonRow, Footer } from '../modal/styles' +import { ButtonRow, Footer } from '../modal/modal.styles' import { useModal } from '../modal/useModal' import { acceptLicensesRequest } from './api' import { License } from './types' diff --git a/packages/client/src/features/licenses/useAttachLicensesModal.tsx b/packages/client/src/features/licenses/useAttachLicensesModal.tsx index ea62059d40..0b3f66a9b3 100644 --- a/packages/client/src/features/licenses/useAttachLicensesModal.tsx +++ b/packages/client/src/features/licenses/useAttachLicensesModal.tsx @@ -9,7 +9,7 @@ import { attachLicenseRequest } from './api' import type { License } from './types' import { useLicensesListQuery } from './queries' import { ModalHeaderTop, ModalNext } from '../modal/ModalNext' -import { ButtonRow, Footer, ModalScroll } from '../modal/styles' +import { ButtonRow, Footer, ModalScroll } from '../modal/modal.styles' import { Button } from '@/components/Button' import { Empty } from '../home/home.styles' import type { IFile } from '../files/files.types' diff --git a/packages/client/src/features/licenses/useDetachLicenseModal.tsx b/packages/client/src/features/licenses/useDetachLicenseModal.tsx index 7a3fdb296d..661dbc1467 100644 --- a/packages/client/src/features/licenses/useDetachLicenseModal.tsx +++ b/packages/client/src/features/licenses/useDetachLicenseModal.tsx @@ -4,7 +4,7 @@ import { Button } from '@/components/Button' import { toastError, toastSuccess } from '@/components/NotificationCenter/ToastHelper' import type { APIResource } from '../home/types' import { ModalHeaderTop, ModalNext } from '../modal/ModalNext' -import { ButtonRow, Footer, StyledModalContent } from '../modal/styles' +import { ButtonRow, Footer, StyledModalContent } from '../modal/modal.styles' import { useModal } from '../modal/useModal' import { detachLicenseRequest } from './api' diff --git a/packages/client/src/features/modal/ModalNext.tsx b/packages/client/src/features/modal/ModalNext.tsx index ebd39a7abc..95d8453c75 100644 --- a/packages/client/src/features/modal/ModalNext.tsx +++ b/packages/client/src/features/modal/ModalNext.tsx @@ -4,7 +4,7 @@ import { CSSTransition } from 'react-transition-group' import styled, { css } from 'styled-components' import { PlusIcon } from '../../components/icons/PlusIcon' import { useKeyPress } from '../../hooks/useKeyPress' -import { CloseButton, HeaderText, HeaderTop } from './styles' +import { CloseButton, HeaderText, HeaderTop } from './modal.styles' /** * Full-screen layer inside the modal where portaled popups (Combobox, etc.) can mount above the panel diff --git a/packages/client/src/features/modal/SavingModal.tsx b/packages/client/src/features/modal/SavingModal.tsx index fe90f8f0e2..1aabc24684 100644 --- a/packages/client/src/features/modal/SavingModal.tsx +++ b/packages/client/src/features/modal/SavingModal.tsx @@ -1,6 +1,6 @@ import React from 'react' import { ModalHeaderTop, ModalNext } from './ModalNext' -import { Content } from './styles' +import { Content } from './modal.styles' // TODO how about a different name for this? like Processing modal, because it doesn't have to be just saving export const SavingModal = ({ diff --git a/packages/client/src/features/modal/styles.ts b/packages/client/src/features/modal/modal.styles.ts similarity index 85% rename from packages/client/src/features/modal/styles.ts rename to packages/client/src/features/modal/modal.styles.ts index fed2d05e09..592e3e1e8d 100644 --- a/packages/client/src/features/modal/styles.ts +++ b/packages/client/src/features/modal/modal.styles.ts @@ -1,7 +1,7 @@ import styled from 'styled-components' -import { TransparentButton } from '../../components/Button' -import { compactScrollBarV2 } from '../../components/Page/styles' -import { Svg } from '../../components/icons/Svg' +import { TransparentButton } from '@/components/Button' +import { Svg } from '@/components/icons/Svg' +import { compactScrollBarV2 } from '@/components/Page/page.styles' export const HeaderTop = styled.div` border-radius: 8px 8px 0 0; @@ -109,17 +109,3 @@ export const ModalLoaderWrapper = styled.div` align-items: center; min-height: 200px; ` - -export const ModalPageRow = styled.div` - display: grid; - grid-template-columns: auto auto; -` - -export const ModalPageCol = styled.div` - align-self: stretch; - min-width: 350px; - width: 50vw; - &:last-child { - border: 0; - } -` diff --git a/packages/client/src/features/modal/useConfirm/Dialog.tsx b/packages/client/src/features/modal/useConfirm/Dialog.tsx index 067162e229..21508c0d9c 100644 --- a/packages/client/src/features/modal/useConfirm/Dialog.tsx +++ b/packages/client/src/features/modal/useConfirm/Dialog.tsx @@ -1,7 +1,7 @@ -import React, { ReactNode } from 'react' +import type { ReactNode } from 'react' import styled from 'styled-components' -import { ButtonRow } from '../styles' -import { Button } from '../../../components/Button' +import { Button } from '@/components/Button' +import { ButtonRow } from '../modal.styles' export const StyledConfirmDialog = styled.div` padding: 12px 12px 12px 24px; @@ -29,7 +29,9 @@ export const Dialog = (props: IDialogProps) => { {body} - + ) diff --git a/packages/client/src/features/news/ListAdminNews.tsx b/packages/client/src/features/news/ListAdminNews.tsx index ad2e78db99..06a5799f63 100644 --- a/packages/client/src/features/news/ListAdminNews.tsx +++ b/packages/client/src/features/news/ListAdminNews.tsx @@ -10,10 +10,10 @@ import { NewspaperIcon } from '@/components/icons/NewspaperIcon' import { Svg } from '@/components/icons/Svg' import { Loader } from '@/components/Loader' import { BackLink } from '@/components/Page/PageBackLink' -import { PageContainerMargin, PageTitle } from '@/components/Page/styles' +import { PageContainerMargin, PageTitle } from '@/components/Page/page.styles' import { useAuthUser } from '@/features/auth/useAuthUser' import ExternalLink from '../../components/Controls/ExternalLink' -import { ButtonRow } from '../modal/styles' +import { ButtonRow } from '../modal/modal.styles' import { NewsItem } from './types' import { useNewsAdminAllRequest } from './useNewsListQuery' diff --git a/packages/client/src/features/news/NewsPage.tsx b/packages/client/src/features/news/NewsPage.tsx index 54afc01b22..fc4555c5f9 100644 --- a/packages/client/src/features/news/NewsPage.tsx +++ b/packages/client/src/features/news/NewsPage.tsx @@ -7,7 +7,7 @@ import ExternalLink from '../../components/Controls/ExternalLink' import { InlineError } from '../../components/Error' import { Loader } from '../../components/Loader' import NavigationBar from '../../components/NavigationBar/NavigationBar' -import { PageContainerMargin } from '../../components/Page/styles' +import { PageContainerMargin } from '../../components/Page/page.styles' import { hidePagination, Pagination } from '../../components/Pagination' import { ButtonRow, @@ -23,13 +23,13 @@ import { RightSideItem, SectionTitle, Title, -} from '../../components/Public/styles' +} from '../../components/Public/public-layout.styles' import { usePageMeta } from '../../hooks/usePageMeta' import { usePaginationParamsV2 } from '../../hooks/usePaginationState' import PublicLayout from '../../layouts/PublicLayout' import { useAuthUser } from '../auth/useAuthUser' import { newsYearsListRequest } from './api' -import { ItemBody, ItemDate, NewsListItem } from './styles' +import { ItemBody, ItemDate, NewsListItem } from './news.styles' import { useNewsListQuery } from './useNewsListQuery' const NewsPage = () => { diff --git a/packages/client/src/features/news/form/CreateNewsItemPage.tsx b/packages/client/src/features/news/form/CreateNewsItemPage.tsx index d30c161714..0e2763dff2 100644 --- a/packages/client/src/features/news/form/CreateNewsItemPage.tsx +++ b/packages/client/src/features/news/form/CreateNewsItemPage.tsx @@ -2,12 +2,12 @@ import { useMutation, useQueryClient } from '@tanstack/react-query' import { useNavigate } from 'react-router' import { toastError, toastSuccess } from '@/components/NotificationCenter/ToastHelper' import { BackLink } from '@/components/Page/PageBackLink' -import { PageTitle } from '@/components/Page/styles' +import { PageTitle } from '@/components/Page/page.styles' import { AdminWrapper } from '../../admin/AdminWrapper' import { createNewsItemRequest } from '../api' import { NewsItemPayload } from '../types' import { NewsItemForm } from './NewsItemForm' -import { FormPageContainer } from './styles' +import { FormPageContainer } from './news-form.styles' const CreateNewsItemPage = () => { const navigate = useNavigate() diff --git a/packages/client/src/features/news/form/EditNewsItemPage.tsx b/packages/client/src/features/news/form/EditNewsItemPage.tsx index 8a915c2d0e..42f5ebc153 100644 --- a/packages/client/src/features/news/form/EditNewsItemPage.tsx +++ b/packages/client/src/features/news/form/EditNewsItemPage.tsx @@ -3,12 +3,12 @@ import { useNavigate, useParams } from 'react-router' import { Loader } from '@/components/Loader' import { toastError, toastSuccess } from '@/components/NotificationCenter/ToastHelper' import { BackLinkMargin } from '@/components/Page/PageBackLink' -import { PageTitle } from '@/components/Page/styles' +import { PageTitle } from '@/components/Page/page.styles' import { AdminWrapper } from '../../admin/AdminWrapper' import { deleteNewsItemRequest, editNewsItemRequest, newsItemRequest } from '../api' import { NewsItem, NewsItemPayload } from '../types' import { NewsItemForm } from './NewsItemForm' -import { FormPageContainer } from './styles' +import { FormPageContainer } from './news-form.styles' const useNewsItemRequest = (id: string) => { return useQuery({ diff --git a/packages/client/src/features/news/form/NewsItemForm.tsx b/packages/client/src/features/news/form/NewsItemForm.tsx index 349a58ceed..0502251c27 100644 --- a/packages/client/src/features/news/form/NewsItemForm.tsx +++ b/packages/client/src/features/news/form/NewsItemForm.tsx @@ -7,9 +7,9 @@ import * as Yup from 'yup' import { Button } from '../../../components/Button' import { Checkbox } from '../../../components/Checkbox' import { InputDate } from '../../../components/form/InputDate' -import { CheckboxLabel, FieldGroup, InputError } from '../../../components/form/styles' +import { CheckboxLabel, FieldGroup, InputError } from '../../../components/form/form.styles' import { InputText, InputTextArea } from '../../../components/InputText' -import { ButtonRow } from '../../modal/styles' +import { ButtonRow } from '../../modal/modal.styles' import { NewsItemPayload } from '../types' const StyledForm = styled.form` diff --git a/packages/client/src/features/news/form/styles.ts b/packages/client/src/features/news/form/news-form.styles.ts similarity index 94% rename from packages/client/src/features/news/form/styles.ts rename to packages/client/src/features/news/form/news-form.styles.ts index 1355e5f42e..b837c09a29 100644 --- a/packages/client/src/features/news/form/styles.ts +++ b/packages/client/src/features/news/form/news-form.styles.ts @@ -1,6 +1,6 @@ import styled from 'styled-components' import { StyledBackLink } from '../../../components/Page/PageBackLink' -import { PageContainerMargin, PageTitle } from '../../../components/Page/styles' +import { PageContainerMargin, PageTitle } from '../../../components/Page/page.styles' export const FormPageContainer = styled(PageContainerMargin)` --container-width: 600px; diff --git a/packages/client/src/features/news/styles.ts b/packages/client/src/features/news/news.styles.ts similarity index 100% rename from packages/client/src/features/news/styles.ts rename to packages/client/src/features/news/news.styles.ts diff --git a/packages/client/src/features/overview/ChallengesBanner.tsx b/packages/client/src/features/overview/ChallengesBanner.tsx index 53e7244d57..a34fe217bf 100644 --- a/packages/client/src/features/overview/ChallengesBanner.tsx +++ b/packages/client/src/features/overview/ChallengesBanner.tsx @@ -4,7 +4,7 @@ import styled from 'styled-components' import challengesBannerLeft from '../../assets/ChallengesBannerBackground-Left.png' import challengesBannerRight from '../../assets/ChallengesBannerBackground-Right.png' import { colors } from '../../styles/theme' -import { ViewAllButton } from './styles' +import { ViewAllButton } from './overview.styles' const StyledChallengesBanner = styled.div` display: flex; diff --git a/packages/client/src/features/overview/ChallengesOverviewList.tsx b/packages/client/src/features/overview/ChallengesOverviewList.tsx index f49021c82f..d93369cf72 100644 --- a/packages/client/src/features/overview/ChallengesOverviewList.tsx +++ b/packages/client/src/features/overview/ChallengesOverviewList.tsx @@ -2,11 +2,11 @@ import React from 'react' import { Link } from 'react-router' import styled from 'styled-components' import { Loader } from '../../components/Loader' -import { SectionTitle } from '../../components/Public/styles' +import { SectionTitle } from '../../components/Public/public-layout.styles' import { ChallengeListItem } from '../challenges/list/ChallengeListItem' import { useChallengesListQuery } from '../challenges/list/useChallengesListQuery' import { getTimeStatusColor } from '../challenges/util' -import { ViewAllButton } from './styles' +import { ViewAllButton } from './overview.styles' const StyledChallengesOverview = styled.div` margin-bottom: 64px; diff --git a/packages/client/src/features/overview/OverviewAuthed.tsx b/packages/client/src/features/overview/OverviewAuthed.tsx index e79f040d38..f5458e3222 100644 --- a/packages/client/src/features/overview/OverviewAuthed.tsx +++ b/packages/client/src/features/overview/OverviewAuthed.tsx @@ -4,8 +4,8 @@ import { useQuery } from '@tanstack/react-query' import { Link } from 'react-router' import styled from 'styled-components' import { Loader } from '../../components/Loader' -import { PageContainerMargin } from '../../components/Page/styles' -import { OverviewCenterSection, PageRow, RightSide, RightSideItem, SectionTitle } from '../../components/Public/styles' +import { PageContainerMargin } from '../../components/Page/page.styles' +import { OverviewCenterSection, PageRow, RightSide, RightSideItem, SectionTitle } from '../../components/Public/public-layout.styles' import { usePageMeta } from '../../hooks/usePageMeta' import { IUser } from '../../types/user' import NavigationBar from '../../components/NavigationBar/NavigationBar' @@ -19,7 +19,7 @@ import { ChallengesBanner } from './ChallengesBanner' import ChallengesOverviewList from './ChallengesOverviewList' import { OverviewNewsList } from './OverviewNewsList' import { ParticipantOrgsList } from './ParticipantsOrgsList' -import { CommunityParticipants, ExpertSection, Hr, InfoRow, PageOverviewMainBody } from './styles' +import { CommunityParticipants, ExpertSection, Hr, InfoRow, PageOverviewMainBody } from './overview.styles' import { AppTypeIconBlue } from '../../components/icons/AppTypeIconBlue' import { AppTypeIconYellow } from '../../components/icons/AppTypeIconYellow' import { Button } from '../../components/Button' diff --git a/packages/client/src/features/overview/OverviewExpertsListCondensed.tsx b/packages/client/src/features/overview/OverviewExpertsListCondensed.tsx index 24ff3b751e..c0097536b6 100644 --- a/packages/client/src/features/overview/OverviewExpertsListCondensed.tsx +++ b/packages/client/src/features/overview/OverviewExpertsListCondensed.tsx @@ -10,7 +10,7 @@ import { Name, StyledCondensedList, StyledPreview, -} from '../experts/ExpertsCondensedList/styles' +} from '../experts/ExpertsCondensedList/experts-condensed-list.styles' import { useExpertsListCondensedQuery } from '../experts/useExpertsListQuery' export const OverviewExpertsCondensedList = ({ pick }: { pick?: number }) => { diff --git a/packages/client/src/features/overview/OverviewPublic.tsx b/packages/client/src/features/overview/OverviewPublic.tsx index d777ed8f63..ac7f74a4e3 100644 --- a/packages/client/src/features/overview/OverviewPublic.tsx +++ b/packages/client/src/features/overview/OverviewPublic.tsx @@ -1,8 +1,8 @@ import React from 'react' import styled from 'styled-components' import { Button } from '@/components/Button' -import { PageContainerMargin } from '@/components/Page/styles' -import { OverviewCenterSection, PageRow } from '@/components/Public/styles' +import { PageContainerMargin } from '@/components/Page/page.styles' +import { OverviewCenterSection, PageRow } from '@/components/Public/public-layout.styles' import { usePageMeta } from '@/hooks/usePageMeta' import NavigationBar, { NavigationBarBanner, @@ -10,7 +10,7 @@ import NavigationBar, { } from '../../components/NavigationBar/NavigationBar' import MailButton from '../../components/NavigationBar/SocialMediaButtons' import PublicLayout from '../../layouts/PublicLayout' -import { PageOverviewMainBody } from './styles' +import { PageOverviewMainBody } from './overview.styles' const HeroContent = styled.div` text-align: center; diff --git a/packages/client/src/features/overview/ParticipantsOrgsList.tsx b/packages/client/src/features/overview/ParticipantsOrgsList.tsx index d9f6392be8..8657116696 100644 --- a/packages/client/src/features/overview/ParticipantsOrgsList.tsx +++ b/packages/client/src/features/overview/ParticipantsOrgsList.tsx @@ -1,7 +1,7 @@ import React from 'react' import styled from 'styled-components' import { Loader } from '../../components/Loader' -import { compactScrollBar } from '../../components/Page/styles' +import { compactScrollBar } from '../../components/Page/page.styles' import { useParticipantsQuery } from './useParticipantsQuery' const StyledParticipantsList = styled.ul` diff --git a/packages/client/src/features/overview/styles.ts b/packages/client/src/features/overview/overview.styles.ts similarity index 97% rename from packages/client/src/features/overview/styles.ts rename to packages/client/src/features/overview/overview.styles.ts index e11254f9c3..fd44e48afd 100644 --- a/packages/client/src/features/overview/styles.ts +++ b/packages/client/src/features/overview/overview.styles.ts @@ -1,5 +1,5 @@ import styled from 'styled-components' -import { PageMainBody, SectionTitle } from '../../components/Public/styles' +import { PageMainBody, SectionTitle } from '../../components/Public/public-layout.styles' export const InfoRow = styled.div` display: flex; diff --git a/packages/client/src/features/publishing/PublishingPage.tsx b/packages/client/src/features/publishing/PublishingPage.tsx index 3977bc8593..4c06147e93 100644 --- a/packages/client/src/features/publishing/PublishingPage.tsx +++ b/packages/client/src/features/publishing/PublishingPage.tsx @@ -3,7 +3,7 @@ import React, { useState } from 'react' import { Link, useNavigate, useSearchParams } from 'react-router' import { Button } from '../../components/Button' import { Checkbox } from '../../components/Checkbox' -import { EntityIcon } from '../../components/EntityIcon' +import { EntityIcon } from '../../components/icons/EntityIcon' import { UserLayout } from '../../layouts/UserLayout' import { HomeLoader, NotFound } from '../home/show.styles' import { getEntityTypeFromIdentifier } from '../tracks/TrackProvenanceContent' @@ -21,7 +21,7 @@ import { PublishingWrapper, StyledCallout, StyledPageContainer, -} from './styles' +} from './publishing.styles' import { usePublishingTreeRootQuery } from './usePublishingTreeQuery' import { AxiosError } from 'axios' import { toastError, toastSuccess } from '../../components/NotificationCenter/ToastHelper' diff --git a/packages/client/src/features/publishing/styles.ts b/packages/client/src/features/publishing/publishing.styles.ts similarity index 99% rename from packages/client/src/features/publishing/styles.ts rename to packages/client/src/features/publishing/publishing.styles.ts index 9da061721d..809c963585 100644 --- a/packages/client/src/features/publishing/styles.ts +++ b/packages/client/src/features/publishing/publishing.styles.ts @@ -1,6 +1,6 @@ import styled from 'styled-components' import { Callout } from '../../components/Callout' -import { PageContainer, pagePadding } from '../../components/Page/styles' +import { PageContainer, pagePadding } from '../../components/Page/page.styles' export const StyledPageContainer = styled(PageContainer)` ${pagePadding} diff --git a/packages/client/src/features/request-access/RequestAccessPage.tsx b/packages/client/src/features/request-access/RequestAccessPage.tsx index ab47ac998b..5db464a3ad 100644 --- a/packages/client/src/features/request-access/RequestAccessPage.tsx +++ b/packages/client/src/features/request-access/RequestAccessPage.tsx @@ -10,7 +10,7 @@ import * as Yup from 'yup' import { Button } from '../../components/Button' import { Checkbox } from '../../components/Checkbox' import { FieldGroup } from '../../components/form/FieldGroup' -import { CheckboxLabel, InputError } from '../../components/form/styles' +import { CheckboxLabel, InputError } from '../../components/form/form.styles' import { InputText } from '../../components/InputText' import { Loader } from '../../components/Loader' import { PFDALogoDark, PFDALogoLight } from '../../components/NavigationBar/PFDALogo' diff --git a/packages/client/src/features/request-access/style.ts b/packages/client/src/features/request-access/style.ts index 3aed65a4c0..d90becd67e 100644 --- a/packages/client/src/features/request-access/style.ts +++ b/packages/client/src/features/request-access/style.ts @@ -1,6 +1,6 @@ import styled, { css } from 'styled-components' import { Callout } from '../../components/Callout' -import { PageContainer } from '../../components/Page/styles' +import { PageContainer } from '../../components/Page/page.styles' export const LogoBar = styled.div` display: flex; diff --git a/packages/client/src/features/resources/CreateResource.tsx b/packages/client/src/features/resources/CreateResource.tsx index 0389bb994b..a60c098acd 100644 --- a/packages/client/src/features/resources/CreateResource.tsx +++ b/packages/client/src/features/resources/CreateResource.tsx @@ -3,7 +3,7 @@ import styled from 'styled-components' import { Button } from '../../components/Button' import { Loader } from '../../components/Loader' import { ModalHeaderTop, ModalNext } from '../modal/ModalNext' -import { Footer, ModalScroll } from '../modal/styles' +import { Footer, ModalScroll } from '../modal/modal.styles' import { useModal } from '../modal/useModal' import { Item, useUploadResource } from './useUploadResource' diff --git a/packages/client/src/features/resources/ResourceItem.tsx b/packages/client/src/features/resources/ResourceItem.tsx index ee7fe26167..d73b201190 100644 --- a/packages/client/src/features/resources/ResourceItem.tsx +++ b/packages/client/src/features/resources/ResourceItem.tsx @@ -1,7 +1,7 @@ import React from 'react' import { FileIcon } from '../../components/icons/FileIcon' import { Resource } from '../data-portals/resources/resources.types' -import { FileThumbSmall, ImageContainer, ItemName, StyledResourceItem } from './styles' +import { FileThumbSmall, ImageContainer, ItemName, StyledResourceItem } from './resources.styles' import { getExt, isImageFromExt } from './util' diff --git a/packages/client/src/features/resources/styles.ts b/packages/client/src/features/resources/resources.styles.ts similarity index 100% rename from packages/client/src/features/resources/styles.ts rename to packages/client/src/features/resources/resources.styles.ts diff --git a/packages/client/src/features/resources/useDataPortalResourceModal.tsx b/packages/client/src/features/resources/useDataPortalResourceModal.tsx index 9ab436a5a5..a6c4ad7609 100644 --- a/packages/client/src/features/resources/useDataPortalResourceModal.tsx +++ b/packages/client/src/features/resources/useDataPortalResourceModal.tsx @@ -5,7 +5,7 @@ import { Button } from '../../components/Button' import { InputText } from '../../components/InputText' import { Loader } from '../../components/Loader' import { NotAllowedPage } from '../../components/NotAllowed' -import { NoContent } from '../../components/Public/styles' +import { NoContent } from '../../components/Public/public-layout.styles' import { CopyIcon } from '../../components/icons/CopyIcon' import { FileIcon } from '../../components/icons/FileIcon' import { useAuthUser } from '../auth/useAuthUser' @@ -15,7 +15,7 @@ import { RemovePayload, Resource } from '../data-portals/resources/resources.typ import { canEditResources } from '../data-portals/utils' import { NOTIFICATION_ACTION } from '../home/types' import { ModalHeaderTop, ModalNext } from '../modal/ModalNext' -import { ModalLoaderWrapper } from '../modal/styles' +import { ModalLoaderWrapper } from '../modal/modal.styles' import { useModal } from '../modal/useModal' import { CreateResource } from './CreateResource' import ResourceItem from './ResourceItem' @@ -37,7 +37,7 @@ import { StyledSide, TopCol, TopRow, -} from './styles' +} from './resources.styles' import { getExt, isImageFromExt } from './util' import { useLastWSNotification } from '../../hooks/useLastWSNotification' import { toastSuccess } from '../../components/NotificationCenter/ToastHelper' diff --git a/packages/client/src/features/resources/useUploadResource.tsx b/packages/client/src/features/resources/useUploadResource.tsx index d92ac4a574..0e6f27020e 100644 --- a/packages/client/src/features/resources/useUploadResource.tsx +++ b/packages/client/src/features/resources/useUploadResource.tsx @@ -5,7 +5,7 @@ import { processFile } from './uploadImage' import { useCreateResourceMutation } from './useCreateResourceMutation' import { getExt, isImageFromExt } from './util' import { FileIcon } from '../../components/icons/FileIcon' -import { FileThumb } from './styles' +import { FileThumb } from './resources.styles' import { FileWithPreview } from './resources.types' import { Button } from '../../components/Button' import { toastError, toastSuccess } from '../../components/NotificationCenter/ToastHelper' diff --git a/packages/client/src/features/space-groups/form/SpaceGroupForm.tsx b/packages/client/src/features/space-groups/form/SpaceGroupForm.tsx index 3c2c6de34a..cdc8f943ae 100644 --- a/packages/client/src/features/space-groups/form/SpaceGroupForm.tsx +++ b/packages/client/src/features/space-groups/form/SpaceGroupForm.tsx @@ -5,11 +5,11 @@ import React, { useEffect } from 'react' import { useForm } from 'react-hook-form' import { Button } from '../../../components/Button' import { FieldGroup } from '../../../components/form/FieldGroup' -import { InputError } from '../../../components/form/styles' +import { InputError } from '../../../components/form/form.styles' import { InputText, InputTextArea } from '../../../components/InputText' import { Loader } from '../../../components/Loader' import { ApiErrorResponse } from '../../home/types' -import { Footer, StyledForm, StyledModalScroll } from '../../modal/styles' +import { Footer, StyledForm, StyledModalScroll } from '../../modal/modal.styles' import { SpaceGroupFormData } from '../types' import { spaceGroupValidationSchema } from './helpers' diff --git a/packages/client/src/features/space-groups/modals/useDeleteSpaceGroupModal.tsx b/packages/client/src/features/space-groups/modals/useDeleteSpaceGroupModal.tsx index a1f13ced70..92f451d9aa 100644 --- a/packages/client/src/features/space-groups/modals/useDeleteSpaceGroupModal.tsx +++ b/packages/client/src/features/space-groups/modals/useDeleteSpaceGroupModal.tsx @@ -7,7 +7,7 @@ import { Button } from '../../../components/Button' import { InfoCircleIcon } from '../../../components/icons/InfoCircleIcon' import { Loader } from '../../../components/Loader' import { ModalHeaderTop, ModalNext } from '../../modal/ModalNext' -import { ButtonRow, Footer } from '../../modal/styles' +import { ButtonRow, Footer } from '../../modal/modal.styles' import { useModal } from '../../modal/useModal' import { deleteSpaceGroupRequest } from '../api' import { ISpaceGroup } from '../types' diff --git a/packages/client/src/features/space-reports/SpaceReportList.tsx b/packages/client/src/features/space-reports/SpaceReportList.tsx index f3b2e60679..7997d7f89a 100644 --- a/packages/client/src/features/space-reports/SpaceReportList.tsx +++ b/packages/client/src/features/space-reports/SpaceReportList.tsx @@ -5,7 +5,7 @@ import { Button } from '@/components/Button' import { SpaceReportIcon } from '@/components/icons/SpaceReportIcon' import { ActionsMenu } from '@/components/Menu' import { ContentFooter } from '@/components/Page/ContentFooter' -import { StyledPageTable } from '@/components/Table/components/styles' +import { StyledPageTable } from '@/components/Table/components/table.styles' import { useLastWSNotification } from '@/hooks/useLastWSNotification' import { getSelectedObjectsFromIndexes } from '@/utils/object' import Table from '../../components/Table' diff --git a/packages/client/src/features/space-reports/useDeleteSpaceReportModal.tsx b/packages/client/src/features/space-reports/useDeleteSpaceReportModal.tsx index 0ebfcf40c2..ad7447035c 100644 --- a/packages/client/src/features/space-reports/useDeleteSpaceReportModal.tsx +++ b/packages/client/src/features/space-reports/useDeleteSpaceReportModal.tsx @@ -7,7 +7,7 @@ import { toastError, toastSuccess } from '@/components/NotificationCenter/ToastH import { StyledTable, StyledTD } from '@/components/ResourceTable' import { formatDate, itemsCountString } from '@/utils/formatting' import { ModalHeaderTop, ModalNext } from '../modal/ModalNext' -import { ButtonRow, Footer, ModalScroll } from '../modal/styles' +import { ButtonRow, Footer, ModalScroll } from '../modal/modal.styles' import { useModal } from '../modal/useModal' import { ISpaceReport } from './space-report.types' import { deleteReports } from './space-reports.api' diff --git a/packages/client/src/features/space-reports/useGenerateSpaceReportModal.tsx b/packages/client/src/features/space-reports/useGenerateSpaceReportModal.tsx index 7baea320b4..a29c9b9688 100644 --- a/packages/client/src/features/space-reports/useGenerateSpaceReportModal.tsx +++ b/packages/client/src/features/space-reports/useGenerateSpaceReportModal.tsx @@ -4,12 +4,12 @@ import { AxiosError } from 'axios' import styled from 'styled-components' import { Button } from '@/components/Button' import { Checkbox } from '@/components/CheckboxNext' -import { FieldGroup, FieldLabelRow } from '@/components/form/styles' +import { FieldGroup, FieldLabelRow } from '@/components/form/form.styles' import { Loader } from '@/components/Loader' import { toastError } from '@/components/NotificationCenter/ToastHelper' import { Radio } from '@/components/Radio' import { ModalHeaderTop, ModalNext } from '../modal/ModalNext' -import { ButtonRow, Footer, ModalScroll, StyledForm } from '../modal/styles' +import { ButtonRow, Footer, ModalScroll, StyledForm } from '../modal/modal.styles' import { useModal } from '../modal/useModal' import { SpaceReportFormat, SpaceReportFormatToOptionsMap } from './space-report.types' import { createReport } from './space-reports.api' diff --git a/packages/client/src/features/spaces/SpaceSelectionList.tsx b/packages/client/src/features/spaces/SpaceSelectionList.tsx index 46bd19f7e0..2e4a8ff26e 100644 --- a/packages/client/src/features/spaces/SpaceSelectionList.tsx +++ b/packages/client/src/features/spaces/SpaceSelectionList.tsx @@ -1,8 +1,8 @@ import { useQuery } from '@tanstack/react-query' import type React from 'react' import { HomeIcon } from '@/components/icons/HomeIcon' -import { FdaRestrictedIcon } from './FdaRestrictedIcon' -import { ProtectedIcon } from './ProtectedIcon' +import { FdaRestrictedIcon } from '@/components/icons/FdaRestrictedIcon' +import { ProtectedIcon } from '@/components/icons/ProtectedIcon' import { type EditableSpace, fetchEditableSpacesList } from './spaces.api' import styles from './spaces.module.css' import { findSpaceTypeIcon } from './useSpacesColumns' diff --git a/packages/client/src/features/spaces/form/CreateSpace.tsx b/packages/client/src/features/spaces/form/CreateSpace.tsx index 993812652e..5f8419e1ba 100644 --- a/packages/client/src/features/spaces/form/CreateSpace.tsx +++ b/packages/client/src/features/spaces/form/CreateSpace.tsx @@ -2,10 +2,10 @@ import { useMutation, useQueryClient } from '@tanstack/react-query' import React from 'react' import { useNavigate } from 'react-router' import { AxiosError } from 'axios' -import { PageTitle } from '../../../components/Page/styles' +import { PageTitle } from '../../../components/Page/page.styles' import { createSpaceRequest, spaceRequest } from '../spaces.api' import { SpaceForm } from './CreateSpaceForm' -import { StyledBack, StyledPageCenter, StyledPageContent } from './styles' +import { StyledBack, StyledPageCenter, StyledPageContent } from './spaces-form.styles' import { UserLayout } from '../../../layouts/UserLayout' import { ApiErrorResponse } from '../../home/types' import { toastError, toastSuccess } from '../../../components/NotificationCenter/ToastHelper' diff --git a/packages/client/src/features/spaces/form/CreateSpaceForm.tsx b/packages/client/src/features/spaces/form/CreateSpaceForm.tsx index b2312d5ae9..204ab6698a 100644 --- a/packages/client/src/features/spaces/form/CreateSpaceForm.tsx +++ b/packages/client/src/features/spaces/form/CreateSpaceForm.tsx @@ -7,14 +7,14 @@ import { Button } from '../../../components/Button' import { Checkbox } from '../../../components/Checkbox' import { FieldGroup } from '../../../components/form/FieldGroup' import { RadioButtonGroup } from '../../../components/form/RadioButtonGroup' -import { Divider, FieldLabelRow, InputError } from '../../../components/form/styles' +import { Divider, FieldLabelRow, InputError } from '../../../components/form/form.styles' import { InputText } from '../../../components/InputText' import { Loader } from '../../../components/Loader' import { useAuthUser } from '../../auth/useAuthUser' import { useConfirm } from '../../modal/useConfirm' import { CreateSpacePayload, CreateSpaceResponse } from '../spaces.api' import { getSpaceTypeOptions, SPACE_TYPE_HINT, validationSchema } from './helpers' -import { HintText, Row, StyledForm } from './styles' +import { HintText, Row, StyledForm } from './spaces-form.styles' export interface ISpaceForm { mutation: UseMutationResult diff --git a/packages/client/src/features/spaces/form/SpaceSettings.tsx b/packages/client/src/features/spaces/form/SpaceSettings.tsx index 0b2ae927d0..b93e6fde84 100644 --- a/packages/client/src/features/spaces/form/SpaceSettings.tsx +++ b/packages/client/src/features/spaces/form/SpaceSettings.tsx @@ -5,11 +5,11 @@ import { useForm } from 'react-hook-form' import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { useNavigate, useParams } from 'react-router' import { FieldGroup } from '../../../components/form/FieldGroup' -import { Divider, InputError } from '../../../components/form/styles' +import { Divider, InputError } from '../../../components/form/form.styles' import { InputText } from '../../../components/InputText' import { Loader } from '../../../components/Loader' import { BackLinkMargin } from '../../../components/Page/PageBackLink' -import { PageTitle } from '../../../components/Page/styles' +import { PageTitle } from '../../../components/Page/page.styles' import { StyledTagItem, StyledTags } from '../../../components/Tags' import { useEditTagsModal } from '../../actionModals/useEditTagsModal' import { SpaceTypeName } from '../common' @@ -17,7 +17,7 @@ import { EditSpacePayload, editSpaceRequest, spaceRequest } from '../spaces.api' import { ISpace } from '../spaces.types' import { useSpaceActions } from '../useSpaceActions' import { editValidationSchema } from './helpers' -import { HintText, Row, StyledButton, StyledForm, StyledPageCenter, StyledPageContent } from './styles' +import { HintText, Row, StyledButton, StyledForm, StyledPageCenter, StyledPageContent } from './spaces-form.styles' import { UserLayout } from '../../../layouts/UserLayout' import { Button } from '../../../components/Button' import { toastError, toastSuccess } from '../../../components/NotificationCenter/ToastHelper' diff --git a/packages/client/src/features/spaces/form/styles.ts b/packages/client/src/features/spaces/form/spaces-form.styles.ts similarity index 100% rename from packages/client/src/features/spaces/form/styles.ts rename to packages/client/src/features/spaces/form/spaces-form.styles.ts diff --git a/packages/client/src/features/spaces/members/MemberEditButton.tsx b/packages/client/src/features/spaces/members/MemberEditButton.tsx index d44b5f1923..408b5b083c 100644 --- a/packages/client/src/features/spaces/members/MemberEditButton.tsx +++ b/packages/client/src/features/spaces/members/MemberEditButton.tsx @@ -1,7 +1,7 @@ import React from 'react' import { ThreeDotsIcon } from '../../../components/icons/ThreeDotsIcon' import Menu from '../../../components/Menu/Menu' -import { StyledEditButton } from '../../discussions/styles' +import { StyledEditButton } from '../../discussions/discussions.styles' import { SpaceMembership } from './members.types' import { useChangeMemberRoleModal } from './useChangeMemberRoleModal' diff --git a/packages/client/src/features/spaces/members/MembersListTable.tsx b/packages/client/src/features/spaces/members/MembersListTable.tsx index 8b3cc09de7..40bd6384b0 100644 --- a/packages/client/src/features/spaces/members/MembersListTable.tsx +++ b/packages/client/src/features/spaces/members/MembersListTable.tsx @@ -7,7 +7,7 @@ import { } from '@tanstack/react-table' import React from 'react' import Table from '../../../components/Table' -import { StyledPageTable } from '../../../components/Table/components/styles' +import { StyledPageTable } from '../../../components/Table/components/table.styles' import { SpaceMembership } from './members.types' import { ISpace } from '../spaces.types' import { useMembersColumns } from './useMembersColumns' diff --git a/packages/client/src/features/spaces/members/members.styles.ts b/packages/client/src/features/spaces/members/members.styles.ts index d530d61e77..43866d273a 100644 --- a/packages/client/src/features/spaces/members/members.styles.ts +++ b/packages/client/src/features/spaces/members/members.styles.ts @@ -1,5 +1,5 @@ import styled, { css } from 'styled-components' -import { Footer } from '../../modal/styles' +import { Footer } from '../../modal/modal.styles' export const StyledFields = styled.div` display: flex; diff --git a/packages/client/src/features/spaces/members/useAddMembersModal.tsx b/packages/client/src/features/spaces/members/useAddMembersModal.tsx index 3c5a763552..52a19f0c8b 100644 --- a/packages/client/src/features/spaces/members/useAddMembersModal.tsx +++ b/packages/client/src/features/spaces/members/useAddMembersModal.tsx @@ -8,12 +8,12 @@ import * as Yup from 'yup' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' import { cn } from '@/utils/cn' import { Button } from '../../../components/Button' -import { FieldGroup, Hint, InputError } from '../../../components/form/styles' +import { FieldGroup, Hint, InputError } from '../../../components/form/form.styles' import { InputText } from '../../../components/InputText' import { toastError, toastSuccess } from '../../../components/NotificationCenter/ToastHelper' import type { ApiRailsError } from '../../home/types' import { ModalHeaderTop, ModalNext, useModalFloatingPortalHost } from '../../modal/ModalNext' -import { ButtonRow } from '../../modal/styles' +import { ButtonRow } from '../../modal/modal.styles' import { useModal } from '../../modal/useModal' import { addMembersToSpaceRequest } from './members.api' import { StyledFields, StyledFooter } from './members.styles' diff --git a/packages/client/src/features/spaces/members/useBulkChangeMemberRolesModal.tsx b/packages/client/src/features/spaces/members/useBulkChangeMemberRolesModal.tsx index ac8b00f67f..0fc91db3f1 100644 --- a/packages/client/src/features/spaces/members/useBulkChangeMemberRolesModal.tsx +++ b/packages/client/src/features/spaces/members/useBulkChangeMemberRolesModal.tsx @@ -7,7 +7,7 @@ import * as Yup from 'yup' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' import { cn } from '@/utils/cn' import { Button } from '../../../components/Button' -import { ErrorHint, FieldGroup, Hint, InputError } from '../../../components/form/styles' +import { ErrorHint, FieldGroup, Hint, InputError } from '../../../components/form/form.styles' import { ModalHeaderTop, ModalNext, useModalFloatingPortalHost } from '../../modal/ModalNext' import { useModal } from '../../modal/useModal' import { diff --git a/packages/client/src/features/spaces/members/useChangeMemberRoleModal.tsx b/packages/client/src/features/spaces/members/useChangeMemberRoleModal.tsx index f0d38fb9a2..63117735f5 100644 --- a/packages/client/src/features/spaces/members/useChangeMemberRoleModal.tsx +++ b/packages/client/src/features/spaces/members/useChangeMemberRoleModal.tsx @@ -7,7 +7,7 @@ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@ import { cn } from '@/utils/cn' import { Button } from '../../../components/Button' import { Callout } from '../../../components/Callout' -import { ErrorHint, FieldGroup, Hint, InputError } from '../../../components/form/styles' +import { ErrorHint, FieldGroup, Hint, InputError } from '../../../components/form/form.styles' import { InputText } from '../../../components/InputText' import { ModalHeaderTop, ModalNext, useModalFloatingPortalHost } from '../../modal/ModalNext' import { useModal } from '../../modal/useModal' diff --git a/packages/client/src/features/spaces/modals/ModalSpaceList.tsx b/packages/client/src/features/spaces/modals/ModalSpaceList.tsx index 0b657b6594..bd3ab410f5 100644 --- a/packages/client/src/features/spaces/modals/ModalSpaceList.tsx +++ b/packages/client/src/features/spaces/modals/ModalSpaceList.tsx @@ -1,7 +1,7 @@ import React from 'react' import { Link } from 'react-router' import styled from 'styled-components' -import { VerticalCenter } from '../../../components/Page/styles' +import { VerticalCenter } from '../../../components/Page/page.styles' import { ISpaceV2 } from '../spaces.types' import { findSpaceTypeIcon } from '../useSpacesColumns' diff --git a/packages/client/src/features/spaces/modals/useAddSpacesToSpaceGroupModal.tsx b/packages/client/src/features/spaces/modals/useAddSpacesToSpaceGroupModal.tsx index b03686049d..ca121ea3f1 100644 --- a/packages/client/src/features/spaces/modals/useAddSpacesToSpaceGroupModal.tsx +++ b/packages/client/src/features/spaces/modals/useAddSpacesToSpaceGroupModal.tsx @@ -8,7 +8,7 @@ import { Callout } from '../../../components/Callout' import { Loader } from '../../../components/Loader' import { itemsCountString } from '../../../utils/formatting' import { ModalHeaderTop, ModalNext } from '../../modal/ModalNext' -import { ButtonRow, Footer, ModalScrollPadding } from '../../modal/styles' +import { ButtonRow, Footer, ModalScrollPadding } from '../../modal/modal.styles' import { useModal } from '../../modal/useModal' import { addSpacesToSpaceGroup } from '../../space-groups/api' import { ISpaceV2 } from '../spaces.types' diff --git a/packages/client/src/features/spaces/modals/useRemoveSpacesFromSpaceGroupModal.tsx b/packages/client/src/features/spaces/modals/useRemoveSpacesFromSpaceGroupModal.tsx index 661126cd7b..bd9d59e9b9 100644 --- a/packages/client/src/features/spaces/modals/useRemoveSpacesFromSpaceGroupModal.tsx +++ b/packages/client/src/features/spaces/modals/useRemoveSpacesFromSpaceGroupModal.tsx @@ -5,7 +5,7 @@ import { Button } from '../../../components/Button' import { Loader } from '../../../components/Loader' import { itemsCountString } from '../../../utils/formatting' import { ModalHeaderTop, ModalNext } from '../../modal/ModalNext' -import { ButtonRow, Footer, ModalScrollPadding } from '../../modal/styles' +import { ButtonRow, Footer, ModalScrollPadding } from '../../modal/modal.styles' import { useModal } from '../../modal/useModal' import { removeSpaces } from '../../space-groups/api' import { ISpaceGroup } from '../../space-groups/types' diff --git a/packages/client/src/features/spaces/show/SpaceActivation.tsx b/packages/client/src/features/spaces/show/SpaceActivation.tsx index 35ad800859..d2de0149a9 100644 --- a/packages/client/src/features/spaces/show/SpaceActivation.tsx +++ b/packages/client/src/features/spaces/show/SpaceActivation.tsx @@ -2,13 +2,13 @@ import React from 'react' import { useMutation, useQueryClient } from '@tanstack/react-query' import styled from 'styled-components' import { Loader } from '../../../components/Loader' -import { PageContainer } from '../../../components/Page/styles' +import { PageContainer } from '../../../components/Page/page.styles' import { useAuthUser } from '../../auth/useAuthUser' import { acceptSpaceRequest } from '../spaces.api' import { ISpace } from '../spaces.types' -import { SpaceHeaderDescrip, SpaceHeaderTitle, SpaceMainInfo } from './styles' -import { ProtectedIcon } from '../ProtectedIcon' -import { FdaRestrictedIcon } from '../FdaRestrictedIcon' +import { SpaceHeaderDescrip, SpaceHeaderTitle, SpaceMainInfo } from './spaces-show.styles' +import { ProtectedIcon } from '@/components/icons/ProtectedIcon' +import { FdaRestrictedIcon } from '@/components/icons/FdaRestrictedIcon' import { Button } from '../../../components/Button' import { ApiErrorResponse } from '../../home/types' import { toastError, toastSuccess } from '../../../components/NotificationCenter/ToastHelper' diff --git a/packages/client/src/features/spaces/show/SpaceLocked.tsx b/packages/client/src/features/spaces/show/SpaceLocked.tsx index b5009ac624..3ddd282f09 100644 --- a/packages/client/src/features/spaces/show/SpaceLocked.tsx +++ b/packages/client/src/features/spaces/show/SpaceLocked.tsx @@ -2,9 +2,9 @@ import React from 'react' import { useNavigate } from 'react-router' import styled from 'styled-components' import { AlertText, Col, Warning } from '../../../components/NotAllowed' -import { PageContainer } from '../../../components/Page/styles' +import { PageContainer } from '../../../components/Page/page.styles' import { ISpace } from '../spaces.types' -import { ActionButton } from './styles' +import { ActionButton } from './spaces-show.styles' export const ButtonWrapper = styled.div` diff --git a/packages/client/src/features/spaces/show/SpaceNotAllowed.tsx b/packages/client/src/features/spaces/show/SpaceNotAllowed.tsx index 36090ce516..a01ff993a1 100644 --- a/packages/client/src/features/spaces/show/SpaceNotAllowed.tsx +++ b/packages/client/src/features/spaces/show/SpaceNotAllowed.tsx @@ -1,6 +1,6 @@ import React from 'react' import { ActionText, AlertText, Col, Warning } from '../../../components/NotAllowed' -import { PageContainer } from '../../../components/Page/styles' +import { PageContainer } from '../../../components/Page/page.styles' export function SpaceNotAllowed() { return ( diff --git a/packages/client/src/features/spaces/show/SpaceShowLayout.tsx b/packages/client/src/features/spaces/show/SpaceShowLayout.tsx index 8c02d4927f..fa52c1e35a 100644 --- a/packages/client/src/features/spaces/show/SpaceShowLayout.tsx +++ b/packages/client/src/features/spaces/show/SpaceShowLayout.tsx @@ -18,8 +18,8 @@ import { ErrorBoundary } from '@/utils/ErrorBoundary' import { Expand, Fill, Main, MenuItem, MenuText, Row, StyledMenu } from '../../home/home.styles' import type { ApiErrorResponse } from '../../home/types' import { useActiveResourceFromUrl } from '../../home/useActiveResourceFromUrl' -import { FdaRestrictedIcon } from '../FdaRestrictedIcon' -import { ProtectedIcon } from '../ProtectedIcon' +import { FdaRestrictedIcon } from '@/components/icons/FdaRestrictedIcon' +import { ProtectedIcon } from '@/components/icons/ProtectedIcon' import { fixGuestPermissions } from '../spaces.api' import { useSpaceActions } from '../useSpaceActions' import { SpaceTypeTabs } from './SpaceTypeTabs' @@ -34,7 +34,7 @@ import { SpaceMainInfo, SpaceTopRight, TopSpaceHeader, -} from './styles' +} from './spaces-show.styles' export const SpaceShowLayout = () => { const context = useOutletContext() diff --git a/packages/client/src/features/spaces/show/SpaceTypeTabs.tsx b/packages/client/src/features/spaces/show/SpaceTypeTabs.tsx index f6de682bd2..b0e92c51f4 100644 --- a/packages/client/src/features/spaces/show/SpaceTypeTabs.tsx +++ b/packages/client/src/features/spaces/show/SpaceTypeTabs.tsx @@ -1,7 +1,7 @@ import React from 'react' import { Link } from 'react-router' import { ISpace } from '../spaces.types' -import { Tab, Tabs } from './styles' +import { Tab, Tabs } from './spaces-show.styles' import { ResourceTypeUrlNames } from '../../home/types' const privateTextShort = 'Only you can view and edit resources.' diff --git a/packages/client/src/features/spaces/show/styles.ts b/packages/client/src/features/spaces/show/spaces-show.styles.ts similarity index 100% rename from packages/client/src/features/spaces/show/styles.ts rename to packages/client/src/features/spaces/show/spaces-show.styles.ts diff --git a/packages/client/src/features/spaces/useSpacesColumns.tsx b/packages/client/src/features/spaces/useSpacesColumns.tsx index bcd255f4ad..9ff9b047c6 100644 --- a/packages/client/src/features/spaces/useSpacesColumns.tsx +++ b/packages/client/src/features/spaces/useSpacesColumns.tsx @@ -13,8 +13,8 @@ import { StyledTagItem, StyledTags } from '@/components/Tags' import { formatDateOnly } from '@/utils/formatting' import SelectFilter, { selectFilterFn } from '../../components/Table/components/SelectFilter' import { SpaceTypeName } from './common' -import { FdaRestrictedIcon } from './FdaRestrictedIcon' -import { ProtectedIcon } from './ProtectedIcon' +import { FdaRestrictedIcon } from '@/components/icons/FdaRestrictedIcon' +import { ProtectedIcon } from '@/components/icons/ProtectedIcon' import type { ISpaceV2 } from './spaces.types' import { useSpaceHiddenMutation } from './useSpaceHiddenMutation' diff --git a/packages/client/src/features/spaces/useUnlockSpaceModal.tsx b/packages/client/src/features/spaces/useUnlockSpaceModal.tsx index 634599bc4f..d352802f2c 100644 --- a/packages/client/src/features/spaces/useUnlockSpaceModal.tsx +++ b/packages/client/src/features/spaces/useUnlockSpaceModal.tsx @@ -3,7 +3,7 @@ import React from 'react' import { styled } from 'styled-components' import { Button } from '../../components/Button' import { ModalHeaderTop, ModalNext } from '../modal/ModalNext' -import { Footer } from '../modal/styles' +import { Footer } from '../modal/modal.styles' import { useModal } from '../modal/useModal' import { unlockSpaceRequest } from './spaces.api' import { ISpace } from './spaces.types' diff --git a/packages/client/src/features/tracks/TrackProvenanceContent.tsx b/packages/client/src/features/tracks/TrackProvenanceContent.tsx index 67192bcff9..30c8babf68 100644 --- a/packages/client/src/features/tracks/TrackProvenanceContent.tsx +++ b/packages/client/src/features/tracks/TrackProvenanceContent.tsx @@ -7,7 +7,7 @@ import { DatabaseIcon } from '../../components/icons/DatabaseIcon' import { FileIcon } from '../../components/icons/FileIcon' import { SitemapIcon } from '../../components/icons/SitemapIcon' import { StickyNoteIcon } from '../../components/icons/StickyNote' -import { Help } from '../apps/form/styles' +import { Help } from '../apps/form/apps-form.styles' import { NotFound } from '../home/show.styles' export type EntityType = 'file' | 'app' | 'execution' | 'database' | 'comparison' | 'note' diff --git a/packages/client/src/features/workflows/WorkflowExecutionsList.tsx b/packages/client/src/features/workflows/WorkflowExecutionsList.tsx index 2554016f24..61f254b58c 100644 --- a/packages/client/src/features/workflows/WorkflowExecutionsList.tsx +++ b/packages/client/src/features/workflows/WorkflowExecutionsList.tsx @@ -10,7 +10,7 @@ import type { import { useEffect, useState } from 'react' import { ContentFooter } from '@/components/Page/ContentFooter' import { hidePagination, Pagination } from '@/components/Pagination' -import { StyledPageTable } from '@/components/Table/components/styles' +import { StyledPageTable } from '@/components/Table/components/table.styles' import { useColumnWidthLocalStorage } from '@/hooks/useColumnWidthLocalStorage' import { useHiddenColumnLocalStorage } from '@/hooks/useHiddenColumnLocalStorage' import { useLastWSNotification } from '@/hooks/useLastWSNotification' diff --git a/packages/client/src/features/workflows/WorkflowList.tsx b/packages/client/src/features/workflows/WorkflowList.tsx index 8140331d8f..04c1ccf767 100644 --- a/packages/client/src/features/workflows/WorkflowList.tsx +++ b/packages/client/src/features/workflows/WorkflowList.tsx @@ -11,7 +11,7 @@ import { PlusIcon } from '@/components/icons/PlusIcon' import { ActionsMenu } from '@/components/Menu' import { ContentFooter } from '@/components/Page/ContentFooter' import { Pagination } from '@/components/Pagination' -import { StyledPageTable } from '@/components/Table/components/styles' +import { StyledPageTable } from '@/components/Table/components/table.styles' import { ErrorBoundary } from '@/utils/ErrorBoundary' import { getSelectedObjectsFromIndexes, toArrayFromObject } from '@/utils/object' import Table from '../../components/Table' diff --git a/packages/client/src/features/workflows/WorkflowSpec/WorkflowSpec.tsx b/packages/client/src/features/workflows/WorkflowSpec/WorkflowSpec.tsx index 88c4adfd7b..4d51f7c7fe 100644 --- a/packages/client/src/features/workflows/WorkflowSpec/WorkflowSpec.tsx +++ b/packages/client/src/features/workflows/WorkflowSpec/WorkflowSpec.tsx @@ -1,6 +1,6 @@ import React from 'react' import { COMPUTE_RESOURCE_LABELS } from '@/types/user' -import { StyledSpecTab } from '../../apps/SpecTab/styles' +import { StyledSpecTab } from '../../apps/SpecTab/apps-spec-tab.styles' import { MetadataKey, MetadataVal } from '../../home/show.styles' import { Spec, Stage } from '../workflows.types' import { WorkflowSpecTable } from './WorkflowSpecTable' diff --git a/packages/client/src/features/workflows/WorkflowsDiagram/index.tsx b/packages/client/src/features/workflows/WorkflowsDiagram/index.tsx index 08b3fd88ce..83ffc7601d 100644 --- a/packages/client/src/features/workflows/WorkflowsDiagram/index.tsx +++ b/packages/client/src/features/workflows/WorkflowsDiagram/index.tsx @@ -4,7 +4,7 @@ import Xarrow from 'react-xarrows' import { CubeIcon } from '../../../components/icons/CubeIcon' import { Loader } from '../../../components/Loader' import type { InputOutput, Stage as WorkflowStage } from '../workflows.types' -import { StyledWorkflowDiagram } from './styles' +import { StyledWorkflowDiagram } from './workflows-diagram.styles' import { useWorkflowDiagramQuery } from './useWorkflowDiagramQuery' const NoData = () => { diff --git a/packages/client/src/features/workflows/WorkflowsDiagram/styles.ts b/packages/client/src/features/workflows/WorkflowsDiagram/workflows-diagram.styles.ts similarity index 100% rename from packages/client/src/features/workflows/WorkflowsDiagram/styles.ts rename to packages/client/src/features/workflows/WorkflowsDiagram/workflows-diagram.styles.ts diff --git a/packages/client/src/features/workflows/run/RunWorkflowForm.tsx b/packages/client/src/features/workflows/run/RunWorkflowForm.tsx index f03a55b1f0..bf5741415f 100644 --- a/packages/client/src/features/workflows/run/RunWorkflowForm.tsx +++ b/packages/client/src/features/workflows/run/RunWorkflowForm.tsx @@ -17,7 +17,7 @@ import { CubeIcon } from '@/components/icons/CubeIcon' import { GearIcon } from '@/components/icons/GearIcon' import { toastError } from '@/components/NotificationCenter/ToastHelper' import { BackLink } from '@/components/Page/PageBackLink' -import { FormPageContainer } from '@/components/Page/styles' +import { FormPageContainer } from '@/components/Page/page.styles' import type { IUser } from '@/types/user' import { getSpaceIdFromScope } from '@/utils' import type { AcceptedLicense, IApp, InputSpec, SelectType } from '../../apps/apps.types' @@ -25,7 +25,7 @@ import { getDefaultValueFromServer } from '../../apps/form/common' import { ErrorMessageForField } from '../../apps/run/ErrorMessageForField' import { JobRunInput } from '../../apps/run/JobRunInput' import { SelectSpaceScope } from '../../apps/run/SelectSpaceScope' -import { Section, SectionBody, SectionHeader, StyledGrid, Topbox, TopboxItem } from '../../apps/run/styles' +import { Section, SectionBody, SectionHeader, StyledGrid, Topbox, TopboxItem } from '../../apps/run/apps-run.styles' import { extractFileUids, getValue, useDefaultScopeSelection, useSelectableSpaces } from '../../apps/run/utils' import { useAuthUser } from '../../auth/useAuthUser' import type { FileUid } from '../../files/files.types' @@ -42,7 +42,7 @@ import { runWorkflow, } from '../workflows.api' import type { App, InputOutput, IWorkflow, Stage, WorkflowMeta } from '../workflows.types' -import { StyledAnalysisName, StyledStageHeader, WorkflowConfiguration } from './styles' +import { StyledAnalysisName, StyledStageHeader, WorkflowConfiguration } from './workflows-run.styles' export interface RunWorkflowFormType { analysisName: string diff --git a/packages/client/src/features/workflows/run/styles.ts b/packages/client/src/features/workflows/run/workflows-run.styles.ts similarity index 100% rename from packages/client/src/features/workflows/run/styles.ts rename to packages/client/src/features/workflows/run/workflows-run.styles.ts diff --git a/packages/client/src/features/workflows/useCreateWorkflowModal.tsx b/packages/client/src/features/workflows/useCreateWorkflowModal.tsx index f188acbbac..1ad7dc109b 100644 --- a/packages/client/src/features/workflows/useCreateWorkflowModal.tsx +++ b/packages/client/src/features/workflows/useCreateWorkflowModal.tsx @@ -5,7 +5,7 @@ import { Button } from '@/components/Button' import { FieldGroup } from '@/components/form/FieldGroup' import { InputText } from '@/components/InputText' import { ModalHeaderTop, ModalNext } from '../modal/ModalNext' -import { ButtonRow, Footer } from '../modal/styles' +import { ButtonRow, Footer } from '../modal/modal.styles' import { useModal } from '../modal/useModal' import { createWorkflowRequest } from './workflows.api' diff --git a/packages/client/src/hooks/useMutationErrorEffect.ts b/packages/client/src/hooks/useMutationErrorEffect.ts index 05d4dff483..386a1b790f 100644 --- a/packages/client/src/hooks/useMutationErrorEffect.ts +++ b/packages/client/src/hooks/useMutationErrorEffect.ts @@ -1,21 +1,23 @@ import { useEffect } from 'react' -import { FieldValues, Path, UseFormSetError } from 'react-hook-form' -import { MutationErrors } from '../types/utils' +import type { FieldValues, Path, UseFormSetError } from 'react-hook-form' +import type { MutationErrors } from '@/types/utils' -export function formatMutationErrors( - obj?: Record, -): MutationErrors | undefined { +export function formatMutationErrors(obj?: Record): MutationErrors | undefined { const nObj = obj if (nObj) { return { errors: [], - fieldErrors: Object.keys(nObj).length > 0 ? ({ ...nObj }) : {}, + fieldErrors: Object.keys(nObj).length > 0 ? { ...nObj } : {}, } } return undefined } -export const useMutationErrorEffect = (setError: UseFormSetError, mutationErrors?: MutationErrors) => useEffect(() => { +export const useMutationErrorEffect = ( + setError: UseFormSetError, + mutationErrors?: MutationErrors, +) => + useEffect(() => { if (mutationErrors) { Object.keys(mutationErrors.fieldErrors).forEach((e: string) => { setError(e as Path, { message: mutationErrors.fieldErrors[e].join('; '), type: 'onChange' }) diff --git a/packages/client/src/pages/AboutPage/index.tsx b/packages/client/src/pages/AboutPage/index.tsx index 614f913905..da14833429 100644 --- a/packages/client/src/pages/AboutPage/index.tsx +++ b/packages/client/src/pages/AboutPage/index.tsx @@ -1,12 +1,12 @@ import { useState } from 'react' import { Button } from '../../components/Button' import NavigationBar from '../../components/NavigationBar/NavigationBar' -import { PageContainerMargin } from '../../components/Page/styles' +import { PageContainerMargin } from '../../components/Page/page.styles' import { PfTab, PfTabContent, PfTabRow, PfTabTitle } from '../../components/Tabs/PfTab' import { useAuthUser } from '../../features/auth/useAuthUser' import { usePageMeta } from '../../hooks/usePageMeta' import PublicLayout from '../../layouts/PublicLayout' -import { RichText } from '../styles' +import { RichText } from '../pages.styles' //TODO JIRI: TO BE DELETED COMPLETELY diff --git a/packages/client/src/pages/Account/Notifications/index.tsx b/packages/client/src/pages/Account/Notifications/index.tsx index a3b3a42edd..b689fefdb7 100644 --- a/packages/client/src/pages/Account/Notifications/index.tsx +++ b/packages/client/src/pages/Account/Notifications/index.tsx @@ -2,10 +2,10 @@ import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { Controller, type Path, type PathValue, useForm } from 'react-hook-form' import { Button } from '@/components/Button' import { Checkbox } from '@/components/CheckboxNext' -import { FieldLabelRow } from '@/components/form/styles' +import { FieldLabelRow } from '@/components/form/form.styles' import { Loader } from '@/components/Loader' import { toastSuccess } from '@/components/NotificationCenter/ToastHelper' -import { PageActions, PageHeader, PageTitle } from '@/components/Page/styles' +import { PageActions, PageHeader, PageTitle } from '@/components/Page/page.styles' import { usePageMeta } from '@/hooks/usePageMeta' import { fetchNotificationsPreferences, saveNotificationsPreferences } from './api' import { @@ -16,7 +16,7 @@ import { SectionTitleSmall, StyledNotifications, StyledPageContainer, -} from './styles' +} from './notifications.styles' import type { AllNotification, NotificationPreferences } from './types' type NotificationLabelType = Record diff --git a/packages/client/src/pages/Account/Notifications/styles.ts b/packages/client/src/pages/Account/Notifications/notifications.styles.ts similarity index 98% rename from packages/client/src/pages/Account/Notifications/styles.ts rename to packages/client/src/pages/Account/Notifications/notifications.styles.ts index 8220211786..c9a14883b9 100644 --- a/packages/client/src/pages/Account/Notifications/styles.ts +++ b/packages/client/src/pages/Account/Notifications/notifications.styles.ts @@ -1,5 +1,5 @@ import styled from 'styled-components' -import { PageContainer, pagePadding } from '../../../components/Page/styles' +import { PageContainer, pagePadding } from '../../../components/Page/page.styles' export const StyledNotifications = styled.div` display: flex; diff --git a/packages/client/src/pages/NoFoundPage/index.tsx b/packages/client/src/pages/NoFoundPage/index.tsx index 3680a25116..c6fecbbebe 100644 --- a/packages/client/src/pages/NoFoundPage/index.tsx +++ b/packages/client/src/pages/NoFoundPage/index.tsx @@ -1,7 +1,7 @@ import React from 'react' import styled from 'styled-components' import { UserLayout } from '../../layouts/UserLayout' -import { PageContainerMargin } from '../../components/Page/styles' +import { PageContainerMargin } from '../../components/Page/page.styles' const Text = styled.div` text-align: center; diff --git a/packages/client/src/pages/Security/index.tsx b/packages/client/src/pages/Security/index.tsx index 47628809e7..d7373cbdf7 100644 --- a/packages/client/src/pages/Security/index.tsx +++ b/packages/client/src/pages/Security/index.tsx @@ -1,11 +1,11 @@ import React from 'react' import { Link } from 'react-router' import styled from 'styled-components' -import { PageContainerMargin } from '../../components/Page/styles' +import { PageContainerMargin } from '../../components/Page/page.styles' import { useAuthUser } from '../../features/auth/useAuthUser' import NavigationBar from '../../components/NavigationBar/NavigationBar' import PublicLayout from '../../layouts/PublicLayout' -import { RichText } from '../styles' +import { RichText } from '../pages.styles' const StyledRichText = styled(RichText)` padding-top: 32px; diff --git a/packages/client/src/pages/ToS/index.tsx b/packages/client/src/pages/ToS/index.tsx index 7a74c90a75..0592e73a08 100644 --- a/packages/client/src/pages/ToS/index.tsx +++ b/packages/client/src/pages/ToS/index.tsx @@ -1,10 +1,10 @@ import React from 'react' import styled from 'styled-components' -import { PageContainerMargin } from '../../components/Page/styles' +import { PageContainerMargin } from '../../components/Page/page.styles' import { useAuthUser } from '../../features/auth/useAuthUser' import NavigationBar from '../../components/NavigationBar/NavigationBar' import PublicLayout from '../../layouts/PublicLayout' -import { RichText } from '../styles' +import { RichText } from '../pages.styles' const StyledRichText = styled(RichText)` padding-top: 32px; diff --git a/packages/client/src/pages/styles.tsx b/packages/client/src/pages/pages.styles.tsx similarity index 100% rename from packages/client/src/pages/styles.tsx rename to packages/client/src/pages/pages.styles.tsx diff --git a/packages/client/src/routes/account/index.tsx b/packages/client/src/routes/account/index.tsx index 2e1476dccd..b3416948ab 100644 --- a/packages/client/src/routes/account/index.tsx +++ b/packages/client/src/routes/account/index.tsx @@ -1,26 +1,46 @@ +import React from 'react' import { Navigate, Outlet } from 'react-router' import { AccountLayout } from '@/features/account/AccountLayout' -import { AccountSettings } from '@/features/account/AccountSettings' -import { ApiKeys } from '@/features/account/ApiKeys' -import { CloudResources } from '@/features/account/CloudResources' -import { Dashboard } from '@/features/account/Dashboard' -import { Licenses } from '@/features/account/Licenses' -import { ActivityReportsPage } from '@/features/admin/activity-reports/ActivityReportsPage' -import { AlertsPage } from '@/features/admin/alerts/AlertsPage' -import { AdminDashboard } from '@/features/admin/dashboard/Dashboard' -import { InvitationsList } from '@/features/admin/invitations' -import { ProvisioningList } from '@/features/admin/invitations/ProvisioningList' -import AdminMembershipsPage from '@/features/admin/memberships' -import { SpacesList } from '@/features/admin/spaces' -import { AdminUsersLayout } from '@/features/admin/users/AdminUsersLayout' import { useAuthUser } from '@/features/auth/useAuthUser' import { LayoutLoader } from '@/layouts/UserLayout' -import PendingUsersList from '../../features/admin/pendingUsers' -import UsersList from '../../features/admin/users' -import CreateNewsItemPage from '../../features/news/form/CreateNewsItemPage' -import EditNewsItemPage from '../../features/news/form/EditNewsItemPage' -import ListAdminNews from '../../features/news/ListAdminNews' -import NotificationsPage from '../../pages/Account/Notifications' + +const AccountSettings = React.lazy(() => + import('@/features/account/AccountSettings').then(m => ({ default: m.AccountSettings })), +) +const ApiKeys = React.lazy(() => import('@/features/account/ApiKeys').then(m => ({ default: m.ApiKeys }))) +const CloudResources = React.lazy(() => + import('@/features/account/CloudResources').then(m => ({ default: m.CloudResources })), +) +const Dashboard = React.lazy(() => import('@/features/account/Dashboard').then(m => ({ default: m.Dashboard }))) +const Licenses = React.lazy(() => import('@/features/account/Licenses').then(m => ({ default: m.Licenses }))) +const ActivityReportsPage = React.lazy(() => + import('@/features/admin/activity-reports/ActivityReportsPage').then(m => ({ + default: m.ActivityReportsPage, + })), +) +const AlertsPage = React.lazy(() => import('@/features/admin/alerts/AlertsPage').then(m => ({ default: m.AlertsPage }))) +const AdminDashboard = React.lazy(() => + import('@/features/admin/dashboard/Dashboard').then(m => ({ default: m.AdminDashboard })), +) +const InvitationsList = React.lazy(() => + import('@/features/admin/invitations').then(m => ({ default: m.InvitationsList })), +) +const ProvisioningList = React.lazy(() => + import('@/features/admin/invitations/ProvisioningList').then(m => ({ + default: m.ProvisioningList, + })), +) +const AdminMembershipsPage = React.lazy(() => import('@/features/admin/memberships')) +const SpacesList = React.lazy(() => import('@/features/admin/spaces').then(m => ({ default: m.SpacesList }))) +const AdminUsersLayout = React.lazy(() => + import('@/features/admin/users/AdminUsersLayout').then(m => ({ default: m.AdminUsersLayout })), +) +const PendingUsersList = React.lazy(() => import('../../features/admin/pendingUsers')) +const UsersList = React.lazy(() => import('../../features/admin/users')) +const CreateNewsItemPage = React.lazy(() => import('../../features/news/form/CreateNewsItemPage')) +const EditNewsItemPage = React.lazy(() => import('../../features/news/form/EditNewsItemPage')) +const ListAdminNews = React.lazy(() => import('../../features/news/ListAdminNews')) +const NotificationsPage = React.lazy(() => import('../../pages/Account/Notifications')) const AdminRouteGuard = () => { const { user, loading } = useAuthUser(true) @@ -41,36 +61,36 @@ const accountRoutes = [ element: , children: [ { index: true, element: }, - { path: 'dashboard', element: }, - { path: 'cloud-resources', element: }, - { path: 'notifications', element: }, - { path: 'settings', element: }, - { path: 'licenses', element: }, - { path: 'api-keys', element: }, + { path: 'dashboard', Component: Dashboard }, + { path: 'cloud-resources', Component: CloudResources }, + { path: 'notifications', Component: NotificationsPage }, + { path: 'settings', Component: AccountSettings }, + { path: 'licenses', Component: Licenses }, + { path: 'api-keys', Component: ApiKeys }, { path: 'admin', element: , children: [ - { index: true, element: }, - { path: 'alerts', element: }, + { index: true, Component: AdminDashboard }, + { path: 'alerts', Component: AlertsPage }, { path: 'users', - element: , + Component: AdminUsersLayout, children: [ - { index: true, element: }, - { path: 'invitations', element: }, - { path: 'invitations/provisioning', element: }, - { path: 'pending', element: }, - { path: 'memberships', element: }, + { index: true, Component: UsersList }, + { path: 'invitations', Component: InvitationsList }, + { path: 'invitations/provisioning', Component: ProvisioningList }, + { path: 'pending', Component: PendingUsersList }, + { path: 'memberships', Component: AdminMembershipsPage }, ], }, { path: 'invitations', element: }, - { path: 'spaces', element: }, - { path: 'activity-reports', element: }, + { path: 'spaces', Component: SpacesList }, + { path: 'activity-reports', Component: ActivityReportsPage }, { path: 'invitations/provisioning', element: }, - { path: 'news', element: }, - { path: 'news/create', element: }, - { path: 'news/:id/edit', element: }, + { path: 'news', Component: ListAdminNews }, + { path: 'news/create', Component: CreateNewsItemPage }, + { path: 'news/:id/edit', Component: EditNewsItemPage }, ], }, ], diff --git a/packages/client/src/routes/resource-pages.tsx b/packages/client/src/routes/resource-pages.tsx index b4212e1838..bb823c701b 100644 --- a/packages/client/src/routes/resource-pages.tsx +++ b/packages/client/src/routes/resource-pages.tsx @@ -1,13 +1,12 @@ import React from 'react' import { Navigate, useLocation, useOutletContext, useParams, useSearchParams } from 'react-router' -import { Markdown } from '@/components/Markdown' -import { AppShowOutletContext } from '@/features/apps/AppsShow' -import { StyledMarkdownAppShow } from '@/features/apps/form/styles' +import type { AppShowOutletContext } from '@/features/apps/AppsShow' +import { StyledMarkdownAppShow } from '@/features/apps/form/apps-form.styles' import { useAuthUser } from '@/features/auth/useAuthUser' -import { HomeScopeContextValue, useHomeScope } from '@/features/home/HomeScopeContext' +import { type HomeScopeContextValue, useHomeScope } from '@/features/home/HomeScopeContext' import { isContributorOrHigherRole } from '@/features/spaces/common' -import { ISpace } from '@/features/spaces/spaces.types' -import { SpaceOutletContext } from './spaces' +import type { ISpace } from '@/features/spaces/spaces.types' +import type { SpaceOutletContext } from './spaces' const MembersList = React.lazy(() => import('../features/spaces/members/MembersList').then(m => ({ default: m.MembersList })), @@ -63,6 +62,7 @@ const SpaceReportList = React.lazy(() => const TrackInHome = React.lazy(() => import('../features/tracks/TrackInHome').then(m => ({ default: m.TrackInHome }))) const FileList = React.lazy(() => import('../features/files/FileList').then(m => ({ default: m.FileList }))) const FileShow = React.lazy(() => import('../features/files/show/FileShow').then(m => ({ default: m.FileShow }))) +const Markdown = React.lazy(() => import('@/components/Markdown').then(m => ({ default: m.Markdown }))) /** * Result of useUnifiedRouteContext when in home context. diff --git a/packages/client/src/routes/root.tsx b/packages/client/src/routes/root.tsx index 4a32095b58..bd96c04d4e 100644 --- a/packages/client/src/routes/root.tsx +++ b/packages/client/src/routes/root.tsx @@ -1,8 +1,6 @@ import React, { useEffect, useState } from 'react' import 'react-tooltip/dist/react-tooltip.css' -import { TanStackDevtools } from '@tanstack/react-devtools' import { QueryClientProvider } from '@tanstack/react-query' -import { ReactQueryDevtoolsPanel } from '@tanstack/react-query-devtools' import { createBrowserRouter, Navigate, Outlet, useLocation } from 'react-router' import { RouterProvider } from 'react-router/dom' import { AlertDismissedProvider } from '@/features/admin/alerts/useAlertDismissedLocalStorage' @@ -17,15 +15,25 @@ import queryClientInstance, { setAuthFailureCallback } from '@/utils/queryClient import { ThemeProvider } from '@/utils/ThemeContext' import AuthWall from '../AuthWall' import Header from '../components/Header/Header' -import HomeShowLayout from '../features/home/HomeShowLayout' -import RequestAccessPage from '../features/request-access/RequestAccessPage' import NoFoundPage from '../pages/NoFoundPage' import GlobalStyle from '../styles/global' import accountRoutes from './account' import { homeRoutes } from './home' import spacesRoutes from './spaces' +const Noop = (): null => null + +const TanStackDevtools = import.meta.env.DEV + ? React.lazy(() => import('@tanstack/react-devtools').then(m => ({ default: m.TanStackDevtools }))) + : Noop + +const ReactQueryDevtoolsPanel = import.meta.env.DEV + ? React.lazy(() => import('@tanstack/react-query-devtools').then(m => ({ default: m.ReactQueryDevtoolsPanel }))) + : Noop + const DataPortalRoutes = React.lazy(() => import('../features/data-portals/routes')) +const HomeShowLayout = React.lazy(() => import('../features/home/HomeShowLayout')) +const RequestAccessPage = React.lazy(() => import('../features/request-access/RequestAccessPage')) const ExpertsSinglePage = React.lazy(() => import('../features/experts/details/index')) const EditChallengePage = React.lazy(() => import('../features/challenges/form/EditChallengePage')) const ChallengeDetailsLayout = React.lazy(() => import('../features/challenges/details/ChallengeDetailsLayout')) @@ -89,14 +97,16 @@ const RootComponent = () => { - , - }, - ]} - /> + + , + }, + ]} + /> + diff --git a/packages/client/src/stories/styles.ts b/packages/client/src/stories/stories.styles.ts similarity index 100% rename from packages/client/src/stories/styles.ts rename to packages/client/src/stories/stories.styles.ts diff --git a/packages/client/src/styles/tailwind.css b/packages/client/src/styles/tailwind.css index 0941140b52..08e2c8b59e 100644 --- a/packages/client/src/styles/tailwind.css +++ b/packages/client/src/styles/tailwind.css @@ -1,5 +1,3 @@ -@import "@fontsource/lato/100.css"; -@import "@fontsource/lato/100-italic.css"; @import "@fontsource/lato/300.css"; @import "@fontsource/lato/300-italic.css"; @import "@fontsource/lato/400.css"; diff --git a/packages/client/src/utils/useNumberParams.ts b/packages/client/src/utils/useNumberParams.ts deleted file mode 100644 index bb542d200e..0000000000 --- a/packages/client/src/utils/useNumberParams.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Params, useParams } from 'react-router' -import { map, when } from 'ramda' - -type RecordUndefinedVal = Record - -export function useNumberParams>(): RecordUndefinedVal { - const params = useParams>() - - const convertedParams = map( - when( - (value) => !Number.isNaN(Number(value)), - Number, - ), - params, - ) - - return convertedParams as RecordUndefinedVal -} diff --git a/packages/client/vite.config.ts b/packages/client/vite.config.ts index f6c6e9dc47..f2c04ceffb 100644 --- a/packages/client/vite.config.ts +++ b/packages/client/vite.config.ts @@ -71,6 +71,7 @@ export default defineConfig(({ command, mode }) => { }, build: { + target: 'es2022', assetsInlineLimit: filePath => (fontAssetPattern.test(filePath) ? false : undefined), outDir: env.VITE_OUT_DIR || (isProduction ? '../rails/public/packs' : 'dist'), emptyOutDir: true, @@ -83,16 +84,129 @@ export default defineConfig(({ command, mode }) => { entryFileNames: 'bundle-[hash].js', chunkFileNames: '[name]-[hash].js', assetFileNames: assetInfo => { - if (assetInfo.name?.endsWith('.css')) { - return 'bundle-[hash].css' + // names is always a single-element array here + if (assetInfo.names[0]?.endsWith('.css')) { + return '[name]-[hash][extname]' } return '[name][extname]' }, codeSplitting: { + minSize: 10_000, groups: [ { - name: 'vendor', + name: 'vendor-react', test: /node_modules[\\/](react|react-dom|react-router)([\\/]|$)/, + priority: 50, + }, + { + name: 'vendor-tanstack', + test: /node_modules[\\/]@tanstack[\\/]/, + priority: 40, + }, + { + name: 'vendor-forms', + test: /node_modules[\\/](react-hook-form|yup|@hookform)([\\/]|$)/, + priority: 30, + }, + { + name: 'vendor-styled', + test: /node_modules[\\/]styled-components([\\/]|$)/, + priority: 30, + }, + { + name: 'vendor-axios', + test: /node_modules[\\/]axios([\\/]|$)/, + priority: 30, + }, + { + name: 'vendor-select', + test: /node_modules[\\/]react-select([\\/]|$)/, + priority: 30, + }, + { + name: 'vendor-charts', + test: /node_modules[\\/]recharts([\\/]|$)/, + priority: 30, + }, + { + name: 'vendor-dnd', + test: /node_modules[\\/]@dnd-kit[\\/]/, + priority: 30, + }, + { + name: 'vendor-fp', + test: /node_modules[\\/](lodash|ramda|effect|immer|use-immer)([\\/]|$)/, + priority: 30, + }, + { + name: 'vendor-date', + test: /node_modules[\\/](date-fns|@date-fns)([\\/]|$)/, + priority: 30, + }, + { + name: 'vendor-icons', + test: /node_modules[\\/]lucide-react([\\/]|$)/, + priority: 30, + }, + { + name: 'vendor-ui', + test: /node_modules[\\/](@base-ui|clsx|tailwind-merge|class-variance-authority|dompurify|react-toastify|react-tooltip|react-modal|react-transition-group)([\\/]|$)/, + priority: 30, + }, + { + name: 'vendor-prettier', + test: /node_modules[\\/]prettier([\\/]|$)/, + priority: 30, + }, + { + name: 'vendor-lexical', + test: /node_modules[\\/](@lexical|lexical)([\\/]|$)/, + priority: 30, + }, + { + name: 'vendor-markdown', + test: /node_modules[\\/](react-markdown|rehype-.*|remark-.*|unified|hast-.*|mdast-.*|micromark.*|vfile|unist-.*)([\\/]|$)/, + priority: 30, + }, + + // ── App source groups ──────────────────────────────── + { + name: 'app-icons', + test: /src[\\/]components[\\/]icons[\\/]/, + priority: 25, + }, + // Shared components (excluding icons and Markdown, handled separately) + { + name: 'app-components', + test: /src[\\/]components[\\/](?!icons[\\/]|Markdown[\\/])/, + priority: 22, + }, + // Shared utils, hooks, services, constants + { + name: 'app-utilities', + test: /src[\\/](utils|hooks|services|constants)[\\/]/, + priority: 20, + }, + // Feature API files — three patterns, all excluding admin (which stays in app-admin): + // 1. dot-prefixed: *.api.ts / *.types.ts (e.g. apps.api.ts, spaces.types.ts) + // 2. plain api.ts: features/*/api.ts (e.g. challenges/api.ts) + // 3. query hooks: use*Query.ts (e.g. useFetchAppQuery.ts) + { + name: 'app-api-layer', + test: /src[\\/]features[\\/](?!admin[\\/]).+\.(api|types)\.(ts|tsx)$|src[\\/]features[\\/](?!admin[\\/]).*[\\/]api\.(ts|tsx)$|src[\\/]features[\\/](?!admin[\\/]).+use\w+Query\.(ts|tsx)$/, + priority: 18, + }, + // Admin-only features — never loaded by regular users + { + name: 'app-admin', + test: /src[\\/]features[\\/]admin[\\/]/, + priority: 15, + }, + // Lexical rich text editor — large feature, lazy-loaded + { + name: 'app-lexi', + test: /src[\\/]features[\\/]lexi[\\/]/, + priority: 15, }, ], }, @@ -109,128 +223,25 @@ export default defineConfig(({ command, mode }) => { cert: fs.readFileSync(certPath), } : undefined, - proxy: { - '/docs': { - target: 'https://localhost:3000', - secure: false, - changeOrigin: true, - }, - '/logout': { - target: 'https://localhost:3000', - secure: false, - changeOrigin: true, - }, - '/return_from_login': { - target: 'https://localhost:3000', - secure: false, - changeOrigin: true, - }, - '/login': { - target: 'https://localhost:3000', - secure: false, - changeOrigin: true, - }, - '/api': { - target: 'https://localhost:3000', - secure: false, - changeOrigin: true, - }, - '/pdfs': { - target: 'https://localhost:3000', - secure: false, - changeOrigin: true, - }, - '/assets': { - target: 'https://localhost:3000', - secure: false, - changeOrigin: true, - }, - '/discussions': { - target: 'https://localhost:3000', - secure: false, - changeOrigin: true, - }, - '/apps': { - target: 'https://localhost:3000', - secure: false, - changeOrigin: true, - }, - '/workflows/new': { - target: 'https://localhost:3000', - secure: false, - changeOrigin: true, - }, - '/notes': { - target: 'https://localhost:3000', - secure: false, - changeOrigin: true, - }, - '/comparisons': { - target: 'https://localhost:3000', - secure: false, - changeOrigin: true, - }, - '/licenses': { - target: 'https://localhost:3000', - secure: false, - changeOrigin: true, - }, - '/users': { - target: 'https://localhost:3000', - secure: false, - changeOrigin: true, - }, - '/profile': { - target: 'https://localhost:3000', - secure: false, - changeOrigin: true, - }, - '/guidelines': { - target: 'https://localhost:3000', - secure: false, - changeOrigin: true, - }, - '^/workflows/.+/edit$': { - target: 'https://localhost:3000', - secure: false, - changeOrigin: true, - }, - '^/experts/.+/edit$': { - target: 'https://localhost:3000', - secure: false, - changeOrigin: true, - }, - '/experts/new': { - target: 'https://localhost:3000', - secure: false, - changeOrigin: true, - }, - '/admin/comparator_settings': { - target: 'https://localhost:3000', - secure: false, - changeOrigin: true, - }, - '/admin/org_action_requests': { - target: 'https://localhost:3000', - secure: false, - changeOrigin: true, - }, - '/admin/participants': { - target: 'https://localhost:3000', - secure: false, - changeOrigin: true, - }, - '/admin/admin_memberships': { - target: 'https://localhost:3000', - secure: false, - changeOrigin: true, - }, - '/admin/activity_reports': { - target: 'https://localhost:3000', - secure: false, - changeOrigin: true, - }, - }, + proxy: (() => { + const toRails = { target: 'https://localhost:3000', secure: false, changeOrigin: true } + const routes = [ + // Auth / session + '/login', '/logout', '/return_from_login', + // Rails-rendered pages still served by Rails + '/docs', '/pdfs', '/assets', '/guidelines', '/profile', + '/users', '/licenses', '/notes', '/comparisons', + '/discussions', '/apps', '/workflows/new', '/experts/new', + // Admin pages (Rails-rendered) + '/admin/comparator_settings', '/admin/org_action_requests', + '/admin/participants', '/admin/admin_memberships', '/admin/activity_reports', + // API + '/api', + // Regex routes (Rails edit forms) + '^/workflows/.+/edit$', '^/experts/.+/edit$', + ] + return Object.fromEntries(routes.map(r => [r, toRails])) + })(), }, publicDir: 'public', From 4b31ae3c6cb16867f4347700880cd3dd379b2d20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Lagan?= <43816355+jirkalagan@users.noreply.github.com> Date: Thu, 28 May 2026 15:31:23 +0200 Subject: [PATCH 02/16] PFDA-6420 correct SSOId casing in user service and platform client (#3978) --- .../libs/shared/src/domain/user/service/user.service.ts | 2 +- packages/server/libs/shared/src/platform-client/index.ts | 2 +- .../libs/shared/test/unit/domain/user.service.spec.ts | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/server/libs/shared/src/domain/user/service/user.service.ts b/packages/server/libs/shared/src/domain/user/service/user.service.ts index f92ddb429f..98c84a4610 100644 --- a/packages/server/libs/shared/src/domain/user/service/user.service.ts +++ b/packages/server/libs/shared/src/domain/user/service/user.service.ts @@ -201,7 +201,7 @@ export class UserService { if (user.extras.sso_enabled === null || user.extras.sso_enabled === undefined) { try { const response = await this.platformClient.getSSOId({ id: user.dxid }) - user.extras.sso_enabled = Boolean(response.SSoId) + user.extras.sso_enabled = Boolean(response.SSOId) await this.em.flush() } catch (error) { this.logger.warn(`Failed to fetch SSO id for user ${user.dxuser}: ${error}`) diff --git a/packages/server/libs/shared/src/platform-client/index.ts b/packages/server/libs/shared/src/platform-client/index.ts index a1c01d7443..c821ebfe52 100644 --- a/packages/server/libs/shared/src/platform-client/index.ts +++ b/packages/server/libs/shared/src/platform-client/index.ts @@ -764,7 +764,7 @@ export class PlatformClient { * Outputs: * - {SSOId: string} Identity provider ID from Okta, or empty string for non-SSO users */ - async getSSOId(data: GetSsoIdData): Promise<{ SSoId: string }> { + async getSSOId(data: GetSsoIdData): Promise<{ SSOId: string }> { const url = `${config.platform.apiUrl}/user/getSSOId` const options: AxiosRequestConfig = { diff --git a/packages/server/libs/shared/test/unit/domain/user.service.spec.ts b/packages/server/libs/shared/test/unit/domain/user.service.spec.ts index 1ecd99fcff..aa9e420b20 100644 --- a/packages/server/libs/shared/test/unit/domain/user.service.spec.ts +++ b/packages/server/libs/shared/test/unit/domain/user.service.spec.ts @@ -442,7 +442,7 @@ describe('user service tests', () => { it('lazy-backfills sso_enabled when null and persists', async () => { const user = buildUser({ sso_enabled: null }) userRepoFindOneOrFailStub.resolves(user) - platformClientGetSSOIdStub.resolves({ SSoId: 'idp-okta-123' }) + platformClientGetSSOIdStub.resolves({ SSOId: 'idp-okta-123' }) const userService = createUserService() const dto = await userService.getAdminUserDetails(99) @@ -453,10 +453,10 @@ describe('user service tests', () => { expect(dto.isSSO).to.equal(true) }) - it('records non-SSO users when platform returns empty SSoId', async () => { + it('records non-SSO users when platform returns empty SSOId', async () => { const user = buildUser({ sso_enabled: null }) userRepoFindOneOrFailStub.resolves(user) - platformClientGetSSOIdStub.resolves({ SSoId: '' }) + platformClientGetSSOIdStub.resolves({ SSOId: '' }) const userService = createUserService() const dto = await userService.getAdminUserDetails(99) From a583735fc357ae97752e6bfb79a5ec5d07fc3975 Mon Sep 17 00:00:00 2001 From: Jaroslav Iha <52426722+ihitch@users.noreply.github.com> Date: Fri, 29 May 2026 16:36:18 +0200 Subject: [PATCH 03/16] =?UTF-8?q?PFDA-6370=20=E2=80=93=C2=A0new=20GSRS=20l?= =?UTF-8?q?ocal=20docker=20setup=20(#3965)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 + Makefile | 13 +- docker/external.docker-compose.yml | 20 +- docker/external.services.yml | 62 +- docker/misc/gsrs-db-init/01-gsrsdb-schema.sql | 2310 +++++++++++++ docs/COLIMA_GUIDE.md | 5 + docs/DOCKER_BASED_SETUP.md | 95 +- packages/gsrs/README.md | 26 + packages/gsrs/frontend-dev/Dockerfile | 15 + packages/gsrs/frontend-dev/entrypoint.sh | 39 + packages/gsrs/nginx/Dockerfile | 2 + packages/gsrs/nginx/entrypoint.sh | 30 + packages/gsrs/nginx/nginx.conf | 12 +- packages/gsrs/scripts/fetch-seed-data.sh | 74 + packages/gsrs/web/entrypoint.sh | 45 +- packages/nginx/default.conf.template | 10 +- .../rails/docker/misc/gsrs-db-init/gsrsdb.sql | 2943 ----------------- .../gsrs/config/frontend_application.conf | 1230 ------- .../misc/gsrs/config/gateway_application.yml | 165 - .../gsrs/config/substances_application.conf | 445 --- packages/rails/docker/misc/gsrs/context.xml | 4 - .../rails/docker/misc/gsrs/libjnainchi.so | Bin 1265744 -> 0 bytes .../rails/docker/misc/gsrs/run-version.sh | 22 - .../rails/docker/misc/gsrs/switch-frontend.sh | 26 - 24 files changed, 2700 insertions(+), 4897 deletions(-) create mode 100644 docker/misc/gsrs-db-init/01-gsrsdb-schema.sql create mode 100644 packages/gsrs/frontend-dev/Dockerfile create mode 100644 packages/gsrs/frontend-dev/entrypoint.sh create mode 100644 packages/gsrs/nginx/entrypoint.sh create mode 100755 packages/gsrs/scripts/fetch-seed-data.sh delete mode 100644 packages/rails/docker/misc/gsrs-db-init/gsrsdb.sql delete mode 100644 packages/rails/docker/misc/gsrs/config/frontend_application.conf delete mode 100644 packages/rails/docker/misc/gsrs/config/gateway_application.yml delete mode 100644 packages/rails/docker/misc/gsrs/config/substances_application.conf delete mode 100644 packages/rails/docker/misc/gsrs/context.xml delete mode 100644 packages/rails/docker/misc/gsrs/libjnainchi.so delete mode 100644 packages/rails/docker/misc/gsrs/run-version.sh delete mode 100755 packages/rails/docker/misc/gsrs/switch-frontend.sh diff --git a/.gitignore b/.gitignore index 038b7358c8..643106d548 100644 --- a/.gitignore +++ b/.gitignore @@ -107,3 +107,7 @@ vendor/assets/bower_components/ .cursor/ .specify/ .playwright-cli + +# GSRS seed data (downloaded via `make gsrs-seed-data`) +packages/gsrs/seed-data/ +docker/misc/gsrs-db-init/02-gsrsdb-data.sql diff --git a/Makefile b/Makefile index 5a35b4c8db..8e0a68d3a4 100644 --- a/Makefile +++ b/Makefile @@ -40,6 +40,7 @@ check-unpublished-env-variables: # └───────────────────────┘ PFDA_SHOULD_RUN_GSRS ?= 0 +GSRS_FRONTEND_DEV ?= false # ┌───────────┐ # │ │ @@ -67,9 +68,12 @@ DB_WIPE_VOLUMES := db-pfda-mysql-volume # Conditionally defined if gsrs should be included in the stack ifneq (,$(filter-out 0,$(PFDA_SHOULD_RUN_GSRS))) DOCKER_COMPOSE_FILE_FLAGS := $(DOCKER_COMPOSE_FILE_FLAGS) -f $(EXTERNAL_DOCKER_COMPOSE_FILE) -SERVICES := $(SERVICES) gsrs gsrsdb +SERVICES := $(SERVICES) gsrs gsrs-nginx gsrsdb DB_WIPE_SERVICES := $(DB_WIPE_SERVICES) gsrsdb DB_WIPE_VOLUMES := $(DB_WIPE_VOLUMES) db-gsrs-mariadb-volume +ifeq (true,$(GSRS_FRONTEND_DEV)) +DOCKER_COMPOSE_FILE_FLAGS := $(DOCKER_COMPOSE_FILE_FLAGS) --profile frontend-dev +endif endif # Recursive `=` so DOCKER_COMPOSE_FILE_FLAGS is re-expanded at every call @@ -90,7 +94,14 @@ prepare-db: $(COMPOSE) run -T --rm --no-deps --build -e PFDA_DB_INIT_ONLY=1 web prepare-db-test: $(COMPOSE) up --build $(PREPARE_DB_TEST_SERVICES) +gsrs-seed-data: + ./packages/gsrs/scripts/fetch-seed-data.sh run: +ifneq (0,$(PFDA_SHOULD_RUN_GSRS)) +ifneq (,$(PFDA_SHOULD_RUN_GSRS)) + @mkdir -p packages/gsrs/seed-data/ginas.ix +endif +endif $(COMPOSE) up --build stop: $(COMPOSE) down diff --git a/docker/external.docker-compose.yml b/docker/external.docker-compose.yml index 0125734c25..5f01b3e4b6 100644 --- a/docker/external.docker-compose.yml +++ b/docker/external.docker-compose.yml @@ -1,13 +1,17 @@ volumes: db-gsrs-mariadb-volume: + gsrs-frontend-node-modules: services: web: depends_on: - - gsrs + - gsrs-nginx environment: - - GSRS_URL=http://gsrs:8080 + - GSRS_URL=http://gsrs-nginx:80 - GSRS_ENABLED=true + nginx: + depends_on: + - gsrs-nginx gsrs: depends_on: gsrsdb: @@ -15,9 +19,19 @@ services: extends: file: ./external.services.yml service: gsrs + gsrs-nginx: + depends_on: + - gsrs + extends: + file: ./external.services.yml + service: gsrs-nginx + gsrs-frontend-dev: + extends: + file: ./external.services.yml + service: gsrs-frontend-dev gsrsdb: extends: file: ./external.services.yml service: gsrsdb volumes: - - db-gsrs-mariadb-volume:/var/lib/mariadb + - db-gsrs-mariadb-volume:/var/lib/mysql diff --git a/docker/external.services.yml b/docker/external.services.yml index e6d1a92045..68dc8a97fa 100644 --- a/docker/external.services.yml +++ b/docker/external.services.yml @@ -1,24 +1,45 @@ services: gsrs: build: - context: ../packages/rails - dockerfile: docker/images/gsrs.Dockerfile - ports: - - "8080:8080" + context: ../packages/gsrs/web + dockerfile: Dockerfile + args: + GSRS3_MAIN_BRANCH: ${GSRS3_MAIN_BRANCH:-GSRSv3.1.2PUB} + FRONTEND_TAG: ${GSRS_FRONTEND_TAG:-pfda} + # Alias as gsrs-web so gsrs-nginx config works unchanged (matches cloud service name) + networks: + default: + aliases: + - gsrs-web + environment: + - HOST=${GSRS_HOST:-https://localhost:3000} + - GSRS_DATABASE_HOST=${GSRS_DATABASE_HOST:-gsrsdb:3306} + - GSRS_DATABASE_NAME=${GSRS_DATABASE_NAME:-ixginas_local} + - GSRS_DATABASE_USERNAME=${GSRS_DATABASE_USERNAME:-root} + - GSRS_DATABASE_PASSWORD=${GSRS_DATABASE_PASSWORD:-${GSRS_DB_ROOT_PASSWORD:-password}} + - GSRS_LOCAL_MODE=${GSRS_LOCAL_MODE:-true} volumes: + # Lucene index; entrypoint symlinks this to /opt/gsrs/ginas.ix - type: bind - source: ${GSRS_FRONTEND_PATH:-/dev/null} - target: /usr/local/GSRSFrontend - - type: bind - source: ${GSRS_INDEX_PATH:-/dev/null} - target: /ginas.ix + source: ${GSRS_INDEX_PATH:-../packages/gsrs/seed-data/ginas.ix} + target: /tmp/read-only-base + + gsrs-nginx: + build: + context: ../packages/gsrs/nginx + depends_on: + - gsrs + environment: + - GSRS_FRONTEND_DEV=${GSRS_FRONTEND_DEV:-false} + ports: + - 8081:80 gsrsdb: image: "mariadb:10.6.15" tmpfs: - /tmp environment: - MYSQL_DATABASE: ixginas + MYSQL_DATABASE: ixginas_local MYSQL_ROOT_PASSWORD: ${GSRS_DB_ROOT_PASSWORD:-password} ports: - "32900:3306" @@ -30,4 +51,23 @@ services: start_period: 20s volumes: # Script for the DB initialization (creating the tables) - - ../packages/rails/docker/misc/gsrs-db-init:/docker-entrypoint-initdb.d + - ./misc/gsrs-db-init:/docker-entrypoint-initdb.d + gsrsdb_emulated: + extends: + service: gsrsdb + image: amd64/mariadb:10.6.15 + + gsrs-frontend-dev: + profiles: + - frontend-dev + build: + context: ../packages/gsrs/frontend-dev + mem_limit: 6g + volumes: + - type: bind + source: ${GSRS_FRONTEND_PATH:-.} + target: /app + # Separate node_modules to avoid overwriting host's (different platform) + - gsrs-frontend-node-modules:/app/node_modules + ports: + - 4200:4200 diff --git a/docker/misc/gsrs-db-init/01-gsrsdb-schema.sql b/docker/misc/gsrs-db-init/01-gsrsdb-schema.sql new file mode 100644 index 0000000000..e49825bba3 --- /dev/null +++ b/docker/misc/gsrs-db-init/01-gsrsdb-schema.sql @@ -0,0 +1,2310 @@ +-- MariaDB dump 10.19 Distrib 10.6.15-MariaDB, for debian-linux-gnu (aarch64) +-- +-- Host: localhost Database: ixginas_local +-- ------------------------------------------------------ +-- Server version 10.6.15-MariaDB-1:10.6.15+maria~ubu2004 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Sequence structure for `LONG_SEQ_ID` +-- + +DROP SEQUENCE IF EXISTS `LONG_SEQ_ID`; +CREATE SEQUENCE `LONG_SEQ_ID` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=InnoDB; +SELECT SETVAL(`LONG_SEQ_ID`, 1, 0); + +-- +-- Sequence structure for `db_gsrs_version_seq` +-- + +DROP SEQUENCE IF EXISTS `db_gsrs_version_seq`; +CREATE SEQUENCE `db_gsrs_version_seq` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=InnoDB; +SELECT SETVAL(`db_gsrs_version_seq`, 1, 0); + +-- +-- Sequence structure for `ix_core_acl_seq` +-- + +DROP SEQUENCE IF EXISTS `ix_core_acl_seq`; +CREATE SEQUENCE `ix_core_acl_seq` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=InnoDB; +SELECT SETVAL(`ix_core_acl_seq`, 1, 0); + +-- +-- Sequence structure for `ix_core_backup_seq` +-- + +DROP SEQUENCE IF EXISTS `ix_core_backup_seq`; +CREATE SEQUENCE `ix_core_backup_seq` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=InnoDB; +SELECT SETVAL(`ix_core_backup_seq`, 1001, 0); + +-- +-- Sequence structure for `ix_core_etag_seq` +-- + +DROP SEQUENCE IF EXISTS `ix_core_etag_seq`; +CREATE SEQUENCE `ix_core_etag_seq` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=InnoDB; +SELECT SETVAL(`ix_core_etag_seq`, 2001, 0); + +-- +-- Sequence structure for `ix_core_group_seq` +-- + +DROP SEQUENCE IF EXISTS `ix_core_group_seq`; +CREATE SEQUENCE `ix_core_group_seq` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=InnoDB; +SELECT SETVAL(`ix_core_group_seq`, 1001, 0); + +-- +-- Sequence structure for `ix_core_namespace_seq` +-- + +DROP SEQUENCE IF EXISTS `ix_core_namespace_seq`; +CREATE SEQUENCE `ix_core_namespace_seq` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=InnoDB; +SELECT SETVAL(`ix_core_namespace_seq`, 1, 0); + +-- +-- Sequence structure for `ix_core_principal_seq` +-- + +DROP SEQUENCE IF EXISTS `ix_core_principal_seq`; +CREATE SEQUENCE `ix_core_principal_seq` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=InnoDB; +SELECT SETVAL(`ix_core_principal_seq`, 1001, 0); + +-- +-- Sequence structure for `ix_core_procjob_seq` +-- + +DROP SEQUENCE IF EXISTS `ix_core_procjob_seq`; +CREATE SEQUENCE `ix_core_procjob_seq` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=InnoDB; +SELECT SETVAL(`ix_core_procjob_seq`, 1001, 0); + +-- +-- Sequence structure for `ix_core_procrec_seq` +-- + +DROP SEQUENCE IF EXISTS `ix_core_procrec_seq`; +CREATE SEQUENCE `ix_core_procrec_seq` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=InnoDB; +SELECT SETVAL(`ix_core_procrec_seq`, 1001, 0); + +-- +-- Sequence structure for `ix_core_userprof_seq` +-- + +DROP SEQUENCE IF EXISTS `ix_core_userprof_seq`; +CREATE SEQUENCE `ix_core_userprof_seq` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=InnoDB; +SELECT SETVAL(`ix_core_userprof_seq`, 1001, 0); + +-- +-- Sequence structure for `ix_core_value_seq` +-- + +DROP SEQUENCE IF EXISTS `ix_core_value_seq`; +CREATE SEQUENCE `ix_core_value_seq` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=InnoDB; +SELECT SETVAL(`ix_core_value_seq`, 1001, 0); + +-- +-- Sequence structure for `ix_core_xref_seq` +-- + +DROP SEQUENCE IF EXISTS `ix_core_xref_seq`; +CREATE SEQUENCE `ix_core_xref_seq` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=InnoDB; +SELECT SETVAL(`ix_core_xref_seq`, 1, 0); + +-- +-- Sequence structure for `ix_ginas_controlled_vocab_seq` +-- + +DROP SEQUENCE IF EXISTS `ix_ginas_controlled_vocab_seq`; +CREATE SEQUENCE `ix_ginas_controlled_vocab_seq` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=InnoDB; +SELECT SETVAL(`ix_ginas_controlled_vocab_seq`, 1001, 0); + +-- +-- Sequence structure for `ix_ginas_vocabulary_term_seq` +-- + +DROP SEQUENCE IF EXISTS `ix_ginas_vocabulary_term_seq`; +CREATE SEQUENCE `ix_ginas_vocabulary_term_seq` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=InnoDB; +SELECT SETVAL(`ix_ginas_vocabulary_term_seq`, 4001, 0); + +-- +-- Table structure for table `ix_batch_processingjob` +-- + +DROP TABLE IF EXISTS `ix_batch_processingjob`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_batch_processingjob` ( + `id` varchar(40) NOT NULL, + `category` varchar(255) DEFAULT NULL, + `completed_record_count` int(11) NOT NULL, + `data` longtext DEFAULT NULL, + `finish_date` datetime(6) DEFAULT NULL, + `job_status` varchar(255) DEFAULT NULL, + `results` longtext DEFAULT NULL, + `start_date` datetime(6) DEFAULT NULL, + `status_message` varchar(255) DEFAULT NULL, + `total_records` int(11) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_core_acl` +-- + +DROP TABLE IF EXISTS `ix_core_acl`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_core_acl` ( + `id` bigint(20) NOT NULL, + `perm` int(11) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_core_acl_group` +-- + +DROP TABLE IF EXISTS `ix_core_acl_group`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_core_acl_group` ( + `ix_core_acl_id` bigint(20) NOT NULL, + `ix_core_group_id` bigint(20) NOT NULL, + KEY `fkffablaywfq4inuntnok9otle` (`ix_core_group_id`), + KEY `fk8a5l9ehfusnoigq1r4robs2da` (`ix_core_acl_id`), + CONSTRAINT `fk8a5l9ehfusnoigq1r4robs2da` FOREIGN KEY (`ix_core_acl_id`) REFERENCES `ix_core_acl` (`id`), + CONSTRAINT `fkffablaywfq4inuntnok9otle` FOREIGN KEY (`ix_core_group_id`) REFERENCES `ix_core_group` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_core_acl_principal` +-- + +DROP TABLE IF EXISTS `ix_core_acl_principal`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_core_acl_principal` ( + `ix_core_acl_id` bigint(20) NOT NULL, + `ix_core_principal_id` bigint(20) NOT NULL, + KEY `fkpf5d4mu9td8et6k5pgt78jma8` (`ix_core_principal_id`), + KEY `fkc9bo2bwjfcf7djff6coigl2b1` (`ix_core_acl_id`), + CONSTRAINT `fkc9bo2bwjfcf7djff6coigl2b1` FOREIGN KEY (`ix_core_acl_id`) REFERENCES `ix_core_acl` (`id`), + CONSTRAINT `fkpf5d4mu9td8et6k5pgt78jma8` FOREIGN KEY (`ix_core_principal_id`) REFERENCES `ix_core_principal` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_core_backup` +-- + +DROP TABLE IF EXISTS `ix_core_backup`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_core_backup` ( + `id` bigint(20) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `deprecated` bit(1) NOT NULL, + `modified` datetime(6) DEFAULT NULL, + `version` bigint(20) DEFAULT NULL, + `compressed` bit(1) NOT NULL, + `data` longblob DEFAULT NULL, + `kind` varchar(255) DEFAULT NULL, + `refid` varchar(255) DEFAULT NULL, + `sha1` varchar(255) DEFAULT NULL, + `namespace_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `UK_6n0ebodjb5t7yoxowli7t5qud` (`refid`), + KEY `fknulpohkjr0e7imml16hnmcl2c` (`namespace_id`), + CONSTRAINT `fknulpohkjr0e7imml16hnmcl2c` FOREIGN KEY (`namespace_id`) REFERENCES `ix_core_namespace` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_core_db_gsrs_version` +-- + +DROP TABLE IF EXISTS `ix_core_db_gsrs_version`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_core_db_gsrs_version` ( + `id` bigint(20) NOT NULL, + `entity` varchar(255) NOT NULL, + `hash` varchar(255) DEFAULT NULL, + `modified` datetime(6) DEFAULT NULL, + `version_info` varchar(255) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_core_edit` +-- + +DROP TABLE IF EXISTS `ix_core_edit`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_core_edit` ( + `id` varchar(40) NOT NULL, + `batch` varchar(64) DEFAULT NULL, + `comments` longtext DEFAULT NULL, + `created` bigint(20) DEFAULT NULL, + `kind` varchar(255) DEFAULT NULL, + `new_value` longtext DEFAULT NULL, + `old_value` longtext DEFAULT NULL, + `path` varchar(1024) DEFAULT NULL, + `refid` varchar(255) DEFAULT NULL, + `version` varchar(255) DEFAULT NULL, + `editor_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `refid_core_edit_index` (`refid`), + KEY `kind_core_edit_index` (`kind`), + KEY `fkj2b3ncg8uek4q4tjua17gvkgi` (`editor_id`), + CONSTRAINT `fkj2b3ncg8uek4q4tjua17gvkgi` FOREIGN KEY (`editor_id`) REFERENCES `ix_core_principal` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_core_etag` +-- + +DROP TABLE IF EXISTS `ix_core_etag`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_core_etag` ( + `id` bigint(20) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `deprecated` bit(1) NOT NULL, + `modified` datetime(6) DEFAULT NULL, + `version` bigint(20) DEFAULT NULL, + `count` int(11) DEFAULT NULL, + `etag` varchar(16) DEFAULT NULL, + `filter` varchar(4000) DEFAULT NULL, + `method` varchar(10) DEFAULT NULL, + `path` varchar(255) DEFAULT NULL, + `query` varchar(2048) DEFAULT NULL, + `sha1` varchar(40) DEFAULT NULL, + `skip` int(11) DEFAULT NULL, + `status` int(11) DEFAULT NULL, + `top` int(11) DEFAULT NULL, + `total` int(11) DEFAULT NULL, + `uri` varchar(4000) DEFAULT NULL, + `namespace_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `UK_hvark3ftc0xax8dcbjuftcn7v` (`etag`), + KEY `fk22kqxphqlg1d1hmsi2wtm6k0c` (`namespace_id`), + CONSTRAINT `fk22kqxphqlg1d1hmsi2wtm6k0c` FOREIGN KEY (`namespace_id`) REFERENCES `ix_core_namespace` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_core_figure` +-- + +DROP TABLE IF EXISTS `ix_core_figure`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_core_figure` ( + `DTYPE` varchar(31) NOT NULL, + `id` bigint(20) NOT NULL, + `caption` varchar(255) DEFAULT NULL, + `data` longblob DEFAULT NULL, + `mime_type` varchar(255) DEFAULT NULL, + `sha1` varchar(140) DEFAULT NULL, + `data_size` int(11) DEFAULT NULL, + `url` varchar(1024) DEFAULT NULL, + `parent_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `fk911xrg14bag2m8e096i9d75lu` (`parent_id`), + CONSTRAINT `fk911xrg14bag2m8e096i9d75lu` FOREIGN KEY (`parent_id`) REFERENCES `ix_core_figure` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_core_filedata` +-- + +DROP TABLE IF EXISTS `ix_core_filedata`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_core_filedata` ( + `DTYPE` varchar(31) NOT NULL, + `id` varchar(40) NOT NULL, + `data` longblob DEFAULT NULL, + `mime_type` varchar(255) DEFAULT NULL, + `sha1` varchar(140) DEFAULT NULL, + `data_size` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_core_group` +-- + +DROP TABLE IF EXISTS `ix_core_group`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_core_group` ( + `id` bigint(20) NOT NULL, + `name` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `UK_pm62da77mybok0t03dd0a9oum` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_core_group_principal` +-- + +DROP TABLE IF EXISTS `ix_core_group_principal`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_core_group_principal` ( + `ix_core_group_id` bigint(20) NOT NULL, + `ix_core_principal_id` bigint(20) NOT NULL, + PRIMARY KEY (`ix_core_group_id`,`ix_core_principal_id`), + KEY `fkp21u3ryjg094idoi9alrg90p7` (`ix_core_principal_id`), + CONSTRAINT `fk1voeekm54sy5sc3et2fqo0unx` FOREIGN KEY (`ix_core_group_id`) REFERENCES `ix_core_group` (`id`), + CONSTRAINT `fkp21u3ryjg094idoi9alrg90p7` FOREIGN KEY (`ix_core_principal_id`) REFERENCES `ix_core_principal` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_core_key_user_list` +-- + +DROP TABLE IF EXISTS `ix_core_key_user_list`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_core_key_user_list` ( + `id` bigint(20) NOT NULL, + `entity_key` varchar(255) DEFAULT NULL, + `kind` varchar(255) DEFAULT NULL, + `list_name` varchar(255) NOT NULL, + `user_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `ukq0ipvkfn4lc8e88hi3900bytv` (`entity_key`,`list_name`,`user_id`,`kind`), + KEY `fk7q0vtv7ajevho6v75n57jy0dj` (`user_id`), + CONSTRAINT `fk7q0vtv7ajevho6v75n57jy0dj` FOREIGN KEY (`user_id`) REFERENCES `ix_core_principal` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_core_namespace` +-- + +DROP TABLE IF EXISTS `ix_core_namespace`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_core_namespace` ( + `id` bigint(20) NOT NULL, + `location` varchar(1024) DEFAULT NULL, + `modifier` int(11) DEFAULT NULL, + `name` varchar(255) DEFAULT NULL, + `owner_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `UK_t3wv0p58vflh5n2vnj6rjan75` (`name`), + KEY `fkdgo5yjubgilh1nauv1t69gslx` (`owner_id`), + CONSTRAINT `fkdgo5yjubgilh1nauv1t69gslx` FOREIGN KEY (`owner_id`) REFERENCES `ix_core_principal` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_core_payload` +-- + +DROP TABLE IF EXISTS `ix_core_payload`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_core_payload` ( + `id` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `mime_type` varchar(128) DEFAULT NULL, + `name` varchar(1024) DEFAULT NULL, + `sha1` varchar(40) DEFAULT NULL, + `capacity` bigint(20) DEFAULT NULL, + `namespace_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `fkd150c5llpyncrqgpmqvvj8c9g` (`namespace_id`), + CONSTRAINT `fkd150c5llpyncrqgpmqvvj8c9g` FOREIGN KEY (`namespace_id`) REFERENCES `ix_core_namespace` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_core_payload_property` +-- + +DROP TABLE IF EXISTS `ix_core_payload_property`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_core_payload_property` ( + `ix_core_payload_id` varchar(40) NOT NULL, + `ix_core_value_id` bigint(20) NOT NULL, + KEY `fki6ubcj55u3pq0gm70ay7umle1` (`ix_core_value_id`), + KEY `fk6j2diflggrmws0k3suo8ms215` (`ix_core_payload_id`), + CONSTRAINT `fk6j2diflggrmws0k3suo8ms215` FOREIGN KEY (`ix_core_payload_id`) REFERENCES `ix_core_payload` (`id`), + CONSTRAINT `fki6ubcj55u3pq0gm70ay7umle1` FOREIGN KEY (`ix_core_value_id`) REFERENCES `ix_core_value` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_core_principal` +-- + +DROP TABLE IF EXISTS `ix_core_principal`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_core_principal` ( + `DTYPE` varchar(31) NOT NULL, + `id` bigint(20) NOT NULL, + `is_admin` bit(1) DEFAULT NULL, + `created` datetime(6) DEFAULT NULL, + `deprecated` bit(1) NOT NULL, + `email` varchar(255) DEFAULT NULL, + `modified` datetime(6) DEFAULT NULL, + `provider` varchar(255) DEFAULT NULL, + `uri` varchar(1024) DEFAULT NULL, + `username` varchar(255) DEFAULT NULL, + `version` bigint(20) DEFAULT NULL, + `selfie_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `UK_p8p720bdp9bkws54yip7x1t47` (`username`), + KEY `fk6th1516rd9u5crfw7r12qtypk` (`selfie_id`), + CONSTRAINT `fk6th1516rd9u5crfw7r12qtypk` FOREIGN KEY (`selfie_id`) REFERENCES `ix_core_figure` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_core_procjob` +-- + +DROP TABLE IF EXISTS `ix_core_procjob`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_core_procjob` ( + `id` bigint(20) NOT NULL, + `last_update` datetime(6) DEFAULT NULL, + `message` longtext DEFAULT NULL, + `job_start` bigint(20) DEFAULT NULL, + `statistics` longtext DEFAULT NULL, + `status` int(11) DEFAULT NULL, + `job_stop` bigint(20) DEFAULT NULL, + `version` bigint(20) DEFAULT NULL, + `owner_id` bigint(20) DEFAULT NULL, + `payload_id` varchar(40) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `fkkx6oorfim5n6bhuy3j8wogyl5` (`owner_id`), + KEY `fkoxadf72bp8jsiuh1v42gx1t71` (`payload_id`), + CONSTRAINT `fkkx6oorfim5n6bhuy3j8wogyl5` FOREIGN KEY (`owner_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkoxadf72bp8jsiuh1v42gx1t71` FOREIGN KEY (`payload_id`) REFERENCES `ix_core_payload` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_core_procjob_key` +-- + +DROP TABLE IF EXISTS `ix_core_procjob_key`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_core_procjob_key` ( + `ix_core_procjob_id` bigint(20) NOT NULL, + `keys_id` bigint(20) NOT NULL, + KEY `fkr2mo13ikjb3bfw91uuwf7n5aw` (`keys_id`), + KEY `fk70h2uyrhvkuo84bwag5vljg9s` (`ix_core_procjob_id`), + CONSTRAINT `fk70h2uyrhvkuo84bwag5vljg9s` FOREIGN KEY (`ix_core_procjob_id`) REFERENCES `ix_core_procjob` (`id`), + CONSTRAINT `fkr2mo13ikjb3bfw91uuwf7n5aw` FOREIGN KEY (`keys_id`) REFERENCES `ix_core_value` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_core_procrec` +-- + +DROP TABLE IF EXISTS `ix_core_procrec`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_core_procrec` ( + `id` bigint(20) NOT NULL, + `last_update` datetime(6) DEFAULT NULL, + `message` longtext DEFAULT NULL, + `name` varchar(128) DEFAULT NULL, + `rec_start` bigint(20) DEFAULT NULL, + `status` int(11) DEFAULT NULL, + `rec_stop` bigint(20) DEFAULT NULL, + `job_id` bigint(20) DEFAULT NULL, + `xref_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `fkpsv2ie5f4qjkar6kgis359efe` (`job_id`), + KEY `fkabpfcuyjcycb86bmc06xps4j6` (`xref_id`), + CONSTRAINT `fkabpfcuyjcycb86bmc06xps4j6` FOREIGN KEY (`xref_id`) REFERENCES `ix_core_xref` (`id`), + CONSTRAINT `fkpsv2ie5f4qjkar6kgis359efe` FOREIGN KEY (`job_id`) REFERENCES `ix_core_procjob` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_core_procrec_prop` +-- + +DROP TABLE IF EXISTS `ix_core_procrec_prop`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_core_procrec_prop` ( + `ix_core_procrec_id` bigint(20) NOT NULL, + `properties_id` bigint(20) NOT NULL, + KEY `fkjg8tmtxlf4d2vnb90e6i7exg0` (`properties_id`), + KEY `fktnw4u7w89a21880hmtva47pta` (`ix_core_procrec_id`), + CONSTRAINT `fkjg8tmtxlf4d2vnb90e6i7exg0` FOREIGN KEY (`properties_id`) REFERENCES `ix_core_value` (`id`), + CONSTRAINT `fktnw4u7w89a21880hmtva47pta` FOREIGN KEY (`ix_core_procrec_id`) REFERENCES `ix_core_procrec` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_core_session` +-- + +DROP TABLE IF EXISTS `ix_core_session`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_core_session` ( + `id` varchar(40) NOT NULL, + `accessed` bigint(20) NOT NULL, + `created` bigint(20) NOT NULL, + `expired` bit(1) NOT NULL, + `location` varchar(255) DEFAULT NULL, + `profile_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `fkfxn2t6y3dre527h1eymkt8lur` (`profile_id`), + CONSTRAINT `fkfxn2t6y3dre527h1eymkt8lur` FOREIGN KEY (`profile_id`) REFERENCES `ix_core_userprof` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_core_structure` +-- + +DROP TABLE IF EXISTS `ix_core_structure`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_core_structure` ( + `DTYPE` varchar(31) NOT NULL, + `id` varchar(40) NOT NULL, + `atropi` int(11) DEFAULT NULL, + `charge` int(11) DEFAULT NULL, + `count` int(11) DEFAULT NULL, + `created` datetime(6) DEFAULT NULL, + `defined_stereo` int(11) DEFAULT NULL, + `deprecated` bit(1) NOT NULL, + `digest` varchar(128) DEFAULT NULL, + `ez_centers` int(11) DEFAULT NULL, + `formula` varchar(255) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `molfile` longtext DEFAULT NULL, + `mwt` double DEFAULT NULL, + `optical` int(11) DEFAULT NULL, + `smiles` longtext DEFAULT NULL, + `stereo_centers` int(11) DEFAULT NULL, + `stereo` varchar(255) DEFAULT NULL, + `stereo_comments` longtext DEFAULT NULL, + `version` bigint(20) DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `fksobht0ese9794r3q9k1q6i7gp` (`created_by_id`), + KEY `fk37rfonx9x7vmkwsru7dxxqhhk` (`last_edited_by_id`), + CONSTRAINT `fk37rfonx9x7vmkwsru7dxxqhhk` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fksobht0ese9794r3q9k1q6i7gp` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_core_structure_link` +-- + +DROP TABLE IF EXISTS `ix_core_structure_link`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_core_structure_link` ( + `ix_core_structure_id` varchar(40) NOT NULL, + `ix_core_xref_id` bigint(20) NOT NULL, + KEY `fkdca3xgv2a5p344i74yc7sk89v` (`ix_core_xref_id`), + KEY `fk44si68uocnubt6vaobd4mgmmy` (`ix_core_structure_id`), + CONSTRAINT `fk44si68uocnubt6vaobd4mgmmy` FOREIGN KEY (`ix_core_structure_id`) REFERENCES `ix_core_structure` (`id`), + CONSTRAINT `fkdca3xgv2a5p344i74yc7sk89v` FOREIGN KEY (`ix_core_xref_id`) REFERENCES `ix_core_xref` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_core_structure_property` +-- + +DROP TABLE IF EXISTS `ix_core_structure_property`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_core_structure_property` ( + `ix_core_structure_id` varchar(40) NOT NULL, + `ix_core_value_id` bigint(20) NOT NULL, + KEY `property_structure_id_index` (`ix_core_structure_id`), + KEY `property_value_id_index` (`ix_core_value_id`), + CONSTRAINT `fk4n49941jj4uufoosy5n1g9rg6` FOREIGN KEY (`ix_core_value_id`) REFERENCES `ix_core_value` (`id`), + CONSTRAINT `fkok4h9jsov59dh00wnrmsnd12x` FOREIGN KEY (`ix_core_structure_id`) REFERENCES `ix_core_structure` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_core_user_saved_list` +-- + +DROP TABLE IF EXISTS `ix_core_user_saved_list`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_core_user_saved_list` ( + `id` bigint(20) NOT NULL, + `kind` varchar(255) DEFAULT NULL, + `list` longtext DEFAULT NULL, + `name` varchar(255) NOT NULL, + `user_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `ukg72w8umh72yn9lnpxxycln5jd` (`name`,`user_id`,`kind`), + KEY `fkhd1bc5m9wxca27lxoexqjfwei` (`user_id`), + CONSTRAINT `fkhd1bc5m9wxca27lxoexqjfwei` FOREIGN KEY (`user_id`) REFERENCES `ix_core_principal` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_core_userprof` +-- + +DROP TABLE IF EXISTS `ix_core_userprof`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_core_userprof` ( + `id` bigint(20) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `deprecated` bit(1) NOT NULL, + `modified` datetime(6) DEFAULT NULL, + `version` bigint(20) DEFAULT NULL, + `active` bit(1) NOT NULL, + `hashp` varchar(255) DEFAULT NULL, + `apikey` varchar(255) DEFAULT NULL, + `ROLES_JSON` longtext DEFAULT NULL, + `salt` varchar(255) DEFAULT NULL, + `system_auth` bit(1) NOT NULL, + `namespace_id` bigint(20) DEFAULT NULL, + `user_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `fks5bqupbwldu7843qnt8tuntnu` (`namespace_id`), + KEY `fknq0obnfqd9j3uh1uxdqn3ouq7` (`user_id`), + CONSTRAINT `fknq0obnfqd9j3uh1uxdqn3ouq7` FOREIGN KEY (`user_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fks5bqupbwldu7843qnt8tuntnu` FOREIGN KEY (`namespace_id`) REFERENCES `ix_core_namespace` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = latin1 */ ; +/*!50003 SET character_set_results = latin1 */ ; +/*!50003 SET collation_connection = latin1_swedish_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER ix_core_userprof_update_roles BEFORE UPDATE ON ix_core_userprof +FOR EACH ROW +BEGIN + IF NEW.roles_json IS NULL THEN + SET NEW.roles_json = '["Query","Updater","SuperUpdate","DataEntry","SuperDataEntry"]'; + END IF; +END */;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; + +-- +-- Table structure for table `ix_core_userprof_prop` +-- + +DROP TABLE IF EXISTS `ix_core_userprof_prop`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_core_userprof_prop` ( + `ix_core_userprof_id` bigint(20) NOT NULL, + `ix_core_value_id` bigint(20) NOT NULL, + KEY `fknfow9qqryxbxgppprcum5khf8` (`ix_core_value_id`), + KEY `fklloqe5wbjywhajh4tw6ilfnvg` (`ix_core_userprof_id`), + CONSTRAINT `fklloqe5wbjywhajh4tw6ilfnvg` FOREIGN KEY (`ix_core_userprof_id`) REFERENCES `ix_core_userprof` (`id`), + CONSTRAINT `fknfow9qqryxbxgppprcum5khf8` FOREIGN KEY (`ix_core_value_id`) REFERENCES `ix_core_value` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_core_value` +-- + +DROP TABLE IF EXISTS `ix_core_value`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_core_value` ( + `DTYPE` varchar(31) NOT NULL, + `id` bigint(20) NOT NULL, + `label` varchar(255) DEFAULT NULL, + `intval` bigint(20) DEFAULT NULL, + `average` double DEFAULT NULL, + `lval` double DEFAULT NULL, + `rval` double DEFAULT NULL, + `data` longblob DEFAULT NULL, + `mime_type` varchar(32) DEFAULT NULL, + `sha1` varchar(40) DEFAULT NULL, + `data_size` int(11) DEFAULT NULL, + `strval` varchar(1024) DEFAULT NULL, + `href` longtext DEFAULT NULL, + `term` varchar(255) DEFAULT NULL, + `numval` double DEFAULT NULL, + `unit` varchar(255) DEFAULT NULL, + `heading` varchar(1024) DEFAULT NULL, + `major_topic` bit(1) DEFAULT NULL, + `text` longtext DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `value_label_index` (`label`), + KEY `value_term_index` (`term`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_core_xref` +-- + +DROP TABLE IF EXISTS `ix_core_xref`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_core_xref` ( + `id` bigint(20) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `deprecated` bit(1) NOT NULL, + `modified` datetime(6) DEFAULT NULL, + `version` bigint(20) DEFAULT NULL, + `kind` varchar(255) NOT NULL, + `refid` varchar(40) NOT NULL, + `namespace_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `xref_refid_index` (`refid`), + KEY `xref_kind_index` (`kind`), + KEY `fk6g9t8ugidjwe166t5nk7x2wqm` (`namespace_id`), + CONSTRAINT `fk6g9t8ugidjwe166t5nk7x2wqm` FOREIGN KEY (`namespace_id`) REFERENCES `ix_core_namespace` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_core_xref_property` +-- + +DROP TABLE IF EXISTS `ix_core_xref_property`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_core_xref_property` ( + `ix_core_xref_id` bigint(20) NOT NULL, + `ix_core_value_id` bigint(20) NOT NULL, + KEY `fkaucrto6dcvyyq1n6jo332gqsf` (`ix_core_value_id`), + KEY `fkmr6or6lteb684kq2e1dgsxl1w` (`ix_core_xref_id`), + CONSTRAINT `fkaucrto6dcvyyq1n6jo332gqsf` FOREIGN KEY (`ix_core_value_id`) REFERENCES `ix_core_value` (`id`), + CONSTRAINT `fkmr6or6lteb684kq2e1dgsxl1w` FOREIGN KEY (`ix_core_xref_id`) REFERENCES `ix_core_xref` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_agentmod` +-- + +DROP TABLE IF EXISTS `ix_ginas_agentmod`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_agentmod` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `agent_modification_process` varchar(255) DEFAULT NULL, + `agent_modification_role` varchar(255) DEFAULT NULL, + `agent_modification_type` varchar(255) DEFAULT NULL, + `modification_group` varchar(255) DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + `agent_substance_uuid` varchar(40) DEFAULT NULL, + `amount_uuid` varchar(40) DEFAULT NULL, + `owner_uuid` varchar(40) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `fk837ol47m9wstcu74fp5toniam` (`created_by_id`), + KEY `fk2prhrnc5vlo55jxu1rxgpfdw1` (`last_edited_by_id`), + KEY `fk2x5f4lw85tpkym1r3urwp2u3w` (`agent_substance_uuid`), + KEY `fki7hwi4cyu1hi7yjo2ddwkig51` (`amount_uuid`), + KEY `fk9ybw4linkblw3p4u25cq6qs0d` (`owner_uuid`), + CONSTRAINT `fk2prhrnc5vlo55jxu1rxgpfdw1` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fk2x5f4lw85tpkym1r3urwp2u3w` FOREIGN KEY (`agent_substance_uuid`) REFERENCES `ix_ginas_substanceref` (`uuid`), + CONSTRAINT `fk837ol47m9wstcu74fp5toniam` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fk9ybw4linkblw3p4u25cq6qs0d` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_modifications` (`uuid`), + CONSTRAINT `fki7hwi4cyu1hi7yjo2ddwkig51` FOREIGN KEY (`amount_uuid`) REFERENCES `ix_ginas_amount` (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_amount` +-- + +DROP TABLE IF EXISTS `ix_ginas_amount`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_amount` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `approval_id` varchar(10) DEFAULT NULL, + `average` double DEFAULT NULL, + `high` double DEFAULT NULL, + `high_limit` double DEFAULT NULL, + `low` double DEFAULT NULL, + `low_limit` double DEFAULT NULL, + `non_numeric_value` varchar(255) DEFAULT NULL, + `type` varchar(255) DEFAULT NULL, + `units` varchar(255) DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `fkqsmrbuknll0fmv6jthf4cycy5` (`created_by_id`), + KEY `fk9leptgx7incy9twmrwcpeo2bm` (`last_edited_by_id`), + CONSTRAINT `fk9leptgx7incy9twmrwcpeo2bm` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkqsmrbuknll0fmv6jthf4cycy5` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_code` +-- + +DROP TABLE IF EXISTS `ix_ginas_code`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_code` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `code` varchar(255) NOT NULL, + `code_system` varchar(255) DEFAULT NULL, + `code_text` longtext DEFAULT NULL, + `comments` longtext DEFAULT NULL, + `type` varchar(255) DEFAULT NULL, + `url` longtext DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + `owner_uuid` varchar(40) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `ix_ix_ginas_code_code` (`code`), + KEY `ix_ix_ginas_code_code_system` (`code_system`), + KEY `ix_ix_ginas_code_type` (`type`), + KEY `ix_ix_ginas_code_owner` (`owner_uuid`), + KEY `fkfwn6blkrhusg1xhrue0u820p` (`created_by_id`), + KEY `fkpio633txjf8p5soyujcrtbx9v` (`last_edited_by_id`), + CONSTRAINT `fke9p0ygr5drc93bxry80f9y215` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_substance` (`uuid`), + CONSTRAINT `fkfwn6blkrhusg1xhrue0u820p` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkpio633txjf8p5soyujcrtbx9v` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_component` +-- + +DROP TABLE IF EXISTS `ix_ginas_component`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_component` ( + `DTYPE` varchar(31) NOT NULL, + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `type` varchar(255) DEFAULT NULL, + `role` varchar(255) DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + `substance_uuid` varchar(40) DEFAULT NULL, + `amount_uuid` varchar(40) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `fkodvtp4qvwc7nyfr3lbc893o6m` (`created_by_id`), + KEY `fkbbvqudmdnm60le1imuwb2uj5x` (`last_edited_by_id`), + KEY `fkql4nn094peyvxrwctj1ga2wp2` (`substance_uuid`), + KEY `fksqa51pxp5tbk6vyu34qbr8c5u` (`amount_uuid`), + CONSTRAINT `fkbbvqudmdnm60le1imuwb2uj5x` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkodvtp4qvwc7nyfr3lbc893o6m` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkql4nn094peyvxrwctj1ga2wp2` FOREIGN KEY (`substance_uuid`) REFERENCES `ix_ginas_substanceref` (`uuid`), + CONSTRAINT `fksqa51pxp5tbk6vyu34qbr8c5u` FOREIGN KEY (`amount_uuid`) REFERENCES `ix_ginas_amount` (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_controlled_vocab` +-- + +DROP TABLE IF EXISTS `ix_ginas_controlled_vocab`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_controlled_vocab` ( + `DTYPE` varchar(31) NOT NULL, + `id` bigint(20) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `deprecated` bit(1) NOT NULL, + `modified` datetime(6) DEFAULT NULL, + `version` bigint(20) DEFAULT NULL, + `domain` varchar(255) DEFAULT NULL, + `editable` bit(1) NOT NULL, + `filterable` bit(1) NOT NULL, + `vocabulary_term_type` varchar(255) DEFAULT NULL, + `namespace_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `UK_ytqxax1bcj99cxs7tos6l26k` (`domain`), + KEY `fk68jp62s2i2745esqr9px9s5a2` (`namespace_id`), + CONSTRAINT `fk68jp62s2i2745esqr9px9s5a2` FOREIGN KEY (`namespace_id`) REFERENCES `ix_core_namespace` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_definition` +-- + +DROP TABLE IF EXISTS `ix_ginas_definition`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_definition` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `definition` longtext DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `fk4kcslc98jcqx137enxl5fgs5t` (`created_by_id`), + KEY `fk9wxg9p9i1bi7qoxfcu9gkg9og` (`last_edited_by_id`), + CONSTRAINT `fk4kcslc98jcqx137enxl5fgs5t` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fk9wxg9p9i1bi7qoxfcu9gkg9og` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_glycosylation` +-- + +DROP TABLE IF EXISTS `ix_ginas_glycosylation`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_glycosylation` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `glycosylation_type` varchar(255) DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + `c_glycosylation_sites_uuid` varchar(40) DEFAULT NULL, + `n_glycosylation_sites_uuid` varchar(40) DEFAULT NULL, + `o_glycosylation_sites_uuid` varchar(40) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `fk6dapjdumuglm11xxawpupefqm` (`created_by_id`), + KEY `fkpglm1avjx8n78aom78j3ju3bf` (`last_edited_by_id`), + KEY `fkqiim2s89ddjuxbkhpv3xa023j` (`c_glycosylation_sites_uuid`), + KEY `fkffabrw84stgayaui9g1a4wk1g` (`n_glycosylation_sites_uuid`), + KEY `fkmt1ufykgpny0dlxj36h6tgxwr` (`o_glycosylation_sites_uuid`), + CONSTRAINT `fk6dapjdumuglm11xxawpupefqm` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkffabrw84stgayaui9g1a4wk1g` FOREIGN KEY (`n_glycosylation_sites_uuid`) REFERENCES `ix_ginas_site_lob` (`uuid`), + CONSTRAINT `fkmt1ufykgpny0dlxj36h6tgxwr` FOREIGN KEY (`o_glycosylation_sites_uuid`) REFERENCES `ix_ginas_site_lob` (`uuid`), + CONSTRAINT `fkpglm1avjx8n78aom78j3ju3bf` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkqiim2s89ddjuxbkhpv3xa023j` FOREIGN KEY (`c_glycosylation_sites_uuid`) REFERENCES `ix_ginas_site_lob` (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_linkage` +-- + +DROP TABLE IF EXISTS `ix_ginas_linkage`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_linkage` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `linkage` varchar(255) DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + `owner_uuid` varchar(40) DEFAULT NULL, + `site_container_uuid` varchar(40) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `fkq619bp0y4e8y3c6efgyp2k8ux` (`created_by_id`), + KEY `fkfctm6wmaejthxy8y5gtbaqd80` (`last_edited_by_id`), + KEY `fkotqo99g96i7epg4s384xushll` (`owner_uuid`), + KEY `fkaao7lfx6xsyc4l1cpmsga4vre` (`site_container_uuid`), + CONSTRAINT `fkaao7lfx6xsyc4l1cpmsga4vre` FOREIGN KEY (`site_container_uuid`) REFERENCES `ix_ginas_site_lob` (`uuid`), + CONSTRAINT `fkfctm6wmaejthxy8y5gtbaqd80` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkotqo99g96i7epg4s384xushll` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_nucleicacid` (`uuid`), + CONSTRAINT `fkq619bp0y4e8y3c6efgyp2k8ux` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_material` +-- + +DROP TABLE IF EXISTS `ix_ginas_material`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_material` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `defining` bit(1) DEFAULT NULL, + `type` varchar(255) DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + `amount_uuid` varchar(40) DEFAULT NULL, + `monomer_substance_uuid` varchar(40) DEFAULT NULL, + `owner_uuid` varchar(40) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `fk6ts531mold2ibya0c038hebea` (`created_by_id`), + KEY `fkpab2df5aaru3riy5vxd86uve3` (`last_edited_by_id`), + KEY `fkipvr7dsgmt37oig421t41o385` (`amount_uuid`), + KEY `fkegxevel4526aib74sesmtu25e` (`monomer_substance_uuid`), + KEY `fkuvsb9isctq5ela0dqy2hhwti` (`owner_uuid`), + CONSTRAINT `fk6ts531mold2ibya0c038hebea` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkegxevel4526aib74sesmtu25e` FOREIGN KEY (`monomer_substance_uuid`) REFERENCES `ix_ginas_substanceref` (`uuid`), + CONSTRAINT `fkipvr7dsgmt37oig421t41o385` FOREIGN KEY (`amount_uuid`) REFERENCES `ix_ginas_amount` (`uuid`), + CONSTRAINT `fkpab2df5aaru3riy5vxd86uve3` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkuvsb9isctq5ela0dqy2hhwti` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_polymer` (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_mixture` +-- + +DROP TABLE IF EXISTS `ix_ginas_mixture`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_mixture` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + `parent_substance_uuid` varchar(40) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `fk4tqay4hgaqpm3sq8rx9184jat` (`created_by_id`), + KEY `fkjfwb6hqmtuoadhdx7wpkhxaju` (`last_edited_by_id`), + KEY `fko0yqo20vk9l8tqybgp75o23km` (`parent_substance_uuid`), + CONSTRAINT `fk4tqay4hgaqpm3sq8rx9184jat` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkjfwb6hqmtuoadhdx7wpkhxaju` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fko0yqo20vk9l8tqybgp75o23km` FOREIGN KEY (`parent_substance_uuid`) REFERENCES `ix_ginas_substanceref` (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_modifications` +-- + +DROP TABLE IF EXISTS `ix_ginas_modifications`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_modifications` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `fknt72fojjxifrwa7bfwjw8cpm5` (`created_by_id`), + KEY `fkpod9b4pm2tw1e4llfvayoivw4` (`last_edited_by_id`), + CONSTRAINT `fknt72fojjxifrwa7bfwjw8cpm5` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkpod9b4pm2tw1e4llfvayoivw4` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_moiety` +-- + +DROP TABLE IF EXISTS `ix_ginas_moiety`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_moiety` ( + `inner_uuid` varchar(255) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `uuid` varchar(40) DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + `count_uuid` varchar(40) DEFAULT NULL, + `owner_uuid` varchar(40) DEFAULT NULL, + `structure_id` varchar(40) DEFAULT NULL, + PRIMARY KEY (`inner_uuid`), + UNIQUE KEY `UK_8cr4axbsithvjxcfhnltaejsp` (`uuid`), + KEY `moiety_owner_index` (`owner_uuid`), + KEY `fkkw3ljg8rkiv07pcn0o0n3o02a` (`created_by_id`), + KEY `fk3a5dgbi1pmatnvuta5a4wy3aq` (`last_edited_by_id`), + KEY `fkf0mktcfnu1ly1x7ubmf41lh2n` (`count_uuid`), + KEY `fkc3r993grtkv5al4opvpv554ga` (`structure_id`), + CONSTRAINT `fk3a5dgbi1pmatnvuta5a4wy3aq` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fk8olyp6rpiq8yxtuk3mxsnbels` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_substance` (`uuid`), + CONSTRAINT `fkc3r993grtkv5al4opvpv554ga` FOREIGN KEY (`structure_id`) REFERENCES `ix_core_structure` (`id`), + CONSTRAINT `fkf0mktcfnu1ly1x7ubmf41lh2n` FOREIGN KEY (`count_uuid`) REFERENCES `ix_ginas_amount` (`uuid`), + CONSTRAINT `fkkw3ljg8rkiv07pcn0o0n3o02a` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_name` +-- + +DROP TABLE IF EXISTS `ix_ginas_name`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_name` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `display_name` bit(1) NOT NULL, + `domains` longtext DEFAULT NULL, + `full_name` longtext DEFAULT NULL, + `languages` longtext DEFAULT NULL, + `name` varchar(1024) NOT NULL, + `name_jurisdiction` longtext DEFAULT NULL, + `preferred` bit(1) NOT NULL, + `std_name` longtext DEFAULT NULL, + `type` varchar(32) DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + `owner_uuid` varchar(40) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `name_index` (`name`(768)), + KEY `name_owner_index` (`owner_uuid`), + KEY `fklhhdrsy7v2qr1amwmw0981mv2` (`created_by_id`), + KEY `fkgwls3gldgeqmgliev3kcvhjml` (`last_edited_by_id`), + CONSTRAINT `fkeqm42ow1b2o1c3uhu3d1k2efm` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_substance` (`uuid`), + CONSTRAINT `fkgwls3gldgeqmgliev3kcvhjml` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fklhhdrsy7v2qr1amwmw0981mv2` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_nameorg` +-- + +DROP TABLE IF EXISTS `ix_ginas_nameorg`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_nameorg` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `deprecated_date` datetime(6) DEFAULT NULL, + `name_org` varchar(255) NOT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + `owner_uuid` varchar(40) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `nameorg_owner_index` (`owner_uuid`), + KEY `fkk77bj1lax07ocd00s3sfmn6ot` (`created_by_id`), + KEY `fkm5w47bga21kw55x56q7jbbguj` (`last_edited_by_id`), + CONSTRAINT `fkk77bj1lax07ocd00s3sfmn6ot` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkm5w47bga21kw55x56q7jbbguj` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkqtmeq2vb6siyu40vxnw4c8vq` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_name` (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_note` +-- + +DROP TABLE IF EXISTS `ix_ginas_note`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_note` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `note` longtext DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + `owner_uuid` varchar(40) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `note_owner_index` (`owner_uuid`), + KEY `fkge1aq2fv84ucy1ilwx97vpuwu` (`created_by_id`), + KEY `fkpg2o4yxwwlbbw1rro1c5df60` (`last_edited_by_id`), + CONSTRAINT `fkge1aq2fv84ucy1ilwx97vpuwu` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkj3nrt8342rqojj5d4k24w5tgm` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_substance` (`uuid`), + CONSTRAINT `fkpg2o4yxwwlbbw1rro1c5df60` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_nucleicacid` +-- + +DROP TABLE IF EXISTS `ix_ginas_nucleicacid`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_nucleicacid` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `nucleic_acid_sub_type` varchar(255) DEFAULT NULL, + `nucleic_acid_type` varchar(255) DEFAULT NULL, + `sequence_origin` varchar(255) DEFAULT NULL, + `sequence_type` varchar(255) DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + `modifications_uuid` varchar(40) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `fkm9yv3dunytjgyjfiq6r503lyr` (`created_by_id`), + KEY `fk6jk9rw9co4676wg98pvseggxc` (`last_edited_by_id`), + KEY `fkck0ay4di4y12vsqd9gqw4qh4b` (`modifications_uuid`), + CONSTRAINT `fk6jk9rw9co4676wg98pvseggxc` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkck0ay4di4y12vsqd9gqw4qh4b` FOREIGN KEY (`modifications_uuid`) REFERENCES `ix_ginas_modifications` (`uuid`), + CONSTRAINT `fkm9yv3dunytjgyjfiq6r503lyr` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_nucleicacid_subunits` +-- + +DROP TABLE IF EXISTS `ix_ginas_nucleicacid_subunits`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_nucleicacid_subunits` ( + `ix_ginas_nucleicacid_uuid` varchar(40) NOT NULL, + `ix_ginas_subunit_uuid` varchar(40) NOT NULL, + KEY `fkjun57ycd07jv8oe3h8566r488` (`ix_ginas_subunit_uuid`), + KEY `fkdby8ustw4fo38x6e98cg814td` (`ix_ginas_nucleicacid_uuid`), + CONSTRAINT `fkdby8ustw4fo38x6e98cg814td` FOREIGN KEY (`ix_ginas_nucleicacid_uuid`) REFERENCES `ix_ginas_nucleicacid` (`uuid`), + CONSTRAINT `fkjun57ycd07jv8oe3h8566r488` FOREIGN KEY (`ix_ginas_subunit_uuid`) REFERENCES `ix_ginas_subunit` (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_otherlinks` +-- + +DROP TABLE IF EXISTS `ix_ginas_otherlinks`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_otherlinks` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `linkage_type` varchar(255) DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + `owner_uuid` varchar(40) DEFAULT NULL, + `site_container_uuid` varchar(40) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `fk9sukhdr4s0yje92m8hp82hitx` (`created_by_id`), + KEY `fkigwh0j2irewbpsb1xgael3pim` (`last_edited_by_id`), + KEY `fkdub4td7p5ki0u4dl83j4u9ysr` (`owner_uuid`), + KEY `fk5nj85bcu54jc56se3hm4q3chm` (`site_container_uuid`), + CONSTRAINT `fk5nj85bcu54jc56se3hm4q3chm` FOREIGN KEY (`site_container_uuid`) REFERENCES `ix_ginas_site_lob` (`uuid`), + CONSTRAINT `fk9sukhdr4s0yje92m8hp82hitx` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkdub4td7p5ki0u4dl83j4u9ysr` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_protein` (`uuid`), + CONSTRAINT `fkigwh0j2irewbpsb1xgael3pim` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_parameter` +-- + +DROP TABLE IF EXISTS `ix_ginas_parameter`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_parameter` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `name` varchar(255) NOT NULL, + `type` varchar(255) DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + `owner_uuid` varchar(40) DEFAULT NULL, + `referenced_substance_uuid` varchar(40) DEFAULT NULL, + `value_uuid` varchar(40) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `fklbuqth4cgx61sh4rcci2mdl1o` (`created_by_id`), + KEY `fklj93g1oplslasut6r924dft2l` (`last_edited_by_id`), + KEY `fk9ixg1ch1e0hueyta2dh4vlidg` (`owner_uuid`), + KEY `fkdxnyu34iqqponnw4bnj9hk8rb` (`referenced_substance_uuid`), + KEY `fkix1d880p7x7v51quhcre616af` (`value_uuid`), + CONSTRAINT `fk9ixg1ch1e0hueyta2dh4vlidg` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_property` (`uuid`), + CONSTRAINT `fkdxnyu34iqqponnw4bnj9hk8rb` FOREIGN KEY (`referenced_substance_uuid`) REFERENCES `ix_ginas_substanceref` (`uuid`), + CONSTRAINT `fkix1d880p7x7v51quhcre616af` FOREIGN KEY (`value_uuid`) REFERENCES `ix_ginas_amount` (`uuid`), + CONSTRAINT `fklbuqth4cgx61sh4rcci2mdl1o` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fklj93g1oplslasut6r924dft2l` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_physicalmod` +-- + +DROP TABLE IF EXISTS `ix_ginas_physicalmod`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_physicalmod` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `modification_group` varchar(255) DEFAULT NULL, + `physical_modification_role` varchar(255) DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + `owner_uuid` varchar(40) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `fk32ojpkiiy03fk8ro0eyclrbkh` (`created_by_id`), + KEY `fk23yuiouuyqodtlxmjxopv0ybf` (`last_edited_by_id`), + KEY `fkd8fg9mm0ilkfdii08s5qsonde` (`owner_uuid`), + CONSTRAINT `fk23yuiouuyqodtlxmjxopv0ybf` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fk32ojpkiiy03fk8ro0eyclrbkh` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkd8fg9mm0ilkfdii08s5qsonde` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_modifications` (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_physicalpar` +-- + +DROP TABLE IF EXISTS `ix_ginas_physicalpar`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_physicalpar` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `parameter_name` varchar(255) DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + `amount_uuid` varchar(40) DEFAULT NULL, + `owner_uuid` varchar(40) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `fkrfgl3mys5n5wiknd32enb7hmb` (`created_by_id`), + KEY `fkd1w1xyqt12divo39phpoi2113` (`last_edited_by_id`), + KEY `fk4ce1vbnehe206ru4gctnlkidh` (`amount_uuid`), + KEY `fk1e30fjxi7rv1m875713tges77` (`owner_uuid`), + CONSTRAINT `fk1e30fjxi7rv1m875713tges77` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_physicalmod` (`uuid`), + CONSTRAINT `fk4ce1vbnehe206ru4gctnlkidh` FOREIGN KEY (`amount_uuid`) REFERENCES `ix_ginas_amount` (`uuid`), + CONSTRAINT `fkd1w1xyqt12divo39phpoi2113` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkrfgl3mys5n5wiknd32enb7hmb` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_polymer` +-- + +DROP TABLE IF EXISTS `ix_ginas_polymer`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_polymer` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + `classification_uuid` varchar(40) DEFAULT NULL, + `display_structure_id` varchar(40) DEFAULT NULL, + `idealized_structure_id` varchar(40) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `fk8axkm0cbpwpc43krkhw8y6tad` (`created_by_id`), + KEY `fk5o81f597yvub0mf1b6cnqx8ev` (`last_edited_by_id`), + KEY `fktn8tft3hwqnpv8tkfhtbh5jsm` (`classification_uuid`), + KEY `fkcd56mdyyo9bvrrd80w0y8iixl` (`display_structure_id`), + KEY `fk264hsvr9c8q3w1e51j99ua2d0` (`idealized_structure_id`), + CONSTRAINT `fk264hsvr9c8q3w1e51j99ua2d0` FOREIGN KEY (`idealized_structure_id`) REFERENCES `ix_core_structure` (`id`), + CONSTRAINT `fk5o81f597yvub0mf1b6cnqx8ev` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fk8axkm0cbpwpc43krkhw8y6tad` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkcd56mdyyo9bvrrd80w0y8iixl` FOREIGN KEY (`display_structure_id`) REFERENCES `ix_core_structure` (`id`), + CONSTRAINT `fktn8tft3hwqnpv8tkfhtbh5jsm` FOREIGN KEY (`classification_uuid`) REFERENCES `polymer_classification` (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_property` +-- + +DROP TABLE IF EXISTS `ix_ginas_property`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_property` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `defining` bit(1) DEFAULT NULL, + `name` varchar(255) NOT NULL, + `property_type` varchar(255) DEFAULT NULL, + `type` varchar(255) DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + `owner_uuid` varchar(40) DEFAULT NULL, + `referenced_substance_uuid` varchar(40) DEFAULT NULL, + `value_uuid` varchar(40) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `property_owner_index` (`owner_uuid`), + KEY `fktla10hxba7smca0g675soamsq` (`created_by_id`), + KEY `fkafltirwo87s1so6vigtf1s8mn` (`last_edited_by_id`), + KEY `fkoh8nhvrowpdthcxj69pwkke9t` (`referenced_substance_uuid`), + KEY `fkpbekqdofak8ol2fq92f5onn1t` (`value_uuid`), + CONSTRAINT `fkafltirwo87s1so6vigtf1s8mn` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkoh8nhvrowpdthcxj69pwkke9t` FOREIGN KEY (`referenced_substance_uuid`) REFERENCES `ix_ginas_substanceref` (`uuid`), + CONSTRAINT `fkpbekqdofak8ol2fq92f5onn1t` FOREIGN KEY (`value_uuid`) REFERENCES `ix_ginas_amount` (`uuid`), + CONSTRAINT `fkrlu3e72lq9y59122xd75q51vt` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_substance` (`uuid`), + CONSTRAINT `fktla10hxba7smca0g675soamsq` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_protein` +-- + +DROP TABLE IF EXISTS `ix_ginas_protein`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_protein` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `disulf_json` longtext DEFAULT NULL, + `protein_sub_type` varchar(255) DEFAULT NULL, + `protein_type` varchar(255) DEFAULT NULL, + `sequence_origin` varchar(255) DEFAULT NULL, + `sequence_type` varchar(255) DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + `glycosylation_uuid` varchar(40) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `fk6ay15bqty5r2xmk13a4ld75rm` (`created_by_id`), + KEY `fkpovxe3t3ycsa1x6xivr20ukbh` (`last_edited_by_id`), + KEY `fkec7ms0paeosyymbpsnbu5pjfb` (`glycosylation_uuid`), + CONSTRAINT `fk6ay15bqty5r2xmk13a4ld75rm` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkec7ms0paeosyymbpsnbu5pjfb` FOREIGN KEY (`glycosylation_uuid`) REFERENCES `ix_ginas_glycosylation` (`uuid`), + CONSTRAINT `fkpovxe3t3ycsa1x6xivr20ukbh` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_protein_subunit` +-- + +DROP TABLE IF EXISTS `ix_ginas_protein_subunit`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_protein_subunit` ( + `ix_ginas_protein_uuid` varchar(40) NOT NULL, + `ix_ginas_subunit_uuid` varchar(40) NOT NULL, + KEY `fklk7qxuwt9o7g8k6rphr5jj7ey` (`ix_ginas_subunit_uuid`), + KEY `fk39xyg6fxghld06apb91xc1xt6` (`ix_ginas_protein_uuid`), + CONSTRAINT `fk39xyg6fxghld06apb91xc1xt6` FOREIGN KEY (`ix_ginas_protein_uuid`) REFERENCES `ix_ginas_protein` (`uuid`), + CONSTRAINT `fklk7qxuwt9o7g8k6rphr5jj7ey` FOREIGN KEY (`ix_ginas_subunit_uuid`) REFERENCES `ix_ginas_subunit` (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_reference` +-- + +DROP TABLE IF EXISTS `ix_ginas_reference`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_reference` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `citation` longtext DEFAULT NULL, + `doc_type` varchar(255) DEFAULT NULL, + `document_date` datetime(6) DEFAULT NULL, + `id` varchar(255) DEFAULT NULL, + `public_domain` bit(1) NOT NULL, + `tags` longtext DEFAULT NULL, + `uploaded_file` varchar(1024) DEFAULT NULL, + `url` longtext DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + `owner_uuid` varchar(40) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `ref_id_index` (`id`), + KEY `ref_owner_index` (`owner_uuid`), + KEY `fkpv1epn9el8d1fpqct4px1nio7` (`created_by_id`), + KEY `fk975dqn3b674b23ga0igmmct25` (`last_edited_by_id`), + CONSTRAINT `fk975dqn3b674b23ga0igmmct25` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkk7kui3q4qm7pwdq679ibkyi5h` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_substance` (`uuid`), + CONSTRAINT `fkpv1epn9el8d1fpqct4px1nio7` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_relationship` +-- + +DROP TABLE IF EXISTS `ix_ginas_relationship`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_relationship` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `comments` longtext DEFAULT NULL, + `interaction_type` varchar(255) DEFAULT NULL, + `originator_uuid` varchar(255) DEFAULT NULL, + `qualification` varchar(255) DEFAULT NULL, + `type` varchar(255) DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + `amount_uuid` varchar(40) DEFAULT NULL, + `mediator_substance_uuid` varchar(40) DEFAULT NULL, + `owner_uuid` varchar(40) DEFAULT NULL, + `related_substance_uuid` varchar(40) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `interaction_index` (`interaction_type`), + KEY `qualification_index` (`qualification`), + KEY `type_index` (`type`), + KEY `relate_originate_index` (`originator_uuid`), + KEY `rel_owner_index` (`owner_uuid`), + KEY `fk70gmjxu8uevujxd4uetj6nfm3` (`created_by_id`), + KEY `fkmsd9lm6ayae7qbwp1iv50ftbb` (`last_edited_by_id`), + KEY `fk492eul84p3uecmkpqmd8ujvkb` (`amount_uuid`), + KEY `fksim8mqlrevhpl0aa0hrdh3wwe` (`mediator_substance_uuid`), + KEY `fkb6yhrsc7dprxg0apyknpue5ij` (`related_substance_uuid`), + CONSTRAINT `fk492eul84p3uecmkpqmd8ujvkb` FOREIGN KEY (`amount_uuid`) REFERENCES `ix_ginas_amount` (`uuid`), + CONSTRAINT `fk70gmjxu8uevujxd4uetj6nfm3` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkb6yhrsc7dprxg0apyknpue5ij` FOREIGN KEY (`related_substance_uuid`) REFERENCES `ix_ginas_substanceref` (`uuid`), + CONSTRAINT `fkmsd9lm6ayae7qbwp1iv50ftbb` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkr1msd0rheudj2srgokqrftrek` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_substance` (`uuid`), + CONSTRAINT `fksim8mqlrevhpl0aa0hrdh3wwe` FOREIGN KEY (`mediator_substance_uuid`) REFERENCES `ix_ginas_substanceref` (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_site_lob` +-- + +DROP TABLE IF EXISTS `ix_ginas_site_lob`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_site_lob` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `site_count` bigint(20) NOT NULL, + `site_type` varchar(255) DEFAULT NULL, + `sites_json` longtext DEFAULT NULL, + `sites_short_hand` longtext DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `fkfbc7le8ehsxj39t2yikmmy3py` (`created_by_id`), + KEY `fkh2cg1v3f9ha8t0w4l8iprib2g` (`last_edited_by_id`), + CONSTRAINT `fkfbc7le8ehsxj39t2yikmmy3py` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkh2cg1v3f9ha8t0w4l8iprib2g` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_ssg1` +-- + +DROP TABLE IF EXISTS `ix_ginas_ssg1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_ssg1` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `fk3tljtp4q2e94j2q27hgnnhse4` (`created_by_id`), + KEY `fkle7gsf4fuf75tsrvksgvkjc25` (`last_edited_by_id`), + CONSTRAINT `fk3tljtp4q2e94j2q27hgnnhse4` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkle7gsf4fuf75tsrvksgvkjc25` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_strucdiv` +-- + +DROP TABLE IF EXISTS `ix_ginas_strucdiv`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_strucdiv` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `developmental_stage` varchar(255) DEFAULT NULL, + `fraction_material_type` varchar(255) DEFAULT NULL, + `fraction_name` varchar(255) DEFAULT NULL, + `infra_specific_name` varchar(255) DEFAULT NULL, + `infra_specific_type` varchar(255) DEFAULT NULL, + `organism_author` varchar(255) DEFAULT NULL, + `organism_family` varchar(255) DEFAULT NULL, + `organism_genus` varchar(255) DEFAULT NULL, + `organism_species` varchar(255) DEFAULT NULL, + `part` longtext DEFAULT NULL, + `part_location` varchar(255) DEFAULT NULL, + `source_material_class` varchar(255) DEFAULT NULL, + `source_material_state` varchar(255) DEFAULT NULL, + `source_material_type` varchar(255) DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + `maternal_uuid` varchar(40) DEFAULT NULL, + `paternal_uuid` varchar(40) DEFAULT NULL, + `parent_substance_uuid` varchar(40) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `fkqpk4af5q91r4nsm521kd57298` (`created_by_id`), + KEY `fk4epq4o38ci57y71dxu7ootl41` (`last_edited_by_id`), + KEY `fkhh72pwq35aaqgv370uavhtnjh` (`maternal_uuid`), + KEY `fk6lcu1945kbaxi6fmir3qt5ugk` (`paternal_uuid`), + KEY `fk27p7qapsxr5d2efscf8k7521` (`parent_substance_uuid`), + CONSTRAINT `fk27p7qapsxr5d2efscf8k7521` FOREIGN KEY (`parent_substance_uuid`) REFERENCES `ix_ginas_substanceref` (`uuid`), + CONSTRAINT `fk4epq4o38ci57y71dxu7ootl41` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fk6lcu1945kbaxi6fmir3qt5ugk` FOREIGN KEY (`paternal_uuid`) REFERENCES `ix_ginas_substanceref` (`uuid`), + CONSTRAINT `fkhh72pwq35aaqgv370uavhtnjh` FOREIGN KEY (`maternal_uuid`) REFERENCES `ix_ginas_substanceref` (`uuid`), + CONSTRAINT `fkqpk4af5q91r4nsm521kd57298` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_structuralmod` +-- + +DROP TABLE IF EXISTS `ix_ginas_structuralmod`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_structuralmod` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `extent` varchar(255) DEFAULT NULL, + `location_type` varchar(255) DEFAULT NULL, + `modification_group` varchar(255) DEFAULT NULL, + `moleculare_fragment_role` varchar(255) DEFAULT NULL, + `residue_modified` varchar(255) DEFAULT NULL, + `structural_modification_type` varchar(255) DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + `extent_amount_uuid` varchar(40) DEFAULT NULL, + `molecular_fragment_uuid` varchar(40) DEFAULT NULL, + `owner_uuid` varchar(40) DEFAULT NULL, + `site_container_uuid` varchar(40) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `fkndd0pxjud610e953hg730emw` (`created_by_id`), + KEY `fk1ysjs1dx6uo8flj8rkiscscx4` (`last_edited_by_id`), + KEY `fktkmtm9vpmaklmypp3jad1pspp` (`extent_amount_uuid`), + KEY `fk6n3mtotuwqi717fr2evp3dfxi` (`molecular_fragment_uuid`), + KEY `fkoi4vt2lg0x2v3s4urckwjb3s3` (`owner_uuid`), + KEY `fkb94sjca6cclvcwtx2osvdeuu` (`site_container_uuid`), + CONSTRAINT `fk1ysjs1dx6uo8flj8rkiscscx4` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fk6n3mtotuwqi717fr2evp3dfxi` FOREIGN KEY (`molecular_fragment_uuid`) REFERENCES `ix_ginas_substanceref` (`uuid`), + CONSTRAINT `fkb94sjca6cclvcwtx2osvdeuu` FOREIGN KEY (`site_container_uuid`) REFERENCES `ix_ginas_site_lob` (`uuid`), + CONSTRAINT `fkndd0pxjud610e953hg730emw` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkoi4vt2lg0x2v3s4urckwjb3s3` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_modifications` (`uuid`), + CONSTRAINT `fktkmtm9vpmaklmypp3jad1pspp` FOREIGN KEY (`extent_amount_uuid`) REFERENCES `ix_ginas_amount` (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_substance` +-- + +DROP TABLE IF EXISTS `ix_ginas_substance`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_substance` ( + `DTYPE` varchar(31) NOT NULL, + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `approval_id` varchar(20) DEFAULT NULL, + `approved` datetime(6) DEFAULT NULL, + `change_reason` varchar(255) DEFAULT NULL, + `definition_level` int(11) DEFAULT NULL, + `definition_type` int(11) DEFAULT NULL, + `status` varchar(255) DEFAULT NULL, + `class` int(11) DEFAULT NULL, + `version` varchar(255) DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + `approved_by_id` bigint(20) DEFAULT NULL, + `modifications_uuid` varchar(40) DEFAULT NULL, + `structure_id` varchar(40) DEFAULT NULL, + `specified_substance_uuid` varchar(40) DEFAULT NULL, + `nucleic_acid_uuid` varchar(40) DEFAULT NULL, + `polymer_uuid` varchar(40) DEFAULT NULL, + `structurally_diverse_uuid` varchar(40) DEFAULT NULL, + `protein_uuid` varchar(40) DEFAULT NULL, + `mixture_uuid` varchar(40) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `sub_approval_index` (`approval_id`), + KEY `sub_dtype_index` (`DTYPE`), + KEY `fka9b6lpf9y3l0t04rviskjs8o1` (`created_by_id`), + KEY `fk9hlo5n1alfg4rgloypq8agc3e` (`last_edited_by_id`), + KEY `fkmb0vxvmui506xtkh18lw1ucym` (`approved_by_id`), + KEY `fk30b2jg1r8dr4ibvt3f4h7ui3b` (`modifications_uuid`), + KEY `fkau9cajhw1nffg9w1vh0am4ls4` (`structure_id`), + KEY `fkd29meikxu3elfx1w5dket3ia5` (`specified_substance_uuid`), + KEY `fk8lglxcodtpv6nj0wbw61cpdk9` (`nucleic_acid_uuid`), + KEY `fkncdqbv3ilcg21bws3e3y0xwg4` (`polymer_uuid`), + KEY `fkhrs798kf99tmayeg8hjbo9vdl` (`structurally_diverse_uuid`), + KEY `fkcw3qqer4es16onh3qgcuf6jb8` (`protein_uuid`), + KEY `fkekk08a5uheng9eocf61xo4m2l` (`mixture_uuid`), + CONSTRAINT `fk30b2jg1r8dr4ibvt3f4h7ui3b` FOREIGN KEY (`modifications_uuid`) REFERENCES `ix_ginas_modifications` (`uuid`), + CONSTRAINT `fk8lglxcodtpv6nj0wbw61cpdk9` FOREIGN KEY (`nucleic_acid_uuid`) REFERENCES `ix_ginas_nucleicacid` (`uuid`), + CONSTRAINT `fk9hlo5n1alfg4rgloypq8agc3e` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fka9b6lpf9y3l0t04rviskjs8o1` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkau9cajhw1nffg9w1vh0am4ls4` FOREIGN KEY (`structure_id`) REFERENCES `ix_core_structure` (`id`), + CONSTRAINT `fkcw3qqer4es16onh3qgcuf6jb8` FOREIGN KEY (`protein_uuid`) REFERENCES `ix_ginas_protein` (`uuid`), + CONSTRAINT `fkd29meikxu3elfx1w5dket3ia5` FOREIGN KEY (`specified_substance_uuid`) REFERENCES `ix_ginas_ssg1` (`uuid`), + CONSTRAINT `fkekk08a5uheng9eocf61xo4m2l` FOREIGN KEY (`mixture_uuid`) REFERENCES `ix_ginas_mixture` (`uuid`), + CONSTRAINT `fkhrs798kf99tmayeg8hjbo9vdl` FOREIGN KEY (`structurally_diverse_uuid`) REFERENCES `ix_ginas_strucdiv` (`uuid`), + CONSTRAINT `fkmb0vxvmui506xtkh18lw1ucym` FOREIGN KEY (`approved_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkncdqbv3ilcg21bws3e3y0xwg4` FOREIGN KEY (`polymer_uuid`) REFERENCES `ix_ginas_polymer` (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_substance_mix_comp` +-- + +DROP TABLE IF EXISTS `ix_ginas_substance_mix_comp`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_substance_mix_comp` ( + `ix_ginas_mixture_uuid` varchar(40) NOT NULL, + `ix_ginas_component_uuid` varchar(40) NOT NULL, + KEY `fkjsfcmh12rru7tls24cbkbmb0t` (`ix_ginas_component_uuid`), + KEY `fkpubptahgdm25hadwlf3pwlfap` (`ix_ginas_mixture_uuid`), + CONSTRAINT `fkjsfcmh12rru7tls24cbkbmb0t` FOREIGN KEY (`ix_ginas_component_uuid`) REFERENCES `ix_ginas_component` (`uuid`), + CONSTRAINT `fkpubptahgdm25hadwlf3pwlfap` FOREIGN KEY (`ix_ginas_mixture_uuid`) REFERENCES `ix_ginas_mixture` (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_substance_ss_comp` +-- + +DROP TABLE IF EXISTS `ix_ginas_substance_ss_comp`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_substance_ss_comp` ( + `ix_ginas_ssg1_uuid` varchar(40) NOT NULL, + `ix_ginas_component_uuid` varchar(40) NOT NULL, + KEY `fkb8ofx08elpr455o7a72rrr9tm` (`ix_ginas_component_uuid`), + KEY `fkaf57kow6qnxnp2ya35n21jiyo` (`ix_ginas_ssg1_uuid`), + CONSTRAINT `fkaf57kow6qnxnp2ya35n21jiyo` FOREIGN KEY (`ix_ginas_ssg1_uuid`) REFERENCES `ix_ginas_ssg1` (`uuid`), + CONSTRAINT `fkb8ofx08elpr455o7a72rrr9tm` FOREIGN KEY (`ix_ginas_component_uuid`) REFERENCES `ix_ginas_component` (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_substance_tags` +-- + +DROP TABLE IF EXISTS `ix_ginas_substance_tags`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_substance_tags` ( + `ix_ginas_substance_uuid` varchar(40) NOT NULL, + `ix_core_value_id` bigint(20) NOT NULL, + KEY `fkjlsvy9nlwl3vf5mvhcvf0y80k` (`ix_core_value_id`), + KEY `fk2hyjvdeqia2qiemoagh6yjq6b` (`ix_ginas_substance_uuid`), + CONSTRAINT `fk2hyjvdeqia2qiemoagh6yjq6b` FOREIGN KEY (`ix_ginas_substance_uuid`) REFERENCES `ix_ginas_substance` (`uuid`), + CONSTRAINT `fkjlsvy9nlwl3vf5mvhcvf0y80k` FOREIGN KEY (`ix_core_value_id`) REFERENCES `ix_core_value` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_substanceref` +-- + +DROP TABLE IF EXISTS `ix_ginas_substanceref`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_substanceref` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `approval_ID` varchar(32) DEFAULT NULL, + `ref_pname` varchar(1024) DEFAULT NULL, + `refuuid` varchar(128) DEFAULT NULL, + `substance_class` varchar(255) DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `sub_ref_index` (`refuuid`), + KEY `fko2bjxrp2qi847appx7ecf65vc` (`created_by_id`), + KEY `fkm6qbi1moehd7wqh9w2ip412us` (`last_edited_by_id`), + CONSTRAINT `fkm6qbi1moehd7wqh9w2ip412us` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fko2bjxrp2qi847appx7ecf65vc` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_subunit` +-- + +DROP TABLE IF EXISTS `ix_ginas_subunit`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_subunit` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `sequence` longtext DEFAULT NULL, + `subunit_index` int(11) DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `fk7kjfdjus3twoyg4vd2jp367n6` (`created_by_id`), + KEY `fk9pyegqu1n4ekd45fdmitw12t7` (`last_edited_by_id`), + CONSTRAINT `fk7kjfdjus3twoyg4vd2jp367n6` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fk9pyegqu1n4ekd45fdmitw12t7` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_sugar` +-- + +DROP TABLE IF EXISTS `ix_ginas_sugar`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_sugar` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `sugar` varchar(255) DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + `owner_uuid` varchar(40) DEFAULT NULL, + `site_container_uuid` varchar(40) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `fke6ndxx94bjimsgux4lygsh51f` (`created_by_id`), + KEY `fk1p4pfd811kxxjqfxbiuu9sknv` (`last_edited_by_id`), + KEY `fkkx0aeyak8r0byugf719kqu7ms` (`owner_uuid`), + KEY `fkpx5dhn0168ipbpu04xgmby97y` (`site_container_uuid`), + CONSTRAINT `fk1p4pfd811kxxjqfxbiuu9sknv` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fke6ndxx94bjimsgux4lygsh51f` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkkx0aeyak8r0byugf719kqu7ms` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_nucleicacid` (`uuid`), + CONSTRAINT `fkpx5dhn0168ipbpu04xgmby97y` FOREIGN KEY (`site_container_uuid`) REFERENCES `ix_ginas_site_lob` (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_unit` +-- + +DROP TABLE IF EXISTS `ix_ginas_unit`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_unit` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `attachmentMap` longtext DEFAULT NULL, + `attachment_count` int(11) DEFAULT NULL, + `label` varchar(255) DEFAULT NULL, + `structure` longtext DEFAULT NULL, + `type` varchar(255) DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + `amap_id` bigint(20) DEFAULT NULL, + `amount_uuid` varchar(40) DEFAULT NULL, + `owner_uuid` varchar(40) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `fkl4qe419byvtxe3epgd4a50glc` (`created_by_id`), + KEY `fknbsd63mfulnly1dtk7f6vxcq4` (`last_edited_by_id`), + KEY `fkq8b5gi5r7thxi8vyrli5lrtu2` (`amap_id`), + KEY `fk2x4h6n93ud35rtm5nxt7xrcmw` (`amount_uuid`), + KEY `fkf3rxpagehygabef32q3kn4am` (`owner_uuid`), + CONSTRAINT `fk2x4h6n93ud35rtm5nxt7xrcmw` FOREIGN KEY (`amount_uuid`) REFERENCES `ix_ginas_amount` (`uuid`), + CONSTRAINT `fkf3rxpagehygabef32q3kn4am` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_polymer` (`uuid`), + CONSTRAINT `fkl4qe419byvtxe3epgd4a50glc` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fknbsd63mfulnly1dtk7f6vxcq4` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkq8b5gi5r7thxi8vyrli5lrtu2` FOREIGN KEY (`amap_id`) REFERENCES `ix_core_value` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_ginas_vocabulary_term` +-- + +DROP TABLE IF EXISTS `ix_ginas_vocabulary_term`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_ginas_vocabulary_term` ( + `DTYPE` varchar(31) NOT NULL, + `id` bigint(20) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `deprecated` bit(1) NOT NULL, + `modified` datetime(6) DEFAULT NULL, + `version` bigint(20) DEFAULT NULL, + `description` varchar(4000) DEFAULT NULL, + `display` varchar(3000) DEFAULT NULL, + `filters` longtext DEFAULT NULL, + `hidden` bit(1) NOT NULL, + `origin` varchar(255) DEFAULT NULL, + `regex` varchar(3000) DEFAULT NULL, + `selected` bit(1) NOT NULL, + `term_value` varchar(3000) DEFAULT NULL, + `system_category` varchar(255) DEFAULT NULL, + `fragment_structure` varchar(255) DEFAULT NULL, + `simplified_structure` varchar(255) DEFAULT NULL, + `namespace_id` bigint(20) DEFAULT NULL, + `owner_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `vocabulary_term_owner_index` (`owner_id`), + KEY `fk3t5cvdqdtqn0eqc1654fbxhqt` (`namespace_id`), + CONSTRAINT `fk3t5cvdqdtqn0eqc1654fbxhqt` FOREIGN KEY (`namespace_id`) REFERENCES `ix_core_namespace` (`id`), + CONSTRAINT `fkbk04rq7l3tav8pey5rm2j14hm` FOREIGN KEY (`owner_id`) REFERENCES `ix_ginas_controlled_vocab` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_import_data` +-- + +DROP TABLE IF EXISTS `ix_import_data`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_import_data` ( + `instance_id` varchar(40) NOT NULL, + `data` longtext DEFAULT NULL, + `entity_class_name` varchar(255) DEFAULT NULL, + `record_id` varchar(40) DEFAULT NULL, + `save_date` datetime(6) DEFAULT NULL, + `version` int(11) NOT NULL, + PRIMARY KEY (`instance_id`), + KEY `idx_ix_import_data_entity_class_name` (`entity_class_name`), + KEY `idx_ix_import_data_version` (`version`), + KEY `idx_ix_import_data_record_id` (`record_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_import_mapping` +-- + +DROP TABLE IF EXISTS `ix_import_mapping`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_import_mapping` ( + `mapping_id` varchar(40) NOT NULL, + `data_location` varchar(255) DEFAULT NULL, + `entity_class` varchar(255) DEFAULT NULL, + `instance_id` varchar(40) DEFAULT NULL, + `mapping_key` varchar(255) DEFAULT NULL, + `qualifier` varchar(255) DEFAULT NULL, + `record_id` varchar(40) DEFAULT NULL, + `mapping_value` varchar(512) DEFAULT NULL, + PRIMARY KEY (`mapping_id`), + KEY `idx_ix_import_mapping_key` (`mapping_key`), + KEY `idx_ix_import_mapping_value` (`mapping_value`), + KEY `idx_ix_import_mapping_instance_id` (`instance_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_import_metadata` +-- + +DROP TABLE IF EXISTS `ix_import_metadata`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_import_metadata` ( + `record_id` varchar(40) NOT NULL, + `data_format` varchar(255) DEFAULT NULL, + `entity_class_name` varchar(255) DEFAULT NULL, + `import_adapter` varchar(255) DEFAULT NULL, + `import_status` int(11) DEFAULT NULL, + `import_type` int(11) DEFAULT NULL, + `instance_id` varchar(40) DEFAULT NULL, + `process_status` int(11) DEFAULT NULL, + `reason` varchar(255) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `source_name` varchar(255) DEFAULT NULL, + `validation_status` int(11) DEFAULT NULL, + `version` int(11) NOT NULL, + `version_creation_date` datetime(6) DEFAULT NULL, + `version_status` int(11) DEFAULT NULL, + `imported_by_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`record_id`), + UNIQUE KEY `UK_b3wth3q98eiauf3rngwjybxve` (`instance_id`), + KEY `idx_ix_import_metadata_entity_class_name` (`entity_class_name`), + KEY `fkn75dm5x09m6wvk7uq5q74do9c` (`imported_by_id`), + CONSTRAINT `fkn75dm5x09m6wvk7uq5q74do9c` FOREIGN KEY (`imported_by_id`) REFERENCES `ix_core_principal` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_import_raw` +-- + +DROP TABLE IF EXISTS `ix_import_raw`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_import_raw` ( + `record_id` varchar(40) NOT NULL, + `raw_data` longblob DEFAULT NULL, + `record_format` varchar(255) DEFAULT NULL, + PRIMARY KEY (`record_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ix_import_validation` +-- + +DROP TABLE IF EXISTS `ix_import_validation`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ix_import_validation` ( + `validation_id` varchar(40) NOT NULL, + `validation_date` datetime(6) DEFAULT NULL, + `validation_json` longtext DEFAULT NULL, + `validation_message` varchar(2048) DEFAULT NULL, + `validation_type` int(11) DEFAULT NULL, + `entity_class_name` varchar(255) DEFAULT NULL, + `instance_id` varchar(40) DEFAULT NULL, + `version` int(11) NOT NULL, + PRIMARY KEY (`validation_id`), + KEY `idx_ix_import_validation_entity_class_name` (`entity_class_name`), + KEY `idx_ix_import_validation_version` (`version`), + KEY `idx_ix_import_validation_instance_id` (`instance_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `polymer_classification` +-- + +DROP TABLE IF EXISTS `polymer_classification`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `polymer_classification` ( + `uuid` varchar(40) NOT NULL, + `created` datetime(6) DEFAULT NULL, + `current_version` int(11) NOT NULL, + `deprecated` bit(1) NOT NULL, + `internal_version` bigint(20) DEFAULT NULL, + `last_edited` datetime(6) DEFAULT NULL, + `record_access` mediumblob DEFAULT NULL, + `internal_references` longtext DEFAULT NULL, + `polymer_class` varchar(255) DEFAULT NULL, + `polymer_geometry` varchar(255) DEFAULT NULL, + `polymer_subclass` longtext DEFAULT NULL, + `source_type` varchar(255) DEFAULT NULL, + `created_by_id` bigint(20) DEFAULT NULL, + `last_edited_by_id` bigint(20) DEFAULT NULL, + `parent_substance_uuid` varchar(40) DEFAULT NULL, + PRIMARY KEY (`uuid`), + KEY `fk9tp2yhc5vdofsdnx5cit45hdy` (`created_by_id`), + KEY `fk6bup6ku2dri7cl4rgno4fd6dd` (`last_edited_by_id`), + KEY `fkl3chbblh2guqlw9ikn9grc3vb` (`parent_substance_uuid`), + CONSTRAINT `fk6bup6ku2dri7cl4rgno4fd6dd` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fk9tp2yhc5vdofsdnx5cit45hdy` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), + CONSTRAINT `fkl3chbblh2guqlw9ikn9grc3vb` FOREIGN KEY (`parent_substance_uuid`) REFERENCES `ix_ginas_substanceref` (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping routines for database 'ixginas_local' +-- +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2026-05-21 13:18:49 diff --git a/docs/COLIMA_GUIDE.md b/docs/COLIMA_GUIDE.md index 27d45598a3..b626df105e 100644 --- a/docs/COLIMA_GUIDE.md +++ b/docs/COLIMA_GUIDE.md @@ -15,6 +15,11 @@ _Last updated: 17.12.2024_ ## Start Colima - `colima start -f --cpu 4 --memory 10 --disk 30 --arch aarch64 --vz-rosetta --mount-type=virtiofs` +> **Note:** If you also run GSRS locally (`PFDA_SHOULD_RUN_GSRS=1`), increase the disk to at least 50 GiB: +> ``` +> colima start -f --cpu 4 --memory 10 --disk 50 --arch aarch64 --vz-rosetta --mount-type=virtiofs +> ``` + ## Run PFDA - From inside the project root `make run` diff --git a/docs/DOCKER_BASED_SETUP.md b/docs/DOCKER_BASED_SETUP.md index 068bba5d36..7e08862934 100644 --- a/docs/DOCKER_BASED_SETUP.md +++ b/docs/DOCKER_BASED_SETUP.md @@ -105,40 +105,95 @@ make stop ### Running application with external services (GSRS) -To include GSRS in the local stack, set `PFDA_SHOULD_RUN_GSRS=1` for the command or export it in your shell profile: +GSRS runs as part of the local Docker stack. A schema-only database is included in the repo so GSRS can start empty without any downloads. For a fully populated instance (substance data + Lucene search index), run `make gsrs-seed-data` first — this downloads the data from S3 and requires the AWS CLI to be installed and configured: ```bash -PFDA_SHOULD_RUN_GSRS=1 make run +# Install the AWS CLI (macOS) +brew install awscli + +# Configure credentials (use your access key from the AWS console) +aws configure +``` + +#### Quick start + +```bash +# Add to ~/.bashrc or ~/.zshrc +export PFDA_SHOULD_RUN_GSRS=1 ``` -#### Switch GSRS version running in the container +Then run as usual: + +```bash +make run +``` + +To populate with full substance data and search index: + +```bash +make gsrs-seed-data +make run +``` + +This starts the GSRS backend, MariaDB (schema from `docker/misc/gsrs-db-init/01-gsrsdb-schema.sql`), and nginx sidecar. If you ran `make gsrs-seed-data`, the full data dump and Lucene index are also loaded. + +GSRS UI is available at `https://localhost:3000/ginas/app/ui/`. + +#### Environment variables -1. Connect to the running container. -2. Run script _run-version.sh_. -3. When prompted, paste the required GSRS version branch name from the [gsrs-play-dist repo](https://github.com/dnanexus/gsrs-play-dist). +| Variable | Default | Description | +|----------|---------|-------------| +| `PFDA_SHOULD_RUN_GSRS` | _(unset)_ | Set to `1` to include GSRS containers | +| `GSRS_LOCAL_MODE` | `true` | Symlinks index directly (required for macOS) | +| `GSRS_INDEX_PATH` | `packages/gsrs/seed-data/ginas.ix` | Path to Lucene index directory | +| `GSRS_FRONTEND_DEV` | `false` | Set to `true` to enable live frontend dev server | +| `GSRS_FRONTEND_PATH` | _(unset)_ | Absolute path to GSRSFrontend repo (required when `GSRS_FRONTEND_DEV=true`) | -#### GSRS frontend development live update +#### Resetting GSRS data -Once the _gsrs_ container is running, you can use it for GSRS frontend development: +To start fresh (wipe DB and index): -1. Clone the [GSRSFrontend repo](https://github.com/ncats/GSRSFrontend/tree/precision_new), branch _precision_new_. -2. Create `GSRS_FRONTEND_PATH` (for example in `~/.zshrc`) with an absolute path to the repo, such as _/Users/pbarta@dnanexus.com/ncats/GSRSFrontend_. -3. Restart the _gsrs_ container. -4. Edit several config files in the cloned repo. These changes are not supposed to be committed: - * `angular.json` - add line `"baseHref": "/ginas/app/ui/",` under `projects.gsrs-client.architect.options` - * `src/app/fda/config/config.json` - add line `"customToolbarComponent": "precisionFDA",` - * `src/environments/environment.fda.local.ts` - set the following variables: - ```bash +```bash +make stop +docker volume rm precision-fda_db-gsrs-mariadb-volume +``` + +Then `make run` again to recreate with seed data. + +#### GSRS frontend development (live hot reload) + +A dedicated container runs the Angular dev server with hot reload. No manual config edits needed. + +1. Clone [GSRSFrontend repo](https://github.com/ncats/GSRSFrontend), branch `pfda`: + ```bash + git clone -b pfda https://github.com/ncats/GSRSFrontend.git ~/Projects/GSRSFrontend + ``` + +2. Edit several config files in the cloned repo (these changes are not supposed to be committed): + - `angular.json` - add line `"baseHref": "/ginas/app/ui/",` under `projects.gsrs-client.architect.options` + - `src/app/fda/config/config.json` - add lines `"customToolbarComponent": "precisionFDA",` and `"isPfdaVersion": true,` + - `src/environments/environment.fda.local.ts` - set following variables: + ```typescript environment.apiBaseUrl = 'https://localhost:3000/ginas/app/'; environment.baseHref = '/ginas/app/ui/'; ``` -5. Connect to the running _gsrs_ container, run script `switch-frontend.sh` (located in root), and follow the instructions. + +3. Set environment variables (e.g., in `~/.zshrc`): + ```bash + export PFDA_SHOULD_RUN_GSRS=1 + export GSRS_FRONTEND_DEV=true + export GSRS_FRONTEND_PATH=~/Projects/GSRSFrontend + ``` + +4. Run: ```bash - docker exec -it bash - cd / - ./switch-frontend.sh + make run ``` +The frontend dev container installs dependencies and runs `ng serve` with the `fda.local` configuration. Changes to source files in your local GSRSFrontend repo are picked up automatically via polling. + +> **Note:** The first startup takes a few minutes while Angular compiles. Subsequent starts reuse the cached `node_modules` volume. + ## (Optional) Skip cache rebuilds for faster startup After the Docker setup runs successfully, you can save startup time by using [`docker/.env.example`](../docker/.env.example) as a reference and setting skip flags in `docker/.env`. These flags only work if the relevant deps and caches have already been built by a previous successful startup. diff --git a/packages/gsrs/README.md b/packages/gsrs/README.md index 63dbcd81c3..260f25c2b9 100644 --- a/packages/gsrs/README.md +++ b/packages/gsrs/README.md @@ -55,7 +55,33 @@ Some parameters need to be specified to run this container. These are typically | `GSRS_DATABASE_PASSWORD` | (database password) | | `GSRS_DATABASE_NAME` | (database name) | +## Local Development Setup +Before running GSRS locally, you can download the seed data (Lucene index + DB dump) from S3, but the GSRS runs without populated db and index as well: + +```bash +make gsrs-seed-data +``` + +This downloads: +- **Lucene index** → `packages/gsrs/seed-data/ginas.ix/` +- **DB data dump** → `docker/misc/gsrs-db-init/02-gsrsdb-data.sql` + +The repo already ships a schema-only file (`docker/misc/gsrs-db-init/01-gsrsdb-schema.sql`), so GSRS can start with an empty DB even without running this script. The seed data adds ~18 substances for a fully populated local instance. + +**Prerequisites**: AWS CLI configured with access to the `gsrs-database-dumps-dev` bucket. + +You can override the S3 source with environment variables: + +| Variable | Default | Description | +|----------|---------|-------------| +| `GSRS_SEED_S3_BUCKET` | `gsrs-database-dumps-dev` | S3 bucket name | +| `GSRS_SEED_INDEX_KEY` | `local/ginas_ix.tar.gz` | S3 key for the Lucene index archive | +| `GSRS_SEED_DB_DUMP_KEY` | `local/gsrsdb.sql.gz` | S3 key for the gzipped SQL dump | + +The script is idempotent — it skips downloads if the files already exist. Delete the local files to force a re-download. + +--- ## Database & Index Restore Workflow Within the data_update folder, we have the dockerfile and script for restoring the database and index. diff --git a/packages/gsrs/frontend-dev/Dockerfile b/packages/gsrs/frontend-dev/Dockerfile new file mode 100644 index 0000000000..7e758cf653 --- /dev/null +++ b/packages/gsrs/frontend-dev/Dockerfile @@ -0,0 +1,15 @@ +FROM node:22-bullseye-slim + +RUN apt-get update && \ + apt-get install -y --no-install-recommends git python3 make g++ && \ + rm -rf /var/lib/apt/lists/* + +WORKDIR /app + +# Dependencies are installed at container startup (from bind-mounted source) +EXPOSE 4200 + +COPY entrypoint.sh /usr/local/bin/entrypoint.sh +RUN chmod +x /usr/local/bin/entrypoint.sh + +ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] diff --git a/packages/gsrs/frontend-dev/entrypoint.sh b/packages/gsrs/frontend-dev/entrypoint.sh new file mode 100644 index 0000000000..760ee78e34 --- /dev/null +++ b/packages/gsrs/frontend-dev/entrypoint.sh @@ -0,0 +1,39 @@ +#!/bin/bash +set -e + +cd /app + +echo "=== GSRS Frontend Dev Server ===" + +# Install deps if node_modules is missing or outdated +if [ ! -d "node_modules/.bin/ng" ]; then + echo "Installing dependencies (first run — this may take a few minutes)..." + npm install --legacy-peer-deps + # @types/deep-equal uses 'export =' which is incompatible with 'import * as' + # in newer Angular/TS. Remove it — the code works fine without types for deep-equal. + rm -rf node_modules/@types/deep-equal +fi + +# Patch environment file for local development if not already patched +ENV_FILE="src/environments/environment.fda.local.ts" +if [ ! -f "$ENV_FILE" ]; then + echo "Creating $ENV_FILE for local development..." + cat > "$ENV_FILE" <<'EOF' +import { environment as fdaEnv } from './environment.fda'; +export const environment = { + ...fdaEnv, + apiBaseUrl: 'https://localhost:3000/ginas/app/', + baseHref: '/ginas/app/ui/', +}; +EOF +fi + +echo "Starting Angular dev server on port 4200..." +echo "Live reload enabled — changes to source files will auto-rebuild." +export NODE_OPTIONS="--max-old-space-size=4096" +exec npx ng serve \ + --host 0.0.0.0 \ + --port 4200 \ + --disable-host-check \ + --configuration fda.local \ + --poll 2000 diff --git a/packages/gsrs/nginx/Dockerfile b/packages/gsrs/nginx/Dockerfile index 283114a4b1..7d42ae8a66 100644 --- a/packages/gsrs/nginx/Dockerfile +++ b/packages/gsrs/nginx/Dockerfile @@ -3,5 +3,7 @@ FROM nginx:alpine RUN apk update && apk upgrade --no-cache COPY nginx.conf /etc/nginx/nginx.conf +COPY entrypoint.sh /docker-entrypoint.d/99-frontend-dev.sh +RUN chmod +x /docker-entrypoint.d/99-frontend-dev.sh EXPOSE 80 \ No newline at end of file diff --git a/packages/gsrs/nginx/entrypoint.sh b/packages/gsrs/nginx/entrypoint.sh new file mode 100644 index 0000000000..1344845af0 --- /dev/null +++ b/packages/gsrs/nginx/entrypoint.sh @@ -0,0 +1,30 @@ +#!/bin/sh +# Generate frontend location config based on GSRS_FRONTEND_DEV env var +mkdir -p /etc/nginx/conf.d + +if [ "$GSRS_FRONTEND_DEV" = "true" ]; then + echo 'GSRS nginx: Frontend dev mode ENABLED (routing /ginas/app/ui → gsrs-frontend-dev:4200)' + cat > /etc/nginx/conf.d/frontend-location.conf <<'EOF' +location /ginas/app/ui { + resolver 127.0.0.11 valid=10s; + set $frontend http://gsrs-frontend-dev:4200; + proxy_pass $frontend; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_read_timeout 300s; +} +EOF +else + echo 'GSRS nginx: Frontend dev mode DISABLED (routing /ginas/app/ui → gsrs-web WAR)' + cat > /etc/nginx/conf.d/frontend-location.conf <<'EOF' +location /ginas/app/ui { + proxy_pass http://gsrs-web:8080/frontend/ginas/app/ui; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; +} +EOF +fi diff --git a/packages/gsrs/nginx/nginx.conf b/packages/gsrs/nginx/nginx.conf index ef204f1dbc..9f25336f0e 100644 --- a/packages/gsrs/nginx/nginx.conf +++ b/packages/gsrs/nginx/nginx.conf @@ -87,13 +87,11 @@ http { return 200 "OK\n"; } - # Replacement for ROOT routing module - location /ginas/app/ui { - proxy_pass http://gsrs-web:8080/frontend/ginas/app/ui; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - } + # Frontend routing: dev server or pre-built WAR + # Controlled by GSRS_FRONTEND_DEV env var via entrypoint script + # Default: gsrs-web:8080/frontend (pre-built WAR) + # Dev mode: gsrs-frontend-dev:4200 (Angular dev server with HMR) + include /etc/nginx/conf.d/frontend-location.conf; location /ginas/app/beta { proxy_pass http://gsrs-web:8080/frontend/ginas/app/ui; diff --git a/packages/gsrs/scripts/fetch-seed-data.sh b/packages/gsrs/scripts/fetch-seed-data.sh new file mode 100755 index 0000000000..ec5f9a80a1 --- /dev/null +++ b/packages/gsrs/scripts/fetch-seed-data.sh @@ -0,0 +1,74 @@ +#!/bin/bash +set -euo pipefail + +# Downloads GSRS seed data (Lucene index + full DB dump) from S3. +# +# The repo ships a schema-only SQL file so GSRS can start with an empty DB. +# Running this script downloads the data dump (18 substances) and the Lucene index for a fully populated local instance. +# +# Prerequisites: +# - AWS CLI configured with access to the gsrs-database-dumps-dev bucket +# - tar, gunzip available (standard on macOS/Linux) +# +# Usage: +# ./packages/gsrs/scripts/fetch-seed-data.sh +# make gsrs-seed-data + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +GSRS_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" +REPO_ROOT="$(cd "$GSRS_DIR/../.." && pwd)" + +S3_BUCKET="${GSRS_SEED_S3_BUCKET:-gsrs-database-dumps-dev}" +S3_INDEX_KEY="${GSRS_SEED_INDEX_KEY:-local/ginas_ix.tar.gz}" +S3_DB_DUMP_KEY="${GSRS_SEED_DB_DUMP_KEY:-local/gsrsdb.sql.gz}" + +INDEX_DIR="$GSRS_DIR/seed-data/ginas.ix" +DB_INIT_DIR="$REPO_ROOT/docker/misc/gsrs-db-init" + +echo "=== GSRS Seed Data Download ===" +echo "S3 bucket: $S3_BUCKET" +echo "" + +# --- Lucene Index --- +if [ -d "$INDEX_DIR" ] && [ "$(ls -A "$INDEX_DIR" 2>/dev/null)" ]; then + echo "[index] Already exists at $INDEX_DIR — skipping (delete to re-download)" +else + echo "[index] Downloading Lucene index from s3://$S3_BUCKET/$S3_INDEX_KEY ..." + mkdir -p "$INDEX_DIR" + + TMP_ARCHIVE=$(mktemp /tmp/ginas_ix.XXXXXX.tar.gz) + trap 'rm -f "$TMP_ARCHIVE"' EXIT + + aws s3 cp "s3://$S3_BUCKET/$S3_INDEX_KEY" "$TMP_ARCHIVE" + + echo "[index] Extracting to $INDEX_DIR ..." + tar -xzf "$TMP_ARCHIVE" -C "$GSRS_DIR/seed-data" + + rm -f "$TMP_ARCHIVE" + echo "[index] Done." +fi + +echo "" + +# --- Database Dump (full data — runs after schema via numerical ordering) --- +DB_DUMP_FILE="$DB_INIT_DIR/02-gsrsdb-data.sql" +if [ -f "$DB_DUMP_FILE" ]; then + echo "[db] Full dump already exists at $DB_DUMP_FILE — skipping (delete to re-download)" +else + echo "[db] Downloading full DB dump from s3://$S3_BUCKET/$S3_DB_DUMP_KEY ..." + mkdir -p "$DB_INIT_DIR" + + TMP_DUMP=$(mktemp /tmp/gsrsdb.XXXXXX.sql.gz) + trap 'rm -f "$TMP_DUMP"' EXIT + + aws s3 cp "s3://$S3_BUCKET/$S3_DB_DUMP_KEY" "$TMP_DUMP" + + echo "[db] Decompressing to $DB_DUMP_FILE ..." + gunzip -c "$TMP_DUMP" > "$DB_DUMP_FILE" + + rm -f "$TMP_DUMP" + echo "[db] Done." +fi + +echo "" +echo "=== Seed data ready. You can now run: make run ===" diff --git a/packages/gsrs/web/entrypoint.sh b/packages/gsrs/web/entrypoint.sh index a57f4d6df1..07952f0575 100644 --- a/packages/gsrs/web/entrypoint.sh +++ b/packages/gsrs/web/entrypoint.sh @@ -1,23 +1,34 @@ #!/bin/bash set -e -# --- OverlayFS Setup --- -# Use the unique hostname (container ID) to prevent collisions if you run multiple tasks -UNIQUE_ID=$(hostname) -UPPER="/tmp/overlay-data/${UNIQUE_ID}/upper" -WORK="/tmp/overlay-data/${UNIQUE_ID}/work" -MERGED="/opt/gsrs/ginas.ix" - -echo "Configuring OverlayFS for GSRS Index..." -mkdir -p "$UPPER" "$WORK" "$MERGED" - -# The Actual Mount Command -mount -t overlay overlay \ - -o lowerdir=/tmp/read-only-base,upperdir="$UPPER",workdir="$WORK" \ - "$MERGED" - -# Lucene cleanup: ensure no stale locks from the base index block startup -rm -f "$MERGED/write.lock" +# --- Index Setup --- +# Index is always bind-mounted to /tmp/read-only-base. +# Production (ECS): OverlayFS keeps the shared index read-only with a writable upper layer. +# Local dev: symlink directly. +if [ "${GSRS_LOCAL_MODE}" = "true" ]; then + echo "Local mode — symlinking index directly" + mkdir -p /opt/gsrs + ln -sfn /tmp/read-only-base /opt/gsrs/ginas.ix + find /opt/gsrs/ginas.ix -name "write.lock" -delete 2>/dev/null || true +else + UNIQUE_ID=$(hostname) + UPPER="/tmp/overlay-data/${UNIQUE_ID}/upper" + WORK="/tmp/overlay-data/${UNIQUE_ID}/work" + MERGED="/opt/gsrs/ginas.ix" + + echo "Configuring OverlayFS for GSRS Index..." + mkdir -p "$UPPER" "$WORK" "$MERGED" + + if ! mount -t overlay overlay \ + -o "lowerdir=/tmp/read-only-base,upperdir=$UPPER,workdir=$WORK" \ + "$MERGED"; then + echo "ERROR: OverlayFS mount failed." + exit 1 + fi + echo "OverlayFS mounted" + + rm -f "$MERGED/write.lock" +fi # --- Original GSRS Configuration --- TC_PATH="/usr/local/tomcat" diff --git a/packages/nginx/default.conf.template b/packages/nginx/default.conf.template index 0a5900e9f0..3ab2907e48 100644 --- a/packages/nginx/default.conf.template +++ b/packages/nginx/default.conf.template @@ -23,10 +23,14 @@ server { proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } - - # This is a simulation of AWS ALB rule for GSRS static assets + + # GSRS static assets served directly via gsrs-nginx (no auth needed, faster) + # All other /ginas/* requests fall through to Rails (location /) which injects + # AUTHENTICATION_USERNAME/EMAIL headers and reverse-proxies to GSRS location ~ ^/ginas/.*((\.(js|css|png|jpg|jpeg|gif))|(manifest\.json))$ { - proxy_pass http://host.docker.internal:8080; + resolver 127.0.0.11 valid=10s; + set $gsrs_upstream http://gsrs-nginx:80; + proxy_pass $gsrs_upstream; } location ~ ^/api/files/([^/]+)/download$ { diff --git a/packages/rails/docker/misc/gsrs-db-init/gsrsdb.sql b/packages/rails/docker/misc/gsrs-db-init/gsrsdb.sql deleted file mode 100644 index 415dadb16c..0000000000 --- a/packages/rails/docker/misc/gsrs-db-init/gsrsdb.sql +++ /dev/null @@ -1,2943 +0,0 @@ --- MySQL dump 10.13 Distrib 8.0.34, for Linux (x86_64) --- --- Host: gsrs-dev-db.cyy6pahwar0b.us-west-2.rds.amazonaws.com Database: ixginas20230708 --- ------------------------------------------------------ --- Server version 5.5.5-10.6.14-MariaDB-log - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!50503 SET NAMES utf8mb4 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - --- --- Table structure for table `LONG_SEQ_ID` --- - -DROP TABLE IF EXISTS `LONG_SEQ_ID`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `LONG_SEQ_ID` ( - `next_not_cached_value` bigint(21) NOT NULL, - `minimum_value` bigint(21) NOT NULL, - `maximum_value` bigint(21) NOT NULL, - `start_value` bigint(21) NOT NULL COMMENT 'start value when sequences is created or value if RESTART is used', - `increment` bigint(21) NOT NULL COMMENT 'increment value', - `cache_size` bigint(21) unsigned NOT NULL, - `cycle_option` tinyint(1) unsigned NOT NULL COMMENT '0 if no cycles are allowed, 1 if the sequence should begin a new cycle when maximum_value is passed', - `cycle_count` bigint(21) NOT NULL COMMENT 'How many cycles have been done' -) ENGINE=InnoDB SEQUENCE=1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_batch_processingjob` --- - -DROP TABLE IF EXISTS `ix_batch_processingjob`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_batch_processingjob` ( - `id` varchar(40) NOT NULL, - `category` varchar(255) DEFAULT NULL, - `completed_record_count` int(11) NOT NULL, - `data` longtext DEFAULT NULL, - `finish_date` datetime(6) DEFAULT NULL, - `job_status` varchar(255) DEFAULT NULL, - `results` longtext DEFAULT NULL, - `start_date` datetime(6) DEFAULT NULL, - `status_message` varchar(255) DEFAULT NULL, - `total_records` int(11) NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_acl` --- - -DROP TABLE IF EXISTS `ix_core_acl`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_acl` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `perm` int(11) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_acl_group` --- - -DROP TABLE IF EXISTS `ix_core_acl_group`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_acl_group` ( - `ix_core_acl_id` bigint(20) NOT NULL, - `ix_core_group_id` bigint(20) NOT NULL, - PRIMARY KEY (`ix_core_acl_id`,`ix_core_group_id`), - KEY `c_37918c15` (`ix_core_group_id`), - CONSTRAINT `c_37918c15` FOREIGN KEY (`ix_core_group_id`) REFERENCES `ix_core_group` (`id`), - CONSTRAINT `c_8334ae69` FOREIGN KEY (`ix_core_acl_id`) REFERENCES `ix_core_acl` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_acl_principal` --- - -DROP TABLE IF EXISTS `ix_core_acl_principal`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_acl_principal` ( - `ix_core_acl_id` bigint(20) NOT NULL, - `ix_core_principal_id` bigint(20) NOT NULL, - PRIMARY KEY (`ix_core_acl_id`,`ix_core_principal_id`), - KEY `c_0563d198` (`ix_core_principal_id`), - CONSTRAINT `c_0563d198` FOREIGN KEY (`ix_core_principal_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_edb5bbb8` FOREIGN KEY (`ix_core_acl_id`) REFERENCES `ix_core_acl` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_acl_seq` --- - -DROP TABLE IF EXISTS `ix_core_acl_seq`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_acl_seq` ( - `next_not_cached_value` bigint(21) NOT NULL, - `minimum_value` bigint(21) NOT NULL, - `maximum_value` bigint(21) NOT NULL, - `start_value` bigint(21) NOT NULL COMMENT 'start value when sequences is created or value if RESTART is used', - `increment` bigint(21) NOT NULL COMMENT 'increment value', - `cache_size` bigint(21) unsigned NOT NULL, - `cycle_option` tinyint(1) unsigned NOT NULL COMMENT '0 if no cycles are allowed, 1 if the sequence should begin a new cycle when maximum_value is passed', - `cycle_count` bigint(21) NOT NULL COMMENT 'How many cycles have been done' -) ENGINE=InnoDB SEQUENCE=1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_attribute` --- - -DROP TABLE IF EXISTS `ix_core_attribute`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_attribute` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `name` varchar(255) DEFAULT NULL, - `value` varchar(1024) DEFAULT NULL, - `namespace_id` bigint(20) DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `i_2e0d49bb` (`namespace_id`), - CONSTRAINT `c_5de71e45` FOREIGN KEY (`namespace_id`) REFERENCES `ix_core_namespace` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_backup` --- - -DROP TABLE IF EXISTS `ix_core_backup`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_backup` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `namespace_id` bigint(20) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `modified` datetime DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `refid` varchar(255) DEFAULT NULL, - `kind` varchar(255) DEFAULT NULL, - `data` longblob DEFAULT NULL, - `sha1` varchar(255) DEFAULT NULL, - `compressed` tinyint(1) DEFAULT 0, - `version` bigint(20) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `c_2884574a` (`refid`), - KEY `i_abc97ed9` (`namespace_id`), - CONSTRAINT `c_d73bb54b` FOREIGN KEY (`namespace_id`) REFERENCES `ix_core_namespace` (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=5158265 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_backup_seq` --- - -DROP TABLE IF EXISTS `ix_core_backup_seq`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_backup_seq` ( - `next_not_cached_value` bigint(21) NOT NULL, - `minimum_value` bigint(21) NOT NULL, - `maximum_value` bigint(21) NOT NULL, - `start_value` bigint(21) NOT NULL COMMENT 'start value when sequences is created or value if RESTART is used', - `increment` bigint(21) NOT NULL COMMENT 'increment value', - `cache_size` bigint(21) unsigned NOT NULL, - `cycle_option` tinyint(1) unsigned NOT NULL COMMENT '0 if no cycles are allowed, 1 if the sequence should begin a new cycle when maximum_value is passed', - `cycle_count` bigint(21) NOT NULL COMMENT 'How many cycles have been done' -) ENGINE=InnoDB SEQUENCE=1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_curation` --- - -DROP TABLE IF EXISTS `ix_core_curation`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_curation` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `curator_id` bigint(20) DEFAULT NULL, - `status` int(11) DEFAULT NULL, - `timestamp` datetime DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `i_c639b9b3` (`curator_id`), - CONSTRAINT `c_a6783131` FOREIGN KEY (`curator_id`) REFERENCES `ix_core_principal` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_db_gsrs_version` --- - -DROP TABLE IF EXISTS `ix_core_db_gsrs_version`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_db_gsrs_version` ( - `id` bigint(20) NOT NULL, - `entity` varchar(255) NOT NULL, - `hash` varchar(255) DEFAULT NULL, - `modified` datetime(6) DEFAULT NULL, - `version_info` varchar(255) NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_edit` --- - -DROP TABLE IF EXISTS `ix_core_edit`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_edit` ( - `id` varchar(40) NOT NULL, - `created` bigint(20) DEFAULT NULL, - `refid` varchar(255) DEFAULT NULL, - `kind` varchar(255) DEFAULT NULL, - `batch` varchar(64) DEFAULT NULL, - `editor_id` bigint(20) DEFAULT NULL, - `path` varchar(1024) DEFAULT NULL, - `comments` longtext DEFAULT NULL, - `version` varchar(255) DEFAULT NULL, - `old_value` longtext DEFAULT NULL, - `new_value` longtext DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `i_7aee51ce` (`editor_id`), - KEY `refid_core_edit_index` (`refid`), - KEY `kind_core_edit_index` (`kind`), - CONSTRAINT `c_12a5334f` FOREIGN KEY (`editor_id`) REFERENCES `ix_core_principal` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_etag` --- - -DROP TABLE IF EXISTS `ix_core_etag`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_etag` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `namespace_id` bigint(20) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `modified` datetime DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `etag` varchar(16) DEFAULT NULL, - `uri` varchar(4000) DEFAULT NULL, - `path` varchar(255) DEFAULT NULL, - `method` varchar(10) DEFAULT NULL, - `sha1` varchar(40) DEFAULT NULL, - `total` int(11) DEFAULT NULL, - `count` int(11) DEFAULT NULL, - `skip` int(11) DEFAULT NULL, - `top` int(11) DEFAULT NULL, - `status` int(11) DEFAULT NULL, - `query` varchar(2048) DEFAULT NULL, - `filter` varchar(4000) DEFAULT NULL, - `version` bigint(20) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `c_116a77ea` (`etag`), - KEY `i_2713cf1c` (`namespace_id`), - CONSTRAINT `c_d104ddaf` FOREIGN KEY (`namespace_id`) REFERENCES `ix_core_namespace` (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=36300825 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_etag_seq` --- - -DROP TABLE IF EXISTS `ix_core_etag_seq`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_etag_seq` ( - `next_not_cached_value` bigint(21) NOT NULL, - `minimum_value` bigint(21) NOT NULL, - `maximum_value` bigint(21) NOT NULL, - `start_value` bigint(21) NOT NULL COMMENT 'start value when sequences is created or value if RESTART is used', - `increment` bigint(21) NOT NULL COMMENT 'increment value', - `cache_size` bigint(21) unsigned NOT NULL, - `cycle_option` tinyint(1) unsigned NOT NULL COMMENT '0 if no cycles are allowed, 1 if the sequence should begin a new cycle when maximum_value is passed', - `cycle_count` bigint(21) NOT NULL COMMENT 'How many cycles have been done' -) ENGINE=InnoDB SEQUENCE=1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_etagref` --- - -DROP TABLE IF EXISTS `ix_core_etagref`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_etagref` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `etag_id` bigint(20) DEFAULT NULL, - `ref_id` bigint(20) DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `i_5e1fe842` (`etag_id`), - CONSTRAINT `c_aa5f10b2` FOREIGN KEY (`etag_id`) REFERENCES `ix_core_etag` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_event` --- - -DROP TABLE IF EXISTS `ix_core_event`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_event` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `title` varchar(255) DEFAULT NULL, - `description` longtext DEFAULT NULL, - `url` varchar(1024) DEFAULT NULL, - `start_time` bigint(20) DEFAULT NULL, - `end_time` bigint(20) DEFAULT NULL, - `unit` int(11) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_event_link` --- - -DROP TABLE IF EXISTS `ix_core_event_link`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_event_link` ( - `ix_core_event_id` bigint(20) NOT NULL, - `ix_core_xref_id` bigint(20) NOT NULL, - PRIMARY KEY (`ix_core_event_id`,`ix_core_xref_id`), - KEY `c_80f406a0` (`ix_core_xref_id`), - CONSTRAINT `c_80f406a0` FOREIGN KEY (`ix_core_xref_id`) REFERENCES `ix_core_xref` (`id`), - CONSTRAINT `c_98366c6b` FOREIGN KEY (`ix_core_event_id`) REFERENCES `ix_core_event` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_event_prop` --- - -DROP TABLE IF EXISTS `ix_core_event_prop`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_event_prop` ( - `ix_core_event_id` bigint(20) NOT NULL, - `ix_core_value_id` bigint(20) NOT NULL, - PRIMARY KEY (`ix_core_event_id`,`ix_core_value_id`), - KEY `c_2d292e00` (`ix_core_value_id`), - CONSTRAINT `c_2d292e00` FOREIGN KEY (`ix_core_value_id`) REFERENCES `ix_core_value` (`id`), - CONSTRAINT `c_32e7a523` FOREIGN KEY (`ix_core_event_id`) REFERENCES `ix_core_event` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_figure` --- - -DROP TABLE IF EXISTS `ix_core_figure`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_figure` ( - `dtype` varchar(10) NOT NULL, - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `caption` varchar(255) DEFAULT NULL, - `mime_type` varchar(255) DEFAULT NULL, - `url` varchar(1024) DEFAULT NULL, - `data` longblob DEFAULT NULL, - `data_size` int(11) DEFAULT NULL, - `sha1` varchar(140) DEFAULT NULL, - `parent_id` bigint(20) DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `i_bcc29d98` (`parent_id`), - CONSTRAINT `c_933ce9dc` FOREIGN KEY (`parent_id`) REFERENCES `ix_core_figure` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_filedata` --- - -DROP TABLE IF EXISTS `ix_core_filedata`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_filedata` ( - `dtype` varchar(10) NOT NULL, - `id` varchar(40) NOT NULL, - `mime_type` varchar(255) DEFAULT NULL, - `data` longblob DEFAULT NULL, - `data_size` bigint(20) DEFAULT NULL, - `sha1` varchar(140) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_group` --- - -DROP TABLE IF EXISTS `ix_core_group`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_group` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `name` varchar(255) DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `c_3aa2c124` (`name`) -) ENGINE=InnoDB AUTO_INCREMENT=81 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_group_principal` --- - -DROP TABLE IF EXISTS `ix_core_group_principal`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_group_principal` ( - `ix_core_group_id` bigint(20) NOT NULL, - `ix_core_principal_id` bigint(20) NOT NULL, - PRIMARY KEY (`ix_core_group_id`,`ix_core_principal_id`), - KEY `c_045e1ef9` (`ix_core_principal_id`), - CONSTRAINT `c_045e1ef9` FOREIGN KEY (`ix_core_principal_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_2223dcea` FOREIGN KEY (`ix_core_group_id`) REFERENCES `ix_core_group` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_group_seq` --- - -DROP TABLE IF EXISTS `ix_core_group_seq`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_group_seq` ( - `next_not_cached_value` bigint(21) NOT NULL, - `minimum_value` bigint(21) NOT NULL, - `maximum_value` bigint(21) NOT NULL, - `start_value` bigint(21) NOT NULL COMMENT 'start value when sequences is created or value if RESTART is used', - `increment` bigint(21) NOT NULL COMMENT 'increment value', - `cache_size` bigint(21) unsigned NOT NULL, - `cycle_option` tinyint(1) unsigned NOT NULL COMMENT '0 if no cycles are allowed, 1 if the sequence should begin a new cycle when maximum_value is passed', - `cycle_count` bigint(21) NOT NULL COMMENT 'How many cycles have been done' -) ENGINE=InnoDB SEQUENCE=1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_investigator` --- - -DROP TABLE IF EXISTS `ix_core_investigator`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_investigator` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `name` varchar(255) DEFAULT NULL, - `pi_id` bigint(20) DEFAULT NULL, - `organization_id` bigint(20) DEFAULT NULL, - `role` int(11) DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `i_1bcd7f25` (`organization_id`), - CONSTRAINT `c_71245644` FOREIGN KEY (`organization_id`) REFERENCES `ix_core_organization` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_journal` --- - -DROP TABLE IF EXISTS `ix_core_journal`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_journal` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `issn` varchar(10) DEFAULT NULL, - `volume` varchar(255) DEFAULT NULL, - `issue` varchar(255) DEFAULT NULL, - `year` int(11) DEFAULT NULL, - `month` varchar(10) DEFAULT NULL, - `title` varchar(1024) DEFAULT NULL, - `iso_abbr` varchar(255) DEFAULT NULL, - `factor` double DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_key_user_list` --- - -DROP TABLE IF EXISTS `ix_core_key_user_list`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_key_user_list` ( - `id` bigint(20) NOT NULL, - `entity_key` varchar(255) DEFAULT NULL, - `list_name` varchar(255) NOT NULL, - `user_id` bigint(20) DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `ukbomijjxdp2cmjttgrnqtoucvo` (`entity_key`,`list_name`,`user_id`), - KEY `fk7q0vtv7ajevho6v75n57jy0dj` (`user_id`), - CONSTRAINT `fk7q0vtv7ajevho6v75n57jy0dj` FOREIGN KEY (`user_id`) REFERENCES `ix_core_principal` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_namespace` --- - -DROP TABLE IF EXISTS `ix_core_namespace`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_namespace` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `name` varchar(255) DEFAULT NULL, - `owner_id` bigint(20) DEFAULT NULL, - `location` varchar(1024) DEFAULT NULL, - `modifier` int(11) DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `c_2b9ef5c1` (`name`), - KEY `i_b77ca179` (`owner_id`), - CONSTRAINT `c_d7342e64` FOREIGN KEY (`owner_id`) REFERENCES `ix_core_principal` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_namespace_seq` --- - -DROP TABLE IF EXISTS `ix_core_namespace_seq`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_namespace_seq` ( - `next_not_cached_value` bigint(21) NOT NULL, - `minimum_value` bigint(21) NOT NULL, - `maximum_value` bigint(21) NOT NULL, - `start_value` bigint(21) NOT NULL COMMENT 'start value when sequences is created or value if RESTART is used', - `increment` bigint(21) NOT NULL COMMENT 'increment value', - `cache_size` bigint(21) unsigned NOT NULL, - `cycle_option` tinyint(1) unsigned NOT NULL COMMENT '0 if no cycles are allowed, 1 if the sequence should begin a new cycle when maximum_value is passed', - `cycle_count` bigint(21) NOT NULL COMMENT 'How many cycles have been done' -) ENGINE=InnoDB SEQUENCE=1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_organization` --- - -DROP TABLE IF EXISTS `ix_core_organization`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_organization` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `duns` varchar(10) DEFAULT NULL, - `name` varchar(255) DEFAULT NULL, - `department` varchar(255) DEFAULT NULL, - `city` varchar(255) DEFAULT NULL, - `state` varchar(128) DEFAULT NULL, - `zipcode` varchar(64) DEFAULT NULL, - `district` varchar(255) DEFAULT NULL, - `country` varchar(255) DEFAULT NULL, - `fips` varchar(3) DEFAULT NULL, - `longitude` double DEFAULT NULL, - `latitude` double DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_payload` --- - -DROP TABLE IF EXISTS `ix_core_payload`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_payload` ( - `id` varchar(40) NOT NULL, - `namespace_id` bigint(20) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `name` varchar(1024) DEFAULT NULL, - `sha1` varchar(40) DEFAULT NULL, - `mime_type` varchar(128) DEFAULT NULL, - `capacity` bigint(20) DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `i_14e619fc` (`namespace_id`), - CONSTRAINT `c_3f780616` FOREIGN KEY (`namespace_id`) REFERENCES `ix_core_namespace` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_payload_property` --- - -DROP TABLE IF EXISTS `ix_core_payload_property`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_payload_property` ( - `ix_core_payload_id` varchar(40) NOT NULL, - `ix_core_value_id` bigint(20) NOT NULL, - PRIMARY KEY (`ix_core_payload_id`,`ix_core_value_id`), - KEY `c_c378137b` (`ix_core_value_id`), - CONSTRAINT `c_99d3e052` FOREIGN KEY (`ix_core_payload_id`) REFERENCES `ix_core_payload` (`id`), - CONSTRAINT `c_c378137b` FOREIGN KEY (`ix_core_value_id`) REFERENCES `ix_core_value` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_predicate` --- - -DROP TABLE IF EXISTS `ix_core_predicate`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_predicate` ( - `dtype` varchar(10) NOT NULL, - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `namespace_id` bigint(20) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `modified` datetime DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `subject_id` bigint(20) DEFAULT NULL, - `predicate` varchar(255) NOT NULL, - `version` bigint(20) NOT NULL, - PRIMARY KEY (`id`), - KEY `i_ea60b9c5` (`namespace_id`), - KEY `i_f051e6a6` (`subject_id`), - CONSTRAINT `c_8380c650` FOREIGN KEY (`namespace_id`) REFERENCES `ix_core_namespace` (`id`), - CONSTRAINT `c_c61aacd9` FOREIGN KEY (`subject_id`) REFERENCES `ix_core_xref` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_predicate_object` --- - -DROP TABLE IF EXISTS `ix_core_predicate_object`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_predicate_object` ( - `ix_core_predicate_id` bigint(20) NOT NULL, - `ix_core_xref_id` bigint(20) NOT NULL, - PRIMARY KEY (`ix_core_predicate_id`,`ix_core_xref_id`), - KEY `c_9e293820` (`ix_core_xref_id`), - CONSTRAINT `c_8e0804d7` FOREIGN KEY (`ix_core_predicate_id`) REFERENCES `ix_core_predicate` (`id`), - CONSTRAINT `c_9e293820` FOREIGN KEY (`ix_core_xref_id`) REFERENCES `ix_core_xref` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_predicate_property` --- - -DROP TABLE IF EXISTS `ix_core_predicate_property`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_predicate_property` ( - `ix_core_predicate_id` bigint(20) NOT NULL, - `ix_core_value_id` bigint(20) NOT NULL, - PRIMARY KEY (`ix_core_predicate_id`,`ix_core_value_id`), - KEY `c_62edfd42` (`ix_core_value_id`), - CONSTRAINT `c_62edfd42` FOREIGN KEY (`ix_core_value_id`) REFERENCES `ix_core_value` (`id`), - CONSTRAINT `c_6b1b65df` FOREIGN KEY (`ix_core_predicate_id`) REFERENCES `ix_core_predicate` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_principal` --- - -DROP TABLE IF EXISTS `ix_core_principal`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_principal` ( - `dtype` varchar(10) NOT NULL, - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `namespace_id` bigint(20) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `modified` datetime DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `provider` varchar(255) DEFAULT NULL, - `username` varchar(255) DEFAULT NULL, - `email` varchar(255) DEFAULT NULL, - `is_admin` tinyint(1) DEFAULT 0, - `uri` varchar(1024) DEFAULT NULL, - `selfie_id` bigint(20) DEFAULT NULL, - `version` bigint(20) NOT NULL, - `lastname` varchar(255) DEFAULT NULL, - `forename` varchar(255) DEFAULT NULL, - `initials` varchar(255) DEFAULT NULL, - `prefname` varchar(255) DEFAULT NULL, - `suffix` varchar(20) DEFAULT NULL, - `affiliation` longtext DEFAULT NULL, - `orcid` varchar(255) DEFAULT NULL, - `institution_id` bigint(20) DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `c_117ea9e1` (`username`), - KEY `i_d3ad08f2` (`namespace_id`), - KEY `i_087afcf1` (`selfie_id`), - KEY `i_c164584e` (`institution_id`), - CONSTRAINT `c_16a08d9e` FOREIGN KEY (`institution_id`) REFERENCES `ix_core_organization` (`id`), - CONSTRAINT `c_8fbeac5e` FOREIGN KEY (`namespace_id`) REFERENCES `ix_core_namespace` (`id`), - CONSTRAINT `c_a2c06c5d` FOREIGN KEY (`selfie_id`) REFERENCES `ix_core_figure` (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=10037 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_principal_seq` --- - -DROP TABLE IF EXISTS `ix_core_principal_seq`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_principal_seq` ( - `next_not_cached_value` bigint(21) NOT NULL, - `minimum_value` bigint(21) NOT NULL, - `maximum_value` bigint(21) NOT NULL, - `start_value` bigint(21) NOT NULL COMMENT 'start value when sequences is created or value if RESTART is used', - `increment` bigint(21) NOT NULL COMMENT 'increment value', - `cache_size` bigint(21) unsigned NOT NULL, - `cycle_option` tinyint(1) unsigned NOT NULL COMMENT '0 if no cycles are allowed, 1 if the sequence should begin a new cycle when maximum_value is passed', - `cycle_count` bigint(21) NOT NULL COMMENT 'How many cycles have been done' -) ENGINE=InnoDB SEQUENCE=1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_procjob` --- - -DROP TABLE IF EXISTS `ix_core_procjob`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_procjob` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `status` int(11) DEFAULT NULL, - `job_start` bigint(20) DEFAULT NULL, - `job_stop` bigint(20) DEFAULT NULL, - `message` longtext DEFAULT NULL, - `statistics` longtext DEFAULT NULL, - `owner_id` bigint(20) DEFAULT NULL, - `payload_id` varchar(40) DEFAULT NULL, - `last_update` datetime DEFAULT NULL, - `version` bigint(20) NOT NULL, - PRIMARY KEY (`id`), - KEY `i_cdaeb7ec` (`owner_id`), - KEY `i_015ac682` (`payload_id`), - CONSTRAINT `c_f3fe89eb` FOREIGN KEY (`owner_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_fe6f1c1b` FOREIGN KEY (`payload_id`) REFERENCES `ix_core_payload` (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=85 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_procjob_key` --- - -DROP TABLE IF EXISTS `ix_core_procjob_key`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_procjob_key` ( - `ix_core_procjob_id` bigint(20) NOT NULL, - `ix_core_value_id` bigint(20) NOT NULL, - `keys_id` bigint(20) NOT NULL, - PRIMARY KEY (`ix_core_procjob_id`,`ix_core_value_id`), - KEY `c_437a9cfc` (`ix_core_value_id`), - CONSTRAINT `c_437a9cfc` FOREIGN KEY (`ix_core_value_id`) REFERENCES `ix_core_value` (`id`), - CONSTRAINT `c_67a7c278` FOREIGN KEY (`ix_core_procjob_id`) REFERENCES `ix_core_procjob` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_procjob_seq` --- - -DROP TABLE IF EXISTS `ix_core_procjob_seq`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_procjob_seq` ( - `next_not_cached_value` bigint(21) NOT NULL, - `minimum_value` bigint(21) NOT NULL, - `maximum_value` bigint(21) NOT NULL, - `start_value` bigint(21) NOT NULL COMMENT 'start value when sequences is created or value if RESTART is used', - `increment` bigint(21) NOT NULL COMMENT 'increment value', - `cache_size` bigint(21) unsigned NOT NULL, - `cycle_option` tinyint(1) unsigned NOT NULL COMMENT '0 if no cycles are allowed, 1 if the sequence should begin a new cycle when maximum_value is passed', - `cycle_count` bigint(21) NOT NULL COMMENT 'How many cycles have been done' -) ENGINE=InnoDB SEQUENCE=1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_procrec` --- - -DROP TABLE IF EXISTS `ix_core_procrec`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_procrec` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `rec_start` bigint(20) DEFAULT NULL, - `rec_stop` bigint(20) DEFAULT NULL, - `name` varchar(128) DEFAULT NULL, - `status` int(11) DEFAULT NULL, - `message` longtext DEFAULT NULL, - `xref_id` bigint(20) DEFAULT NULL, - `job_id` bigint(20) DEFAULT NULL, - `last_update` datetime NOT NULL, - PRIMARY KEY (`id`), - KEY `i_208a1bba` (`xref_id`), - KEY `i_caa0d4b8` (`job_id`), - CONSTRAINT `c_75776597` FOREIGN KEY (`job_id`) REFERENCES `ix_core_procjob` (`id`), - CONSTRAINT `c_a187d219` FOREIGN KEY (`xref_id`) REFERENCES `ix_core_xref` (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=6411033 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_procrec_prop` --- - -DROP TABLE IF EXISTS `ix_core_procrec_prop`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_procrec_prop` ( - `ix_core_procrec_id` bigint(20) NOT NULL, - `ix_core_value_id` bigint(20) NOT NULL, - `properties_id` bigint(20) NOT NULL, - PRIMARY KEY (`ix_core_procrec_id`,`ix_core_value_id`), - KEY `c_13ac23dd` (`ix_core_value_id`), - KEY `fkjg8tmtxlf4d2vnb90e6i7exg0` (`properties_id`), - CONSTRAINT `c_13ac23dd` FOREIGN KEY (`ix_core_value_id`) REFERENCES `ix_core_value` (`id`), - CONSTRAINT `c_633c0170` FOREIGN KEY (`ix_core_procrec_id`) REFERENCES `ix_core_procrec` (`id`), - CONSTRAINT `fkjg8tmtxlf4d2vnb90e6i7exg0` FOREIGN KEY (`properties_id`) REFERENCES `ix_core_value` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_procrec_seq` --- - -DROP TABLE IF EXISTS `ix_core_procrec_seq`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_procrec_seq` ( - `next_not_cached_value` bigint(21) NOT NULL, - `minimum_value` bigint(21) NOT NULL, - `maximum_value` bigint(21) NOT NULL, - `start_value` bigint(21) NOT NULL COMMENT 'start value when sequences is created or value if RESTART is used', - `increment` bigint(21) NOT NULL COMMENT 'increment value', - `cache_size` bigint(21) unsigned NOT NULL, - `cycle_option` tinyint(1) unsigned NOT NULL COMMENT '0 if no cycles are allowed, 1 if the sequence should begin a new cycle when maximum_value is passed', - `cycle_count` bigint(21) NOT NULL COMMENT 'How many cycles have been done' -) ENGINE=InnoDB SEQUENCE=1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_pubauthor` --- - -DROP TABLE IF EXISTS `ix_core_pubauthor`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_pubauthor` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `position` int(11) DEFAULT NULL, - `is_last` tinyint(1) DEFAULT 0, - `correspondence` tinyint(1) DEFAULT 0, - `author_id` bigint(20) DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `i_962a3366` (`author_id`), - CONSTRAINT `c_6fb86703` FOREIGN KEY (`author_id`) REFERENCES `ix_core_principal` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_publication` --- - -DROP TABLE IF EXISTS `ix_core_publication`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_publication` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `pmid` bigint(20) DEFAULT NULL, - `pmcid` varchar(255) DEFAULT NULL, - `title` longtext DEFAULT NULL, - `pages` varchar(255) DEFAULT NULL, - `doi` varchar(255) DEFAULT NULL, - `abstract_text` longtext DEFAULT NULL, - `journal_id` bigint(20) DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `c_d2188a90` (`pmid`), - UNIQUE KEY `c_388c2569` (`pmcid`), - KEY `i_773c6776` (`journal_id`), - CONSTRAINT `c_35349138` FOREIGN KEY (`journal_id`) REFERENCES `ix_core_journal` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_publication_author` --- - -DROP TABLE IF EXISTS `ix_core_publication_author`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_publication_author` ( - `ix_core_publication_id` bigint(20) NOT NULL, - `ix_core_pubauthor_id` bigint(20) NOT NULL, - PRIMARY KEY (`ix_core_publication_id`,`ix_core_pubauthor_id`), - KEY `c_9f462072` (`ix_core_pubauthor_id`), - CONSTRAINT `c_6954fa07` FOREIGN KEY (`ix_core_publication_id`) REFERENCES `ix_core_publication` (`id`), - CONSTRAINT `c_9f462072` FOREIGN KEY (`ix_core_pubauthor_id`) REFERENCES `ix_core_pubauthor` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_publication_figure` --- - -DROP TABLE IF EXISTS `ix_core_publication_figure`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_publication_figure` ( - `ix_core_publication_id` bigint(20) NOT NULL, - `ix_core_figure_id` bigint(20) NOT NULL, - PRIMARY KEY (`ix_core_publication_id`,`ix_core_figure_id`), - KEY `c_229b7533` (`ix_core_figure_id`), - CONSTRAINT `c_01454ae4` FOREIGN KEY (`ix_core_publication_id`) REFERENCES `ix_core_publication` (`id`), - CONSTRAINT `c_229b7533` FOREIGN KEY (`ix_core_figure_id`) REFERENCES `ix_core_figure` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_publication_keyword` --- - -DROP TABLE IF EXISTS `ix_core_publication_keyword`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_publication_keyword` ( - `ix_core_publication_id` bigint(20) NOT NULL, - `ix_core_value_id` bigint(20) NOT NULL, - PRIMARY KEY (`ix_core_publication_id`,`ix_core_value_id`), - KEY `c_aebecf49` (`ix_core_value_id`), - CONSTRAINT `c_aebecf49` FOREIGN KEY (`ix_core_value_id`) REFERENCES `ix_core_value` (`id`), - CONSTRAINT `c_c0cadd3d` FOREIGN KEY (`ix_core_publication_id`) REFERENCES `ix_core_publication` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_publication_mesh` --- - -DROP TABLE IF EXISTS `ix_core_publication_mesh`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_publication_mesh` ( - `ix_core_publication_id` bigint(20) NOT NULL, - `ix_core_value_id` bigint(20) NOT NULL, - PRIMARY KEY (`ix_core_publication_id`,`ix_core_value_id`), - KEY `c_00f5160e` (`ix_core_value_id`), - CONSTRAINT `c_00f5160e` FOREIGN KEY (`ix_core_value_id`) REFERENCES `ix_core_value` (`id`), - CONSTRAINT `c_5c0daa3c` FOREIGN KEY (`ix_core_publication_id`) REFERENCES `ix_core_publication` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_session` --- - -DROP TABLE IF EXISTS `ix_core_session`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_session` ( - `id` varchar(40) NOT NULL, - `profile_id` bigint(20) DEFAULT NULL, - `created` bigint(20) DEFAULT NULL, - `accessed` bigint(20) DEFAULT NULL, - `location` varchar(255) DEFAULT NULL, - `expired` tinyint(1) DEFAULT 0, - PRIMARY KEY (`id`), - KEY `i_3e903ae6` (`profile_id`), - CONSTRAINT `c_1a9538dc` FOREIGN KEY (`profile_id`) REFERENCES `ix_core_userprof` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_stitch` --- - -DROP TABLE IF EXISTS `ix_core_stitch`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_stitch` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `name` varchar(255) DEFAULT NULL, - `impl` varchar(1024) DEFAULT NULL, - `description` longtext DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_stitch_attribute` --- - -DROP TABLE IF EXISTS `ix_core_stitch_attribute`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_stitch_attribute` ( - `ix_core_stitch_id` bigint(20) NOT NULL, - `ix_core_attribute_id` bigint(20) NOT NULL, - PRIMARY KEY (`ix_core_stitch_id`,`ix_core_attribute_id`), - KEY `c_01938a37` (`ix_core_attribute_id`), - CONSTRAINT `c_01938a37` FOREIGN KEY (`ix_core_attribute_id`) REFERENCES `ix_core_attribute` (`id`), - CONSTRAINT `c_c9d83c50` FOREIGN KEY (`ix_core_stitch_id`) REFERENCES `ix_core_stitch` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_structure` --- - -DROP TABLE IF EXISTS `ix_core_structure`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_structure` ( - `dtype` varchar(10) NOT NULL, - `id` varchar(40) NOT NULL, - `created` datetime DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `digest` varchar(128) DEFAULT NULL, - `molfile` longtext DEFAULT NULL, - `smiles` longtext DEFAULT NULL, - `formula` varchar(255) DEFAULT NULL, - `stereo` varchar(255) DEFAULT NULL, - `optical` int(11) DEFAULT NULL, - `atropi` int(11) DEFAULT NULL, - `stereo_comments` longtext DEFAULT NULL, - `stereo_centers` int(11) DEFAULT NULL, - `defined_stereo` int(11) DEFAULT NULL, - `ez_centers` int(11) DEFAULT NULL, - `charge` int(11) DEFAULT NULL, - `mwt` double DEFAULT NULL, - `count` int(11) DEFAULT NULL, - `version` bigint(20) NOT NULL, - `internal_references` longtext DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `record_access` varbinary(255) DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `i_97f0d7b1` (`created_by_id`), - KEY `i_86d0302b` (`last_edited_by_id`), - CONSTRAINT `c_d4a49424` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_f0993eb0` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_structure_link` --- - -DROP TABLE IF EXISTS `ix_core_structure_link`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_structure_link` ( - `ix_core_structure_id` varchar(40) NOT NULL, - `ix_core_xref_id` bigint(20) NOT NULL, - PRIMARY KEY (`ix_core_structure_id`,`ix_core_xref_id`), - KEY `c_40d92d08` (`ix_core_xref_id`), - CONSTRAINT `c_40d92d08` FOREIGN KEY (`ix_core_xref_id`) REFERENCES `ix_core_xref` (`id`), - CONSTRAINT `c_55f5450b` FOREIGN KEY (`ix_core_structure_id`) REFERENCES `ix_core_structure` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_structure_property` --- - -DROP TABLE IF EXISTS `ix_core_structure_property`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_structure_property` ( - `ix_core_structure_id` varchar(40) NOT NULL, - `ix_core_value_id` bigint(20) NOT NULL, - PRIMARY KEY (`ix_core_structure_id`,`ix_core_value_id`), - KEY `c_72b2a857` (`ix_core_value_id`), - KEY `property_structure_id_index` (`ix_core_structure_id`), - KEY `property_value_id_index` (`ix_core_value_id`), - CONSTRAINT `c_634d3d46` FOREIGN KEY (`ix_core_structure_id`) REFERENCES `ix_core_structure` (`id`), - CONSTRAINT `c_72b2a857` FOREIGN KEY (`ix_core_value_id`) REFERENCES `ix_core_value` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_timeline` --- - -DROP TABLE IF EXISTS `ix_core_timeline`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_timeline` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `name` varchar(255) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_timeline_event` --- - -DROP TABLE IF EXISTS `ix_core_timeline_event`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_timeline_event` ( - `ix_core_timeline_id` bigint(20) NOT NULL, - `ix_core_event_id` bigint(20) NOT NULL, - PRIMARY KEY (`ix_core_timeline_id`,`ix_core_event_id`), - KEY `c_f4784b80` (`ix_core_event_id`), - CONSTRAINT `c_2c85a4b0` FOREIGN KEY (`ix_core_timeline_id`) REFERENCES `ix_core_timeline` (`id`), - CONSTRAINT `c_f4784b80` FOREIGN KEY (`ix_core_event_id`) REFERENCES `ix_core_event` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_user_saved_list` --- - -DROP TABLE IF EXISTS `ix_core_user_saved_list`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_user_saved_list` ( - `id` bigint(20) NOT NULL, - `list` longtext DEFAULT NULL, - `name` varchar(255) NOT NULL, - `user_id` bigint(20) DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `uknftwibs7mebodwpavq6ub0lqh` (`name`,`user_id`), - KEY `fkhd1bc5m9wxca27lxoexqjfwei` (`user_id`), - CONSTRAINT `fkhd1bc5m9wxca27lxoexqjfwei` FOREIGN KEY (`user_id`) REFERENCES `ix_core_principal` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_userprof` --- - -DROP TABLE IF EXISTS `ix_core_userprof`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_userprof` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `namespace_id` bigint(20) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `modified` datetime DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `user_id` bigint(20) DEFAULT NULL, - `active` tinyint(1) DEFAULT 0, - `hashp` varchar(255) DEFAULT NULL, - `salt` varchar(255) DEFAULT NULL, - `system_auth` tinyint(1) DEFAULT 0, - `roles_json` longtext DEFAULT NULL, - `apikey` varchar(255) DEFAULT NULL, - `version` bigint(20) NOT NULL, - PRIMARY KEY (`id`), - KEY `i_278ce9be` (`namespace_id`), - KEY `i_b7398fef` (`user_id`), - CONSTRAINT `c_3fac3cac` FOREIGN KEY (`namespace_id`) REFERENCES `ix_core_namespace` (`id`), - CONSTRAINT `c_91de8ced` FOREIGN KEY (`user_id`) REFERENCES `ix_core_principal` (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=10014 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -/*!50003 SET @saved_cs_client = @@character_set_client */ ; -/*!50003 SET @saved_cs_results = @@character_set_results */ ; -/*!50003 SET @saved_col_connection = @@collation_connection */ ; -/*!50003 SET character_set_client = latin1 */ ; -/*!50003 SET character_set_results = latin1 */ ; -/*!50003 SET collation_connection = latin1_swedish_ci */ ; -/*!50003 SET @saved_sql_mode = @@sql_mode */ ; -/*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ; -DELIMITER ;; -/*!50003 CREATE*/ /*!50003 TRIGGER ix_core_userprof_update_roles BEFORE UPDATE ON ix_core_userprof -FOR EACH ROW -BEGIN - IF NEW.roles_json IS NULL THEN - SET NEW.roles_json = '["Query","Updater","SuperUpdate","DataEntry","SuperDataEntry"]'; - END IF; -END */;; -DELIMITER ; -/*!50003 SET sql_mode = @saved_sql_mode */ ; -/*!50003 SET character_set_client = @saved_cs_client */ ; -/*!50003 SET character_set_results = @saved_cs_results */ ; -/*!50003 SET collation_connection = @saved_col_connection */ ; - --- --- Table structure for table `ix_core_userprof_prop` --- - -DROP TABLE IF EXISTS `ix_core_userprof_prop`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_userprof_prop` ( - `ix_core_userprof_id` bigint(20) NOT NULL, - `ix_core_value_id` bigint(20) NOT NULL, - PRIMARY KEY (`ix_core_userprof_id`,`ix_core_value_id`), - KEY `c_cc1c20b1` (`ix_core_value_id`), - CONSTRAINT `c_74285f69` FOREIGN KEY (`ix_core_userprof_id`) REFERENCES `ix_core_userprof` (`id`), - CONSTRAINT `c_cc1c20b1` FOREIGN KEY (`ix_core_value_id`) REFERENCES `ix_core_value` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_userprof_seq` --- - -DROP TABLE IF EXISTS `ix_core_userprof_seq`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_userprof_seq` ( - `next_not_cached_value` bigint(21) NOT NULL, - `minimum_value` bigint(21) NOT NULL, - `maximum_value` bigint(21) NOT NULL, - `start_value` bigint(21) NOT NULL COMMENT 'start value when sequences is created or value if RESTART is used', - `increment` bigint(21) NOT NULL COMMENT 'increment value', - `cache_size` bigint(21) unsigned NOT NULL, - `cycle_option` tinyint(1) unsigned NOT NULL COMMENT '0 if no cycles are allowed, 1 if the sequence should begin a new cycle when maximum_value is passed', - `cycle_count` bigint(21) NOT NULL COMMENT 'How many cycles have been done' -) ENGINE=InnoDB SEQUENCE=1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_value` --- - -DROP TABLE IF EXISTS `ix_core_value`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_value` ( - `dtype` varchar(10) NOT NULL, - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `label` varchar(255) DEFAULT NULL, - `term` varchar(255) DEFAULT NULL, - `href` longtext DEFAULT NULL, - `major_topic` tinyint(1) DEFAULT 0, - `heading` varchar(1024) DEFAULT NULL, - `text` longtext DEFAULT NULL, - `data` longblob DEFAULT NULL, - `data_size` int(11) DEFAULT NULL, - `sha1` varchar(40) DEFAULT NULL, - `mime_type` varchar(32) DEFAULT NULL, - `intval` bigint(20) DEFAULT NULL, - `numval` double DEFAULT NULL, - `unit` varchar(255) DEFAULT NULL, - `lval` double DEFAULT NULL, - `rval` double DEFAULT NULL, - `average` double DEFAULT NULL, - `strval` varchar(1024) DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `value_label_index` (`label`), - KEY `value_term_index` (`term`) -) ENGINE=InnoDB AUTO_INCREMENT=54371927 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_value_seq` --- - -DROP TABLE IF EXISTS `ix_core_value_seq`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_value_seq` ( - `next_not_cached_value` bigint(21) NOT NULL, - `minimum_value` bigint(21) NOT NULL, - `maximum_value` bigint(21) NOT NULL, - `start_value` bigint(21) NOT NULL COMMENT 'start value when sequences is created or value if RESTART is used', - `increment` bigint(21) NOT NULL COMMENT 'increment value', - `cache_size` bigint(21) unsigned NOT NULL, - `cycle_option` tinyint(1) unsigned NOT NULL COMMENT '0 if no cycles are allowed, 1 if the sequence should begin a new cycle when maximum_value is passed', - `cycle_count` bigint(21) NOT NULL COMMENT 'How many cycles have been done' -) ENGINE=InnoDB SEQUENCE=1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_xref` --- - -DROP TABLE IF EXISTS `ix_core_xref`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_xref` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `namespace_id` bigint(20) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `modified` datetime DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `refid` varchar(40) NOT NULL, - `kind` varchar(255) NOT NULL, - `version` bigint(20) NOT NULL, - PRIMARY KEY (`id`), - KEY `i_8bbd04dc` (`namespace_id`), - KEY `xref_refid_index` (`refid`), - KEY `xref_kind_index` (`kind`), - CONSTRAINT `c_76da580e` FOREIGN KEY (`namespace_id`) REFERENCES `ix_core_namespace` (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=5153780 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_xref_property` --- - -DROP TABLE IF EXISTS `ix_core_xref_property`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_xref_property` ( - `ix_core_xref_id` bigint(20) NOT NULL, - `ix_core_value_id` bigint(20) NOT NULL, - PRIMARY KEY (`ix_core_xref_id`,`ix_core_value_id`), - KEY `c_07052a0b` (`ix_core_value_id`), - CONSTRAINT `c_07052a0b` FOREIGN KEY (`ix_core_value_id`) REFERENCES `ix_core_value` (`id`), - CONSTRAINT `c_c56225d5` FOREIGN KEY (`ix_core_xref_id`) REFERENCES `ix_core_xref` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_core_xref_seq` --- - -DROP TABLE IF EXISTS `ix_core_xref_seq`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_core_xref_seq` ( - `next_not_cached_value` bigint(21) NOT NULL, - `minimum_value` bigint(21) NOT NULL, - `maximum_value` bigint(21) NOT NULL, - `start_value` bigint(21) NOT NULL COMMENT 'start value when sequences is created or value if RESTART is used', - `increment` bigint(21) NOT NULL COMMENT 'increment value', - `cache_size` bigint(21) unsigned NOT NULL, - `cycle_option` tinyint(1) unsigned NOT NULL COMMENT '0 if no cycles are allowed, 1 if the sequence should begin a new cycle when maximum_value is passed', - `cycle_count` bigint(21) NOT NULL COMMENT 'How many cycles have been done' -) ENGINE=InnoDB SEQUENCE=1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_agentmod` --- - -DROP TABLE IF EXISTS `ix_ginas_agentmod`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_agentmod` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `owner_uuid` varchar(40) DEFAULT NULL, - `agent_modification_process` varchar(255) DEFAULT NULL, - `agent_modification_role` varchar(255) DEFAULT NULL, - `agent_modification_type` varchar(255) DEFAULT NULL, - `agent_substance_uuid` varchar(40) DEFAULT NULL, - `amount_uuid` varchar(40) DEFAULT NULL, - `modification_group` varchar(255) DEFAULT NULL, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - KEY `i_e8fec8b0` (`created_by_id`), - KEY `i_797c3291` (`last_edited_by_id`), - KEY `i_90654d9b` (`owner_uuid`), - KEY `i_916a29a3` (`agent_substance_uuid`), - KEY `i_8048764d` (`amount_uuid`), - CONSTRAINT `c_09a65704` FOREIGN KEY (`agent_substance_uuid`) REFERENCES `ix_ginas_substanceref` (`uuid`), - CONSTRAINT `c_60a9acb3` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_modifications` (`uuid`), - CONSTRAINT `c_d284f5d7` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_d5922695` FOREIGN KEY (`amount_uuid`) REFERENCES `ix_ginas_amount` (`uuid`), - CONSTRAINT `c_fbcb8c5e` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_amount` --- - -DROP TABLE IF EXISTS `ix_ginas_amount`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_amount` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `type` varchar(255) DEFAULT NULL, - `average` double DEFAULT NULL, - `high_limit` double DEFAULT NULL, - `high` double DEFAULT NULL, - `low_limit` double DEFAULT NULL, - `low` double DEFAULT NULL, - `units` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `non_numeric_value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `approval_id` varchar(10) DEFAULT NULL, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - KEY `i_9044f8e6` (`created_by_id`), - KEY `i_1396ad0a` (`last_edited_by_id`), - CONSTRAINT `c_172b3d49` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_48c42eee` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_code` --- - -DROP TABLE IF EXISTS `ix_ginas_code`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_code` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `owner_uuid` varchar(40) DEFAULT NULL, - `code_system` varchar(255) DEFAULT NULL, - `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `comments` longtext DEFAULT NULL, - `code_text` longtext DEFAULT NULL, - `type` varchar(255) DEFAULT NULL, - `url` longtext DEFAULT NULL, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - KEY `i_edc5bb41` (`created_by_id`), - KEY `i_aa0faf44` (`last_edited_by_id`), - KEY `i_1e97fd27` (`owner_uuid`), - KEY `code_index` (`code`), - KEY `code_system_index` (`code_system`), - KEY `code_code_system_index` (`code`,`code_system`), - KEY `ix_ix_ginas_code_code` (`code`), - KEY `ix_ix_ginas_code_code_system` (`code_system`), - KEY `ix_ix_ginas_code_type` (`type`), - KEY `ix_ix_ginas_code_owner` (`owner_uuid`), - CONSTRAINT `c_1d85e0b8` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_31873b2b` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_substance` (`uuid`), - CONSTRAINT `c_7c279009` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_component` --- - -DROP TABLE IF EXISTS `ix_ginas_component`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_component` ( - `dtype` varchar(10) NOT NULL, - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `type` varchar(255) DEFAULT NULL, - `substance_uuid` varchar(40) DEFAULT NULL, - `internal_version` bigint(20) NOT NULL, - `role` varchar(255) DEFAULT NULL, - `amount_uuid` varchar(40) DEFAULT NULL, - PRIMARY KEY (`uuid`), - KEY `i_1204b09e` (`created_by_id`), - KEY `i_992c5a03` (`last_edited_by_id`), - KEY `i_c5a4340b` (`substance_uuid`), - KEY `i_ec7c7e9a` (`amount_uuid`), - CONSTRAINT `c_175162da` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_358de474` FOREIGN KEY (`substance_uuid`) REFERENCES `ix_ginas_substanceref` (`uuid`), - CONSTRAINT `c_966c1285` FOREIGN KEY (`amount_uuid`) REFERENCES `ix_ginas_amount` (`uuid`), - CONSTRAINT `c_c2cfb61d` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_controlled_vocab` --- - -DROP TABLE IF EXISTS `ix_ginas_controlled_vocab`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_controlled_vocab` ( - `dtype` varchar(10) NOT NULL, - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `namespace_id` bigint(20) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `modified` datetime DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `domain` varchar(255) DEFAULT NULL, - `vocabulary_term_type` varchar(255) DEFAULT NULL, - `editable` tinyint(1) DEFAULT 0, - `filterable` tinyint(1) DEFAULT 0, - `version` bigint(20) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `c_5afb2826` (`domain`), - KEY `i_f95f237a` (`namespace_id`), - CONSTRAINT `c_b23afb26` FOREIGN KEY (`namespace_id`) REFERENCES `ix_core_namespace` (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=4397 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_controlled_vocab_core_value` --- - -DROP TABLE IF EXISTS `ix_ginas_controlled_vocab_core_value`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_controlled_vocab_core_value` ( - `ix_ginas_controlled_vocab_id` bigint(20) NOT NULL, - `ix_core_value_id` bigint(20) NOT NULL, - PRIMARY KEY (`ix_ginas_controlled_vocab_id`,`ix_core_value_id`), - KEY `c_ac65921f` (`ix_core_value_id`), - CONSTRAINT `c_ac65921f` FOREIGN KEY (`ix_core_value_id`) REFERENCES `ix_core_value` (`id`), - CONSTRAINT `c_d583143a` FOREIGN KEY (`ix_ginas_controlled_vocab_id`) REFERENCES `ix_ginas_controlled_vocab` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_controlled_vocab_seq` --- - -DROP TABLE IF EXISTS `ix_ginas_controlled_vocab_seq`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_controlled_vocab_seq` ( - `next_not_cached_value` bigint(21) NOT NULL, - `minimum_value` bigint(21) NOT NULL, - `maximum_value` bigint(21) NOT NULL, - `start_value` bigint(21) NOT NULL COMMENT 'start value when sequences is created or value if RESTART is used', - `increment` bigint(21) NOT NULL COMMENT 'increment value', - `cache_size` bigint(21) unsigned NOT NULL, - `cycle_option` tinyint(1) unsigned NOT NULL COMMENT '0 if no cycles are allowed, 1 if the sequence should begin a new cycle when maximum_value is passed', - `cycle_count` bigint(21) NOT NULL COMMENT 'How many cycles have been done' -) ENGINE=InnoDB SEQUENCE=1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_definition` --- - -DROP TABLE IF EXISTS `ix_ginas_definition`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_definition` ( - `uuid` varchar(40) NOT NULL, - `created` datetime(6) DEFAULT NULL, - `current_version` int(11) NOT NULL, - `deprecated` bit(1) NOT NULL, - `internal_version` bigint(20) DEFAULT NULL, - `last_edited` datetime(6) DEFAULT NULL, - `record_access` mediumblob DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `definition` longtext DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - PRIMARY KEY (`uuid`), - KEY `fk4kcslc98jcqx137enxl5fgs5t` (`created_by_id`), - KEY `fk9wxg9p9i1bi7qoxfcu9gkg9og` (`last_edited_by_id`), - CONSTRAINT `fk4kcslc98jcqx137enxl5fgs5t` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `fk9wxg9p9i1bi7qoxfcu9gkg9og` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_glycosylation` --- - -DROP TABLE IF EXISTS `ix_ginas_glycosylation`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_glycosylation` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `c_glycosylation_sites_uuid` varchar(40) DEFAULT NULL, - `n_glycosylation_sites_uuid` varchar(40) DEFAULT NULL, - `o_glycosylation_sites_uuid` varchar(40) DEFAULT NULL, - `glycosylation_type` varchar(255) DEFAULT NULL, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - KEY `i_f243b84a` (`created_by_id`), - KEY `i_e6735e70` (`last_edited_by_id`), - KEY `i_a41ea995` (`c_glycosylation_sites_uuid`), - KEY `i_e167ac5a` (`n_glycosylation_sites_uuid`), - KEY `i_6caedade` (`o_glycosylation_sites_uuid`), - CONSTRAINT `c_22d42e85` FOREIGN KEY (`c_glycosylation_sites_uuid`) REFERENCES `ix_ginas_site_lob` (`uuid`), - CONSTRAINT `c_8ddb40b1` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_b1b38f93` FOREIGN KEY (`n_glycosylation_sites_uuid`) REFERENCES `ix_ginas_site_lob` (`uuid`), - CONSTRAINT `c_b501c304` FOREIGN KEY (`o_glycosylation_sites_uuid`) REFERENCES `ix_ginas_site_lob` (`uuid`), - CONSTRAINT `c_d9f835a6` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_linkage` --- - -DROP TABLE IF EXISTS `ix_ginas_linkage`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_linkage` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `owner_uuid` varchar(40) DEFAULT NULL, - `linkage` varchar(255) DEFAULT NULL, - `site_container_uuid` varchar(40) DEFAULT NULL, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - KEY `i_69e7b2a7` (`created_by_id`), - KEY `i_5c50e6ba` (`last_edited_by_id`), - KEY `i_31291300` (`owner_uuid`), - KEY `i_3eff1028` (`site_container_uuid`), - CONSTRAINT `c_a8c5dc9e` FOREIGN KEY (`site_container_uuid`) REFERENCES `ix_ginas_site_lob` (`uuid`), - CONSTRAINT `c_ae6b03c1` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_ca67400b` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_de82d9a4` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_nucleicacid` (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_material` --- - -DROP TABLE IF EXISTS `ix_ginas_material`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_material` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `owner_uuid` varchar(40) DEFAULT NULL, - `amount_uuid` varchar(40) DEFAULT NULL, - `monomer_substance_uuid` varchar(40) DEFAULT NULL, - `type` varchar(255) DEFAULT NULL, - `defining` tinyint(1) DEFAULT 0, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - KEY `i_57660fad` (`created_by_id`), - KEY `i_6b6bb6e1` (`last_edited_by_id`), - KEY `i_6dc373fb` (`owner_uuid`), - KEY `i_2cb0b2dd` (`amount_uuid`), - KEY `i_7c19cf3c` (`monomer_substance_uuid`), - CONSTRAINT `c_228619ce` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_8be1479b` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_polymer` (`uuid`), - CONSTRAINT `c_e02e47e1` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_e72e3a1f` FOREIGN KEY (`amount_uuid`) REFERENCES `ix_ginas_amount` (`uuid`), - CONSTRAINT `c_eede4a4e` FOREIGN KEY (`monomer_substance_uuid`) REFERENCES `ix_ginas_substanceref` (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_mixture` --- - -DROP TABLE IF EXISTS `ix_ginas_mixture`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_mixture` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `parent_substance_uuid` varchar(40) DEFAULT NULL, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - KEY `i_873527b2` (`created_by_id`), - KEY `i_046c8793` (`last_edited_by_id`), - KEY `i_8589cf27` (`parent_substance_uuid`), - CONSTRAINT `c_4b599f1d` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_c531797e` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_e140e14f` FOREIGN KEY (`parent_substance_uuid`) REFERENCES `ix_ginas_substanceref` (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_modifications` --- - -DROP TABLE IF EXISTS `ix_ginas_modifications`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_modifications` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - KEY `i_cd4ce51a` (`created_by_id`), - KEY `i_9f57a27d` (`last_edited_by_id`), - CONSTRAINT `c_d0121858` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_db44363c` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_moiety` --- - -DROP TABLE IF EXISTS `ix_ginas_moiety`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_moiety` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `owner_uuid` varchar(40) DEFAULT NULL, - `structure_id` varchar(40) DEFAULT NULL, - `count_uuid` varchar(40) DEFAULT NULL, - `inner_uuid` varchar(255) DEFAULT NULL, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - UNIQUE KEY `c_ce8c5912` (`inner_uuid`), - KEY `i_59b3b423` (`created_by_id`), - KEY `i_521b68cd` (`last_edited_by_id`), - KEY `i_9b5117f0` (`owner_uuid`), - KEY `i_9448f241` (`structure_id`), - KEY `i_c7272b24` (`count_uuid`), - KEY `moiety_owner_index` (`owner_uuid`), - CONSTRAINT `c_1e35889c` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_substance` (`uuid`), - CONSTRAINT `c_4a0fd12e` FOREIGN KEY (`count_uuid`) REFERENCES `ix_ginas_amount` (`uuid`), - CONSTRAINT `c_6c4e84d5` FOREIGN KEY (`structure_id`) REFERENCES `ix_core_structure` (`id`), - CONSTRAINT `c_79e8cf95` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_b45ca216` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_name` --- - -DROP TABLE IF EXISTS `ix_ginas_name`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_name` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `owner_uuid` varchar(40) DEFAULT NULL, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `full_name` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `std_name` longtext DEFAULT NULL, - `type` varchar(32) DEFAULT NULL, - `domains` longtext DEFAULT NULL, - `languages` longtext DEFAULT NULL, - `name_jurisdiction` longtext DEFAULT NULL, - `preferred` tinyint(1) DEFAULT 0, - `display_name` tinyint(1) DEFAULT 0, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - KEY `i_d0a3e858` (`created_by_id`), - KEY `i_e6a2fb51` (`last_edited_by_id`), - KEY `i_25e68980` (`owner_uuid`), - KEY `name_index` (`name`), - KEY `name_owner_index` (`owner_uuid`), - CONSTRAINT `c_3cdaab27` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_52348b70` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_substance` (`uuid`), - CONSTRAINT `c_d3d75121` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_nameorg` --- - -DROP TABLE IF EXISTS `ix_ginas_nameorg`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_nameorg` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `owner_uuid` varchar(40) DEFAULT NULL, - `name_org` varchar(255) NOT NULL, - `deprecated_date` datetime DEFAULT NULL, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - KEY `i_0af6ec35` (`created_by_id`), - KEY `i_9a2588f9` (`last_edited_by_id`), - KEY `i_14ebb953` (`owner_uuid`), - KEY `nameorg_owner_index` (`owner_uuid`), - CONSTRAINT `c_17af48a9` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_name` (`uuid`), - CONSTRAINT `c_4d1f3b68` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_7104c31d` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_note` --- - -DROP TABLE IF EXISTS `ix_ginas_note`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_note` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `owner_uuid` varchar(40) DEFAULT NULL, - `note` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - KEY `i_9cf176b5` (`created_by_id`), - KEY `i_53803677` (`last_edited_by_id`), - KEY `i_236d20c3` (`owner_uuid`), - KEY `note_owner_index` (`owner_uuid`), - CONSTRAINT `c_520232f3` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_substance` (`uuid`), - CONSTRAINT `c_81b64cae` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_e6509aec` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_nucleicacid` --- - -DROP TABLE IF EXISTS `ix_ginas_nucleicacid`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_nucleicacid` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `modifications_uuid` varchar(40) DEFAULT NULL, - `nucleic_acid_type` varchar(255) DEFAULT NULL, - `nucleic_acid_sub_type` varchar(255) DEFAULT NULL, - `sequence_origin` varchar(255) DEFAULT NULL, - `sequence_type` varchar(255) DEFAULT NULL, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - KEY `i_c8ea3507` (`created_by_id`), - KEY `i_b8ebab65` (`last_edited_by_id`), - KEY `i_a1392a03` (`modifications_uuid`), - CONSTRAINT `c_959b9999` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_bb280648` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_eeb5efc7` FOREIGN KEY (`modifications_uuid`) REFERENCES `ix_ginas_modifications` (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_nucleicacid_subunits` --- - -DROP TABLE IF EXISTS `ix_ginas_nucleicacid_subunits`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_nucleicacid_subunits` ( - `ix_ginas_nucleicacid_uuid` varchar(40) NOT NULL, - `ix_ginas_subunit_uuid` varchar(40) NOT NULL, - PRIMARY KEY (`ix_ginas_nucleicacid_uuid`,`ix_ginas_subunit_uuid`), - KEY `c_2d109af2` (`ix_ginas_subunit_uuid`), - CONSTRAINT `c_2d109af2` FOREIGN KEY (`ix_ginas_subunit_uuid`) REFERENCES `ix_ginas_subunit` (`uuid`), - CONSTRAINT `c_5de01eee` FOREIGN KEY (`ix_ginas_nucleicacid_uuid`) REFERENCES `ix_ginas_nucleicacid` (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_otherlinks` --- - -DROP TABLE IF EXISTS `ix_ginas_otherlinks`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_otherlinks` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `owner_uuid` varchar(40) DEFAULT NULL, - `linkage_type` varchar(255) DEFAULT NULL, - `site_container_uuid` varchar(40) DEFAULT NULL, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - KEY `i_fd4e4062` (`created_by_id`), - KEY `i_a755aebd` (`last_edited_by_id`), - KEY `i_a90e8053` (`owner_uuid`), - KEY `i_995b649a` (`site_container_uuid`), - CONSTRAINT `c_11058b93` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_protein` (`uuid`), - CONSTRAINT `c_5e78f982` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_a0829419` FOREIGN KEY (`site_container_uuid`) REFERENCES `ix_ginas_site_lob` (`uuid`), - CONSTRAINT `c_ff3037e8` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_parameter` --- - -DROP TABLE IF EXISTS `ix_ginas_parameter`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_parameter` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `owner_uuid` varchar(40) DEFAULT NULL, - `referenced_substance_uuid` varchar(40) DEFAULT NULL, - `name` varchar(255) NOT NULL, - `type` varchar(255) DEFAULT NULL, - `value_uuid` varchar(40) DEFAULT NULL, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - KEY `i_a0c76346` (`created_by_id`), - KEY `i_bc65cddb` (`last_edited_by_id`), - KEY `i_97bca746` (`owner_uuid`), - KEY `i_75718d16` (`referenced_substance_uuid`), - KEY `i_b9a77f65` (`value_uuid`), - CONSTRAINT `c_a24936da` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_bc99c270` FOREIGN KEY (`value_uuid`) REFERENCES `ix_ginas_amount` (`uuid`), - CONSTRAINT `c_bd1f6900` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_e991be08` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_property` (`uuid`), - CONSTRAINT `c_f176d1eb` FOREIGN KEY (`referenced_substance_uuid`) REFERENCES `ix_ginas_substanceref` (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_physicalmod` --- - -DROP TABLE IF EXISTS `ix_ginas_physicalmod`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_physicalmod` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `owner_uuid` varchar(40) DEFAULT NULL, - `physical_modification_role` varchar(255) DEFAULT NULL, - `modification_group` varchar(255) DEFAULT NULL, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - KEY `i_0b062bce` (`created_by_id`), - KEY `i_7c71774f` (`last_edited_by_id`), - KEY `i_023e1ac8` (`owner_uuid`), - CONSTRAINT `c_6d989fc6` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_744c488c` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_c141927f` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_modifications` (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_physicalpar` --- - -DROP TABLE IF EXISTS `ix_ginas_physicalpar`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_physicalpar` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `owner_uuid` varchar(40) DEFAULT NULL, - `parameter_name` varchar(255) DEFAULT NULL, - `amount_uuid` varchar(40) DEFAULT NULL, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - KEY `i_212447c4` (`created_by_id`), - KEY `i_75c04a35` (`last_edited_by_id`), - KEY `i_082ca133` (`owner_uuid`), - KEY `i_1eb217f4` (`amount_uuid`), - CONSTRAINT `c_034e2f7c` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_b595e4ba` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_dc5bce39` FOREIGN KEY (`amount_uuid`) REFERENCES `ix_ginas_amount` (`uuid`), - CONSTRAINT `c_e0845807` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_physicalmod` (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_polymer` --- - -DROP TABLE IF EXISTS `ix_ginas_polymer`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_polymer` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `classification_uuid` varchar(40) DEFAULT NULL, - `display_structure_id` varchar(40) DEFAULT NULL, - `idealized_structure_id` varchar(40) DEFAULT NULL, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - KEY `i_508683b0` (`created_by_id`), - KEY `i_8356da61` (`last_edited_by_id`), - KEY `i_3e38b877` (`classification_uuid`), - KEY `i_3c66be92` (`display_structure_id`), - KEY `i_48e4a01f` (`idealized_structure_id`), - CONSTRAINT `c_2cda8114` FOREIGN KEY (`display_structure_id`) REFERENCES `ix_core_structure` (`id`), - CONSTRAINT `c_5f9c7f23` FOREIGN KEY (`classification_uuid`) REFERENCES `polymer_classification` (`uuid`), - CONSTRAINT `c_a83467a2` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_d21ee884` FOREIGN KEY (`idealized_structure_id`) REFERENCES `ix_core_structure` (`id`), - CONSTRAINT `c_d85112ff` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_property` --- - -DROP TABLE IF EXISTS `ix_ginas_property`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_property` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `owner_uuid` varchar(40) DEFAULT NULL, - `name` varchar(255) NOT NULL, - `type` varchar(255) DEFAULT NULL, - `property_type` varchar(255) DEFAULT NULL, - `value_uuid` varchar(40) DEFAULT NULL, - `referenced_substance_uuid` varchar(40) DEFAULT NULL, - `defining` tinyint(1) DEFAULT 0, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - KEY `i_6f12c2a9` (`created_by_id`), - KEY `i_7a9b0f71` (`last_edited_by_id`), - KEY `i_434f1898` (`owner_uuid`), - KEY `i_dc5306ee` (`value_uuid`), - KEY `i_18c70ecb` (`referenced_substance_uuid`), - KEY `property_owner_index` (`owner_uuid`), - CONSTRAINT `c_1824202b` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_1f9e699f` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_substance` (`uuid`), - CONSTRAINT `c_3a23d2a9` FOREIGN KEY (`referenced_substance_uuid`) REFERENCES `ix_ginas_substanceref` (`uuid`), - CONSTRAINT `c_5330547a` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_ef8b2c10` FOREIGN KEY (`value_uuid`) REFERENCES `ix_ginas_amount` (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_protein` --- - -DROP TABLE IF EXISTS `ix_ginas_protein`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_protein` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `protein_type` varchar(255) DEFAULT NULL, - `protein_sub_type` varchar(255) DEFAULT NULL, - `sequence_origin` varchar(255) DEFAULT NULL, - `sequence_type` varchar(255) DEFAULT NULL, - `disulf_json` longtext DEFAULT NULL, - `glycosylation_uuid` varchar(40) DEFAULT NULL, - `modifications_uuid` varchar(40) DEFAULT NULL, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - KEY `i_c07043ef` (`created_by_id`), - KEY `i_32cafedb` (`last_edited_by_id`), - KEY `i_75436589` (`glycosylation_uuid`), - KEY `i_fcca9817` (`modifications_uuid`), - CONSTRAINT `c_3e88fd93` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_4f44d62a` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_a6fb4ff8` FOREIGN KEY (`modifications_uuid`) REFERENCES `ix_ginas_modifications` (`uuid`), - CONSTRAINT `c_bcc47a8d` FOREIGN KEY (`glycosylation_uuid`) REFERENCES `ix_ginas_glycosylation` (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_protein_subunit` --- - -DROP TABLE IF EXISTS `ix_ginas_protein_subunit`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_protein_subunit` ( - `ix_ginas_protein_uuid` varchar(40) NOT NULL, - `ix_ginas_subunit_uuid` varchar(40) NOT NULL, - PRIMARY KEY (`ix_ginas_protein_uuid`,`ix_ginas_subunit_uuid`), - KEY `c_0f1fc6ff` (`ix_ginas_subunit_uuid`), - CONSTRAINT `c_0f1fc6ff` FOREIGN KEY (`ix_ginas_subunit_uuid`) REFERENCES `ix_ginas_subunit` (`uuid`), - CONSTRAINT `c_819d6150` FOREIGN KEY (`ix_ginas_protein_uuid`) REFERENCES `ix_ginas_protein` (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_reference` --- - -DROP TABLE IF EXISTS `ix_ginas_reference`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_reference` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `owner_uuid` varchar(40) DEFAULT NULL, - `citation` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `doc_type` varchar(255) DEFAULT NULL, - `document_date` datetime DEFAULT NULL, - `public_domain` tinyint(1) DEFAULT 0, - `tags` longtext DEFAULT NULL, - `uploaded_file` varchar(1024) DEFAULT NULL, - `id` varchar(255) DEFAULT NULL, - `url` longtext DEFAULT NULL, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - KEY `i_2ba5b3d5` (`created_by_id`), - KEY `i_80ef682b` (`last_edited_by_id`), - KEY `i_3ccbbc1c` (`owner_uuid`), - KEY `ref_id_index` (`id`), - KEY `ref_owner_index` (`owner_uuid`), - CONSTRAINT `c_071569ce` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_substance` (`uuid`), - CONSTRAINT `c_cbd3863e` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_df17ffc0` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_relationship` --- - -DROP TABLE IF EXISTS `ix_ginas_relationship`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_relationship` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `owner_uuid` varchar(40) DEFAULT NULL, - `amount_uuid` varchar(40) DEFAULT NULL, - `comments` longtext DEFAULT NULL, - `interaction_type` varchar(255) DEFAULT NULL, - `qualification` varchar(255) DEFAULT NULL, - `related_substance_uuid` varchar(40) DEFAULT NULL, - `mediator_substance_uuid` varchar(40) DEFAULT NULL, - `originator_uuid` varchar(255) DEFAULT NULL, - `type` varchar(255) DEFAULT NULL, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - KEY `i_1e1d5825` (`created_by_id`), - KEY `i_61241701` (`last_edited_by_id`), - KEY `i_47b6e4f0` (`owner_uuid`), - KEY `i_b5235fc5` (`amount_uuid`), - KEY `i_39d89a99` (`related_substance_uuid`), - KEY `i_4195462c` (`mediator_substance_uuid`), - KEY `interaction_index` (`interaction_type`), - KEY `qualification_index` (`qualification`), - KEY `type_index` (`type`), - KEY `relate_originate_index` (`originator_uuid`), - KEY `rel_owner_index` (`owner_uuid`), - CONSTRAINT `c_337c9ac9` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_62502be5` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_936c0c00` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_substance` (`uuid`), - CONSTRAINT `c_a3fdf047` FOREIGN KEY (`related_substance_uuid`) REFERENCES `ix_ginas_substanceref` (`uuid`), - CONSTRAINT `c_d433b684` FOREIGN KEY (`amount_uuid`) REFERENCES `ix_ginas_amount` (`uuid`), - CONSTRAINT `c_e4bb9034` FOREIGN KEY (`mediator_substance_uuid`) REFERENCES `ix_ginas_substanceref` (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_site_lob` --- - -DROP TABLE IF EXISTS `ix_ginas_site_lob`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_site_lob` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `sites_short_hand` longtext DEFAULT NULL, - `sites_json` longtext DEFAULT NULL, - `site_count` bigint(20) DEFAULT NULL, - `site_type` varchar(255) DEFAULT NULL, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - KEY `i_3215d1f7` (`created_by_id`), - KEY `i_2d4558ef` (`last_edited_by_id`), - CONSTRAINT `c_0fd266c8` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_70f007e0` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_ssg1` --- - -DROP TABLE IF EXISTS `ix_ginas_ssg1`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_ssg1` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - KEY `i_c7f61a0d` (`created_by_id`), - KEY `i_043f1e31` (`last_edited_by_id`), - CONSTRAINT `c_13cf7618` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_1763863d` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_strucdiv` --- - -DROP TABLE IF EXISTS `ix_ginas_strucdiv`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_strucdiv` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `source_material_class` varchar(255) DEFAULT NULL, - `source_material_type` varchar(255) DEFAULT NULL, - `source_material_state` varchar(255) DEFAULT NULL, - `organism_family` varchar(255) DEFAULT NULL, - `organism_genus` varchar(255) DEFAULT NULL, - `organism_species` varchar(255) DEFAULT NULL, - `organism_author` varchar(255) DEFAULT NULL, - `part_location` varchar(255) DEFAULT NULL, - `part` longtext DEFAULT NULL, - `infra_specific_type` varchar(255) DEFAULT NULL, - `infra_specific_name` varchar(255) DEFAULT NULL, - `developmental_stage` varchar(255) DEFAULT NULL, - `fraction_name` varchar(255) DEFAULT NULL, - `fraction_material_type` varchar(255) DEFAULT NULL, - `paternal_uuid` varchar(40) DEFAULT NULL, - `maternal_uuid` varchar(40) DEFAULT NULL, - `parent_substance_uuid` varchar(40) DEFAULT NULL, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - KEY `i_2d8cf3af` (`created_by_id`), - KEY `i_9f0fd61b` (`last_edited_by_id`), - KEY `i_b8220566` (`paternal_uuid`), - KEY `i_ce3e8a36` (`maternal_uuid`), - KEY `i_feb57d17` (`parent_substance_uuid`), - CONSTRAINT `c_59e96282` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_7bf1c14b` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_d4abc04c` FOREIGN KEY (`parent_substance_uuid`) REFERENCES `ix_ginas_substanceref` (`uuid`), - CONSTRAINT `c_efc8abcb` FOREIGN KEY (`maternal_uuid`) REFERENCES `ix_ginas_substanceref` (`uuid`), - CONSTRAINT `c_f9c74f43` FOREIGN KEY (`paternal_uuid`) REFERENCES `ix_ginas_substanceref` (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_structuralmod` --- - -DROP TABLE IF EXISTS `ix_ginas_structuralmod`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_structuralmod` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `owner_uuid` varchar(40) DEFAULT NULL, - `structural_modification_type` varchar(255) DEFAULT NULL, - `location_type` varchar(255) DEFAULT NULL, - `residue_modified` varchar(255) DEFAULT NULL, - `site_container_uuid` varchar(40) DEFAULT NULL, - `extent` varchar(255) DEFAULT NULL, - `extent_amount_uuid` varchar(40) DEFAULT NULL, - `molecular_fragment_uuid` varchar(40) DEFAULT NULL, - `moleculare_fragment_role` varchar(255) DEFAULT NULL, - `modification_group` varchar(255) DEFAULT NULL, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - KEY `i_7d778ca2` (`created_by_id`), - KEY `i_f48ed7eb` (`last_edited_by_id`), - KEY `i_cb2f3eab` (`owner_uuid`), - KEY `i_54af7999` (`site_container_uuid`), - KEY `i_91129afe` (`extent_amount_uuid`), - KEY `i_488d4d1a` (`molecular_fragment_uuid`), - CONSTRAINT `c_2144c64c` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_633ba313` FOREIGN KEY (`site_container_uuid`) REFERENCES `ix_ginas_site_lob` (`uuid`), - CONSTRAINT `c_d6fed8e4` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_modifications` (`uuid`), - CONSTRAINT `c_d9a4a985` FOREIGN KEY (`extent_amount_uuid`) REFERENCES `ix_ginas_amount` (`uuid`), - CONSTRAINT `c_f6bac92e` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_fbb8858e` FOREIGN KEY (`molecular_fragment_uuid`) REFERENCES `ix_ginas_substanceref` (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_substance` --- - -DROP TABLE IF EXISTS `ix_ginas_substance`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_substance` ( - `dtype` varchar(10) NOT NULL, - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `definition_type` int(11) DEFAULT NULL, - `definition_level` int(11) DEFAULT NULL, - `class` int(11) DEFAULT NULL, - `status` varchar(255) DEFAULT NULL, - `version` varchar(255) DEFAULT NULL, - `approved_by_id` bigint(20) DEFAULT NULL, - `approved` datetime DEFAULT NULL, - `change_reason` varchar(255) DEFAULT NULL, - `modifications_uuid` varchar(40) DEFAULT NULL, - `approval_id` varchar(10) DEFAULT NULL, - `internal_version` bigint(20) NOT NULL, - `structure_id` varchar(40) DEFAULT NULL, - `mixture_uuid` varchar(40) DEFAULT NULL, - `nucleic_acid_uuid` varchar(40) DEFAULT NULL, - `polymer_uuid` varchar(40) DEFAULT NULL, - `protein_uuid` varchar(40) DEFAULT NULL, - `specified_substance_uuid` varchar(40) DEFAULT NULL, - `structurally_diverse_uuid` varchar(40) DEFAULT NULL, - PRIMARY KEY (`uuid`), - KEY `i_017dd520` (`created_by_id`), - KEY `i_fa710fd0` (`last_edited_by_id`), - KEY `i_501769c0` (`approved_by_id`), - KEY `i_3062c782` (`modifications_uuid`), - KEY `i_5f8e95e3` (`structure_id`), - KEY `i_bd94d543` (`mixture_uuid`), - KEY `i_57ae22d0` (`nucleic_acid_uuid`), - KEY `i_ce536a5e` (`polymer_uuid`), - KEY `i_23563b9c` (`protein_uuid`), - KEY `i_47e7be29` (`specified_substance_uuid`), - KEY `i_7b7cc8b8` (`structurally_diverse_uuid`), - KEY `sub_approval_index` (`approval_id`), - KEY `sub_dtype_index` (`dtype`), - CONSTRAINT `c_032cfcd1` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_1ca5b4ff` FOREIGN KEY (`modifications_uuid`) REFERENCES `ix_ginas_modifications` (`uuid`), - CONSTRAINT `c_254367aa` FOREIGN KEY (`polymer_uuid`) REFERENCES `ix_ginas_polymer` (`uuid`), - CONSTRAINT `c_2a618519` FOREIGN KEY (`nucleic_acid_uuid`) REFERENCES `ix_ginas_nucleicacid` (`uuid`), - CONSTRAINT `c_58b246cd` FOREIGN KEY (`approved_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_6a75f028` FOREIGN KEY (`structure_id`) REFERENCES `ix_core_structure` (`id`), - CONSTRAINT `c_8c408528` FOREIGN KEY (`structurally_diverse_uuid`) REFERENCES `ix_ginas_strucdiv` (`uuid`), - CONSTRAINT `c_a38cec20` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_abe2e656` FOREIGN KEY (`specified_substance_uuid`) REFERENCES `ix_ginas_ssg1` (`uuid`), - CONSTRAINT `c_c9363aed` FOREIGN KEY (`protein_uuid`) REFERENCES `ix_ginas_protein` (`uuid`), - CONSTRAINT `c_e3fbf5c3` FOREIGN KEY (`mixture_uuid`) REFERENCES `ix_ginas_mixture` (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_substance_mix_comp` --- - -DROP TABLE IF EXISTS `ix_ginas_substance_mix_comp`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_substance_mix_comp` ( - `ix_ginas_mixture_uuid` varchar(40) NOT NULL, - `ix_ginas_component_uuid` varchar(40) NOT NULL, - PRIMARY KEY (`ix_ginas_mixture_uuid`,`ix_ginas_component_uuid`), - KEY `c_0b03e134` (`ix_ginas_component_uuid`), - CONSTRAINT `c_0b03e134` FOREIGN KEY (`ix_ginas_component_uuid`) REFERENCES `ix_ginas_component` (`uuid`), - CONSTRAINT `c_0cedb7b8` FOREIGN KEY (`ix_ginas_mixture_uuid`) REFERENCES `ix_ginas_mixture` (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_substance_ss_comp` --- - -DROP TABLE IF EXISTS `ix_ginas_substance_ss_comp`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_substance_ss_comp` ( - `ix_ginas_ssg1_uuid` varchar(40) NOT NULL, - `ix_ginas_component_uuid` varchar(40) NOT NULL, - PRIMARY KEY (`ix_ginas_ssg1_uuid`,`ix_ginas_component_uuid`), - KEY `c_fdd7602a` (`ix_ginas_component_uuid`), - CONSTRAINT `c_a5b1f22a` FOREIGN KEY (`ix_ginas_ssg1_uuid`) REFERENCES `ix_ginas_ssg1` (`uuid`), - CONSTRAINT `c_fdd7602a` FOREIGN KEY (`ix_ginas_component_uuid`) REFERENCES `ix_ginas_component` (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_substance_tags` --- - -DROP TABLE IF EXISTS `ix_ginas_substance_tags`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_substance_tags` ( - `ix_ginas_substance_uuid` varchar(40) NOT NULL, - `ix_core_value_id` bigint(20) NOT NULL, - PRIMARY KEY (`ix_ginas_substance_uuid`,`ix_core_value_id`), - KEY `c_995ed877` (`ix_core_value_id`), - CONSTRAINT `c_52663f1e` FOREIGN KEY (`ix_ginas_substance_uuid`) REFERENCES `ix_ginas_substance` (`uuid`), - CONSTRAINT `c_995ed877` FOREIGN KEY (`ix_core_value_id`) REFERENCES `ix_core_value` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_substanceref` --- - -DROP TABLE IF EXISTS `ix_ginas_substanceref`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_substanceref` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `ref_pname` varchar(1024) DEFAULT NULL, - `refuuid` varchar(128) DEFAULT NULL, - `substance_class` varchar(255) DEFAULT NULL, - `approval_id` varchar(32) DEFAULT NULL, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - KEY `i_72eceab6` (`created_by_id`), - KEY `i_e935f847` (`last_edited_by_id`), - KEY `ref_uuid_index` (`refuuid`), - KEY `sub_ref_index` (`refuuid`), - CONSTRAINT `c_9b338593` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_bc0dcaaa` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_subunit` --- - -DROP TABLE IF EXISTS `ix_ginas_subunit`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_subunit` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `sequence` longtext DEFAULT NULL, - `subunit_index` int(11) DEFAULT NULL, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - KEY `i_848760c5` (`created_by_id`), - KEY `i_3f6a6aa5` (`last_edited_by_id`), - CONSTRAINT `c_77fe4be4` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_f5925ba9` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_sugar` --- - -DROP TABLE IF EXISTS `ix_ginas_sugar`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_sugar` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `owner_uuid` varchar(40) DEFAULT NULL, - `sugar` varchar(255) DEFAULT NULL, - `site_container_uuid` varchar(40) DEFAULT NULL, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - KEY `i_a4bffe4a` (`created_by_id`), - KEY `i_68c29fda` (`last_edited_by_id`), - KEY `i_9359fa3c` (`owner_uuid`), - KEY `i_a7509a91` (`site_container_uuid`), - CONSTRAINT `c_1b8dcc24` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_1bdc9737` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_40a4802c` FOREIGN KEY (`site_container_uuid`) REFERENCES `ix_ginas_site_lob` (`uuid`), - CONSTRAINT `c_9e3fbfd1` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_nucleicacid` (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_unit` --- - -DROP TABLE IF EXISTS `ix_ginas_unit`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_unit` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `owner_uuid` varchar(40) DEFAULT NULL, - `amap_id` bigint(20) DEFAULT NULL, - `amount_uuid` varchar(40) DEFAULT NULL, - `attachment_count` int(11) DEFAULT NULL, - `label` varchar(255) DEFAULT NULL, - `structure` longtext DEFAULT NULL, - `type` varchar(255) DEFAULT NULL, - `attachmentMap` longtext DEFAULT NULL, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - KEY `i_e1fe74d1` (`created_by_id`), - KEY `i_083bb113` (`last_edited_by_id`), - KEY `i_e89dda2c` (`owner_uuid`), - KEY `i_bece0bd4` (`amap_id`), - KEY `i_3d103a81` (`amount_uuid`), - CONSTRAINT `c_47464e5a` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_4f784205` FOREIGN KEY (`amount_uuid`) REFERENCES `ix_ginas_amount` (`uuid`), - CONSTRAINT `c_9bc432b1` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_dc716ff8` FOREIGN KEY (`amap_id`) REFERENCES `ix_core_value` (`id`), - CONSTRAINT `c_f269116f` FOREIGN KEY (`owner_uuid`) REFERENCES `ix_ginas_polymer` (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_vocabulary_term` --- - -DROP TABLE IF EXISTS `ix_ginas_vocabulary_term`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_vocabulary_term` ( - `dtype` varchar(10) NOT NULL, - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `namespace_id` bigint(20) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `modified` datetime DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `owner_id` bigint(20) DEFAULT NULL, - `value` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `display` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `description` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `origin` varchar(255) DEFAULT NULL, - `filters` longtext DEFAULT NULL, - `hidden` tinyint(1) DEFAULT 0, - `selected` tinyint(1) DEFAULT 0, - `version` bigint(20) NOT NULL, - `system_category` varchar(255) DEFAULT NULL, - `regex` varchar(255) DEFAULT NULL, - `fragment_structure` varchar(255) DEFAULT NULL, - `simplified_structure` varchar(255) DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `i_c9edf351` (`namespace_id`), - KEY `i_e7c81616` (`owner_id`), - KEY `vocabulary_term_owner_index` (`owner_id`), - CONSTRAINT `c_26a25a8c` FOREIGN KEY (`owner_id`) REFERENCES `ix_ginas_controlled_vocab` (`id`), - CONSTRAINT `c_a94727e8` FOREIGN KEY (`namespace_id`) REFERENCES `ix_core_namespace` (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=106722 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_ginas_vocabulary_term_seq` --- - -DROP TABLE IF EXISTS `ix_ginas_vocabulary_term_seq`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_ginas_vocabulary_term_seq` ( - `next_not_cached_value` bigint(21) NOT NULL, - `minimum_value` bigint(21) NOT NULL, - `maximum_value` bigint(21) NOT NULL, - `start_value` bigint(21) NOT NULL COMMENT 'start value when sequences is created or value if RESTART is used', - `increment` bigint(21) NOT NULL COMMENT 'increment value', - `cache_size` bigint(21) unsigned NOT NULL, - `cycle_option` tinyint(1) unsigned NOT NULL COMMENT '0 if no cycles are allowed, 1 if the sequence should begin a new cycle when maximum_value is passed', - `cycle_count` bigint(21) NOT NULL COMMENT 'How many cycles have been done' -) ENGINE=InnoDB SEQUENCE=1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_import_data` --- - -DROP TABLE IF EXISTS `ix_import_data`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_import_data` ( - `instance_id` varchar(40) NOT NULL, - `data` longtext DEFAULT NULL, - `entity_class_name` varchar(255) DEFAULT NULL, - `record_id` varchar(40) DEFAULT NULL, - `save_date` datetime(6) DEFAULT NULL, - `version` int(11) NOT NULL, - PRIMARY KEY (`instance_id`), - KEY `idx_ix_import_data_entity_class_name` (`entity_class_name`), - KEY `idx_ix_import_data_version` (`version`), - KEY `idx_ix_import_data_record_id` (`record_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_import_mapping` --- - -DROP TABLE IF EXISTS `ix_import_mapping`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_import_mapping` ( - `mapping_id` varchar(40) NOT NULL, - `data_location` varchar(255) DEFAULT NULL, - `entity_class` varchar(255) DEFAULT NULL, - `instance_id` varchar(40) DEFAULT NULL, - `mapping_key` varchar(255) DEFAULT NULL, - `qualifier` varchar(255) DEFAULT NULL, - `record_id` varchar(40) DEFAULT NULL, - `mapping_value` varchar(512) DEFAULT NULL, - `instanceId` varchar(40) DEFAULT NULL, - PRIMARY KEY (`mapping_id`), - KEY `idx_ix_import_mapping_key` (`mapping_key`), - KEY `idx_ix_import_mapping_value` (`mapping_value`), - KEY `idx_ix_import_mapping_instance_id` (`instance_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_import_metadata` --- - -DROP TABLE IF EXISTS `ix_import_metadata`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_import_metadata` ( - `record_id` varchar(40) NOT NULL, - `data_format` varchar(255) DEFAULT NULL, - `entity_class_name` varchar(255) DEFAULT NULL, - `import_adapter` varchar(255) DEFAULT NULL, - `import_status` int(11) DEFAULT NULL, - `import_type` int(11) DEFAULT NULL, - `instance_id` varchar(40) DEFAULT NULL, - `process_status` int(11) DEFAULT NULL, - `reason` varchar(255) DEFAULT NULL, - `record_access` mediumblob DEFAULT NULL, - `source_name` varchar(255) DEFAULT NULL, - `validation_status` int(11) DEFAULT NULL, - `version` int(11) NOT NULL, - `version_creation_date` datetime(6) DEFAULT NULL, - `version_status` int(11) DEFAULT NULL, - PRIMARY KEY (`record_id`), - UNIQUE KEY `UK_b3wth3q98eiauf3rngwjybxve` (`instance_id`), - KEY `idx_ix_import_metadata_entity_class_name` (`entity_class_name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_import_raw` --- - -DROP TABLE IF EXISTS `ix_import_raw`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_import_raw` ( - `record_id` varchar(40) NOT NULL, - `raw_data` longblob DEFAULT NULL, - `record_format` varchar(255) DEFAULT NULL, - PRIMARY KEY (`record_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ix_import_validation` --- - -DROP TABLE IF EXISTS `ix_import_validation`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `ix_import_validation` ( - `validation_id` varchar(40) NOT NULL, - `validation_date` datetime(6) DEFAULT NULL, - `validation_json` longtext DEFAULT NULL, - `validation_message` varchar(2048) DEFAULT NULL, - `validation_type` int(11) DEFAULT NULL, - `entity_class_name` varchar(255) DEFAULT NULL, - `instance_id` varchar(40) DEFAULT NULL, - `version` int(11) NOT NULL, - `instanceId` varchar(40) DEFAULT NULL, - PRIMARY KEY (`validation_id`), - KEY `idx_ix_import_validation_entity_class_name` (`entity_class_name`), - KEY `idx_ix_import_validation_version` (`version`), - KEY `idx_ix_import_validation_instance_id` (`instance_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `play_evolutions` --- - -DROP TABLE IF EXISTS `play_evolutions`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `play_evolutions` ( - `id` int(11) NOT NULL, - `hash` varchar(255) NOT NULL, - `applied_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), - `apply_script` longtext DEFAULT NULL, - `revert_script` longtext DEFAULT NULL, - `state` varchar(255) DEFAULT NULL, - `last_problem` text DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `polymer_classification` --- - -DROP TABLE IF EXISTS `polymer_classification`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `polymer_classification` ( - `uuid` varchar(40) NOT NULL, - `current_version` int(11) DEFAULT NULL, - `created` datetime DEFAULT NULL, - `created_by_id` bigint(20) DEFAULT NULL, - `last_edited` datetime DEFAULT NULL, - `last_edited_by_id` bigint(20) DEFAULT NULL, - `deprecated` tinyint(1) DEFAULT 0, - `record_access` varbinary(255) DEFAULT NULL, - `internal_references` longtext DEFAULT NULL, - `polymer_class` varchar(255) DEFAULT NULL, - `polymer_geometry` varchar(255) DEFAULT NULL, - `polymer_subclass` longtext DEFAULT NULL, - `source_type` varchar(255) DEFAULT NULL, - `parent_substance_uuid` varchar(40) DEFAULT NULL, - `internal_version` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), - KEY `i_ed48cb35` (`created_by_id`), - KEY `i_7009c842` (`last_edited_by_id`), - KEY `i_a11b724a` (`parent_substance_uuid`), - CONSTRAINT `c_37c0d602` FOREIGN KEY (`last_edited_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_86d29a3e` FOREIGN KEY (`created_by_id`) REFERENCES `ix_core_principal` (`id`), - CONSTRAINT `c_99019ebe` FOREIGN KEY (`parent_substance_uuid`) REFERENCES `ix_ginas_substanceref` (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; - -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; - --- Dump completed on 2023-10-24 2:53:09 - - --- Migration to GSRS 3.1, January 2024 -ALTER TABLE ix_core_db_gsrs_version MODIFY COLUMN `id` bigint not null auto_increment; - -ALTER TABLE ix_core_key_user_list MODIFY COLUMN `id` bigint not null auto_increment; -ALTER TABLE ix_core_key_user_list ADD COLUMN `kind` varchar(255); -ALTER TABLE ix_core_key_user_list DROP INDEX ukbomijjxdp2cmjttgrnqtoucvo; -alter table ix_core_key_user_list add constraint ukbomijjxdp2cmjttgrnqtoucvo unique (entity_key, list_name, user_id, kind); - -ALTER TABLE ix_core_user_saved_list MODIFY COLUMN `id` bigint not null auto_increment; -ALTER TABLE ix_core_user_saved_list ADD COLUMN `kind` varchar(255); -ALTER TABLE ix_core_user_saved_list DROP INDEX uknftwibs7mebodwpavq6ub0lqh; -alter table ix_core_user_saved_list add constraint uknftwibs7mebodwpavq6ub0lqh unique (name, user_id, kind); - - -ALTER TABLE ix_import_metadata ADD COLUMN `imported_by_id` bigint; -alter table ix_import_metadata add constraint fkn75dm5x09m6wvk7uq5q74do9c foreign key (imported_by_id) references ix_core_principal (id); -alter table ix_ginas_vocabulary_term change column value term_value varchar(3000); \ No newline at end of file diff --git a/packages/rails/docker/misc/gsrs/config/frontend_application.conf b/packages/rails/docker/misc/gsrs/config/frontend_application.conf deleted file mode 100644 index 2b9d2b8555..0000000000 --- a/packages/rails/docker/misc/gsrs/config/frontend_application.conf +++ /dev/null @@ -1,1230 +0,0 @@ -{ - "apiBaseUrl": "https://localhost:3000/ginas/app/", - "version": "3.0.2", - "contactEmail": "admin@admin.com", - "isPfdaVersion": true, - "displayMatchApplication": "false", - "adverseEventShinyHomepageDisplay": "true", - "adverseEventShinySubstanceNameDisplay": "true", - "adverseEventShinyAdverseEventDisplay": "true", - "bannerMessage": null, - "showNameStandardizeButton": true, - "advancedSearchFacetDisplay": false, - "approvalCodeName": "UNII", - "primaryCode": "BDNUM", - "filteredDuplicationCodes": [ - "BDNUM", - "FDA UNII" - ], - "typeaheadFields": [ - "Standardized_Name", - "Display_Name", - "CAS", - "Name", - "Approval_ID" - ], - "loadedComponents": { - "applications": false, - "products": false, - "clinicaltrials": false, - "adverseevents": false, - "impurities": false - }, - "substanceDetailsCards": [ - { - "card": "substance-overview", - "title": "overview" - }, - { - "card": "substance-primary-definition", - "title": "Primary Definition", - "filters": [ - { - "filterName": "equals", - "propertyToCheck": "definitionType", - "value": "ALTERNATIVE" - } - ] - }, - { - "card": "substance-alternative-definition", - "type": "SUBSTANCE->SUB_ALTERNATE", - "title": "Alternative Definitions", - "filters": [ - { - "filterName": "exists", - "propertyToCheck": "relationships" - }, - { - "filterName": "substanceRelationships", - "value": "SUBSTANCE->SUB_ALTERNATE" - } - ] - }, - { - "card": "substance-relationships", - "type": "SUB_CONCEPT->SUBSTANCE", - "title": "Subconcepts Variants", - "filters": [ - { - "filterName": "exists", - "propertyToCheck": "relationships" - }, - { - "filterName": "substanceRelationships", - "value": "SUB_CONCEPT->SUBSTANCE" - } - ] - }, - { - "card": "substance-concept-definition", - "title": "Concept Definition", - "filters": [ - { - "filterName": "equals", - "propertyToCheck": "substanceClass", - "value": "concept" - } - ] - }, - { - "card": "substance-mixture-parent", - "title": "Found in Mixtures", - "filters": [ - { - "filterName": "exists", - "propertyToCheck": "$$mixtureParents" - } - ] - }, - { - "card": "substance-ssg1-parent", - "title": "Found in G1SS", - "filters": [ - { - "filterName": "exists", - "propertyToCheck": "$$constituentParents" - } - ] - }, - { - "card": "substance-hierarchy", - "title": "Substance Hierarchy" - }, - { - "card": "structure-details", - "title": "Chemical Structure", - "filters": [ - { - "filterName": "equals", - "propertyToCheck": "substanceClass", - "value": "chemical|polymer" - }, - { - "filterName": "exists", - "propertyToCheck": "structure" - } - ] - }, - { - "card": "substance-moieties", - "title": "Chemical Moieties", - "filters": [ - { - "filterName": "equals", - "propertyToCheck": "substanceClass", - "value": "chemical" - }, - { - "filterName": "exists", - "propertyToCheck": "moieties" - } - ] - }, - { - "card": "substance-subunits", - "title": "Protein Subunits", - "filters": [ - { - "filterName": "equals", - "propertyToCheck": "substanceClass", - "value": "protein" - }, - { - "filterName": "exists", - "propertyToCheck": "protein.subunits" - } - ] - }, - { - "card": "substance-glycosylation", - "title": "Protein Glycosylation", - "filters": [ - { - "filterName": "equals", - "propertyToCheck": "substanceClass", - "value": "protein" - }, - { - "filterName": "anyExists", - "propertyToCheck": "protein.glycosylation.glycosylationType|protein.glycosylation.CGlycosylationSites|protein.glycosylation.NGlycosylationSites|protein.glycosylation.OGlycosylationSites" - } - ] - }, - { - "card": "substance-disulfide-links", - "title": "Protein Disulfide Links", - "filters": [ - { - "filterName": "equals", - "propertyToCheck": "substanceClass", - "value": "protein" - }, - { - "filterName": "exists", - "propertyToCheck": "protein.disulfideLinks" - } - ] - }, - { - "card": "substance-other-links", - "title": "Protein Other Links", - "filters": [ - { - "filterName": "equals", - "propertyToCheck": "substanceClass", - "value": "protein" - }, - { - "filterName": "exists", - "propertyToCheck": "protein.otherLinks" - } - ] - }, - { - "card": "substance-subunits", - "title": "Nuceic Acid Subunits", - "filters": [ - { - "filterName": "equals", - "propertyToCheck": "substanceClass", - "value": "nucleicAcid" - }, - { - "filterName": "exists", - "propertyToCheck": "nucleicAcid.subunits" - } - ] - }, - { - "card": "substance-na-sugars", - "title": "Nucleic Acid Sugars", - "filters": [ - { - "filterName": "equals", - "propertyToCheck": "substanceClass", - "value": "nucleicAcid" - }, - { - "filterName": "exists", - "propertyToCheck": "nucleicAcid.sugars" - } - ] - }, - { - "card": "substance-na-linkages", - "title": "Nucleic Acid Linkages", - "filters": [ - { - "filterName": "equals", - "propertyToCheck": "substanceClass", - "value": "nucleicAcid" - }, - { - "filterName": "exists", - "propertyToCheck": "nucleicAcid.linkages" - } - ] - }, - { - "card": "substance-polymer-structure", - "title": "Polymer Display Structure", - "filters": [ - { - "filterName": "equals", - "propertyToCheck": "substanceClass", - "value": "polymer" - } - ] - }, - { - "card": "substance-monomers", - "title": "Polymer Monomers and Starting Materials", - "filters": [ - { - "filterName": "equals", - "propertyToCheck": "substanceClass", - "value": "polymer" - }, - { - "filterName": "exists", - "propertyToCheck": "polymer.monomers" - } - ] - }, - { - "card": "substance-structural-units", - "title": "Polymer Structural Units", - "filters": [ - { - "filterName": "equals", - "propertyToCheck": "substanceClass", - "value": "polymer" - }, - { - "filterName": "exists", - "propertyToCheck": "polymer.structuralUnits" - } - ] - }, - { - "card": "substance-mixture-source", - "title": "Mixture Source", - "filters": [ - { - "filterName": "equals", - "propertyToCheck": "substanceClass", - "value": "mixture" - }, - { - "filterName": "exists", - "propertyToCheck": "mixture.parentSubstance" - } - ] - }, - { - "card": "substance-mixture-components", - "title": "Mixture Components", - "filters": [ - { - "filterName": "equals", - "propertyToCheck": "substanceClass", - "value": "mixture" - }, - { - "filterName": "exists", - "propertyToCheck": "mixture.components" - } - ] - }, - { - "card": "substance-constituents", - "title": "G1 Specified Substance Constituents", - "filters": [ - { - "filterName": "equals", - "propertyToCheck": "substanceClass", - "value": "specifiedSubstanceG1" - }, - { - "filterName": "exists", - "propertyToCheck": "specifiedSubstance.constituents" - } - ] - }, - { - "card": "substance-modifications", - "title": "Substance Modifications", - "filters": [ - { - "filterName": "anyExists", - "propertyToCheck": "modifications.structuralModifications|modifications.physicalModifications|modifications.agentModifications" - } - ] - }, - { - "card": "substance-ssg-parent-substance", - "title": "G3 Specified Substance Parent", - "filters": [ - { - "filterName": "exists", - "propertyToCheck": "specifiedSubstanceG3.parentSubstance" - } - ] - }, - { - "card": "substance-ssg-definition", - "title": "G3 Specified Substance Definition", - "filters": [ - { - "filterName": "exists", - "propertyToCheck": "specifiedSubstanceG3.definition" - } - ] - }, - { - "card": "substance-ssg-grade", - "title": "G3 Specified Substance Grade", - "filters": [ - { - "filterName": "exists", - "propertyToCheck": "specifiedSubstanceG3.grade" - } - ] - }, - { - "card": "substance-names", - "title": "Names and Synonyms", - "filters": [ - { - "filterName": "exists", - "propertyToCheck": "names" - } - ] - }, - { - "card": "substance-codes", - "type": "Codes - Classifications", - "filters": [ - { - "filterName": "exists", - "propertyToCheck": "codes" - }, - { - "filterName": "substanceCodes", - "value": "classification" - } - ] - }, - { - "card": "substance-codes", - "type": "Codes - Identifiers", - "filters": [ - { - "filterName": "exists", - "propertyToCheck": "codes" - }, - { - "filterName": "substanceCodes", - "value": "identifiers" - } - ] - }, - { - "card": "substance-properties", - "title": "Characteristic Attributes", - "filters": [ - { - "filterName": "exists", - "propertyToCheck": "properties" - } - ] - }, - { - "card": "substance-relationships-visualization", - "title": "Relationships Visualization", - "filters": [ - { - "filterName": "exists", - "propertyToCheck": "relationships" - } - ] - }, - { - "card": "substance-relationships", - "type": "ACTIVE MOIETY", - "title": "Relationships: Active Moiety", - "filters": [ - { - "filterName": "exists", - "propertyToCheck": "relationships" - }, - { - "filterName": "substanceRelationships", - "value": "ACTIVE MOIETY" - } - ] - }, - { - "card": "substance-relationships", - "type": "METABOLITE", - "title": "Relationships: Metabolites", - "filters": [ - { - "filterName": "exists", - "propertyToCheck": "relationships" - }, - { - "filterName": "substanceRelationships", - "value": "METABOLITE" - } - ] - }, - { - "card": "substance-relationships", - "type": "IMPURITY", - "title": "Relationships: Impurities", - "filters": [ - { - "filterName": "exists", - "propertyToCheck": "relationships" - }, - { - "filterName": "substanceRelationships", - "value": "IMPURITY" - } - ] - }, - { - "card": "substance-relationships", - "type": "CONSTITUENT", - "title": "Relationships: Constitents", - "filters": [ - { - "filterName": "exists", - "propertyToCheck": "relationships" - }, - { - "filterName": "substanceRelationships", - "value": "CONSTITUENT" - } - ] - }, - { - "card": "substance-relationships", - "type": "RELATIONSHIPS", - "title": "Relationships", - "filters": [ - { - "filterName": "exists", - "propertyToCheck": "relationships" - }, - { - "filterName": "substanceRelationships", - "value": [ - "METABOLITE", - "IMPURITY", - "ACTIVE MOIETY", - "CONSTITUENT", - "SUB_CONCEPT->SUBSTANCE" - ] - } - ] - }, - { - "card": "substance-notes", - "title": "Notes", - "filters": [ - { - "filterName": "exists", - "propertyToCheck": "notes" - } - ] - }, - { - "card": "substance-references", - "title": "References", - "filters": [ - { - "filterName": "exists", - "propertyToCheck": "references" - } - ] - }, - { - "card": "substance-audit-info", - "title": "Audit Information" - }, - { - "card": "substance-history", - "title": "Record History", - "filters": [ - { - "filterName": "hasCredentials", - "propertyToCheck": "admin" - } - ] - } - ], - "facets": { - "substances": { - "default": [ - "Deprecated", - "Record Status", - "Substance Class", - "GInAS Tag", - "Relationships", - "Code System", - "ATC Level 1", - "ATC Level 2", - "ATC Level 3", - "ATC Level 4", - "WHO-SDG Level 1", - "WHO-SDG Level 2", - "Application Status", - "Application Type", - "DME Reactions", - "Moiety Type", - "Molecular Weight", - "SubstanceStereochemistry", - "Record Level Access", - "Display Name Level Access", - "Definition Level Access", - "Protein Type", - "modified", - "Product Ingredient Type", - "Product Type", - "Product Dosage Form", - "Definition Level", - "Clinical Trial Count" - ], - "admin": [ - "Record Created By", - "root_lastEdited", - "root_created", - "root_lastEditedBy", - "root_approved", - "Approved By", - "Material Type", - "Family", - "Parts" - ], - "facetView": [ - { - "category": "Default", - "facets": [ - "Deprecated", - "Record Status", - "Substance Class", - "GInAS Tag", - "GInAS Domain", - "Code System", - "ATC Level 1", - "ATC Level 2", - "ATC Level 3", - "ATC Level 4", - "WHO-SDG Level 1", - "WHO-SDG Level 2", - "DME Reactions", - "Application Center", - "Application Type", - "Application Status", - "Material Type", - "Family", - "Parts", - "Moiety Type", - "Molecular Weight", - "SubstanceStereochemistry", - "root_approved", - "Approved By", - "root_created", - "Record Created By", - "root_lastEdited", - "root_lastEditedBy", - "Record Level Access", - "Display Name Level Access", - "Definition Level Access", - "Protein Type", - "Product Ingredient Type", - "Product Type", - "Product Dosage Form", - "Definition Level", - "Clinical Trial Count", - "Relationships" - ] - }, - { - "category": "Record Data", - "facets": [ - "Deprecated", - "Record Status", - "Substance Class", - "Definition Type", - "Definition Level", - "GInAS Tag", - "GInAS Domain", - "GInAS Language", - "GInAS Name Jurisdiction", - "Code System", - "root_approved", - "Approved By", - "root_created", - "Record Created By", - "root_lastEdited", - "root_lastEditedBy", - "Record Level Access", - "Display Name Level Access", - "Definition Level Access", - "Validation", - "Reference Type", - "GInAS Document Tag", - "Relationships" - ] - }, - { - "category": "User Data", - "facets": [ - "Record Created By", - "Approved By", - "root_lastEditedBy" - ] - }, - { - "category": "CMC Data", - "facets": [ - "Record Status", - "Substance Class", - "Code System", - "GInAS Tag", - "Moiety Type", - "Application Center", - "Application Type", - "Application Status", - "Product Ingredient Type", - "Product Type", - "Product Dosage Form", - "Clinical Trial Count", - "CFR", - "Qualification", - "Interaction Type" - ] - }, - { - "category": "Medical Data", - "facets": [ - "Record Status", - "Substance Class", - "ATC Level 1", - "ATC Level 2", - "ATC Level 3", - "ATC Level 4", - "WHO-SDG Level 1", - "WHO-SDG Level 2", - "DME Reactions", - "Code System", - "GInAS Tag", - "Product Ingredient Type", - "Product Type", - "Product Dosage Form", - "Clinical Trial Count", - "CFR" - ] - }, - { - "category": "Chemistry", - "facets": [ - "Record Status", - "Substance Class", - "Code System", - "GInAS Tag", - "Moiety Type", - "Molecular Weight", - "SubstanceStereochemistry", - "Molecular Formula", - "Polymer Class", - "GInAS Subclass", - "Polymer Geometry" - ] - }, - { - "category": "Proteins, DNA and RNA", - "facets": [ - "Record Status", - "Substance Class", - "Code System", - "GInAS Tag", - "Protein Type", - "Modifications", - "Glycosylation Type", - "Protein Subtype", - "Linkage Type", - "Nucleic Acid Subtype", - "Sequence Origin", - "Sequence Type", - "Molecular Weight" - ] - }, - { - "category": "Organisms", - "facets": [ - "Record Status", - "Substance Class", - "Code System", - "GInAS Tag", - "Material Class", - "Material Type", - "Modifications", - "Parts", - "Family", - "Genus", - "Species", - "Author" - ] - }, - { - "category": "Codes", - "facets": [ - "ATCC", - "BDNUM", - "BIOLOGIC SUBSTANCE CLASSIFICATION CODE", - "CAS", - "CAYMAN", - "CERES", - "CFR", - "CFSAN PSEUDO CAS", - "ChEMBL", - "CLINICAL_TRIALS.GOV", - "Code System", - "CODEX ALIMENTARIUS (GSFA)", - "COSMETIC INGREDIENT REVIEW (CIR)", - "DASH INDICATION", - "DEA NO.", - "DME Reactions", - "DRUG BANK", - "DRUG CENTRAL", - "DSLD", - "EC (ENZYME CLASS)", - "EC SCIENTIFIC COMMITTEE ON CONSUMER SAFETY OPINION", - "ECHA (EC/EINECS)", - "EMA ASSESSMENT REPORTS", - "EMA VETERINARY ASSESSMENT REPORTS", - "EPA CompTox", - "EPA PESTICIDE CODE", - "EU CLINICAL TRIALS REGISTER", - "EU FOOD ADDITIVES", - "EU-Orphan Drug", - "EVMPD", - "FARM SUBSTANCE ID", - "FDA ORPHAN DRUG", - "FDA UNII", - "Food Contact Sustance Notif, (FCN No.)", - "GENE", - "GRIN", - "HEALTH -CANADA NHP INGREDIENT MONOGRAPH", - "HEALTH-CANADA NHP INGREDIENT RECORD", - "HSDB", - "IARC", - "INCB IDS CODE", - "INN", - "INS", - "ITIS", - "IUPHAR", - "JAPANESE REVIEW", - "JECFA EVALUATION", - "JECFA MONOGRAPH", - "JMPR-PESTICIDE RESIDUE", - "KEGG", - "LactMed", - "LIVERTOX", - "LOINC", - "MANUFACTURER PRODUCT INFORMATION", - "MERCK INDEX", - "MESH", - "MIRBASE", - "MPNS", - "NCBI TAXONOMY", - "NCI_THESAURUS", - "NDF-RT", - "NSC", - "Other", - "PFAF", - "PHAROS", - "PROTEIN ID", - "PUBCHEM", - "RXCUI", - "STARI", - "SUPERSEDED_BD_NUM", - "SWGDRUG", - "UCSF-FDA TRANSPORTAL", - "UNII", - "UNIPROT", - "USDA PLANTS", - "USP_CATALOG", - "USP-HMC", - "WEB RESOURCE", - "WHO INTERNATIONAL PHARMACOPEIA", - "WHO INTERNATIONAL PHARMACPOEIA", - "WHO-ATC", - "WHO-ESSENTIAL MEDICINES LIST", - "WHO-SDG", - "WHO-SDG Level 1", - "WHO-SDG Level 2", - "WHO-VATC", - "WIKIPEDIA", - "YELLOW LIST" - ] - } - ] - }, - "applications": { - "default": [ - "Application Type", - "Center", - "Title", - "Has Indications", - "Has Ingredients", - "Has Products", - "Status Date Year", - "Submit Date", - "Submit Date Year", - "Application Number", - "Ingredient Name", - "Provenance (GSRS)", - "Public Domain", - "Product Name", - "Sponsor Name", - "Application Status", - "Ingredient Type", - "Substance Key", - "Application Sub Type", - "Indication", - "Dosage Form", - "Division Class Description", - "Source", - "Product Name Deprecated" - ], - "admin": [ - "Record Created By", - "Record Last Edited By", - "Record Create Date", - "Record Last Edited", - "Ingredient Created By", - "Ingredient Last Edited By", - "Ingredient Create Date", - "Ingredient Last Edited" - ] - }, - "products": { - "default": [ - "Product Name", - "Nonproprietary Name", - "Product NDC", - "Dosage Form Name", - "Ingredient Name", - "Ingredient Type", - "Product Type", - "Product Code Type", - "Application Number", - "Status", - "Marketing Category Name", - "Route of Admin", - "Is Listed", - "Labeler Name", - "Labeler DUNS Number", - "Registrant Name", - "Registrant DUNS", - "City", - "State", - "Company Country", - "Country Code", - "Provenance" - ], - "admin": [ - "Record Created By", - "Record Last Edited By", - "Record Create Date", - "Record Last Edited" - ] - }, - "ctclinicaltrial": { - "default": [ - "Has Substances", - "CT Matching Complete", - "Last Updated Year", - "Primary Completion Year", - "First Posted Year", - "Study Types", - "Gender", - "Age Groups", - "Intervention Type", - "Study Results", - "Conditions" - ] - }, - "clinicaltrialsus": { - "default": [ - "Has Substances", - "CT Matching Complete", - "Last Updated Year", - "Primary Completion Year", - "First Posted Year", - "Study Types", - "Gender", - "Age Groups", - "Intervention Type", - "Study Results", - "Conditions" - ] - }, - "adverseeventpt": { - "default": [ - "Adverse Event", - "Prim SOC", - "Ingredient Name", - "Substance Key", - "ATC Level 1", - "ATC Level 2", - "ATC Level 3", - "ATC Level 4" - ] - }, - "adverseeventdme": { - "default": [ - "DME Reactions", - "PTTerm Meddra", - "Ingredient Name", - "Substance Key", - "ATC Level 1", - "ATC Level 2", - "ATC Level 3", - "ATC Level 4" - ] - }, - "adverseeventcvm": { - "default": [ - "Adverse Event", - "Species", - "Route of Administration", - "Ingredient Name", - "Substance Key", - "ATC Level 1", - "ATC Level 2", - "ATC Level 3", - "ATC Level 4" - ] - } - }, - "codeSystemOrder": [ - "BDNUM", - "CAS", - "WHO-ATC", - "EVMPD", - "NCI" - ], - "homeContents": "The main goal of ginas is the production of software, called GSRS, to assist agencies in registering and documenting information about substances found in medicines. The Global Ingredient Archival System provides a common identifier for all of the substances used in medicinal products, utilizing a consistent definition of substances globally, including active substances under clinical investigation, consistent with the ISO 11238 standard.", - "relationshipsVisualizationUri": "/ginas/app/beta/substanceRelationshipVisualizer/index.html?uuid=", - "navItems": [ - { - "display": "Help", - "order": 60, - "children": [ - { - "display": "User Manual", - "href": "https://gsrs.ncats.nih.gov/downloads/Substance%20Registration%20-%20October%202019.docx", - "order": 10 - }, - { - "display": "Email GSRS Support", - "path": "", - "order": 30 - } - ] - } - ], - "substanceSelectorProperties": [ - "root_names_name", - "root_approvalID", - "root_codes_BDNUM", - "root_codes_CAS", - "root_codes_ECHA\\ \\(EC\\/EINECS\\)" - ], - "homeDynamicLinks": [ - { - "display": "Chemicals", - "facetName": "Substance Class", - "facetValue": "chemical" - }, - { - "display": "Polymers", - "facetName": "Substance Class", - "facetValue": "polymer" - }, - { - "display": "Structurally Diverse", - "facetName": "Substance Class", - "facetValue": "structurallyDiverse" - }, - { - "display": "Proteins", - "facetName": "Substance Class", - "facetValue": "protein" - }, - { - "display": "Nucleic Acids", - "facetName": "Substance Class", - "facetValue": "nucleicAcid" - }, - { - "display": "Concepts", - "facetName": "Substance Class", - "facetValue": "concept" - } - ], - "registrarDynamicLinks": [ - { - "display": "Chemicals", - "facets": [ - { - "facetName": "Substance Class", - "facetValue": "chemical" - } - ] - }, - { - "display": "Polymers", - "facets": [ - { - "facetName": "Substance Class", - "facetValue": "polymer" - } - ] - }, - { - "display": "Structurally Diverse", - "facets": [ - { - "facetName": "Substance Class", - "facetValue": "structurallyDiverse" - } - ] - }, - { - "display": "Proteins", - "facets": [ - { - "facetName": "Substance Class", - "facetValue": "protein" - } - ] - }, - { - "display": "Nucleic Acids", - "facets": [ - { - "facetName": "Substance Class", - "facetValue": "nucleicAcid" - } - ] - }, - { - "display": "Concepts", - "facets": [ - { - "facetName": "Substance Class", - "facetValue": "concept" - } - ] - }, - { - "display": "SSG1", - "facets": [ - { - "facetName": "Substance Class", - "facetValue": "specifiedSubstanceG1" - } - ] - } - ], - "registrarDynamicLinks2": [ - { - "display": "Pending Chemicals", - "facets": [ - { - "facetName": "Substance Class", - "facetValue": "chemical" - }, - { - "facetName": "Record Status", - "facetValue": "pending" - } - ] - }, - { - "display": "Pending Polymers", - "facets": [ - { - "facetName": "Substance Class", - "facetValue": "polymer" - }, - { - "facetName": "Record Status", - "facetValue": "pending" - } - ] - }, - { - "display": "Pending Structurally Diverse", - "facets": [ - { - "facetName": "Substance Class", - "facetValue": "structurallyDiverse" - }, - { - "facetName": "Record Status", - "facetValue": "pending" - } - ] - }, - { - "display": "Pending Proteins", - "facets": [ - { - "facetName": "Substance Class", - "facetValue": "protein" - }, - { - "facetName": "Record Status", - "facetValue": "pending" - } - ] - }, - { - "display": "Pending Nucleic Acids", - "facets": [ - { - "facetName": "Substance Class", - "facetValue": "nucleicAcid" - }, - { - "facetName": "Record Status", - "facetValue": "pending" - } - ] - }, - { - "display": "Pending Concepts", - "facets": [ - { - "facetName": "Substance Class", - "facetValue": "concept" - }, - { - "facetName": "Record Status", - "facetValue": "pending" - } - ] - }, - { - "display": "Pending SSG1", - "facets": [ - { - "facetName": "Substance Class", - "facetValue": "specifiedSubstanceG1" - }, - { - "facetName": "Record Status", - "facetValue": "pending" - } - ] - } - ], - "substance": { - "linking": { - "keyType": { - "default": "BDNUM", - "orgDisplayKeyType": "BDNUM", - "clinicalTrialKeyType": "UUID" - } - } - } -} diff --git a/packages/rails/docker/misc/gsrs/config/gateway_application.yml b/packages/rails/docker/misc/gsrs/config/gateway_application.yml deleted file mode 100644 index b45f4384f2..0000000000 --- a/packages/rails/docker/misc/gsrs/config/gateway_application.yml +++ /dev/null @@ -1,165 +0,0 @@ -gsrs: - gateway: - server: - addHeaders: - # these are for the FDA GSRS server to be able to respond to the KASA SSG4M GSRS instance - - "Access-Control-Allow-Origin: *" - - "Access-Control-Allow-Methods: POST, GET, PUT, PATCH, DELETE, OPTIONS" - - "Access-Control-Allow-Headers: auth-key, auth-username, auth-password, auth-token, Content-Type, Content-Range, Content-Disposition, Content-Description" - redirectPatterns: - # fixes for improper redirects on single tomcat instance - - "[/][a-z|A-Z]*/api/v1/: /ginas/app/api/v1/" -eureka: - client: - registerWithEureka: false - fetch-registry: true - serviceUrl: - defaultZone: ${EUREKA_SERVER:http://localhost:8761/eureka} - -spring: - application: - name: gateway - -debug: true - -zuul: - #this sets sensitiveHeaders to empty list so cookies and auth headers are passed through both ways - sensitiveHeaders: - routes: - beta-ui: - path: /ginas/app/beta/** - url: http://localhost:8080/frontend/ginas/app/ui - serviceId: frontend - ui: - path: /ginas/app/ui/** - url: http://localhost:8080/frontend/ginas/app/ui - serviceId: frontend - ginas_app: - path: /ginas/app/** - url: http://localhost:8080 - serviceId: ginas_app_route - applications_core: - path: /api/v1/applications/** - url: http://localhost:8080/applications/api/v1/applications - serviceId: applications_core - applications_core_alt: - path: /api/v1/applications(**)/** - url: http://localhost:8080/applications/api/v1/applications - serviceId: applications_core_alt - applications_all: - path: /api/v1/applicationsall/** - url: http://localhost:8080/applications/api/v1/applicationsall - serviceId: applications_all - applications_all_alt: - path: /api/v1/applicationsall(**)/** - url: http://localhost:8080/applications/api/v1/applicationsall - serviceId: applications_all_alt - applications_darrts: - path: /api/v1/applicationsdarrts/** - url: http://localhost:8080/applications/api/v1/applicationsdarrts - serviceId: applications_darrts - applications_darrts_alt: - path: /api/v1/applicationsdarrts(**)/** - url: http://localhost:8080/applications/api/v1/applicationsdarrts - serviceId: applications_darrts_alt - applications_searchcount: - path: /api/v1/searchcounts/** - url: http://localhost:8080/applications/api/v1/searchcounts - serviceId: applications_searchcount - applications_searchcount_alt: - path: /api/v1/searchcounts(**)/** - url: http://localhost:8080/applications/api/v1/searchcounts - serviceId: applications_searchcount - products_core: - path: /api/v1/products/** - url: http://localhost:8080/products/api/v1/products - serviceId: products_core - products_core_alt: - path: /api/v1/products(**)/** - url: http://localhost:8080/products/api/v1/products - serviceId: products_core - products_all: - path: /api/v1/productsall/** - url: http://localhost:8080/products/api/v1/productsall - serviceId: products_all - products_all_alt: - path: /api/v1/productsall(**)/** - url: http://localhost:8080/products/api/v1/productsall - serviceId: products_all - products_elist: - path: /api/v1/productselist/** - url: http://localhost:8080/products/api/v1/productselist - serviceId: products_elist - products_elist_alt: - path: /api/v1/productselist(**)/** - url: http://localhost:8080/products/api/v1/productselist - serviceId: products_elist - impurities: - path: /api/v1/impurities/** - url: http://localhost:8080/impurities/api/v1/impurities - serviceId: impurities - impurities_alt: - path: /api/v1/impurities(**)/** - url: http://localhost:8080/impurities/api/v1/impurities - serviceId: impurities - adverseeventpt: - path: /api/v1/adverseeventpt/** - url: http://localhost:8080/adverse-events/api/v1/adverseeventpt - serviceId: adverseeventpt - adverseeventpt_alt: - path: /api/v1/adverseeventpt(**)/** - url: http://localhost:8080/adverse-events/api/v1/adverseeventpt - serviceId: adverseeventpt - adverseeventdme: - path: /api/v1/adverseeventdme/** - url: http://localhost:8080/adverse-events/api/v1/adverseeventdme - serviceId: adverseeventdme - adverseeventdme_alt: - path: /api/v1/adverseeventdme(**)/** - url: http://localhost:8080/adverse-events/api/v1/adverseeventdme - serviceId: adverseeventdme - adverseeventcvm: - path: /api/v1/adverseeventcvm/** - url: http://localhost:8080/adverse-events/api/v1/adverseeventcvm - serviceId: adverseeventcvm - adverseeventcvm_alt: - path: /api/v1/adverseeventcvm(**)/** - url: http://localhost:8080/adverse-events/api/v1/adverseeventcvm - serviceId: adverseeventcvm - clinical_trials_us: - path: /api/v1/clinicaltrialsus/** - url: http://localhost:8080/clinical-trials/api/v1/clinicaltrialsus - serviceId: clinical_trials_us - clinical_trials_us_alt: - path: /api/v1/clinicaltrialsus(**)/** - url: http://localhost:8080/clinical-trials/api/v1/clinicaltrialsus - serviceId: clinical_trials_us - clinical_trials_europe: - path: /api/v1/clinicaltrialseurope/** - url: http://localhost:8080/clinical-trials/api/v1/clinicaltrialseurope - serviceId: clinical_trials_europe - clinical_trials_europe_alt: - path: /api/v1/clinicaltrialseurope(**)/** - url: http://localhost:8080/clinical-trials/api/v1/clinicaltrialseurope - serviceId: clinical_trials_europe - legacy: - path: /** - url: http://localhost:8080/substances - serviceId: substances - ignored-patterns: - - "/actuator/health" - -ribbon: - eureka: - enabled: false - -management.endpoints.web.exposure.include: 'routes,filters' - -logging: - level: - org.springframework.cloud.gateway: DEBUG - reactor.netty.http.client: DEBUG - -eureka.client.enabled: false - -zuul.host.socket-timeout-millis: 300000 diff --git a/packages/rails/docker/misc/gsrs/config/substances_application.conf b/packages/rails/docker/misc/gsrs/config/substances_application.conf deleted file mode 100644 index 40ba8f843e..0000000000 --- a/packages/rails/docker/misc/gsrs/config/substances_application.conf +++ /dev/null @@ -1,445 +0,0 @@ -include "substances-core.conf" - -server.tomcat.max-threads=2000 -ix.home= "/ginas.ix" -application.host="https://localhost:3000/ginas/app" -spring.application.name="substances" -logging.file.path="/usr/local/tomcat/logs/substances" -################################################################## -# SPRING BOOT ACTUATOR SETTINGS FOR MICROSERVICE HEALTH CHECKS ## -################################################################## -# turn off rabbit mq check for now since we don't use it otherwise it will say we are down -management.health.rabbit.enabled: false - -ix.ginas.approvalIdGenerator.generatorClass="ix.ginas.utils.UNIIGenerator" - -# PUT YOUR PERSONAL EXTENSIONS AND ADDITIONS HERE -#debug=true -spring.main.allow-bean-definition-overriding=true - -#this is how HOCON does default values -#eureka.client.serviceUrl.defaultZone= "http://localhost:8761/eureka" -eureka.client.enabled=false -ix.ginas.export.path="/gsrs_exports" - -## START AUTHENTICATION -# SSO HTTP proxy authentication settings -ix.authentication.trustheader=true -ix.authentication.usernameheader="AUTHENTICATION_USERNAME" -ix.authentication.useremailheader="AUTHENTICATION_EMAIL" -# set this "false" to only allow authenticated users to see the application -ix.authentication.allownonauthenticated=true -# set this "true" to allow any user that authenticates to be registered -# as a user automatically -ix.authentication.autoregister=true -#Set this to "true" to allow autoregistered users to be active as well -ix.authentication.autoregisteractive=true -## END AUTHENTICATION - -# Oracle Connection -#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver -#spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect -spring.jpa.hibernate.use-new-id-generator-mappings=true -spring.datasource.driverClassName="org.mariadb.jdbc.Driver" -spring.datasource.url="jdbc:mariadb://host.docker.internal:32900/ixginas" -spring.datasource.username="root" -spring.datasource.password="password" -spring.datasource.maximum-pool-size=50 - -# Spring Boot Config -spring.jpa.hibernate.ddl-auto=none #### THIS IS VERY IMPORTANT, OTHERWISE Hibernate will WIPE OUT our database -spring.jpa.show-sql=false -spring.jpa.properties.hibernate.format_sql=false -eureka.client.enabled=false - -# NEED THIS for Applications-api, Products-api and ClinicalTrialsUS/Europe-Api -# gsrs.microservice.applications.api.baseURL="http://localhost:8081/" -# gsrs.microservice.products.api.baseURL="http://localhost:8081/" -# gsrs.microservice.clinicaltrialsus.api.baseURL="http://localhost:8081/" -# gsrs.microservice.clinicaltrialseurope.api.baseURL="http://localhost:8081/" - - -# Secure session off for dev, but if using HTTPS it's better to have it on -gsrs.sessions.sessionSecure=false - -# This is configured in substance-core.conf; modify if needed here. -# Standardize Names in accordance with FDA rules -# Uncomment to add name standardization functionality -# gsrs.validators.substances += { -# "validatorClass" = "ix.ginas.utils.validation.validators.StandardNameValidator", -# "newObjClass" = "ix.ginas.models.v1.Substance", -# "configClass" = "SubstanceValidatorConfig", -# "parameters"= { -# "inPlaceNameStandardizerClass":"gsrs.module.substance.standardizer.FDAMinimumNameStandardizer", -# "fullNameStandardizerClass":"gsrs.module.substance.standardizer.FDAFullNameStandardizer", -# "behaviorOnInvalidStdName": "error" -# } -# } - -ix.ginas.export.settingsPresets.substances= { - "PUBLIC_DATA_ONLY": { - "owner":"admin", - "scrubberSettings": { - "removeAllLocked":true - } - }, - "ALL_DATA": { - "owner":"admin", - "scrubberSettings":null - } -} - -gsrs.importAdapterFactories.substances = - [ - { - - "adapterName": "SDF Adapter", - "importAdapterFactoryClass": "gsrs.module.substance.importers.SDFImportAdapterFactory", - "stagingAreaServiceClass": "gsrs.stagingarea.service.DefaultStagingAreaService", - "entityServiceClass" :"gsrs.dataexchange.SubstanceStagingAreaEntityService", - "description" : "SD file importer for general users", - "supportedFileExtensions": [ - "sdf", - "sd", - "sdfile" - ], - - "parameters": { - #the things used to instantiate a thing used to do the import - - "fileImportActions": [ - ##list of available actions for user to select from - #each action takes in a file record + a substance record to update substance record with data from file - { - "actionClass": "gsrs.module.substance.importers.importActionFactories.NameExtractorActionFactory", - "fields": [ - { - "fieldName": "Name", - "fieldLabel": "Substance Name", - "defaultValue": null, - "fieldType": "java.lang.String", - "expectedToChange": true, - "required": true, - "lookupKey": null - }, - { - "fieldName": "nameType", - "fieldLabel": "Name Type", - "defaultValue": "cn", - "cv": "name_type", - "fieldType": "java.lang.String", - "expectedToChange": true, - "required": false, - "lookupKey": null - }, - { - "fieldName": "displayName", - "fieldLabel": "Display Name?", - "defaultValue": false, - "fieldType": "java.lang.Boolean", - "expectedToChange": true, - "required": false, - "lookupKey": null - } - ], - "parameters": { - "lang": "en" - }, - "actionName": "common_name", - "label":"Create Name" - }, - { - "actionName": "code_import", - "label":"Create Code", - "actionClass": "gsrs.module.substance.importers.importActionFactories.CodeExtractorActionFactory", - "fields": [ - { - "fieldName": "code", - "fieldLabel": "Code/Identifier", - "defaultValue": null, - "fieldType": "java.lang.String", - "expectedToChange": true, - "required": true, - "lookupKey": null - }, - { - "fieldName": "codeType", - "fieldLabel": "Primary or Alternative", - "defaultValue": "PRIMARY", - "fieldType": "java.lang.String", - "expectedToChange": true, - "required": false, - "lookupKey": null - }, - { - "fieldName": "codeSystem", - "fieldLabel": "Code System", - "defaultValue": null, - "fieldType": "java.lang.String", - "expectedToChange": true, - "required": true, - "lookupKey": null - } - ], - "parameters": { - } - }, - { - "actionClass": "gsrs.module.substance.importers.importActionFactories.NSRSCustomCodeExtractorActionFactory", - "fields": [ - { - "fieldName": "code", - "fieldLabel": "NSC Number", - "defaultValue": null, - "fieldType": "java.lang.String", - "expectedToChange": true, - "required": true, - "lookupKey": null - }, - { - "fieldName": "codeType", - "fieldLabel": "Primary or Alternative", - "defaultValue": "PRIMARY", - "fieldType": "java.lang.String", - "expectedToChange": true, - "required": false, - "lookupKey": null - } - ], - "parameters": { - "codeSystem": "NSC" - }, - "actionName": "nci_import", - "label":"Create NSC Code" - }, - { - "actionClass": "gsrs.module.substance.importers.importActionFactories.StructureExtractorActionFactory", - "fields": [ - { - "fieldName": "molfile", - "fieldLabel": "Structure", - "defaultValue": null, - "fieldType": "java.lang.String", - "expectedToChange": true, - "required": true, - "lookupKey": null - } - ], - "parameters": { - - }, - "actionName": "structure_and_moieties", - "label":"Create Structure" - }, - { - "actionClass": "gsrs.module.substance.importers.importActionFactories.PropertyExtractorActionFactory", - "fields": [ - { - "fieldName": "name", - "fieldLabel": "Name", - "defaultValue": null, - "fieldType": "java.lang.String", - "expectedToChange": true, - "required": true, - "lookupKey": null - }, - { - "fieldName": "propertyType", - "fieldLabel": "Property Type", - "defaultValue": "chemical", - "fieldType": "java.lang.String", - "expectedToChange": true, - "required": false, - "lookupKey": null - }, - { - "fieldName": "valueAverage", - "fieldLabel": "Average Value", - "defaultValue": null, - "fieldType": "java.lang.Double", - "expectedToChange": true, - "required": false, - "lookupKey": null - }, - { - "fieldName": "valueNonNumeric", - "fieldLabel": "Non-numeric Value", - "defaultValue": null, - "fieldType": "java.lang.String", - "expectedToChange": true, - "required": false, - "lookupKey": null - }, - { - "fieldName": "valueUnits", - "fieldLabel": "Units", - "defaultValue": null, - "fieldType": "java.lang.String", - "expectedToChange": true, - "required": false, - "lookupKey": null - } - ], - "parameters": { - }, - "actionName": "property_import", - "label":"Create Chemical Property" - }, - { - "actionClass": "gsrs.module.substance.importers.importActionFactories.ReferenceExtractorActionFactory", - "fields": [ - { - "fieldName": "docType", - "fieldLabel": "Type", - "defaultValue": "OTHER", - "fieldType": "java.lang.String", - "expectedToChange": true, - "required": true, - "lookupKey": null - }, - { - "fieldName": "citation", - "fieldLabel": "Reference", - "defaultValue": "{INSERT REFERENCE CITATION HERE}", - "fieldType": "java.lang.String", - "expectedToChange": true, - "required": false, - "lookupKey": null - } - ], - "parameters": { - - }, - "actionName": "public_reference", - "label":"Create Reference" - }, - { - "actionClass": "gsrs.module.substance.importers.importActionFactories.NotesExtractorActionFactory", - "fields": [ - { - "fieldName": "note", - "fieldLabel": "Note", - "defaultValue": null, - "fieldType": "java.lang.String", - "expectedToChange": true, - "required": true, - "lookupKey": null - } - ], - "parameters": { - }, - "actionName": "note_import", - "label":"Create Note" - }, - { - "actionClass": "gsrs.module.substance.importers.importActionFactories.NoOpActionFactory", - "fields": [ - { - "fieldName": "fieldName", - "fieldLabel": "Field to ignore", - "fieldType": "java.lang.String", - "expectedToChange": true, - "lookupKey": null - } - ], - "parameters": { - }, - "actionName": "no-op", - "label":"Omit this field" - } - ] - } - }, - { - "adapterName": "GSRS JSON Adapter", - "importAdapterFactoryClass": "gsrs.module.substance.importers.GSRSJSONImportAdapterFactory", - "stagingAreaServiceClass": "gsrs.stagingarea.service.DefaultStagingAreaService", - "entityServiceClass" :"gsrs.dataexchange.SubstanceStagingAreaEntityService", - "description" : "GSRS legacy JSON file importer", - #extensions belong here because they can override the default set within the class - "supportedFileExtensions": [ - "gsrs", - "gz" - ], - "parameters": { - } - } - ] - -## Add after StandardNameValidator -# gsrs.validators.substances += { -# "validatorClass" = "ix.ginas.utils.validation.validators.StandardNameDuplicateValidator", -# "newObjClass" = "ix.ginas.models.v1.Substance", -# "parameters"= { -# "checkDuplicateInOtherRecord" = true, -# "checkDuplicateInSameRecord" = true, -# "onDuplicateInOtherRecordShowError" = true, -# "onDuplicateInSameRecordShowError" = false -# } -# } - -# Manage tags/bracketed terms in names per FDA configuration. -# In FDA's case: -# No automatic addition in tags found in names to explicit tag list. -# No automatic deletion of explicit tags missing from bracketed terms. -# Warnings off for bracket name missing from tags; warning on for explicit tag missing from names. -# gsrs.validators.substances += { -# "validatorClass" = "ix.ginas.utils.validation.validators.tags.TagsValidator", -# "newObjClass" = "ix.ginas.models.v1.Substance", -# "parameters" = { -# "checkExplicitTagsExtractedFromNames": false, -# "checkExplicitTagsMissingFromNames": true, -# "addExplicitTagsExtractedFromNamesOnCreate": false, -# "addExplicitTagsExtractedFromNamesOnUpdate": false, -# "removeExplicitTagsMissingFromNamesOnCreate": false, -# "removeExplicitTagsMissingFromNamesOnUpdate": false -# } -# } - -gsrs.defaultStagingAreaServiceClass.substances = gsrs.stagingarea.service.DefaultStagingAreaService -gsrs.defaultStagingAreaEntityService.substances = gsrs.dataexchange.SubstanceStagingAreaEntityService -gsrs.availableProcessActions.substances = ["gsrs.dataexchange.processingactions.CreateProcessingAction", - "gsrs.dataexchange.processingactions.MergeProcessingAction", - "gsrs.dataexchange.processingactions.RejectProcessingAction", - "gsrs.dataexchange.processingactions.CreateBatchProcessingAction", - "gsrs.dataexchange.processingactions.ScrubProcessingAction"] - -gsrs.matchableCalculators.substances = -[ - {"matchableCalculationClass" : "gsrs.dataexchange.extractors.CASNumberMatchableExtractor", - "config" :{ - "casCodeSystems": ["CAS", "CASNo", "CASNumber"] - } - }, - {"matchableCalculationClass" : "gsrs.dataexchange.extractors.AllNamesMatchableExtractor","config" :{}}, - {"matchableCalculationClass" : "gsrs.dataexchange.extractors.ApprovalIdMatchableExtractor","config" :{}}, - {"matchableCalculationClass" : "gsrs.dataexchange.extractors.DefinitionalHashMatchableExtractor","config" :{}}, - {"matchableCalculationClass" : "gsrs.dataexchange.extractors.SelectedCodesMatchableExtractor", - "config" : - { - "codeSystems" :["CAS", "ChemBL", "NCI", "NSC", "EINECS"] - } - }, - {"matchableCalculationClass" : "gsrs.dataexchange.extractors.UUIDMatchableExtractor","config" :{}}, - {"matchableCalculationClass" : "gsrs.dataexchange.extractors.CodeMatchableExtractor", - "config" :{ - "reqCodeSystems": ["FDA UNII"], - "codeType": "PRIMARY", - "codeKey": "CODE" - } - } -] - -gsrs.uuidCodeSystem.substances="UUID Code" -gsrs.approvalIdCodeSystem.substances="FDA UNII" - -gsrs.application.ivm.search.max.fetch = "20000" -gsrs.product.ivm.search.max.fetch = "20000" -gsrs.clinicaltrial.ivm.search.max.fetch = "20000" - -gsrs.entityProcessors+={ - "entityClassName": ix.ginas.models.v1.Substance, - "processor": "gsrs.dataexchange.processors.CalculateMatchablesProcessor", - "with":{ - } - } diff --git a/packages/rails/docker/misc/gsrs/context.xml b/packages/rails/docker/misc/gsrs/context.xml deleted file mode 100644 index 678bdf220a..0000000000 --- a/packages/rails/docker/misc/gsrs/context.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/packages/rails/docker/misc/gsrs/libjnainchi.so b/packages/rails/docker/misc/gsrs/libjnainchi.so deleted file mode 100644 index 8839c5c14bcfda7e8302fc0f1e92e1b3fd544c7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1265744 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%0D~!8&z9Twr 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

XKPPv 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

&3{RPPzPuZK7K$m}StQ-UbNbmH< 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 zql-ruk1ifvJi2&v@#x~w#iNTy7mqF;T|ByYbn)oo(Z!>SM;DJS9$h@Tcy#gT;?c#U zi$@oaE*@Pxx_ET)=;G1Eql-ruk1ifvJi2&v@#x~w#iNTy7mqF;T|ByYbn)oo(Z!>S zM;DJS9$h@Tcy#gT;?c#Ui$@oaE*@Pxx_ET)=;G1Eql-ruk1ifvJi2&v@#x~w#iNTy z7mqF;T|ByYbn)oo(Z!>SM;DJS9$h@Tcy#gT;?c#Ui$@oaE*@Pxx_ET)=;G1Eql-ru zk1ifvJi2&v@#x~w#iNTy7mqF;T|ByYbn)oo(Z!>SM;DJS9$h@Tcy#gT;?c#Ui$@oa zE*@Pxx_ET)=;G1Eql-ruk1ifvJi2&v@#x~w#iNTy7mqF;T|ByYbn)oo(Z!>SM;DJS z9$h@Tcy#gT;?c#Ui$@oaE*@Pxx_ET)=;G1Eql-ruk1ifvJi2&v@#x~w#iNTy7mqF; zT|ByYbn)oo(Z!>SM;DJS9$h@Tcy#gT;?c#Ui$@oaE*@Pxx_ET)=;G1Eql-ruk1ifv zJi2&v@#x~w#iNTy7mqF;T|ByYbn)oo(Z!>SM;DJS9$h@Tcy#gT;?c#Ui$@oaE*@Px zx_ET)=;G1Eql-ruk1ifvJi2&v@#x~w#iNTy7mqF;T|ByYbn)oo(Z!>SM;DJS9$h@T zcy#gT;?c#Ui$@oaE*@Pxx_ET)=;G1Eql-ruk1ifvJi2&v@#x~w#iNTy7mqF;T|ByY zbn)oo(Z!>SM;DJS9$h@Tcy#gT;?c#Ui$@oaE*@Pxx_ET)=;G1Eql-ruk1ifvJi2&v z@#x~w#iNTy7mqF;T|ByYbn)oo(Z!>SM;DJS9$h@Tcy#gT;?c#Ui$@oaE*@Pxx_ET) z=;G1Eql-ruk1ifvJi2&v@#x~w#iNTy7mqF;T|ByYbn)oo(Z!>SM;DJS9$h@Tcy#gT z;?c#Ui$@oaE*@Pxx_ET)=;G1Eql-ruk1ifvJi2&v@#x~w#iNTy7mqF;T|ByYbn)oo z(Z!>SM;DJS9$h@Tcy#gT;?c#Ui$@oaE*@Pxx_ET)=;G1Eql-ruk1ifvJi2&v@#x~w z#iNTy7mqF;T|ByYbn)oo(Z!>SM;DJS9$h@Tcy#gT;?c#Ui$@oaE*@Pxx_ET)=;G1E zql-ruk1ifvJi2&v@#x~w#iNTy7mqF;T|ByYbn)oo(Z!>SM;DJS9$h@Tcy#gT;?c#U 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 z504%mJv@4N^zi86(Zi#MM-Pu49z8sIc=Yh-;nBmRher>O9v(eBdU*8k=;6`BqlZTi zj~*U9JbHNa@aW;u!=r~s504%mJv@4N^zi86(Zi#MM-Pu49z8sIc=Yh-;nBmRher>O z9v(eBdU*8k=;6`BqlZTij~*U9JbHNa@aW;u!=r~s504%mJv@4N^zi86(Zi#MM-Pu4 z9z8sIc=Yh-;nBmRher>O9v(eBdU*8k=;6`BqlZTij~*U9JbHNa@aW;u!=r~s504%m zJv@4N^zi86(Zi#MM-Pu49z8sIc=Yh-;nBmRher>O9v(eBdU*8k=;6`BqlZTij~*U9 zJbHNa@aW;u!=r~s504%mJv@4N^zi86(Zi#MM-Pu49z8sIc=Yh-;nBmRher>O9v(eB zdU*8k=;6`BqlZTij~*U9JbHNa@aW;u!=r~s504%mJv@4N^zi86(Zi#MM-Pu49z8sI zc=Yh-;nBmRher>O9v(eBdU*8k=;6`BqlZTij~*U9JbHNa@aW;u!=r~s504%mJv@4N z^zi86(Zi#MM-Pu49z8sIc=Yh-;nBmRher>O9v(eBdU*8k=;6`BqlZTij~*U9JbHNa z@aW;u!=r~s504%mJv@4N^zi86(Zi#MM-Pu49z8sIc=Yh-;nBmRher>O9v(eBdU*8k z=;6`BqlZTij~*U9JbHNa@aW;u!=r~s504%mJv@4N^zi86(Zi#MM-Pu49z8sIc=Yh- z;nBmRher>O9v(eBdU*8k=;6`BqlZTij~*U9JbHNa@aW;u!=r~s504%mJv@4N^zi86 z(Zi#MM-Pu49z8sIc=Yh-;nBmRher>O9v(eBdU*8k=;6`BqlZTij~*U9JbHNa@aW;u z!=r~s504%mJv@4N^zi86(Zi#MM-Pu49z8sIc=Yh-;nBmRher>O9v(eBdU*8k=;6`B zqlZTij~*U9JbHNa@aW;u!=r~s504%mJv@4N^zi86(Zi#MM-Pu49z8sIc=Yh-;nBmR zher>O9v(eBdU*8k=;6`BqlZTij~*U9JbHNa@aW;u!=r~s504%mJv@4N^zi86(Zi#M zM-Pu49z8sIc=Yh-;nBmRher>O9v(eBdU*8k=;6`BqlZTij~*U9JbHNa@aW;u!=r~s z504%mJv@4N^zi86(Zi#MM-Pu49z8sIc=Yh-;nBmRher>O9v(eBdU*8k=;6`BqlZTi zj~*U9JbHNa@aW;u!=r~s504%mJv@4N^zi86(Zi#MM-Pu49z8sIc=Yh-;nBmRher>O z9v(eBdU*8k=;6`BqlZTij~*U9JbHNa@aW;u!=r~s504%mJv@4N^zi86(Zi#MM-Pu4 z9z8sIc=Yh-;nBmRher>O9v(eBdU*8k=;6`BqlZTij~*U9JbHNa@aW;u!=r~s504%m zJv@4N^zi86(Zi#MM-Pu49z8sIc=Yh-;nBmRher>O9v(eBdU*8k=;6`BqlZTij~*U9 zJbHNa@aW;u!=r~s504%mJv@4N^zi86(Zi#MM-Pu49z8sIc=Yh-;nBmRher>O9v(eB zdU*8k=;6`BqlZTij~*U9JbHNa@aW;u!=r~s504%mJv@4N^zi86(Zi#MM-Pu49z8sI zc=Yh-;nBmRher>O9v(eBdU*8k=;6`BqlZTij~*U9JbHNa@aW;u!=r~s504%mJv@4N z^zi86(Zi#MM-Pu49z8sIc=Yh-;nBmRher>O9v(eBdU*8k=;6`BqlZTij~*U9JbHNa z@aW;u!=r~s504%mJv@4N^zi86(Zi#MM-Pu49z8sIc=Yh-;nBmRher>O9v(eB8ax_2 z8ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_2 z8ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_2 z8ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_2 z8ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_2 z8ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_2 z8ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_2 z8ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_2 z8ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_2 z8ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_2 z8ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_2 z8ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_2 z8ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_2 z8ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_2 z8ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_2 z8ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_2 z8ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_2 z8ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_2 z8ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_2 z8ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_2 z8ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_2 z8ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_2 z8ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_2 z8ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_2 z8ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_2 z8ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_2 z8ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_28ax_2nmn33 znmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33 znmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33 znmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33 znmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33 znmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33 znmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33 znmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33 znmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33 znmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33 znmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33 znmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33 znmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33 znmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33 znmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33 znmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33 znmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33 znmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33 znmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33 znmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33 znmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33 znmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33 znmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33 znmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33 znmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33 znmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33 znmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33nmn33T0B}j zT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}j zT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}j zT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}j zT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}j zT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}j zT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}j zT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}j zT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}j zT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}j zT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}j zT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}jT0B}j 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 QzK}OM{IhGw*Z%AOFUjHeXaE2J diff --git a/packages/rails/docker/misc/gsrs/run-version.sh b/packages/rails/docker/misc/gsrs/run-version.sh deleted file mode 100644 index 9134cf7c8c..0000000000 --- a/packages/rails/docker/misc/gsrs/run-version.sh +++ /dev/null @@ -1,22 +0,0 @@ -rm -rf /gsrs-to-deploy -mkdir /gsrs-to-deploy -cd /gsrs-to-deploy - -echo "Paste the name of branch from gsrs-play-dist repo you wish to run:" -read branch_name - -git clone -b $branch_name https://github.com/dnanexus/gsrs-play-dist.git - -cd gsrs-play-dist -cp -rf /gsrs-conf/substances_application.conf substances/WEB-INF/classes/application.conf -cp -rf /gsrs-conf/gateway_application.yml ROOT/WEB-INF/classes/application.yml -cp -rf /gsrs-conf/frontend_application.conf frontend/WEB-INF/classes/static/assets/data/config.json - -/usr/local/tomcat/bin/catalina.sh stop && rm -rf /usr/local/tomcat/work - -rm -rf /usr/local/tomcat/webapps/* -cp -rf /gsrs-to-deploy/gsrs-play-dist/* /usr/local/tomcat/webapps/ - -/usr/local/tomcat/bin/catalina.sh start - -echo -e "\nGSRS version updated, tomcat restarted\n" diff --git a/packages/rails/docker/misc/gsrs/switch-frontend.sh b/packages/rails/docker/misc/gsrs/switch-frontend.sh deleted file mode 100755 index 59a15fc205..0000000000 --- a/packages/rails/docker/misc/gsrs/switch-frontend.sh +++ /dev/null @@ -1,26 +0,0 @@ -echo "Enter [1] to use frontend from your local source code (instant rebuilt on code change)" -echo "Enter [2] to use pre-built frontend" - -read choice - -if [[ $choice -eq 1 ]] -then - oldPwd=$(pwd) - cd /usr/local/GSRSFrontend - bash /usr/local/GSRSFrontend/build.sh - npm install webpack - sed -i 's$http://localhost:8080/frontend/ginas/app/ui$http://localhost:4200/ginas/app/ui$g' /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/application.yml - /usr/local/tomcat/bin/catalina.sh stop && rm -rf /usr/local/tomcat/work - /usr/local/tomcat/bin/catalina.sh start - npm run start:fda:local & - cd $oldPwd -elif [[ $choice -eq 2 ]] -then - sed -i 's$http://localhost:4200/ginas/app/ui$http://localhost:8080/frontend/ginas/app/ui$g' /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/application.yml - /usr/local/tomcat/bin/catalina.sh stop && rm -rf /usr/local/tomcat/work - /usr/local/tomcat/bin/catalina.sh start -else - echo "Invalid option. Not doing anything." -fi - - From 8697953342bfec0ba71f3fbe4a6cb68724cee567 Mon Sep 17 00:00:00 2001 From: Julie Pham <35426376+nganphtgit@users.noreply.github.com> Date: Mon, 1 Jun 2026 16:19:23 +0700 Subject: [PATCH 04/16] PFDA-6972 - fix: bulk_download in cli (#3982) --- packages/rails/app/controllers/api/files_controller.rb | 2 +- packages/rails/app/extras/https_apps_client.rb | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/rails/app/controllers/api/files_controller.rb b/packages/rails/app/controllers/api/files_controller.rb index fc74ccbca0..bf5e3bf2df 100644 --- a/packages/rails/app/controllers/api/files_controller.rb +++ b/packages/rails/app/controllers/api/files_controller.rb @@ -395,7 +395,7 @@ def bulk_download files = nodes.map do |item| { uid: item[:uid], - url: https_apps_client.get_file_download_link(item[:uid], options) + url: https_apps_client.get_file_download_link(item[:uid], options)[:file_url], } end.compact diff --git a/packages/rails/app/extras/https_apps_client.rb b/packages/rails/app/extras/https_apps_client.rb index 5906cd8f7c..753bd48aaa 100644 --- a/packages/rails/app/extras/https_apps_client.rb +++ b/packages/rails/app/extras/https_apps_client.rb @@ -789,6 +789,15 @@ def track_provenance(identifier) ) end + def get_file_download_link(uid, options = {}) + request( + "/files/#{uid}/download/legacy", + {}, + Net::HTTP::Get::METHOD, + options, + ) + end + def file_download(uid, filename, options = {}) request( "/files/#{uid}/#{URI.encode_www_form_component(filename)}", From 55341e0e621e163b4b8a328d6746d1cc158c094c Mon Sep 17 00:00:00 2001 From: Pavel Kubal Date: Tue, 2 Jun 2026 11:13:08 +0200 Subject: [PATCH 05/16] PFDA-6923 Redesign retry mechanism for files sync (#3946) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jiří Lagan <43816355+jirkalagan@users.noreply.github.com> Co-authored-by: Michal Vojtíšek --- .../queues/processor/main-queue.processor.ts | 12 +++++-- .../server/libs/shared/src/config/envs/dev.ts | 1 - .../shared/src/config/envs/development.ts | 1 - .../libs/shared/src/config/envs/production.ts | 1 - .../libs/shared/src/config/envs/staging.ts | 1 - .../libs/shared/src/config/envs/test.ts | 1 - .../server/libs/shared/src/config/index.ts | 2 -- .../server/libs/shared/src/queue/index.ts | 7 ++-- .../queue/producer/main-queue-job.producer.ts | 3 +- .../shared/src/queue/queue.event.listener.ts | 34 ++++++++++++++----- 10 files changed, 39 insertions(+), 24 deletions(-) diff --git a/packages/server/apps/worker/src/queues/processor/main-queue.processor.ts b/packages/server/apps/worker/src/queues/processor/main-queue.processor.ts index e4333a9d22..2ace9f181d 100644 --- a/packages/server/apps/worker/src/queues/processor/main-queue.processor.ts +++ b/packages/server/apps/worker/src/queues/processor/main-queue.processor.ts @@ -15,6 +15,7 @@ import { FOLLOW_UP_ACTION } from '@shared/domain/user-file/user-file.input' import { SpaceMemberNotificationFacade } from '@shared/facade/space-member-notification/space-member-notification.facade' import { SyncFilesStateFacade } from '@shared/facade/sync-file-state/sync-files-state.facade' import { UserProvisionFacade } from '@shared/facade/user/user-provision.facade' +import { ServiceLogger } from '@shared/logger/decorator/service-logger' import { createRunFollowUpActionJobTask } from '@shared/queue' import { NotifyNewDiscussionJob, @@ -27,8 +28,10 @@ import { ProcessWithContext } from '../decorator/process-with-context' @Processor(config.workerJobs.queues.default.name) export class MainQueueProcessor { + @ServiceLogger() + private readonly logger: Logger + constructor( - private readonly logger: Logger, private readonly user: UserContext, private readonly nodeService: NodeService, private readonly challengeService: ChallengeService, @@ -71,7 +74,12 @@ export class MainQueueProcessor { this.logger.log(`synchronizeFile result: ${result}`) if (!result) { - throw new Error(`File ${input.fileUid} not ready for synchronizing, trigger repeat of the job by throwing error`) + this.logger.log( + `File ${input.fileUid} is not ready yet. Deferring via Bull retry/backoff (${job.attemptsMade + 1}/${job.opts.attempts ?? 'n/a'}).`, + ) + + await job.moveToFailed(new Error(`File ${input.fileUid} is not ready on platform to be synchronized`), true) + return } else { const followUpAction = await this.followUpDecider.decideNextAction(input.fileUid) if (followUpAction) { diff --git a/packages/server/libs/shared/src/config/envs/dev.ts b/packages/server/libs/shared/src/config/envs/dev.ts index b386577da0..2fcbcc2416 100644 --- a/packages/server/libs/shared/src/config/envs/dev.ts +++ b/packages/server/libs/shared/src/config/envs/dev.ts @@ -3,7 +3,6 @@ import { ConfigOverride, parseBooleanFromProcess, parseIntFromProcess } from '.. export const config: ConfigOverride = () => ({ // NOTE(samuel) copied from "staging.ts" configuration, so to avoid breaking changes, left unchanged - appName: 'https-apps-worker-stg', api: { railsHost: process.env.HOST, fdaSubnet: { diff --git a/packages/server/libs/shared/src/config/envs/development.ts b/packages/server/libs/shared/src/config/envs/development.ts index 6b36345a35..1bc4f5d4b4 100644 --- a/packages/server/libs/shared/src/config/envs/development.ts +++ b/packages/server/libs/shared/src/config/envs/development.ts @@ -1,7 +1,6 @@ import { ConfigOverride, parseBooleanFromProcess, parseIntFromProcess } from '..' export const config: ConfigOverride = () => ({ - appName: 'https-apps-worker-dev', api: { certPath: process.env.NODE_PATH_CERT ?? '../cert.pem', keyCertPath: process.env.NODE_PATH_KEY_CERT ?? '../key.pem', diff --git a/packages/server/libs/shared/src/config/envs/production.ts b/packages/server/libs/shared/src/config/envs/production.ts index 0f58724b5d..005e74dd9d 100644 --- a/packages/server/libs/shared/src/config/envs/production.ts +++ b/packages/server/libs/shared/src/config/envs/production.ts @@ -3,7 +3,6 @@ import { ConfigOverride, defaultConfig, parseBooleanFromProcess, parseIntFromPro import { MAX_JOB_DURATION_SECONDS } from '../constants' export const config: ConfigOverride = () => ({ - appName: 'https-apps-worker-prod', api: { railsHost: process.env.HOST, allowErrorTestingRoutes: false, diff --git a/packages/server/libs/shared/src/config/envs/staging.ts b/packages/server/libs/shared/src/config/envs/staging.ts index 12eacb714a..090bb40bee 100644 --- a/packages/server/libs/shared/src/config/envs/staging.ts +++ b/packages/server/libs/shared/src/config/envs/staging.ts @@ -2,7 +2,6 @@ import { parseIpv4Cidr } from '../../validation/parsers' import { ConfigOverride, defaultConfig, parseBooleanFromProcess, parseIntFromProcess } from '..' export const config: ConfigOverride = () => ({ - appName: 'https-apps-worker-stg', api: { railsHost: process.env.HOST, fdaSubnet: { diff --git a/packages/server/libs/shared/src/config/envs/test.ts b/packages/server/libs/shared/src/config/envs/test.ts index 9e5f03e87a..cb5fe82a82 100644 --- a/packages/server/libs/shared/src/config/envs/test.ts +++ b/packages/server/libs/shared/src/config/envs/test.ts @@ -2,7 +2,6 @@ import { parseIpv4Cidr } from '@shared/validation/parsers' import { ConfigOverride, parseBooleanFromProcess, parseIntFromProcess } from '..' export const config: ConfigOverride = () => ({ - appName: 'https-apps-worker-test', api: { railsHost: process.env.HOST, fdaSubnet: { diff --git a/packages/server/libs/shared/src/config/index.ts b/packages/server/libs/shared/src/config/index.ts index 610328cb82..3b38f0fc97 100644 --- a/packages/server/libs/shared/src/config/index.ts +++ b/packages/server/libs/shared/src/config/index.ts @@ -49,7 +49,6 @@ const getEnv = (): ENVS => { const env: ENVS = getEnv() const defaultConfig = { - appName: 'https-apps-worker', env, api: { port: parseIntFromProcess(process.env.NODE_PORT) ?? 3001, @@ -57,7 +56,6 @@ const defaultConfig = { enableSsl: parseBooleanFromProcess(process.env.NODE_ENABLE_SSL, true), certPath: process.env.NODE_PATH_CERT ?? path.join(__dirname, '../../../../cert.pem'), keyCertPath: process.env.NODE_PATH_KEY_CERT ?? path.join(__dirname, '../../../../key.pem'), - url: process.env.NODE_URL ?? 'https://nodejs-api', railsHost: process.env.HOST ?? 'https://localhost:3000', // TODO - refactor to boolean allowErrorTestingRoutes: parseBooleanFromProcess(process.env.NODE_ALLOW_ERROR_TESTING_ROUTES, true), diff --git a/packages/server/libs/shared/src/queue/index.ts b/packages/server/libs/shared/src/queue/index.ts index ae4b52eee5..9787239ae6 100644 --- a/packages/server/libs/shared/src/queue/index.ts +++ b/packages/server/libs/shared/src/queue/index.ts @@ -164,11 +164,8 @@ const createRunFollowUpActionJobTask = async (payload: UidAndFollowUpInput, user /** * @deprecated Use the job producer directly within the DI */ -const createFileSynchronizeJobTask = async ( - payload: SyncFileJobInput, - user?: UserCtx, - delayInMs?: number, -): Promise => mainJobProducer.createFileSynchronizeJobTask(payload, user, delayInMs) +const createFileSynchronizeJobTask = async (payload: SyncFileJobInput, user?: UserCtx): Promise => + mainJobProducer.createFileSynchronizeJobTask(payload, user) /** * @deprecated Use the job producer directly within the DI diff --git a/packages/server/libs/shared/src/queue/producer/main-queue-job.producer.ts b/packages/server/libs/shared/src/queue/producer/main-queue-job.producer.ts index 325fdb93e3..4658666f14 100644 --- a/packages/server/libs/shared/src/queue/producer/main-queue-job.producer.ts +++ b/packages/server/libs/shared/src/queue/producer/main-queue-job.producer.ts @@ -82,7 +82,7 @@ export class MainQueueJobProducer extends QueueJobProducer { await this.addToQueue(wrapped, options) } - async createFileSynchronizeJobTask(payload: SyncFileJobInput, user?: UserCtx, delayInMs?: number): Promise { + async createFileSynchronizeJobTask(payload: SyncFileJobInput, user?: UserCtx): Promise { const wrapped = { type: TASK_TYPE.SYNC_FILE_STATE as const, payload, @@ -91,7 +91,6 @@ export class MainQueueJobProducer extends QueueJobProducer { const options: JobOptions = { jobId: `${wrapped.type}.${payload.fileUid}`, - delay: delayInMs ?? 0, } await this.addToQueue(wrapped, options) diff --git a/packages/server/libs/shared/src/queue/queue.event.listener.ts b/packages/server/libs/shared/src/queue/queue.event.listener.ts index f9120c477a..090ef46329 100644 --- a/packages/server/libs/shared/src/queue/queue.event.listener.ts +++ b/packages/server/libs/shared/src/queue/queue.event.listener.ts @@ -21,29 +21,47 @@ export class QueueEventListener { this.init() } - private init() { + private init(): void { this.queues.forEach(queue => { queue.on('failed', (job: Job, error: Error) => { try { - this.logger.error({ job: this.getJobInfo(job), error }, 'Job failed') - } catch (error) { - console.error('error during queue failed handling', { error }) + const attempts = job.opts.attempts ?? 1 + const isTerminalFailure = job.attemptsMade >= attempts + const context = { + job: this.getJobInfo(job), + error, + attemptsMade: job.attemptsMade, + attempts, + } + + if (isTerminalFailure) { + this.logger.error(context, 'Job failed') + } else { + this.logger.warn(context, 'Job attempt failed, retry scheduled by Bull') + } + } catch (eventHandlerError) { + console.error('error during queue failed handling', { error: eventHandlerError }) } }) - queue.on('waiting', async (jobId: number) => { + queue.on('waiting', async (jobId: number | string) => { try { const job = await queue.getJob(jobId) this.logger.debug(this.getJobInfo(job), 'Job waiting in queue') - } catch (error) { - console.error('error during queue waiting handling', { error }) + } catch (eventHandlerError) { + console.error('error during queue waiting handling', { error: eventHandlerError }) } }) }) } - private getJobInfo(job: Job) { + private getJobInfo(job: Job | null): { + type: TaskWithAuth['type'] | undefined + payload: TaskWithAuth['payload'] | undefined + userId: number | undefined + jobId: string | number | undefined + } { return { type: job?.data?.type, payload: job?.data?.payload, From e87b4bd6aa849ac401d16528d63bdb5dbc9b01a8 Mon Sep 17 00:00:00 2001 From: Tomas Vohradnik Date: Tue, 2 Jun 2026 13:31:43 +0200 Subject: [PATCH 06/16] PFDA-6954 Search spaces by ID + search text highlight (#3979) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jiří Lagan <43816355+jirkalagan@users.noreply.github.com> Co-authored-by: Pavel Kubal --- .../features/spaces/SpaceSelectionList.tsx | 25 ++++++++++++++++--- .../src/features/spaces/spaces.module.css | 7 ++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/packages/client/src/features/spaces/SpaceSelectionList.tsx b/packages/client/src/features/spaces/SpaceSelectionList.tsx index 2e4a8ff26e..79311df2f0 100644 --- a/packages/client/src/features/spaces/SpaceSelectionList.tsx +++ b/packages/client/src/features/spaces/SpaceSelectionList.tsx @@ -12,6 +12,21 @@ interface MyHomeProps { onSelect: () => void } +const highlightMatch = (text: string, query: string): React.ReactNode => { + if (!query) return text + const lower = text.toLowerCase() + const q = query.toLowerCase() + const idx = lower.indexOf(q) + if (idx === -1) return text + return ( + <> + {text.slice(0, idx)} + {text.slice(idx, idx + q.length)} + {text.slice(idx + q.length)} + + ) +} + interface SpaceSelectionListProps { excludeScopes?: string[] filterString?: string @@ -34,7 +49,11 @@ export const SpaceSelectionList = ({ const spaces = data .filter(s => !excludeScopes.includes(s.scope)) - .filter(s => !filterString || s.title.toLowerCase().includes(filterString.toLowerCase())) + .filter(s => { + if (!filterString) return true + const q = filterString.toLowerCase() + return s.title.toLowerCase().includes(q) || s.scope.toLowerCase().includes(q) + }) if (isLoading) { return
Loading...
@@ -80,9 +99,9 @@ export const SpaceSelectionList = ({ {s.protected && } {s.restrictedReviewer && } - {s.title} + {highlightMatch(s.title, filterString)} - {s.scope} + {highlightMatch(s.scope, filterString)} ))} diff --git a/packages/client/src/features/spaces/spaces.module.css b/packages/client/src/features/spaces/spaces.module.css index 67cbd53319..c9b44d6406 100644 --- a/packages/client/src/features/spaces/spaces.module.css +++ b/packages/client/src/features/spaces/spaces.module.css @@ -147,3 +147,10 @@ padding: 16px 12px; color: var(--c-text-500); } + +.spaceSelectionMatch { + background-color: var(--highlight-100); + color: inherit; + border-radius: 2px; + padding: 0 1px; +} From aedaa0eeb1a01be2bcd237e56d71aee964883b54 Mon Sep 17 00:00:00 2001 From: Pavel Kubal Date: Tue, 2 Jun 2026 14:07:31 +0200 Subject: [PATCH 07/16] PFDA-6944 fix file origin (#3964) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jiří Lagan <43816355+jirkalagan@users.noreply.github.com> --- .../client/src/features/files/file.utils.ts | 10 ++-- .../src/features/files/show/FileShow.tsx | 14 +++-- .../test/unit/domain/node.helper.spec.ts | 56 +++++++++++++++++++ 3 files changed, 69 insertions(+), 11 deletions(-) diff --git a/packages/client/src/features/files/file.utils.ts b/packages/client/src/features/files/file.utils.ts index 38991e9dc5..f7da195c18 100644 --- a/packages/client/src/features/files/file.utils.ts +++ b/packages/client/src/features/files/file.utils.ts @@ -2,8 +2,6 @@ import * as React from 'react' import { DataNode } from 'rc-tree/lib/interface' import type { OriginObject } from './files.types' -const assertNever = (_value: never): string | null => null - export function findById(tree: DataNode[], nodeId: React.Key): DataNode | null { for (let i = 0; i < tree.length; i++) { const node = tree[i] @@ -74,7 +72,7 @@ export const getOriginHref = (originObject?: OriginObject): string | null => { switch (originObject.originType) { case 'Job': - return `/jobs/${originObject.originUid}` + return `/home/executions/${originObject.originUid}` case 'Comparison': return `/home/comparisons/${originObject.originUid}` case 'UserFile': @@ -83,8 +81,8 @@ export const getOriginHref = (originObject?: OriginObject): string | null => { case 'User': case 'Folder': return null - default: - return assertNever(originObject.originType) + default: { + return originObject.originType + } } } - diff --git a/packages/client/src/features/files/show/FileShow.tsx b/packages/client/src/features/files/show/FileShow.tsx index d922d7f138..584933e649 100644 --- a/packages/client/src/features/files/show/FileShow.tsx +++ b/packages/client/src/features/files/show/FileShow.tsx @@ -14,9 +14,9 @@ import { StyledPropertyItem, StyledPropertyKey, StyledTagItem, StyledTags } from import { theme } from '@/styles/theme' import { sanitizeFileName } from '@/utils/formatting' import { getBackPathNext } from '@/utils/getBackPath' +import { useAuthUser } from '../../auth/useAuthUser' import { ActionsMenuContent } from '../../home/ActionMenuContent' import { ActionModalsRenderer } from '../../home/ActionModalsRenderer' -import { useAuthUser } from '../../auth/useAuthUser' import { defaultHomeContext, type HomeScopeContextValue } from '../../home/HomeScopeContext' import { StyledBackLink } from '../../home/home.styles' import { @@ -39,8 +39,8 @@ import { License } from '../../licenses/License' import type { License as ILicense } from '../../licenses/types' import type { ISpace } from '../../spaces/spaces.types' import { FileBreadcrumb } from '../FileBreadcrumb' -import { fetchFile } from '../files.api' import { getOriginHref } from '../file.utils' +import { fetchFile } from '../files.api' import type { IFile } from '../files.types' import { normalizePermissions } from '../normalizePermissions' import { useFilesSelectActions } from '../useFilesSelectActions' @@ -76,6 +76,10 @@ const FileActionsDropdown = ({ ) } +const getOriginLinkText = (file: IFile): string | undefined => { + return typeof file.origin === 'object' && file.origin ? file.origin.text : undefined +} + export const FileShow = ({ fileId, space, @@ -130,7 +134,7 @@ export const FileShow = ({ const filePermissions = normalizePermissions(file, user, space) const showLicensePending = file.fileLicense?.acceptanceStatus === 'pending' const originHref = getOriginHref(file.originObject) - const originText = typeof file.origin === 'object' && file.origin ? file.origin.text : undefined + const originLinkText = getOriginLinkText(file) return ( <> @@ -227,9 +231,9 @@ export const FileShow = ({ Origin - {originHref && originText != null ? ( + {originHref ? ( - {originText || originHref} + {originLinkText || originHref} ) : typeof file.origin === 'object' ? ( file.origin?.text diff --git a/packages/server/libs/shared/test/unit/domain/node.helper.spec.ts b/packages/server/libs/shared/test/unit/domain/node.helper.spec.ts index dfb6a9f7c7..f2108601dc 100644 --- a/packages/server/libs/shared/test/unit/domain/node.helper.spec.ts +++ b/packages/server/libs/shared/test/unit/domain/node.helper.spec.ts @@ -117,6 +117,62 @@ describe('NodeHelper', () => { }) }) + it('renders node origin link when parent node exists', async () => { + let findOneWhere: { id: number } | null = null + const nodeRepo = { + findOne: async (where: { id: number }) => { + findOneWhere = where + return { uid: 'file-G222-1', name: 'Source File' } + }, + } + + const helper = new NodeHelper( + {} as never, + {} as never, + {} as never, + nodeRepo as never, + { findOne: async () => null } as never, + { findOne: async () => null } as never, + ) + + const result = await helper.resolveOrigin({ parentType: PARENT_TYPE.NODE, parentId: 42 } as UserFile) + + expect(findOneWhere).to.deep.equal({ id: 42 }) + expect(result).to.deep.equal({ + origin: { text: 'Source File' }, + parentType: 'Node', + parentUid: 'file-G222-1', + }) + }) + + it('returns Copied origin for node parent type when parentId does not resolve', async () => { + let findOneWhere: { id: number } | null = null + const nodeRepo = { + findOne: async (where: { id: number }) => { + findOneWhere = where + return null + }, + } + + const helper = new NodeHelper( + {} as never, + {} as never, + {} as never, + nodeRepo as never, + { findOne: async () => null } as never, + { findOne: async () => null } as never, + ) + + const result = await helper.resolveOrigin({ parentType: PARENT_TYPE.NODE, parentId: 99 } as UserFile) + + expect(findOneWhere).to.deep.equal({ id: 99 }) + expect(result).to.deep.equal({ + origin: 'Copied', + parentType: 'Node', + parentUid: null, + }) + }) + it('renders job origin link when parent job exists', async () => { let findOneWhere: { id: number } | null = null const jobRepo = { From bb3843c95202a2911d8408f8b7cfda1d4a4f6391 Mon Sep 17 00:00:00 2001 From: Julie Pham <35426376+nganphtgit@users.noreply.github.com> Date: Wed, 3 Jun 2026 11:43:02 +0700 Subject: [PATCH 08/16] PFDA-6902 - rewrite file create to nodejs (#3928) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jiří Lagan <43816355+jirkalagan@users.noreply.github.com> Co-authored-by: Pavel Kubal --- packages/client/src/api/files.ts | 8 +- packages/client/src/api/types.ts | 4 + .../client/src/features/data-portals/api.ts | 2 +- .../useFileUploadModal/worker/api.ts | 2 +- .../multiFileUpload.ts | 15 +- .../client/src/features/files/files.api.ts | 11 +- .../client/src/features/files/files.types.ts | 2 +- .../src/features/resources/uploadImage.ts | 19 +- .../src/mocks/handlers/assets.handlers.ts | 39 +- .../src/mocks/handlers/files.handlers.ts | 4 +- packages/nginx/default.conf.template | 12 +- packages/nginx/nginx.conf | 11 +- .../rails/app/controllers/api_controller.rb | 97 +--- .../app/serializers/user_file_serializer.rb | 2 - packages/rails/config/routes.rb | 1 - .../spec/controllers/api_controller_spec.rb | 75 --- .../spec/serializers/asset_serializer_spec.rb | 3 +- .../serializers/user_file_serializer_spec.rb | 3 +- .../apps/api/src/files/files.api.module.ts | 3 +- .../apps/api/src/files/files.controller.ts | 25 +- .../integration/files/file-create.spec.ts | 447 ++++++++++++++++++ .../entity/dto/entity-uid-response.dto.ts | 6 + .../libs/shared/src/domain/job/job.service.ts | 4 + .../user-file/dto/user-file-create.dto.ts | 37 ++ .../src/domain/user-file/node.service.ts | 4 + .../user-file/service/user-file.service.ts | 2 +- .../shared/src/domain/user/user.entity.ts | 76 +-- .../facade/file-create/model/file-create.ts | 5 + .../user-file-create-facade.module.ts | 4 +- .../file-create/user-file-create.facade.ts | 77 ++- .../server/libs/shared/src/test/generate.ts | 1 + packages/server/libs/shared/src/test/mocks.ts | 11 + .../validation/pipes/snake-to-camel.pipe.ts | 23 + .../src/validation/pipes/validation.pipe.ts | 2 +- .../domain/user-file-create.facade.spec.ts | 30 +- .../unit/domain/user-file.service.spec.ts | 7 + 36 files changed, 802 insertions(+), 272 deletions(-) create mode 100644 packages/server/apps/api/test/integration/files/file-create.spec.ts create mode 100644 packages/server/libs/shared/src/domain/entity/dto/entity-uid-response.dto.ts create mode 100644 packages/server/libs/shared/src/domain/user-file/dto/user-file-create.dto.ts create mode 100644 packages/server/libs/shared/src/validation/pipes/snake-to-camel.pipe.ts diff --git a/packages/client/src/api/files.ts b/packages/client/src/api/files.ts index a6331c7f08..bbf49233af 100644 --- a/packages/client/src/api/files.ts +++ b/packages/client/src/api/files.ts @@ -1,12 +1,14 @@ import axios from 'axios' -import { ServerScope } from '../features/home/types' +import type { ServerScope } from '../features/home/types' export const createFile = (name: string, scope?: ServerScope, folderId?: string | number) => - axios.post('/api/create_file', { name, scope, folder_id: folderId }).then(response => ({ status: response.status, payload: response.data })) + axios + .post('/api/v2/files', { name, scope, folderId }) + .then(response => ({ status: response.status, payload: response.data })) export const getUploadURL = (uid: string | number, index: number, size: number, md5: string) => axios - .get(`/api/v2/files/${uid}/upload-url`, { params: { index, size, md5 }}) + .get(`/api/v2/files/${uid}/upload-url`, { params: { index, size, md5 } }) .then(response => ({ status: response.status, payload: response.data })) export const uploadChunk = (url: string, chunk: Blob | ArrayBuffer | string, headers?: Record) => { diff --git a/packages/client/src/api/types.ts b/packages/client/src/api/types.ts index eec69ee6ab..6e65b19ca1 100644 --- a/packages/client/src/api/types.ts +++ b/packages/client/src/api/types.ts @@ -49,3 +49,7 @@ export function getBackendErrorMessage(error: unknown, fallback: string, statusM } return fallback } + +export type EntityUidResponse = { + uid: string +} diff --git a/packages/client/src/features/data-portals/api.ts b/packages/client/src/features/data-portals/api.ts index 9dbabcc064..0cd91de3e7 100644 --- a/packages/client/src/features/data-portals/api.ts +++ b/packages/client/src/features/data-portals/api.ts @@ -1,7 +1,7 @@ import axios from 'axios' import { createFile } from '../files/files.api' import { processFile } from '../resources/uploadImage' -import { CreateDataPortalData, DataPortal, UpdateDataPortalData } from './types' +import type { CreateDataPortalData, DataPortal, UpdateDataPortalData } from './types' export async function fetchGovUsers(): Promise<[]> { return axios.get('/api/v2/users/government').then(r => r.data) diff --git a/packages/client/src/features/files/actionModals/useFileUploadModal/worker/api.ts b/packages/client/src/features/files/actionModals/useFileUploadModal/worker/api.ts index 9692305e9c..66357dd862 100644 --- a/packages/client/src/features/files/actionModals/useFileUploadModal/worker/api.ts +++ b/packages/client/src/features/files/actionModals/useFileUploadModal/worker/api.ts @@ -34,7 +34,7 @@ export async function createFileRequest(session: WorkerSession): Promise { session.currentControllers.add(controller) try { - const response = await fetch('/api/create_file', { + const response = await fetch('/api/v2/files', { method: 'POST', headers: buildRequestHeaders(session.csrfToken), body: JSON.stringify(data), diff --git a/packages/client/src/features/files/actionModals/useFileUploadModalLegacy/multiFileUpload.ts b/packages/client/src/features/files/actionModals/useFileUploadModalLegacy/multiFileUpload.ts index 7a92973796..cde5320840 100644 --- a/packages/client/src/features/files/actionModals/useFileUploadModalLegacy/multiFileUpload.ts +++ b/packages/client/src/features/files/actionModals/useFileUploadModalLegacy/multiFileUpload.ts @@ -1,7 +1,7 @@ +import sparkMD5 from 'spark-md5' import { closeFile, createFile, getUploadURL, uploadChunk } from '@/api/files' import { HTTP_STATUS } from '@/constants' -import sparkMD5 from 'spark-md5' -import { CHUNK_SIZE, FILE_STATUS, FilesMeta, IUploadFile, IUploadInfo } from './constants' +import { CHUNK_SIZE, FILE_STATUS, type FilesMeta, type IUploadFile, type IUploadInfo } from './constants' const filterFiles = (filesBlob: any[], filesMeta: any[]) => filesBlob.filter(b => { @@ -14,7 +14,7 @@ const filterFiles = (filesBlob: any[], filesMeta: any[]) => }) const throwIfError = (status: number, payload?: any) => { - if (status !== HTTP_STATUS.OK) { + if (![HTTP_STATUS.OK, HTTP_STATUS.CREATED].includes(status)) { const errorMessage = payload?.error?.message ?? 'Unknown upload failure' throw new Error(errorMessage) } @@ -29,7 +29,14 @@ interface IMultiFileUpload { folderId?: string } -export const multiFileUpload = async ({ filesBlob, filesMeta, updateFileStatus, spaceId, scope, folderId }: IMultiFileUpload) => { +export const multiFileUpload = async ({ + filesBlob, + filesMeta, + updateFileStatus, + spaceId, + scope, + folderId, +}: IMultiFileUpload) => { const scopeToUpload = scope || `space-${spaceId}` const filteredFiles: IUploadFile[] = filterFiles(filesBlob, filesMeta) diff --git a/packages/client/src/features/files/files.api.ts b/packages/client/src/features/files/files.api.ts index 87635c6952..e294d24786 100644 --- a/packages/client/src/features/files/files.api.ts +++ b/packages/client/src/features/files/files.api.ts @@ -1,8 +1,8 @@ import axios from 'axios' +import type { EntityUidResponse } from '@/api/types' import { cleanObject } from '@/utils/object' import type { DownloadListResponse, HomeScope, IFilter, IMeta, ServerScope } from '../home/types' -import type { Params } from '../home/utils' -import { formatScopeQ, prepareListFetch } from '../home/utils' +import { formatScopeQ, type Params, prepareListFetch } from '../home/utils' import type { FileType, IExistingFileSet, IFile, IFolder, SelectedNode } from './files.types' interface RailsFileLinks { @@ -106,7 +106,8 @@ function mapRailsFile(raw: RailsFile): IFile { show_license_pending: raw.show_license_pending, requestApprovalLicenseLink: typeof raw.links?.request_approval_license === 'string' ? raw.links.request_approval_license : undefined, - acceptLicenseActionLink: typeof raw.links?.accept_license_action === 'string' ? raw.links.accept_license_action : undefined, + acceptLicenseActionLink: + typeof raw.links?.accept_license_action === 'string' ? raw.links.accept_license_action : undefined, downloadLink: raw.links?.download, } } @@ -289,8 +290,8 @@ export const moveFilesRequest = async ( return axios.post(url, body).then(res => res.data as MoveFilesResponse) } -export async function createFile(name: string, scope: string, folder_id: string | null): Promise { - return axios.post('/api/create_file', { name, scope, folder_id }).then(r => r.data) +export async function createFile(name: string, scope: string, folder_id: string | null): Promise { + return axios.post('/api/v2/files', { name, scope, folderId: folder_id }).then(r => r.data) } export async function fetchSelectedFiles(ids: number[]): Promise { diff --git a/packages/client/src/features/files/files.types.ts b/packages/client/src/features/files/files.types.ts index e0aa0cf398..84843a789a 100644 --- a/packages/client/src/features/files/files.types.ts +++ b/packages/client/src/features/files/files.types.ts @@ -2,8 +2,8 @@ import type { TreeProps } from 'rc-tree' import type { BasicDataNode } from 'rc-tree/es/interface' import type { DataNode } from 'rc-tree/lib/interface' import type { FileOrg, FileUser } from '../apps/apps.types' -import type { ServerScope } from '../home/types' import type { FileLicense } from '../assets/assets.types' +import type { ServerScope } from '../home/types' export interface NodePermissions { canDelete: boolean diff --git a/packages/client/src/features/resources/uploadImage.ts b/packages/client/src/features/resources/uploadImage.ts index f40380329f..70ad4186d1 100644 --- a/packages/client/src/features/resources/uploadImage.ts +++ b/packages/client/src/features/resources/uploadImage.ts @@ -1,8 +1,7 @@ import axios from 'axios' import sparkMD5 from 'spark-md5' -import { GetUploadURLResponse } from './resources.types' -import { HTTP_STATUS } from '../../constants' import { getUploadURL } from '../../api/files' +import { HTTP_STATUS } from '../../constants' export const CHUNK_SIZE = 100 * 1024 ** 2 // 100Mb @@ -13,14 +12,12 @@ const throwIfError = (status: number, payload?: any) => { } } -const uploadChunk = (url: string, chunk: ArrayBuffer, headers: HeadersInit) => ( - +const uploadChunk = (url: string, chunk: ArrayBuffer, headers: HeadersInit) => fetch(url, { method: 'PUT', body: chunk, headers, }) -) const closeFile = (uid: string, followUpAction?: string) => axios.post('/api/close_file', { @@ -32,7 +29,13 @@ function getNumChunks(file: File) { return Math.ceil(file.size / CHUNK_SIZE) } -async function processChunk(file: File, fileUid: string, chunkIndex: number, reader: FileReader, spark: sparkMD5.ArrayBuffer) { +async function processChunk( + file: File, + fileUid: string, + chunkIndex: number, + reader: FileReader, + spark: sparkMD5.ArrayBuffer, +) { const firstByte = chunkIndex * CHUNK_SIZE const lastByte = (chunkIndex + 1) * CHUNK_SIZE @@ -56,7 +59,9 @@ function readAndProcessFile(file: File, fileUid: string) { const spark = new sparkMD5.ArrayBuffer() reader.onload = async () => { - const promises = Array.from({ length: getNumChunks(file) }, (_, i) => processChunk(file, fileUid, i, reader, spark)) + const promises = Array.from({ length: getNumChunks(file) }, (_, i) => + processChunk(file, fileUid, i, reader, spark), + ) try { await Promise.all(promises) diff --git a/packages/client/src/mocks/handlers/assets.handlers.ts b/packages/client/src/mocks/handlers/assets.handlers.ts index e064256d33..d86c799ee2 100644 --- a/packages/client/src/mocks/handlers/assets.handlers.ts +++ b/packages/client/src/mocks/handlers/assets.handlers.ts @@ -1,6 +1,6 @@ -import { http, HttpResponse } from 'msw' -import { IAsset } from '../../features/assets/assets.types' -import { Asset } from '../../features/actionModals/AttachToModal/useListAssetsQuery' +import { HttpResponse, http } from 'msw' +import type { Asset } from '../../features/actionModals/AttachToModal/useListAssetsQuery' +import type { IAsset } from '../../features/assets/assets.types' // Mock asset data for useSelectAssetModal (IAsset interface) export const mockSelectAssets: IAsset[] = [ @@ -191,7 +191,8 @@ export const mockAttachAssets: Asset[] = [ prefix: 'asset', description: 'A comprehensive guide for project documentation', file_paths: ['/assets/documentation-guide.md'], - content: '# Documentation Guide\n\nThis is a comprehensive guide for creating and maintaining project documentation.\n\n## Getting Started\n\n1. Create clear headings\n2. Use bullet points for lists\n3. Include code examples\n\n```javascript\nconst example = "Hello World";\nconsole.log(example);\n```\n\n## Best Practices\n\n- Keep it simple and clear\n- Update regularly\n- Include examples', + content: + '# Documentation Guide\n\nThis is a comprehensive guide for creating and maintaining project documentation.\n\n## Getting Started\n\n1. Create clear headings\n2. Use bullet points for lists\n3. Include code examples\n\n```javascript\nconst example = "Hello World";\nconsole.log(example);\n```\n\n## Best Practices\n\n- Keep it simple and clear\n- Update regularly\n- Include examples', }, { id: 2, @@ -215,7 +216,8 @@ export const mockAttachAssets: Asset[] = [ prefix: 'asset', description: 'Complete API documentation and reference', file_paths: ['/assets/api-reference.md'], - content: '# API Reference\n\n## Authentication\n\nAll API requests require authentication using an API key.\n\n```bash\ncurl -H "Authorization: Bearer YOUR_API_KEY" https://api.example.com/endpoint\n```\n\n## Endpoints\n\n### GET /api/users\n\nRetrieve a list of users.\n\n**Response:**\n```json\n{\n "users": [\n {\n "id": 1,\n "name": "John Doe",\n "email": "john@example.com"\n }\n ]\n}\n```', + content: + '# API Reference\n\n## Authentication\n\nAll API requests require authentication using an API key.\n\n```bash\ncurl -H "Authorization: Bearer YOUR_API_KEY" https://api.example.com/endpoint\n```\n\n## Endpoints\n\n### GET /api/users\n\nRetrieve a list of users.\n\n**Response:**\n```json\n{\n "users": [\n {\n "id": 1,\n "name": "John Doe",\n "email": "john@example.com"\n }\n ]\n}\n```', }, { id: 3, @@ -239,7 +241,8 @@ export const mockAttachAssets: Asset[] = [ prefix: 'asset', description: 'Template for application configuration files', file_paths: ['/assets/configuration-template.md'], - content: '# Configuration Template\n\nUse this template to configure your application.\n\n## Environment Variables\n\n```env\nDATABASE_URL=postgresql://localhost:5432/mydb\nAPP_SECRET=your-secret-key\nPORT=3000\n```\n\n## Configuration File\n\n```yaml\nserver:\n port: 3000\n host: localhost\n\ndatabase:\n url: postgresql://localhost:5432/mydb\n pool_size: 10\n\nlogging:\n level: info\n format: json\n```', + content: + '# Configuration Template\n\nUse this template to configure your application.\n\n## Environment Variables\n\n```env\nDATABASE_URL=postgresql://localhost:5432/mydb\nAPP_SECRET=your-secret-key\nPORT=3000\n```\n\n## Configuration File\n\n```yaml\nserver:\n port: 3000\n host: localhost\n\ndatabase:\n url: postgresql://localhost:5432/mydb\n pool_size: 10\n\nlogging:\n level: info\n format: json\n```', }, { id: 4, @@ -263,7 +266,8 @@ export const mockAttachAssets: Asset[] = [ prefix: 'asset', description: 'Basic tutorial for new users', file_paths: ['/assets/tutorial-basics.md'], - content: '# Getting Started Tutorial\n\nWelcome to our platform! This tutorial will guide you through the basics.\n\n## Step 1: Setup\n\nFirst, make sure you have all the prerequisites installed:\n\n- Node.js (v16 or higher)\n- npm or yarn\n- Git\n\n## Step 2: Installation\n\n```bash\nnpm install\nnpm start\n```\n\n## Step 3: Your First Project\n\nCreate your first project by following these steps...', + content: + '# Getting Started Tutorial\n\nWelcome to our platform! This tutorial will guide you through the basics.\n\n## Step 1: Setup\n\nFirst, make sure you have all the prerequisites installed:\n\n- Node.js (v16 or higher)\n- npm or yarn\n- Git\n\n## Step 2: Installation\n\n```bash\nnpm install\nnpm start\n```\n\n## Step 3: Your First Project\n\nCreate your first project by following these steps...', }, ] @@ -291,7 +295,11 @@ export const assetsHandlers = [ scope: 'private', space_id: null, locked: false, - origin: { href: '/home/assets/file-GBKx2kj0JqyZgZGbK9bVZ7jJ-1', fa: 'fa fa-file-zip-o fa-fw', text: ' shoudFail' }, + origin: { + href: '/home/assets/file-GBKx2kj0JqyZgZGbK9bVZ7jJ-1', + fa: 'fa fa-file-zip-o fa-fw', + text: ' shoudFail', + }, tags: ['tags', 'are', 'cool'], uid: 'file-GBKx2kj0JqyZgZGbK9bVZ7jJ-1', file_size: '190 Bytes', @@ -303,7 +311,6 @@ export const assetsHandlers = [ user: '/users/minch.yoda', track: '/track?id=file-GBKx2kj0JqyZgZGbK9bVZ7jJ-1', download_list: '/api/files/download_list', - add_file: '/api/create_file', add_folder: '/api/files/create_folder', update: '/api/assets/file-GBKx2kj0JqyZgZGbK9bVZ7jJ-1', download: '/api/files/file-GBKx2kj0JqyZgZGbK9bVZ7jJ-1/download', @@ -340,14 +347,14 @@ export const assetsHandlers = [ uid: 'file-GBPj0980JqyVVyk9699jY41p-1', file_size: '10 KB', created_at_date_time: '2022-06-07 18:43:17 CEST', - description: '# Testing asset content\nThis content was created for testing purposes.\n\nThanks for reaching out!\n', + description: + '# Testing asset content\nThis content was created for testing purposes.\n\nThanks for reaching out!\n', links: { origin_object: { origin_type: 'Asset', origin_uid: 'file-GBPj0980JqyVVyk9699jY41p-1' }, show: '/api/assets/file-GBPj0980JqyVVyk9699jY41p-1', user: '/users/minch.yoda', track: '/track?id=file-GBPj0980JqyVVyk9699jY41p-1', download_list: '/api/files/download_list', - add_file: '/api/create_file', add_folder: '/api/files/create_folder', update: '/api/assets/file-GBPj0980JqyVVyk9699jY41p-1', download: '/api/files/file-GBPj0980JqyVVyk9699jY41p-1/download', @@ -373,20 +380,20 @@ export const assetsHandlers = [ { status: 200 }, ), ), - + // Handler for /api/list_assets (used by useSelectAssetModal and useAssetAttachModal) http.post('/api/list_assets', async ({ request }) => { - const body = await request.json().catch(() => ({})) as Record - + const body = (await request.json().catch(() => ({}))) as Record + // If request has scopes/search_string/states, return IAsset[] format (useSelectAssetModal) if (body && ('scopes' in body || 'search_string' in body || 'states' in body)) { return HttpResponse.json(mockSelectAssets) } - + // Otherwise return Asset[] format (useAssetAttachModal) return HttpResponse.json(mockAttachAssets) }), - + // Handler for /api/assets/delete (used by useDeleteModal) http.post('/api/assets/delete', () => HttpResponse.json({ diff --git a/packages/client/src/mocks/handlers/files.handlers.ts b/packages/client/src/mocks/handlers/files.handlers.ts index 0c7305c6e7..fcc81a6064 100644 --- a/packages/client/src/mocks/handlers/files.handlers.ts +++ b/packages/client/src/mocks/handlers/files.handlers.ts @@ -386,9 +386,7 @@ export const filesMocks = [ }), ), - http.post('/api/list_files', () => - HttpResponse.json(mockCopyFiles), - ), + http.post('/api/list_files', () => HttpResponse.json(mockCopyFiles)), http.post('/api/files/copy', () => HttpResponse.json({ meta: { diff --git a/packages/nginx/default.conf.template b/packages/nginx/default.conf.template index 3ab2907e48..f3811dd447 100644 --- a/packages/nginx/default.conf.template +++ b/packages/nginx/default.conf.template @@ -1,3 +1,8 @@ +map $uri $proxy_uri { + default ""; + ~^/api/create_file$ /files; +} + server { listen 443 ssl; listen [::]:443 ssl; @@ -50,10 +55,15 @@ server { } location / { - proxy_pass ${RUBY_API_URL}; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_version 1.1; + resolver 127.0.0.11 valid=30s; + set $pfda_upstream ${RUBY_API_URL}; + if ($proxy_uri) { + set $pfda_upstream ${NODE_API_URL}$proxy_uri; + } + proxy_pass $pfda_upstream; } # Redirect deprecated singular /job/ path to plural /jobs/ diff --git a/packages/nginx/nginx.conf b/packages/nginx/nginx.conf index 51b60721a2..2eb432f10c 100644 --- a/packages/nginx/nginx.conf +++ b/packages/nginx/nginx.conf @@ -54,6 +54,11 @@ http { ~participants ""; } + map $uri $proxy_uri { + default ""; + ~^/api/create_file$ /files; + } + limit_req_zone $apicall zone=pfdazone:10m rate=5r/s; server { @@ -147,7 +152,6 @@ http { location @pfda { #limit_req zone=pfdazone burst=20 nodelay; - proxy_pass http://pfda; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Request-ID $request_id; @@ -159,6 +163,11 @@ http { proxy_connect_timeout 120; proxy_read_timeout 120; proxy_send_timeout 120; + set $pfda_upstream http://pfda; + if ($proxy_uri) { + set $pfda_upstream https://pfda-nodejs-api:3001$proxy_uri; + } + proxy_pass $pfda_upstream; } location /ws { diff --git a/packages/rails/app/controllers/api_controller.rb b/packages/rails/app/controllers/api_controller.rb index 5d4d44dfcb..22bd670f6b 100644 --- a/packages/rails/app/controllers/api_controller.rb +++ b/packages/rails/app/controllers/api_controller.rb @@ -18,8 +18,7 @@ class ApiController < ApplicationController before_action :require_api_login, except: %i(destroy) before_action :validate_create_asset, only: :create_asset before_action :check_total_and_job_charges_limit, only: %i(run_workflow) - before_action :check_total_charges_limit, only: %i(create_file create_asset) - before_action :validate_create_file, only: :create_file + before_action :check_total_charges_limit, only: %i(create_asset) before_action :validate_get_upload_url, only: :get_upload_url rescue_from ApiError, with: :render_error_method @@ -717,45 +716,6 @@ def license_items render json: { license_id: license_id, items_licensed: items_licensed } end - # Inputs: - # - # name (string, required, nonempty) - # description (string, optional) - # scope (string, optional) 'public' | 'private' | - # - # Outputs: - # - # id (string, "file-xxxx") - # - def create_file - fail "User is not allowed to create public files" if params[:scope] == "public" && !current_user.site_admin? - - project = UserFile.publication_project!(current_user, @scope) - - parent = current_user - # file could be uploaded by CLI inside job; fall back to current_user if job is not found - if params[:parent_type] == "Job" && params[:parent_id] != "" - parent = Job.find_by(dxid: params[:parent_id]) || current_user - end - - api = DNAnexusAPI.new(RequestContext.instance.token) - file_dxid = api.file_new(params[:name], project)["id"] - - file = UserFile.create!( - dxid: file_dxid, - project: project, - name: params[:name], - state: "open", - description: params[:description], - user: current_user, - parent: parent, - scope: @scope, - UserFile.scope_column_name(@scope) => @folder&.id, - ) - - render json: { id: file.uid } - end - # Creates a challenge logo - to be visible as a challenge card image # @return [Hash] - a uid of a file uploaded as a card image # @@ -1561,61 +1521,6 @@ def validate_create_asset end end - # Validates and initializes parameters for a file creation. - # rubocop:todo Metrics/MethodLength - def validate_create_file - folder_id = params[:folder_id].presence - @folder = - begin - folder_id && Folder.find(folder_id) - rescue ActiveRecord::RecordNotFound - raise_api_error "The folder doesn't exist." - end - - # If folder is present, its scope rules everything - params[:scope] = @folder.scope if @folder - - if @folder && !@folder.editable_by?(@context) - raise_api_error "You don't have permissions to add files to the folder." - end - - if @folder && @folder.state == "removing" - raise_api_error "The target folder is being removed." - end - - # user specified only folder id, but the folder is in space - set it for him - if @folder && (@folder.scope.match(/^space-(\d+)$/)) && !params[:space_id] - params[:scope] = @folder.scope - end - - file_name = params[:name].presence - if file_name.blank? || !file_name.is_a?(String) - raise_api_error "File name needs to be a non-empty String" - end - - description = params[:description].presence - if description && !description.is_a?(String) - raise_api_error "File description needs to be a String" - end - - @scope = if ActiveModel::Type::Boolean.new.cast(params[:public_scope]) - Scopes::SCOPE_PUBLIC - else - params[:scope].presence || Scopes::SCOPE_PRIVATE - end - - unless [Scopes::SCOPE_PUBLIC, Scopes::SCOPE_PRIVATE].include?(@scope) || Space.valid_scope?(@scope) - raise_api_error "Scope is invalid" - end - - if Space.valid_scope?(@scope) && !Space.from_scope(@scope).editable_by?(current_user) - raise_api_error "You don't have permissions to add files to the space." - end - - return if @folder.nil? || @folder.scope == @scope - - raise_api_error "The folder doesn't belong to a scope #{@scope}." - end # rubocop:enable Metrics/MethodLength # rubocop:enable Style/SignalException diff --git a/packages/rails/app/serializers/user_file_serializer.rb b/packages/rails/app/serializers/user_file_serializer.rb index ca3a963da8..63f20ab063 100644 --- a/packages/rails/app/serializers/user_file_serializer.rb +++ b/packages/rails/app/serializers/user_file_serializer.rb @@ -62,8 +62,6 @@ def links # POST download_list files links[:download_list] = download_list_api_files_path - # POST: Add file - links[:add_file] = api_create_file_path # POST: Add folder links[:add_folder] = create_folder_api_files_path # PUT edit a single file diff --git a/packages/rails/config/routes.rb b/packages/rails/config/routes.rb index 82a9eab866..d49fe70e9a 100644 --- a/packages/rails/config/routes.rb +++ b/packages/rails/config/routes.rb @@ -393,7 +393,6 @@ end end - post "create_file" post "create_challenge_card_image" post "create_image_file" post "get_upload_url" diff --git a/packages/rails/spec/controllers/api_controller_spec.rb b/packages/rails/spec/controllers/api_controller_spec.rb index ef48f9a6cc..d9aa1cc1bf 100644 --- a/packages/rails/spec/controllers/api_controller_spec.rb +++ b/packages/rails/spec/controllers/api_controller_spec.rb @@ -591,81 +591,6 @@ end end - describe "POST create_file" do - before do - authenticate!(user) - - allow(Users::ChargesFetcher).to receive(:exceeded_charges_limit?).and_return(false) - allow_any_instance_of(DNAnexusAPI).to( - receive(:call).with("file", "new", anything).and_return( - "id" => "file-Bx46ZqQ04Pz5Bq3x20pkBXP4", - ) - ) - end - - context "when sends a file with incorrect params" do - context "with empty name" do - it "doesn't create a file" do - post :create_file, params: { description: "some_desc" } - - expect(response).not_to have_http_status(200) - end - end - end - - context "when sends a file with correct params" do - it "creates a file" do - post :create_file, params: { name: "some_name", description: "some_desc" } - - expect(response).to have_http_status(200) - - expect(UserFile.last.attributes).to include( - "name" => "some_name", - "description" => "some_desc", - "dxid" => "file-Bx46ZqQ04Pz5Bq3x20pkBXP4", - "parent_folder_id" => nil, - ) - end - - it "creates a private file" do - post :create_file, params: { name: anything, public_scope: false } - - expect(UserFile.last.project).to eq(user.private_files_project) - expect(UserFile.last.scope).to eq("private") - end - - it "creates a public file" do - post :create_file, params: { name: anything, public_scope: true } - - expect(UserFile.last.project).to eq(user.public_files_project) - expect(UserFile.last.scope).to eq("public") - end - - context "when public_scope param doesn't exist" do - it "creates a private file" do - post :create_file, params: { name: anything } - - expect(UserFile.last.project).to eq(user.private_files_project) - expect(UserFile.last.scope).to eq("private") - end - end - end - - context "when user exceeded charges limit" do - before do - allow(Users::ChargesFetcher).to receive(:exceeded_charges_limit?).and_return(true) - end - - it "responds with an error" do - post :create_file, format: :json - - expect(response.status).to eq(422) - expect(parsed_response["error"]["message"]).to \ - include(I18n.t("api.errors.exceeded_charges_limit")) - end - end - end - describe "POST #set_tags" do context "when logged in" do let(:host_lead) { create(:user, dxuser: "user_1") } diff --git a/packages/rails/spec/serializers/asset_serializer_spec.rb b/packages/rails/spec/serializers/asset_serializer_spec.rb index ed3c2ab1c2..2f66c73b9b 100644 --- a/packages/rails/spec/serializers/asset_serializer_spec.rb +++ b/packages/rails/spec/serializers/asset_serializer_spec.rb @@ -36,8 +36,7 @@ expect(asset_serialized["links"]["update"]).to eq(api_files_path(asset)) end - it "links[add_file, add_folder] exist" do - expect(asset_serialized["links"]["add_file"]).to eq(api_create_file_path) + it "links[add_folder] exist" do expect(asset_serialized["links"]["add_folder"]).to eq(create_folder_api_files_path) end diff --git a/packages/rails/spec/serializers/user_file_serializer_spec.rb b/packages/rails/spec/serializers/user_file_serializer_spec.rb index c417616419..633b4892dd 100644 --- a/packages/rails/spec/serializers/user_file_serializer_spec.rb +++ b/packages/rails/spec/serializers/user_file_serializer_spec.rb @@ -37,8 +37,7 @@ expect(user_file_serialized["links"]["download_list"]).to eq(download_list_api_files_path) end - it "links[add_file, add_folder, update] exist" do - expect(user_file_serialized["links"]["add_file"]).to eq(api_create_file_path) + it "links[add_folder, update] exist" do expect(user_file_serialized["links"]["add_folder"]).to eq(create_folder_api_files_path) expect(user_file_serialized["links"]["update"]).to eq(api_files_path) end diff --git a/packages/server/apps/api/src/files/files.api.module.ts b/packages/server/apps/api/src/files/files.api.module.ts index 1227d9b1db..5b628bfabf 100644 --- a/packages/server/apps/api/src/files/files.api.module.ts +++ b/packages/server/apps/api/src/files/files.api.module.ts @@ -1,10 +1,11 @@ import { Module } from '@nestjs/common' import { UserFileModule } from '@shared/domain/user-file/user-file.module' +import { UserFileCreateFacadeModule } from '@shared/facade/file-create/user-file-create-facade.module' import { UserFileApiFacadeModule } from '../facade/user-file/user-file-api-facade.module' import { FilesController } from './files.controller' @Module({ - imports: [UserFileModule, UserFileApiFacadeModule], + imports: [UserFileModule, UserFileApiFacadeModule, UserFileCreateFacadeModule], controllers: [FilesController], }) export class FilesApiModule {} diff --git a/packages/server/apps/api/src/files/files.controller.ts b/packages/server/apps/api/src/files/files.controller.ts index 4e4766ab84..0933196c66 100644 --- a/packages/server/apps/api/src/files/files.controller.ts +++ b/packages/server/apps/api/src/files/files.controller.ts @@ -16,6 +16,7 @@ import { Query, Res, UseGuards, + UsePipes, } from '@nestjs/common' import { ApiOperation, ApiQuery, ApiResponse } from '@nestjs/swagger' import archiver from 'archiver' @@ -24,20 +25,24 @@ import { compareVersions } from 'compare-versions' import { Response } from 'express' import { DownloadLinkOptionsDTO } from '@shared/domain/entity/domain/download-link-options.dto' import { Uid } from '@shared/domain/entity/domain/uid' +import { EntityUidResponseDTO } from '@shared/domain/entity/dto/entity-uid-response.dto' import { UserContext } from '@shared/domain/user-context/model/user-context' -import { ResolvePathDTO } from '@shared/domain/user-file/dto/user-file.dto' import { FileGetDTO } from '@shared/domain/user-file/dto/file-get.dto' +import { ResolvePathDTO } from '@shared/domain/user-file/dto/user-file.dto' +import { UserFileCreateDTO } from '@shared/domain/user-file/dto/user-file-create.dto' import { NodeService } from '@shared/domain/user-file/node.service' import { UrlFetchService } from '@shared/domain/user-file/service/url-fetch.service' import { ExistingFileSet, ResolvePath, SelectedNode } from '@shared/domain/user-file/user-file.types' +import { UserFileCreateFacade } from '@shared/facade/file-create/user-file-create.facade' import { GetUploadURLResponse } from '@shared/platform-client/platform-client.responses' import { createCloseFileJobTask } from '@shared/queue' import { TimeUtils } from '@shared/utils/time.utils' +import { SnakeToCamelPipe } from '@shared/validation/pipes/snake-to-camel.pipe' import { CustomValidationPipe } from '@shared/validation/pipes/validation.pipe' import { UserFileBulkDownloadFacade } from '../facade/user-file/user-file-bulk-download.facade' import { UserFileDownloadFacade } from '../facade/user-file/user-file-download.facade' -import { UserFileResolverFacade } from '../facade/user-file/user-file-resolver.facade' import { UserFileGetFacade } from '../facade/user-file/user-file-get.facade' +import { UserFileResolverFacade } from '../facade/user-file/user-file-resolver.facade' import { InternalRouteGuard } from '../internal/guard/internal.guard' import { UserContextGuard } from '../user-context/guard/user-context.guard' import { FileUidParamDTO } from './model/file-uid-param.dto' @@ -56,8 +61,24 @@ export class FilesController { private readonly userFileGetFacade: UserFileGetFacade, private readonly userFileDownloadFacade: UserFileDownloadFacade, private readonly userFileBulkDownloadFacade: UserFileBulkDownloadFacade, + private readonly userFileCreateFacade: UserFileCreateFacade, ) {} + @Post() + @UsePipes(new SnakeToCamelPipe()) + async createFile( + @Body() input: UserFileCreateDTO, + @Res({ passthrough: true }) res: Response, + @Headers('user-agent') userAgent?: string, + ): Promise { + const result = await this.userFileCreateFacade.createFile(input) + + // Keep returning 200 for JupyterLab client + if (userAgent?.includes('python-requests')) res.status(200) + + return result + } + @Get('/:uid/upload-url') async getUploadUrl( @Param() params: FileUidParamDTO, diff --git a/packages/server/apps/api/test/integration/files/file-create.spec.ts b/packages/server/apps/api/test/integration/files/file-create.spec.ts new file mode 100644 index 0000000000..f700c041d4 --- /dev/null +++ b/packages/server/apps/api/test/integration/files/file-create.spec.ts @@ -0,0 +1,447 @@ +import { SqlEntityManager } from '@mikro-orm/mysql' +import { expect } from 'chai' +import supertest from 'supertest' +import { database } from '@shared/database' +import { Space } from '@shared/domain/space/space.entity' +import { SPACE_TYPE } from '@shared/domain/space/space.enum' +import { SPACE_MEMBERSHIP_ROLE, SPACE_MEMBERSHIP_SIDE } from '@shared/domain/space-membership/space-membership.enum' +import { User } from '@shared/domain/user/user.entity' +import { UserFile } from '@shared/domain/user-file/user-file.entity' +import { UserFileRepository } from '@shared/domain/user-file/user-file.repository' +import { PARENT_TYPE } from '@shared/domain/user-file/user-file.types' +import { create, db } from '@shared/test' +import { mocksReset } from '@shared/test/mocks' +import { testedApp } from '../..' +import { getDefaultHeaderData } from '../../utils/expect-helper' + +describe('POST /files', () => { + let em: SqlEntityManager + let user: User + let fileRepo: UserFileRepository + let space: Space + + beforeEach(async () => { + await db.dropData(database.connection()) + // create DB mocks + em = database.orm().em.fork() + em.clear() + fileRepo = em.getRepository(UserFile) + user = create.userHelper.create(em) + space = create.spacesHelper.create(em, { + type: SPACE_TYPE.GROUPS, + hostProject: 'project-host', + guestProject: 'project-guest', + }) + create.spacesHelper.addMember( + em, + { space, user }, + { role: SPACE_MEMBERSHIP_ROLE.CONTRIBUTOR, side: SPACE_MEMBERSHIP_SIDE.HOST }, + ) + create.sessionHelper.create(em, { user }) + await em.flush() + // handle the stubs + mocksReset() + }) + + it('should throw error if name is empty', async () => { + await supertest(testedApp.getHttpServer()).post(`/files`).set(getDefaultHeaderData(user)).send({}).expect(400) + + await supertest(testedApp.getHttpServer()) + .post(`/files`) + .set(getDefaultHeaderData(user)) + .send({ + name: '', + }) + .expect(400) + }) + + it('should create file with default description and user as parent', async () => { + const result = await supertest(testedApp.getHttpServer()) + .post(`/files`) + .set(getDefaultHeaderData(user)) + .send({ + name: 'test_file.txt', + }) + .expect(201) + + const file = await fileRepo.findOne({ uid: result.body.uid }) + expect(file.name).to.equal('test_file.txt') + expect(file.description).to.equal('') + expect(file.parentType).to.equal(PARENT_TYPE.USER) + expect(file.parentId).to.equal(user.id) + }) + + context('should create file with correct scope or private scope by default', () => { + it('should create file in correct scope', async () => { + const result1 = await supertest(testedApp.getHttpServer()) + .post(`/files`) + .set(getDefaultHeaderData(user)) + .send({ + name: 'test_file.txt', + scope: 'private', + }) + .expect(201) + + const file1 = await fileRepo.findOne({ uid: result1.body.uid }) + expect(file1.scope).to.equal('private') + expect(file1.project).to.equal(user.privateFilesProject) + + const result2 = await supertest(testedApp.getHttpServer()) + .post(`/files`) + .set(getDefaultHeaderData(user)) + .send({ + name: 'test_file.txt', + scope: `space-${space.id}`, + }) + .expect(201) + + const file2 = await fileRepo.findOne({ uid: result2.body.uid }) + expect(file2.scope).to.equal(`space-${space.id}`) + expect(file2.project).to.equal(space.hostProject) + }) + + it('should create file in private scope by default', async () => { + const result1 = await supertest(testedApp.getHttpServer()) + .post(`/files`) + .set(getDefaultHeaderData(user)) + .send({ + name: 'test_file.txt', + scope: null, + }) + .expect(201) + + const file1 = await fileRepo.findOne({ uid: result1.body.uid }) + expect(file1.scope).to.equal('private') + + const result2 = await supertest(testedApp.getHttpServer()) + .post(`/files`) + .set(getDefaultHeaderData(user)) + .send({ + name: 'test_file.txt', + scope: '', + }) + .expect(201) + + const file2 = await fileRepo.findOne({ uid: result2.body.uid }) + expect(file2.scope).to.equal('private') + + const result3 = await supertest(testedApp.getHttpServer()) + .post(`/files`) + .set(getDefaultHeaderData(user)) + .send({ + name: 'test_file.txt', + scope: undefined, + }) + .expect(201) + + const file3 = await fileRepo.findOne({ uid: result3.body.uid }) + expect(file3.scope).to.equal('private') + }) + + it('should throw error if scope is invalid', async () => { + await supertest(testedApp.getHttpServer()) + .post(`/files`) + .set(getDefaultHeaderData(user)) + .send({ + name: 'test_file.txt', + scope: 'invalid_scope', + }) + .expect(400) + }) + + it('should throw error if creating public file by non site admin', async () => { + await supertest(testedApp.getHttpServer()) + .post(`/files`) + .set(getDefaultHeaderData(user)) + .send({ + name: 'test_file.txt', + scope: 'public', + }) + .expect(403) + }) + + it('should create public file if user is site admin', async () => { + const siteAdmin = create.userHelper.createSiteAdmin(em) + create.sessionHelper.create(em, { user: siteAdmin }) + await em.flush() + + const result = await supertest(testedApp.getHttpServer()) + .post(`/files`) + .set(getDefaultHeaderData(siteAdmin)) + .send({ + name: 'test_file.txt', + scope: 'public', + }) + .expect(201) + + const file = await fileRepo.findOne({ uid: result.body.uid }) + expect(file.scope).to.equal('public') + expect(file.project).to.equal(siteAdmin.publicFilesProject) + }) + + it('should throw error if user does not have write access to the space', async () => { + const anotherUser = create.userHelper.create(em) + create.sessionHelper.create(em, { user: anotherUser }) + create.spacesHelper.addMember( + em, + { space, user: anotherUser }, + { role: SPACE_MEMBERSHIP_ROLE.VIEWER, side: SPACE_MEMBERSHIP_SIDE.HOST }, + ) + await em.flush() + + await supertest(testedApp.getHttpServer()) + .post(`/files`) + .set(getDefaultHeaderData(anotherUser)) + .send({ + name: 'test_file.txt', + scope: `space-${space.id}`, + }) + .expect(422) + }) + }) + + context('should create file with correct parent folder', () => { + it('should create file in root if folderId is not provided', async () => { + const result = await supertest(testedApp.getHttpServer()) + .post(`/files`) + .set(getDefaultHeaderData(user)) + .send({ + name: 'test_file.txt', + }) + .expect(201) + + const file = await fileRepo.findOne({ uid: result.body.uid }) + expect(file.parentFolderId).to.be.null() + expect(file.scopedParentFolderId).to.be.null() + }) + + it('should create file in root if folderId is null or empty', async () => { + const result1 = await supertest(testedApp.getHttpServer()) + .post(`/files`) + .set(getDefaultHeaderData(user)) + .send({ + name: 'test_file.txt', + folderId: null, + }) + .expect(201) + + const file1 = await fileRepo.findOne({ uid: result1.body.uid }) + expect(file1.parentFolderId).to.be.null() + expect(file1.scopedParentFolderId).to.be.null() + + const result2 = await supertest(testedApp.getHttpServer()) + .post(`/files`) + .set(getDefaultHeaderData(user)) + .send({ + name: 'test_file.txt', + folderId: '', + }) + .expect(201) + + const file2 = await fileRepo.findOne({ uid: result2.body.uid }) + expect(file2.parentFolderId).to.be.null() + expect(file2.scopedParentFolderId).to.be.null() + }) + + it('should create file in the folder if folderId is provided', async () => { + const folder = create.filesHelper.createFolder(em, { + user, + parentFolder: null, + }) + await em.flush() + + const result = await supertest(testedApp.getHttpServer()) + .post(`/files`) + .set(getDefaultHeaderData(user)) + .send({ + name: 'test_file.txt', + folderId: folder.id, + }) + .expect(201) + + const file = await fileRepo.findOne({ uid: result.body.uid }) + expect(file.parentFolderId).to.equal(folder.id) + expect(file.scopedParentFolderId).to.be.null() + }) + + it('should create file in scope folder if folderId is provided and scope is space', async () => { + const folder = create.filesHelper.createFolder( + em, + { + user, + parentFolder: null, + }, + { + scope: `space-${space.id}`, + }, + ) + await em.flush() + + const result = await supertest(testedApp.getHttpServer()) + .post(`/files`) + .set(getDefaultHeaderData(user)) + .send({ + name: 'test_file.txt', + folderId: folder.id, + scope: `space-${space.id}`, + }) + .expect(201) + + const file = await fileRepo.findOne({ uid: result.body.uid }) + expect(file.parentFolderId).to.be.null() + expect(file.scopedParentFolderId).to.equal(folder.id) + }) + }) + + it('should create file with correct parent job', async () => { + const app = create.appHelper.createHTTPS(em, { user }) + const job = create.jobHelper.create(em, { user, app }) + await em.flush() + + const result = await supertest(testedApp.getHttpServer()) + .post(`/files`) + .set(getDefaultHeaderData(user)) + .send({ + name: 'test_file.txt', + parentType: PARENT_TYPE.JOB, + parentId: job.dxid, + }) + .expect(201) + + const file = await fileRepo.findOne({ uid: result.body.uid }) + expect(file.parentType).to.equal(PARENT_TYPE.JOB) + expect(file.parentId).to.equal(job.id) + }) + + it('should inherit the scope of the folder if the file is being created inside a folder', async () => { + const folder = create.filesHelper.createFolder( + em, + { + user, + parentFolder: null, + }, + { + scope: 'private', + }, + ) + await em.flush() + + const result = await supertest(testedApp.getHttpServer()) + .post(`/files`) + .set(getDefaultHeaderData(user)) + .send({ + name: 'test_file.txt', + folderId: folder.id, + scope: space.scope, + }) + .expect(201) + + const file = await fileRepo.findOne({ uid: result.body.uid }) + expect(file.scope).to.equal(folder.scope) + }) + + it('should fall back to current user if parent job does not exist', async () => { + const result = await supertest(testedApp.getHttpServer()) + .post(`/files`) + .set(getDefaultHeaderData(user)) + .send({ + name: 'test_file.txt', + parentType: PARENT_TYPE.JOB, + parentId: 'job-12345', + }) + .expect(201) + + const file = await fileRepo.findOne({ uid: result.body.uid }) + expect(file.parentType).to.equal(PARENT_TYPE.USER) + expect(file.parentId).to.equal(user.id) + }) + + it('should throw error if parentType or parentId is invalid', async () => { + await supertest(testedApp.getHttpServer()) + .post(`/files`) + .set(getDefaultHeaderData(user)) + .send({ + name: 'test_file.txt', + parentType: 'invalid_parent_type', + parentId: 'job-12345', + }) + .expect(400) + + await supertest(testedApp.getHttpServer()) + .post(`/files`) + .set(getDefaultHeaderData(user)) + .send({ + name: 'test_file.txt', + parentType: PARENT_TYPE.JOB, + parentId: 'invalid_parent_id', + }) + .expect(400) + + await supertest(testedApp.getHttpServer()) + .post(`/files`) + .set(getDefaultHeaderData(user)) + .send({ + name: 'test_file.txt', + parentType: PARENT_TYPE.JOB, + }) + .expect(400) + + await supertest(testedApp.getHttpServer()) + .post(`/files`) + .set(getDefaultHeaderData(user)) + .send({ + name: 'test_file.txt', + parentId: 'job-12345', + }) + .expect(400) + }) + + it('should create file with content in description', async () => { + const description = 'This is a test file' + const result = await supertest(testedApp.getHttpServer()) + .post(`/files`) + .set(getDefaultHeaderData(user)) + .send({ + name: 'test_file.txt', + description, + }) + .expect(201) + + const file = await fileRepo.findOne({ uid: result.body.uid }) + expect(file.description).to.equal(description) + }) + + it('should return 200 for JupyterLab client', async () => { + const result = await supertest(testedApp.getHttpServer()) + .post(`/files`) + .set(getDefaultHeaderData(user)) + .set('user-agent', 'python-requests/2.25.1') + .send({ + name: 'test_file.txt', + }) + .expect(200) + + const file = await fileRepo.findOne({ uid: result.body.uid }) + expect(file.name).to.equal('test_file.txt') + }) + + it('should parse snake case parameters', async () => { + const app = create.appHelper.createHTTPS(em, { user }) + const job = create.jobHelper.create(em, { user, app }) + await em.flush() + + const result = await supertest(testedApp.getHttpServer()) + .post(`/files`) + .set(getDefaultHeaderData(user)) + .send({ + name: 'test_file.txt', + parent_type: PARENT_TYPE.JOB, + parent_id: job.dxid, + }) + .expect(201) + + const file = await fileRepo.findOne({ uid: result.body.uid }) + expect(file.parentType).to.equal(PARENT_TYPE.JOB) + expect(file.parentId).to.equal(job.id) + }) +}) diff --git a/packages/server/libs/shared/src/domain/entity/dto/entity-uid-response.dto.ts b/packages/server/libs/shared/src/domain/entity/dto/entity-uid-response.dto.ts new file mode 100644 index 0000000000..07fcfc897e --- /dev/null +++ b/packages/server/libs/shared/src/domain/entity/dto/entity-uid-response.dto.ts @@ -0,0 +1,6 @@ +import { Uid } from '../domain/uid' + +export class EntityUidResponseDTO { + uid: Uid + id?: Uid // for backward compatibility to old clients +} diff --git a/packages/server/libs/shared/src/domain/job/job.service.ts b/packages/server/libs/shared/src/domain/job/job.service.ts index e7af328ca9..2e67fff7e0 100644 --- a/packages/server/libs/shared/src/domain/job/job.service.ts +++ b/packages/server/libs/shared/src/domain/job/job.service.ts @@ -90,6 +90,10 @@ export class JobService implements SearchableByUid<'job'> { return this.jobRepo.findEditableOne({ uid }) } + getEditableOne(where: FilterQuery): Promise { + return this.jobRepo.findEditableOne(where) + } + async synchronizeJob(jobDxid: DxId<'job'>, bullJob: BullJob): Promise> { return await this.jobSyncService.synchronizeJob(jobDxid, bullJob) } diff --git a/packages/server/libs/shared/src/domain/user-file/dto/user-file-create.dto.ts b/packages/server/libs/shared/src/domain/user-file/dto/user-file-create.dto.ts new file mode 100644 index 0000000000..ddaa8ce8e6 --- /dev/null +++ b/packages/server/libs/shared/src/domain/user-file/dto/user-file-create.dto.ts @@ -0,0 +1,37 @@ +import { Transform } from 'class-transformer' +import { IsIn, IsNotEmpty, IsNumber, IsOptional, IsString, ValidateIf } from 'class-validator' +import { IsValidDxid } from '@shared/domain/entity/constraint/is-dxid-valid.constraint' +import { IsValidScope } from '@shared/domain/entity/constraint/is-valid-scope.constraint' +import { DxId } from '@shared/domain/entity/domain/dxid' +import { STATIC_SCOPE } from '@shared/enums' +import { EntityScope } from '@shared/types/common' +import { PARENT_TYPE } from '../user-file.types' + +export class UserFileCreateDTO { + @IsString() + @IsNotEmpty() + name: string + + @Transform(({ value }) => (value === null || value === undefined || value === '' ? 'private' : value)) + @IsValidScope() + scope: EntityScope = STATIC_SCOPE.PRIVATE + + @Transform(({ value }) => (value === '' ? null : value)) + @IsOptional() + @IsNumber() + folderId?: number + + @IsOptional() + @IsString() + description?: string + + @ValidateIf(o => o.parentId != null && o.parentId !== '') + @IsNotEmpty() + @IsIn([PARENT_TYPE.JOB]) + parentType: PARENT_TYPE.JOB + + @ValidateIf(o => o.parentType != null && o.parentType !== '') + @IsNotEmpty() + @IsValidDxid({ entityType: 'job' }) + parentId: DxId<'job'> +} diff --git a/packages/server/libs/shared/src/domain/user-file/node.service.ts b/packages/server/libs/shared/src/domain/user-file/node.service.ts index 39394c4930..04c683ca28 100644 --- a/packages/server/libs/shared/src/domain/user-file/node.service.ts +++ b/packages/server/libs/shared/src/domain/user-file/node.service.ts @@ -203,6 +203,10 @@ export class NodeService { })) as FileOrAsset | null } + async getEditableFolder(id: number): Promise { + return this.nodeRepository.findEditableOne({ id, stiType: FILE_STI_TYPE.FOLDER }) as Promise + } + /** * Loads the whole tree that is filtered by parameters and returns * it sorted with leaves first diff --git a/packages/server/libs/shared/src/domain/user-file/service/user-file.service.ts b/packages/server/libs/shared/src/domain/user-file/service/user-file.service.ts index 1571ae0f4e..b3b7df4494 100644 --- a/packages/server/libs/shared/src/domain/user-file/service/user-file.service.ts +++ b/packages/server/libs/shared/src/domain/user-file/service/user-file.service.ts @@ -303,7 +303,7 @@ export class UserFileService { file.uid = `${fileCreate.dxid}-1` this.logger.log(`Creating file ${JSON.stringify(fileCreate)}`) - await this.em.persistAndFlush(file) + await this.fileRepo.persistAndFlush(file) return file } diff --git a/packages/server/libs/shared/src/domain/user/user.entity.ts b/packages/server/libs/shared/src/domain/user/user.entity.ts index 0c92e0733d..05155d0e49 100644 --- a/packages/server/libs/shared/src/domain/user/user.entity.ts +++ b/packages/server/libs/shared/src/domain/user/user.entity.ts @@ -13,6 +13,8 @@ import { SPACE_STATE } from '@shared/domain/space/space.enum' import { SpaceMembership } from '@shared/domain/space-membership/space-membership.entity' import { ADMIN_LEAD_ROLES, CAN_EDIT_ROLES } from '@shared/domain/space-membership/space-membership.helper' import { UserExtras } from '@shared/domain/user/user-extras' +import { EntityScope } from '@shared/types/common' +import { EntityScopeUtils } from '@shared/utils/entity-scope.utils' import { config } from '../../config' import { BaseEntity } from '../../database/base.entity' import { AdminMembership } from '../admin-membership/admin-membership.entity' @@ -142,6 +144,8 @@ export const DEFAULT_USER_EXTRAS: UserExtras = { sso_enabled: null, } +export type SpaceMembershipMode = 'leadable' | 'manageable' | 'editable' | 'accessible' + @Entity({ tableName: 'users', repository: () => UserRepository }) export class User extends BaseEntity { @Property() @@ -277,15 +281,30 @@ export class User extends BaseEntity { return this.dxuser } + private spaceMembershipWhere(mode?: SpaceMembershipMode, spaceId?: number): Record { + let roleFilter = {} + if (mode === 'leadable') { + roleFilter = { role: SPACE_MEMBERSHIP_ROLE.LEAD } + } else if (mode === 'manageable') { + roleFilter = { role: { $in: ADMIN_LEAD_ROLES } } + } else if (mode === 'editable') { + roleFilter = { role: { $in: CAN_EDIT_ROLES } } + } + + return { + active: true, + ...roleFilter, + spaces: { + ...(spaceId !== undefined ? { id: spaceId } : {}), + state: { $ne: SPACE_STATE.DELETED }, + }, + } + } + async accessibleSpaces(): Promise { await this.spaceMemberships.load({ populate: ['spaces'], - where: { - active: true, - spaces: { - state: { $ne: SPACE_STATE.DELETED }, - }, - }, + where: this.spaceMembershipWhere('accessible'), }) return Array.from(this.spaceMemberships).flatMap(spaceMembership => Array.from(spaceMembership.spaces)) @@ -299,13 +318,7 @@ export class User extends BaseEntity { async editableSpaces(): Promise { await this.spaceMemberships.load({ populate: ['spaces'], - where: { - active: true, - role: { $in: CAN_EDIT_ROLES }, - spaces: { - state: { $ne: SPACE_STATE.DELETED }, - }, - }, + where: this.spaceMembershipWhere('editable'), }) return Array.from(this.spaceMemberships).flatMap(membership => Array.from(membership.spaces)) @@ -317,13 +330,7 @@ export class User extends BaseEntity { async manageableSpaces(): Promise { await this.spaceMemberships.load({ populate: ['spaces'], - where: { - active: true, - role: { $in: ADMIN_LEAD_ROLES }, - spaces: { - state: { $ne: SPACE_STATE.DELETED }, - }, - }, + where: this.spaceMembershipWhere('manageable'), }) return Array.from(this.spaceMemberships).flatMap(membership => Array.from(membership.spaces)) @@ -332,13 +339,7 @@ export class User extends BaseEntity { async leadableSpaces(): Promise { await this.spaceMemberships.load({ populate: ['spaces'], - where: { - active: true, - role: SPACE_MEMBERSHIP_ROLE.LEAD, - spaces: { - state: { $ne: SPACE_STATE.DELETED }, - }, - }, + where: this.spaceMembershipWhere('leadable'), }) return Array.from(this.spaceMemberships).flatMap(membership => Array.from(membership.spaces)) } @@ -388,4 +389,25 @@ export class User extends BaseEntity { isJobExecutionEnabled(): boolean { return this.cloudResourceSettings.job_limit > 0 } + + async getDestinationProjectId(scope: EntityScope, mode?: SpaceMembershipMode): Promise | null> { + if (EntityScopeUtils.isPublic(scope)) { + return this.publicFilesProject + } else if (EntityScopeUtils.isPrivate(scope)) { + return this.privateFilesProject + } else if (EntityScopeUtils.isSpaceScope(scope)) { + const spaceId = EntityScopeUtils.getSpaceIdFromScope(scope) + const spaceMembership = await this.spaceMemberships + .loadItems({ + where: this.spaceMembershipWhere(mode, spaceId), + }) + .then(memberships => memberships[0]) + if (!spaceMembership) { + return null + } + await spaceMembership.spaces.load() + const space = spaceMembership.spaces[0] + return spaceMembership.isHost ? space.hostProject : space.guestProject + } + } } diff --git a/packages/server/libs/shared/src/facade/file-create/model/file-create.ts b/packages/server/libs/shared/src/facade/file-create/model/file-create.ts index d8ac65f136..6122b03b05 100644 --- a/packages/server/libs/shared/src/facade/file-create/model/file-create.ts +++ b/packages/server/libs/shared/src/facade/file-create/model/file-create.ts @@ -1,4 +1,5 @@ import { DxId } from '@shared/domain/entity/domain/dxid' +import { PARENT_TYPE } from '@shared/domain/user-file/user-file.types' import { EntityScope } from '@shared/types/common' export interface FileCreate { @@ -6,4 +7,8 @@ export interface FileCreate { name: string scope: EntityScope description: string + parentType?: PARENT_TYPE + parentId?: number + parentFolderId?: number + scopedParentFolderId?: number } diff --git a/packages/server/libs/shared/src/facade/file-create/user-file-create-facade.module.ts b/packages/server/libs/shared/src/facade/file-create/user-file-create-facade.module.ts index 0bb0c80866..bf2c2d2d0a 100644 --- a/packages/server/libs/shared/src/facade/file-create/user-file-create-facade.module.ts +++ b/packages/server/libs/shared/src/facade/file-create/user-file-create-facade.module.ts @@ -1,10 +1,12 @@ import { Module } from '@nestjs/common' +import { JobModule } from '@shared/domain/job/job.module' import { PlatformModule } from '@shared/domain/platform/platform.module' +import { UserModule } from '@shared/domain/user/user.module' import { UserFileModule } from '@shared/domain/user-file/user-file.module' import { UserFileCreateFacade } from '@shared/facade/file-create/user-file-create.facade' @Module({ - imports: [PlatformModule, UserFileModule], + imports: [PlatformModule, UserFileModule, JobModule, UserModule], providers: [UserFileCreateFacade], exports: [UserFileCreateFacade], }) diff --git a/packages/server/libs/shared/src/facade/file-create/user-file-create.facade.ts b/packages/server/libs/shared/src/facade/file-create/user-file-create.facade.ts index d6a9c0b37c..1af015908f 100644 --- a/packages/server/libs/shared/src/facade/file-create/user-file-create.facade.ts +++ b/packages/server/libs/shared/src/facade/file-create/user-file-create.facade.ts @@ -1,11 +1,17 @@ import { Injectable } from '@nestjs/common' import { DxId } from '@shared/domain/entity/domain/dxid' +import { EntityUidResponseDTO } from '@shared/domain/entity/dto/entity-uid-response.dto' +import { JobService } from '@shared/domain/job/job.service' import { PlatformFileService } from '@shared/domain/platform/service/platform-file.service' +import { UserService } from '@shared/domain/user/service/user.service' import { UserContext } from '@shared/domain/user-context/model/user-context' +import { UserFileCreateDTO } from '@shared/domain/user-file/dto/user-file-create.dto' +import { Folder } from '@shared/domain/user-file/folder.entity' import { NodeService } from '@shared/domain/user-file/node.service' import { UserFile } from '@shared/domain/user-file/user-file.entity' -import { InternalError } from '@shared/errors' -import { FILE_STATE_DX, PARENT_TYPE } from '../../domain/user-file/user-file.types' +import { InternalError, InvalidStateError, PermissionError } from '@shared/errors' +import { EntityScopeUtils } from '@shared/utils/entity-scope.utils' +import { FILE_STATE_DX, FILE_STATE_PFDA, PARENT_TYPE } from '../../domain/user-file/user-file.types' import { FileCreate } from './model/file-create' import { FileCreateWithContent } from './model/file-create-with-content' @@ -15,10 +21,12 @@ export class UserFileCreateFacade { private readonly user: UserContext, private readonly platformFileService: PlatformFileService, private readonly nodeService: NodeService, + private readonly jobService: JobService, + private readonly userService: UserService, ) {} async createFileWithContent(props: FileCreateWithContent, initCloseFile = true): Promise { - const file = await this.createFile(props) + const file = await this.saveFileToDB(props) await this.platformFileService.uploadFileContent(file, props.content) if (initCloseFile) { @@ -28,7 +36,62 @@ export class UserFileCreateFacade { return file } - async createFile({ name, project, scope, description }: FileCreate): Promise { + async createFile(input: UserFileCreateDTO): Promise { + const user = await this.user.loadEntity() + + if (input.scope === 'public' && !(await user?.isSiteAdmin())) { + throw new PermissionError('Only site admin can create public files') + } + + let folder: Folder = null + if (input.folderId) { + folder = await this.nodeService.getEditableFolder(input.folderId) + if (!folder) { + throw new InvalidStateError('Parent folder not found') + } + if (folder && folder.state === FILE_STATE_PFDA.REMOVING) { + throw new InvalidStateError('Cannot add file to a folder that is being removed') + } + + // Inherit the scope of the folder if the file is being created inside a folder + input.scope = folder.scope + } + + await this.userService.checkTotalChargesLimit() + + let parentType = PARENT_TYPE.USER + let parentId = user.id + if (input.parentType === PARENT_TYPE.JOB) { + const job = await this.jobService.getEditableOne({ dxid: input.parentId }) + // file could be uploaded by CLI inside job; fall back to current_user if job is not found + if (job) { + parentType = PARENT_TYPE.JOB + parentId = job.id + } + } + + const project = await user.getDestinationProjectId(input.scope, 'editable') + if (!project) { + throw new InvalidStateError('Scope does not exist or user does not have write access to the scope') + } + + const isSpaceScope = EntityScopeUtils.isSpaceScope(input.scope) + + const file = await this.saveFileToDB({ + name: input.name, + project, + scope: input.scope, + description: input.description ?? '', + parentType, + parentId, + parentFolderId: !isSpaceScope ? folder?.id : null, + scopedParentFolderId: isSpaceScope ? folder?.id : null, + }) + return { uid: file.uid, id: file.uid } + } + + async saveFileToDB(input: FileCreate): Promise { + const { name, project, description, scope, parentType, parentId } = input const dxid = (await this.platformFileService.createFile({ name, project, description }))?.id as DxId<'file'> if (dxid == null) { @@ -36,8 +99,8 @@ export class UserFileCreateFacade { } return await this.nodeService.createFile({ - parentId: this.user.id, - parentType: PARENT_TYPE.USER, + parentId: parentId ?? this.user.id, + parentType: parentType ?? PARENT_TYPE.USER, userId: this.user.id, name, state: FILE_STATE_DX.OPEN, @@ -45,6 +108,8 @@ export class UserFileCreateFacade { project, dxid, description, + parentFolderId: input.parentFolderId, + scopedParentFolderId: input.scopedParentFolderId, }) } } diff --git a/packages/server/libs/shared/src/test/generate.ts b/packages/server/libs/shared/src/test/generate.ts index 557d6d3d5e..19de86783a 100644 --- a/packages/server/libs/shared/src/test/generate.ts +++ b/packages/server/libs/shared/src/test/generate.ts @@ -546,6 +546,7 @@ const userFile = { stiType: FILE_STI_TYPE.USERFILE, } }, + fileId: (): string => `file-${random.dxstr()}`, } const asset = { diff --git a/packages/server/libs/shared/src/test/mocks.ts b/packages/server/libs/shared/src/test/mocks.ts index dd534a601e..0df09a9c86 100644 --- a/packages/server/libs/shared/src/test/mocks.ts +++ b/packages/server/libs/shared/src/test/mocks.ts @@ -33,6 +33,7 @@ const fakes = { fileStatesFake: sinon.stub(), filesListFake: sinon.stub(), filesDescFake: sinon.stub(), + fileCreateFake: sinon.stub(), foldersListFake: sinon.stub(), folderRenameFake: sinon.stub(), folderRemoveFake: sinon.stub(), @@ -123,6 +124,7 @@ const mocksSetDefaultBehaviour = (): void => { fakes.client.filesMoveFake.callsFake(() => ({ id: generate.job.jobId() })) fakes.client.filesListFake.callsFake(() => FILES_LIST_RES_ROOT) fakes.client.filesDescFake.callsFake(() => FILES_DESC_RES) + fakes.client.fileCreateFake.callsFake(() => ({ id: generate.userFile.fileId() })) fakes.client.foldersListFake.callsFake(() => FOLDERS_LIST_RES) fakes.client.orgFindMembersFake.callsFake(() => FIND_MEMBERS_RES) @@ -203,6 +205,12 @@ const mocksSetDefaultBehaviour = (): void => { const data = stub ? stub(...(body.params ?? [])) : undefined return of({ data }) }) + fakes.client.userCloudResourcesFake.callsFake(() => ({ + computeCharges: 0, + storageCharges: 0, + dataEgressCharges: 0, + })) + ;(fakes.bull.isReadyFake as sinon.SinonStub).callsFake(() => Promise.resolve(true)) mockServiceFactory.reset() } @@ -217,6 +225,7 @@ const mocksSetup = (): void => { sandbox.replace(PlatformClient.prototype, 'fileDescribe', fakes.client.fileDescribeFake) sandbox.replace(PlatformClient.prototype, 'fileStates', fakes.client.fileStatesFake) sandbox.replace(PlatformClient.prototype, 'filesList', fakes.client.filesListFake) + sandbox.replace(PlatformClient.prototype, 'fileCreate', fakes.client.fileCreateFake) sandbox.replace(PlatformClient.prototype, 'folderCreate', fakes.client.folderCreateFake) sandbox.replace(PlatformClient.prototype, 'filesMoveToFolder', fakes.client.filesMoveFake) // sandbox.replace(PlatformClient.prototype, 'filesDescribe', fakes.client.filesDescFake) @@ -280,6 +289,7 @@ const mocksReset = (): void => { fakes.client.fileStatesFake.reset() fakes.client.filesListFake.reset() fakes.client.filesDescFake.reset() + fakes.client.fileCreateFake.reset() fakes.client.foldersListFake.reset() fakes.client.folderRenameFake.reset() fakes.client.folderRemoveFake.reset() @@ -299,6 +309,7 @@ const mocksReset = (): void => { fakes.client.userDescribeFake.reset() fakes.client.userResetMfaFake.reset() fakes.client.userUpdateEmailFake.reset() + fakes.client.userCloudResourcesFake.reset() fakes.client.fileDownloadLinkFake.reset() fakes.client.userCloudResourcesFake.reset() diff --git a/packages/server/libs/shared/src/validation/pipes/snake-to-camel.pipe.ts b/packages/server/libs/shared/src/validation/pipes/snake-to-camel.pipe.ts new file mode 100644 index 0000000000..63f9ece212 --- /dev/null +++ b/packages/server/libs/shared/src/validation/pipes/snake-to-camel.pipe.ts @@ -0,0 +1,23 @@ +import { ArgumentMetadata, Injectable, PipeTransform } from '@nestjs/common' + +function snakeToCamel(str: string): string { + return str.replace(/_([a-z])/g, (_, char: string) => char.toUpperCase()) +} + +function transformKeys(value: unknown): unknown { + if (Array.isArray(value)) return value.map(transformKeys) + if (value !== null && typeof value === 'object') { + return Object.fromEntries( + Object.entries(value as Record).map(([k, v]) => [snakeToCamel(k), transformKeys(v)]), + ) + } + return value +} + +@Injectable() +export class SnakeToCamelPipe implements PipeTransform { + transform(value: unknown, metadata: ArgumentMetadata): unknown { + if (metadata.type === 'body') return transformKeys(value) + return value + } +} diff --git a/packages/server/libs/shared/src/validation/pipes/validation.pipe.ts b/packages/server/libs/shared/src/validation/pipes/validation.pipe.ts index 6b61dba324..4c62677c6b 100644 --- a/packages/server/libs/shared/src/validation/pipes/validation.pipe.ts +++ b/packages/server/libs/shared/src/validation/pipes/validation.pipe.ts @@ -16,7 +16,7 @@ import { ValidationError } from '@shared/errors' **/ @Injectable() export class CustomValidationPipe extends ValidationPipe { - async transform(value: unknown, metadata: ArgumentMetadata) { + async transform(value: unknown, metadata: ArgumentMetadata): Promise { try { return await super.transform(value, metadata) } catch (error) { diff --git a/packages/server/libs/shared/test/unit/domain/user-file-create.facade.spec.ts b/packages/server/libs/shared/test/unit/domain/user-file-create.facade.spec.ts index 8998607bd3..7e1abc83ab 100644 --- a/packages/server/libs/shared/test/unit/domain/user-file-create.facade.spec.ts +++ b/packages/server/libs/shared/test/unit/domain/user-file-create.facade.spec.ts @@ -1,7 +1,10 @@ import { expect } from 'chai' import { stub } from 'sinon' +import { JobService } from '@shared/domain/job/job.service' import { PlatformFileService } from '@shared/domain/platform/service/platform-file.service' -import { UserFileService } from '@shared/domain/user-file/service/user-file.service' +import { UserService } from '@shared/domain/user/service/user.service' +import { UserContext } from '@shared/domain/user-context/model/user-context' +import { NodeService } from '@shared/domain/user-file/node.service' import { UserFile } from '@shared/domain/user-file/user-file.entity' import { FILE_STATE_DX, PARENT_TYPE } from '@shared/domain/user-file/user-file.types' import { STATIC_SCOPE } from '@shared/enums' @@ -9,11 +12,10 @@ import { InternalError } from '@shared/errors' import { FileCreate } from '@shared/facade/file-create/model/file-create' import { FileCreateWithContent } from '@shared/facade/file-create/model/file-create-with-content' import { UserFileCreateFacade } from '@shared/facade/file-create/user-file-create.facade' -import { UserCtx } from '@shared/types' describe('UserFileCreateFacade', () => { const USER_ID = 0 - const USER_CTX = { id: USER_ID } as UserCtx + const USER_CTX = { id: USER_ID } as UserContext const FILE_PARENT_TYPE = PARENT_TYPE.USER const FILE_SCOPE = STATIC_SCOPE.PRIVATE @@ -58,6 +60,8 @@ describe('UserFileCreateFacade', () => { project: PROJECT, dxid: DXID, description: DESCRIPTION, + parentFolderId: undefined, + scopedParentFolderId: undefined, }) .resolves(SERVICE_RESULT) @@ -69,13 +73,13 @@ describe('UserFileCreateFacade', () => { uploadFileContentStub.throws() }) - describe('#createFile', () => { + describe('#saveFileToDB', () => { it('should not catch error from platformCreateFile', async () => { const error = new Error('my error') platformCreateFileStub.reset() platformCreateFileStub.throws(error) - await expect(getInstance().createFile(FILE_CREATE)).to.be.rejectedWith(error) + await expect(getInstance().saveFileToDB(FILE_CREATE)).to.be.rejectedWith(error) }) it('should not catch error from serviceCreateFile', async () => { @@ -83,13 +87,13 @@ describe('UserFileCreateFacade', () => { serviceCreateFileStub.reset() serviceCreateFileStub.throws(error) - await expect(getInstance().createFile(FILE_CREATE)).to.be.rejectedWith(error) + await expect(getInstance().saveFileToDB(FILE_CREATE)).to.be.rejectedWith(error) }) it('should reject if platform returns a null dxid', async () => { platformCreateFileStub.withArgs({ name: NAME, project: PROJECT, description: DESCRIPTION }).returns({ id: null }) - await expect(getInstance().createFile(FILE_CREATE)).to.be.rejectedWith( + await expect(getInstance().saveFileToDB(FILE_CREATE)).to.be.rejectedWith( InternalError, 'Failed to create the file on the platform', ) @@ -98,14 +102,14 @@ describe('UserFileCreateFacade', () => { it('should reject if platform returns an empty response', async () => { platformCreateFileStub.withArgs({ name: NAME, project: PROJECT, description: DESCRIPTION }).returns(undefined) - await expect(getInstance().createFile(FILE_CREATE)).to.be.rejectedWith( + await expect(getInstance().saveFileToDB(FILE_CREATE)).to.be.rejectedWith( InternalError, 'Failed to create the file on the platform', ) }) it('should return correctly created file', async () => { - const res = await getInstance().createFile(FILE_CREATE) + const res = await getInstance().saveFileToDB(FILE_CREATE) expect(res).to.eq(SERVICE_RESULT) }) @@ -150,11 +154,13 @@ describe('UserFileCreateFacade', () => { createFile: platformCreateFileStub, uploadFileContent: uploadFileContentStub, } as unknown as PlatformFileService - const userFileService = { + const nodeService = { createFile: serviceCreateFileStub, closeFile: serviceCloseFileStub, - } as unknown as UserFileService + } as unknown as NodeService + const jobService = {} as unknown as JobService + const userService = {} as unknown as UserService - return new UserFileCreateFacade(USER_CTX, platformFileService, userFileService) + return new UserFileCreateFacade(USER_CTX, platformFileService, nodeService, jobService, userService) } }) diff --git a/packages/server/libs/shared/test/unit/domain/user-file.service.spec.ts b/packages/server/libs/shared/test/unit/domain/user-file.service.spec.ts index f5e6e6e610..0810f5998d 100644 --- a/packages/server/libs/shared/test/unit/domain/user-file.service.spec.ts +++ b/packages/server/libs/shared/test/unit/domain/user-file.service.spec.ts @@ -70,6 +70,7 @@ describe('UserFileService', () => { const fileRepoFindAccessibleOneStub = stub() const fileRepoFindStub = stub() const fileRepoCountStub = stub() + const fileRepoPersistAndFlushStub = stub() const fileLoadIfAccessibleByUserStub = stub() const folderRepoFindOneStub = stub() const nodeRepoFindOneOrFailStub = stub() @@ -174,6 +175,7 @@ describe('UserFileService', () => { find: fileRepoFindStub, count: fileRepoCountStub, findEditable: findEditableStub, + persistAndFlush: fileRepoPersistAndFlushStub, } as unknown as UserFileRepository const licensedItemRepo = { getLicenseItemsForNode: getLicenseItemsForNodeStub, @@ -244,6 +246,9 @@ describe('UserFileService', () => { fileRepoFindStub.reset() fileRepoFindStub.throws() + fileRepoPersistAndFlushStub.reset() + fileRepoPersistAndFlushStub.throws() + folderRepoFindOneStub.reset() folderRepoFindOneStub.throws() @@ -377,6 +382,8 @@ describe('UserFileService', () => { }) it('should create the correct UserFile', async () => { + fileRepoPersistAndFlushStub.resolves() + const res = await getInstance().createFile(FILE_CREATE) expect(res.dxid).to.eq(DXID) From 57df926a580b379d3b5eeb20be8d3f855560e4d9 Mon Sep 17 00:00:00 2001 From: Pavel Kubal Date: Thu, 4 Jun 2026 16:11:24 +0200 Subject: [PATCH 09/16] PFDA-6955 Add naming conventions to backend coding guide (#3986) --- docs/backend/backend-coding-guide.md | 23 ++++++++++++++ .../src/admin/admin-memberships.controller.ts | 6 ++-- .../apps/api/src/apps/app.api.module.ts | 4 +-- .../{app.controller.ts => apps.controller.ts} | 2 +- .../src/challenges/challenge.api.module.ts | 4 +-- ...controller.ts => challenges.controller.ts} | 2 +- .../apps/api/src/cli/cli-assets.controller.ts | 10 +++---- ...oller.ts => cli-db-clusters.controller.ts} | 0 .../apps/api/src/cli/cli-jobs.controller.ts | 10 +++---- .../apps/api/src/cli/cli-spaces.controller.ts | 24 +++++++-------- .../server/apps/api/src/cli/cli.api.module.ts | 2 +- ...ontroller.ts => db-clusters.controller.ts} | 8 ++--- .../src/dbclusters/dbcluster.api.module.ts | 8 ++--- .../apps/api/src/emails/email.api.module.ts | 4 +-- ...ail.controller.ts => emails.controller.ts} | 2 +- .../src/facade/cli/cli-api-facade.module.ts | 30 +++++++++---------- ...ts.facade.ts => cli-assets-list.facade.ts} | 8 ++--- ...cade.ts => cli-discussions-list.facade.ts} | 2 +- ...jobs.facade.ts => cli-jobs-list.facade.ts} | 8 ++--- ...s.facade.ts => cli-members-list.facade.ts} | 2 +- ...es.facade.ts => cli-spaces-list.facade.ts} | 10 +++---- ...e.ts => db-clusters-list-facade.module.ts} | 8 ++--- ...t.facade.ts => db-clusters-list.facade.ts} | 2 +- .../space-membership-api-facade.module.ts | 6 ++-- ...s => space-memberships-list-api.facade.ts} | 2 +- .../apps/api/src/folders/folder.api.module.ts | 4 +-- ...er.controller.ts => folders.controller.ts} | 2 +- .../apps/api/src/jobs/job.api.module.ts | 4 +-- .../{job.controller.ts => jobs.controller.ts} | 2 +- .../api/src/licenses/license.api.module.ts | 4 +-- ...e.controller.ts => licenses.controller.ts} | 2 +- .../apps/api/src/news/news.api.module.ts | 4 +-- .../apps/api/src/news/news.controller.ts | 18 +++++------ .../space-memberships.controller.ts | 6 ++-- .../apps/api/src/validation/pipes/uid.pipe.ts | 2 +- .../api/src/workflows/workflow.api.module.ts | 4 +-- ....controller.ts => workflows.controller.ts} | 2 +- .../api/test/integration/news/news.spec.ts | 4 +-- ...spec.ts => cli-assets-list.facade.spec.ts} | 8 ++--- .../unit/facade/cli-dto-validation.spec.ts | 8 ++--- ...e.spec.ts => cli-jobs-list.facade.spec.ts} | 8 ++--- ...spec.ts => cli-spaces-list.facade.spec.ts} | 10 +++---- ...t-assets.dto.ts => cli-assets-list.dto.ts} | 4 +-- ...-list-jobs.dto.ts => cli-jobs-list.dto.ts} | 12 ++++---- ...ry.dto.ts => cli-spaces-list-query.dto.ts} | 2 +- ...t-spaces.dto.ts => cli-spaces-list.dto.ts} | 4 +-- .../src/domain/news-item/news-item.entity.ts | 4 +-- .../src/domain/news-item/news-item.module.ts | 8 ++--- .../domain/news-item/news-item.repository.ts | 2 +- ...w-item.service.ts => news-item.service.ts} | 16 +++++----- .../admin-membership-facade.module.ts | 6 ++-- ...de.ts => admin-memberships-list.facade.ts} | 2 +- ...pec.ts => db-clusters-list.facade.spec.ts} | 8 ++--- ... => admin-memberships-list.facade.spec.ts} | 8 ++--- 54 files changed, 189 insertions(+), 166 deletions(-) rename packages/server/apps/api/src/apps/{app.controller.ts => apps.controller.ts} (98%) rename packages/server/apps/api/src/challenges/{challenge.controller.ts => challenges.controller.ts} (99%) rename packages/server/apps/api/src/cli/{cli-dbclusters.controller.ts => cli-db-clusters.controller.ts} (100%) rename packages/server/apps/api/src/dbclusters/{dbcluster.controller.ts => db-clusters.controller.ts} (94%) rename packages/server/apps/api/src/emails/{email.controller.ts => emails.controller.ts} (95%) rename packages/server/apps/api/src/facade/cli/{cli-list-assets.facade.ts => cli-assets-list.facade.ts} (86%) rename packages/server/apps/api/src/facade/cli/{cli-list-discussions.facade.ts => cli-discussions-list.facade.ts} (95%) rename packages/server/apps/api/src/facade/cli/{cli-list-jobs.facade.ts => cli-jobs-list.facade.ts} (86%) rename packages/server/apps/api/src/facade/cli/{cli-list-members.facade.ts => cli-members-list.facade.ts} (93%) rename packages/server/apps/api/src/facade/cli/{cli-list-spaces.facade.ts => cli-spaces-list.facade.ts} (75%) rename packages/server/apps/api/src/facade/db-cluster/list-facade/{db-cluster-list-facade.module.ts => db-clusters-list-facade.module.ts} (71%) rename packages/server/apps/api/src/facade/db-cluster/list-facade/{db-cluster-list.facade.ts => db-clusters-list.facade.ts} (99%) rename packages/server/apps/api/src/facade/space-membership/{space-membership-list-api.facade.ts => space-memberships-list-api.facade.ts} (93%) rename packages/server/apps/api/src/folders/{folder.controller.ts => folders.controller.ts} (94%) rename packages/server/apps/api/src/jobs/{job.controller.ts => jobs.controller.ts} (99%) rename packages/server/apps/api/src/licenses/{license.controller.ts => licenses.controller.ts} (99%) rename packages/server/apps/api/src/workflows/{workflow.controller.ts => workflows.controller.ts} (95%) rename packages/server/apps/api/test/unit/facade/{cli-list-assets.facade.spec.ts => cli-assets-list.facade.spec.ts} (92%) rename packages/server/apps/api/test/unit/facade/{cli-list-jobs.facade.spec.ts => cli-jobs-list.facade.spec.ts} (92%) rename packages/server/apps/api/test/unit/facade/{cli-list-spaces.facade.spec.ts => cli-spaces-list.facade.spec.ts} (92%) rename packages/server/libs/shared/src/domain/cli/dto/{cli-list-assets.dto.ts => cli-assets-list.dto.ts} (91%) rename packages/server/libs/shared/src/domain/cli/dto/{cli-list-jobs.dto.ts => cli-jobs-list.dto.ts} (91%) rename packages/server/libs/shared/src/domain/cli/dto/{cli-list-spaces-query.dto.ts => cli-spaces-list-query.dto.ts} (94%) rename packages/server/libs/shared/src/domain/cli/dto/{cli-list-spaces.dto.ts => cli-spaces-list.dto.ts} (95%) rename packages/server/libs/shared/src/domain/news-item/service/{new-item.service.ts => news-item.service.ts} (85%) rename packages/server/libs/shared/src/facade/admin-membership/{list-admin-membership.facade.ts => admin-memberships-list.facade.ts} (94%) rename packages/server/libs/shared/test/unit/domain/{db-cluster-list.facade.spec.ts => db-clusters-list.facade.spec.ts} (96%) rename packages/server/libs/shared/test/unit/facade/{list-admin-membership.facade.spec.ts => admin-memberships-list.facade.spec.ts} (90%) diff --git a/docs/backend/backend-coding-guide.md b/docs/backend/backend-coding-guide.md index dc5539fdb1..d8c7f2e987 100644 --- a/docs/backend/backend-coding-guide.md +++ b/docs/backend/backend-coding-guide.md @@ -367,6 +367,29 @@ Examples: - `entity.type.ts` exports `EntityType` - `entity-instance.ts` exports `EntityInstance` +### File Naming Convention + +General rule for files that act on a domain (facades, DTOs, services, etc.): + +> **`-..ts`** — domain name first (preferably **plural**), then the specifics (action, role, etc.), then the suffix. + +The exported class/symbol must be the PascalCase form of the file name without the suffix (e.g. `cli-assets-list.facade.ts` exports `CliAssetsListFacade`). + +| Component | Pattern | Examples | +|-----------|---------|----------| +| **Facade** | `-[-].facade.ts` | `user-files-list.facade.ts`, `db-clusters-list.facade.ts`, `space-memberships-update-api.facade.ts`, `cli-assets-list.facade.ts` (CLI prefix counts as the qualifier; the domain stays plural and `-list` stays last) | +| **Controller** | `.controller.ts` (use a qualifier suffix only when one controller per domain is not enough, e.g. CLI vs. web) | `space-memberships.controller.ts`, `cli-jobs.controller.ts` | +| **Service** | `.service.ts` for the main domain service; `-.service.ts` for additional internal services | `space-membership.service.ts`, `job-synchronization.service.ts` | +| **Repository** | `.repository.ts` (one repository per entity) | `user.repository.ts`, `setting.repository.ts` | +| **Entity** | `.entity.ts` | `space-membership.entity.ts` | +| **Module** | `.module.ts` for domain modules; `.module.ts` for facade modules (matches the facade file) | `space-membership.module.ts`, `cli-assets-list-facade.module.ts` | +| **DTO** | `-.dto.ts` (action describes the operation/shape, not pluralized) | `app-get.dto.ts`, `update-space-membership.dto.ts`, `pending-user.dto.ts` | +| **Enum** | `.enum.ts` | `space-membership.enum.ts` | + +**Rationale for plural on facades/controllers:** facades and controllers operate on collections/resources, so the plural domain name reads naturally with the action suffix (`db-clusters-list`, `user-files-bulk-download`). Services, repositories, entities, and DTOs describe a single domain concept, so they remain singular. + +**Action verb position:** the action goes **after** the domain (`admin-memberships-list.facade.ts`, not `list-admin-memberships.facade.ts`). This keeps related files sorted together alphabetically by domain. + ## Types - **interface** - default choice diff --git a/packages/server/apps/api/src/admin/admin-memberships.controller.ts b/packages/server/apps/api/src/admin/admin-memberships.controller.ts index 89fefb442d..7df7c854aa 100644 --- a/packages/server/apps/api/src/admin/admin-memberships.controller.ts +++ b/packages/server/apps/api/src/admin/admin-memberships.controller.ts @@ -4,7 +4,7 @@ import { CreateAdminMembershipDTO } from '@shared/domain/admin-membership/dto/cr import { UserWithAdminRolesDTO } from '@shared/domain/admin-membership/dto/user-with-admin-roles.dto' import { PaginatedResult } from '@shared/domain/entity/domain/paginated.result' import { CreateAdminMembershipFacade } from '@shared/facade/admin-membership/create-admin-membership.facade' -import { ListAdminMembershipFacade } from '@shared/facade/admin-membership/list-admin-membership.facade' +import { AdminMembershipsListFacade } from '@shared/facade/admin-membership/admin-memberships-list.facade' import { RemoveAdminMembershipFacade } from '@shared/facade/admin-membership/remove-admin-membership.facade' import { UserContextGuard } from '../user-context/guard/user-context.guard' import { SiteAdminGuard } from './guards/site-admin.guard' @@ -13,7 +13,7 @@ import { SiteAdminGuard } from './guards/site-admin.guard' @Controller('/admin/memberships') export class AdminMembershipsController { constructor( - private readonly listAdminMembershipFacade: ListAdminMembershipFacade, + private readonly adminMembershipsListFacade: AdminMembershipsListFacade, private readonly createAdminMembershipFacade: CreateAdminMembershipFacade, private readonly removeAdminMembershipFacade: RemoveAdminMembershipFacade, ) {} @@ -22,7 +22,7 @@ export class AdminMembershipsController { async getUsersWithRoles( @Query() query: AdminMembershipPaginationDTO, ): Promise> { - return this.listAdminMembershipFacade.listUsersWithRoles(query) + return this.adminMembershipsListFacade.listUsersWithRoles(query) } @HttpCode(201) diff --git a/packages/server/apps/api/src/apps/app.api.module.ts b/packages/server/apps/api/src/apps/app.api.module.ts index 7eb2babf15..97743817fc 100644 --- a/packages/server/apps/api/src/apps/app.api.module.ts +++ b/packages/server/apps/api/src/apps/app.api.module.ts @@ -2,10 +2,10 @@ import { Module } from '@nestjs/common' import { AppModule } from '@shared/domain/app/app.module' import { AppFacadeModule } from '@shared/facade/app/app-facade.module' import { LicenseApiFacadeModule } from '../facade/license/license-api-facade.module' -import { AppController } from './app.controller' +import { AppsController } from './apps.controller' @Module({ imports: [AppModule, LicenseApiFacadeModule, AppFacadeModule], - controllers: [AppController], + controllers: [AppsController], }) export class AppApiModule {} diff --git a/packages/server/apps/api/src/apps/app.controller.ts b/packages/server/apps/api/src/apps/apps.controller.ts similarity index 98% rename from packages/server/apps/api/src/apps/app.controller.ts rename to packages/server/apps/api/src/apps/apps.controller.ts index f279b957e8..a09b5d4810 100644 --- a/packages/server/apps/api/src/apps/app.controller.ts +++ b/packages/server/apps/api/src/apps/apps.controller.ts @@ -11,7 +11,7 @@ import { AppUidParamDto } from './model/app-uid-param.dto' @UseGuards(UserContextGuard) @Controller('/apps') -export class AppController { +export class AppsController { constructor( private readonly licensesForAppFacade: LicensesForAppFacade, private readonly appRunFacade: AppRunFacade, diff --git a/packages/server/apps/api/src/challenges/challenge.api.module.ts b/packages/server/apps/api/src/challenges/challenge.api.module.ts index 1d9d8ab3c3..2233c0e923 100644 --- a/packages/server/apps/api/src/challenges/challenge.api.module.ts +++ b/packages/server/apps/api/src/challenges/challenge.api.module.ts @@ -1,10 +1,10 @@ import { Module } from '@nestjs/common' import { ChallengeModule } from '@shared/domain/challenge/challenge.module' import { ChallengeApiFacadeModule } from '../facade/challenge/challenge-api-facade.module' -import { ChallengeController } from './challenge.controller' +import { ChallengesController } from './challenges.controller' @Module({ imports: [ChallengeModule, ChallengeApiFacadeModule], - controllers: [ChallengeController], + controllers: [ChallengesController], }) export class ChallengeApiModule {} diff --git a/packages/server/apps/api/src/challenges/challenge.controller.ts b/packages/server/apps/api/src/challenges/challenges.controller.ts similarity index 99% rename from packages/server/apps/api/src/challenges/challenge.controller.ts rename to packages/server/apps/api/src/challenges/challenges.controller.ts index 332c434540..62da7aeae6 100644 --- a/packages/server/apps/api/src/challenges/challenge.controller.ts +++ b/packages/server/apps/api/src/challenges/challenges.controller.ts @@ -15,7 +15,7 @@ import { ChallengeFacade } from '../facade/challenge/challenge.facade' import { UserContextGuard } from '../user-context/guard/user-context.guard' @Controller('/challenges') -export class ChallengeController { +export class ChallengesController { constructor( private readonly challengeService: ChallengeService, private readonly challengeFacade: ChallengeFacade, diff --git a/packages/server/apps/api/src/cli/cli-assets.controller.ts b/packages/server/apps/api/src/cli/cli-assets.controller.ts index 4988e94d76..ee3eb803a0 100644 --- a/packages/server/apps/api/src/cli/cli-assets.controller.ts +++ b/packages/server/apps/api/src/cli/cli-assets.controller.ts @@ -1,16 +1,16 @@ import { Controller, Get, Query, UseGuards } from '@nestjs/common' -import { CliListAssetDTO } from '@shared/domain/cli/dto/cli-list-assets.dto' +import { CliAssetListDTO } from '@shared/domain/cli/dto/cli-assets-list.dto' import { CliScopeQueryDTO } from '@shared/domain/cli/dto/cli-scope-query.dto' -import { CliListAssetsFacade } from '../facade/cli/cli-list-assets.facade' +import { CliAssetsListFacade } from '../facade/cli/cli-assets-list.facade' import { UserContextGuard } from '../user-context/guard/user-context.guard' @Controller('/cli/assets') export class CliAssetsController { - constructor(private readonly cliListAssetsFacade: CliListAssetsFacade) {} + constructor(private readonly cliAssetsListFacade: CliAssetsListFacade) {} @UseGuards(UserContextGuard) @Get() - async listAssets(@Query() query: CliScopeQueryDTO): Promise { - return this.cliListAssetsFacade.listAssets(query.scope) + async listAssets(@Query() query: CliScopeQueryDTO): Promise { + return this.cliAssetsListFacade.listAssets(query.scope) } } diff --git a/packages/server/apps/api/src/cli/cli-dbclusters.controller.ts b/packages/server/apps/api/src/cli/cli-db-clusters.controller.ts similarity index 100% rename from packages/server/apps/api/src/cli/cli-dbclusters.controller.ts rename to packages/server/apps/api/src/cli/cli-db-clusters.controller.ts diff --git a/packages/server/apps/api/src/cli/cli-jobs.controller.ts b/packages/server/apps/api/src/cli/cli-jobs.controller.ts index 925ab50e2b..9cba3da3b8 100644 --- a/packages/server/apps/api/src/cli/cli-jobs.controller.ts +++ b/packages/server/apps/api/src/cli/cli-jobs.controller.ts @@ -1,11 +1,11 @@ import { Controller, Get, Param, Patch, Query, UseGuards } from '@nestjs/common' -import { CliListJobDTO } from '@shared/domain/cli/dto/cli-list-jobs.dto' +import { CliJobListDTO } from '@shared/domain/cli/dto/cli-jobs-list.dto' import { CliScopeQueryDTO } from '@shared/domain/cli/dto/cli-scope-query.dto' import { DxId } from '@shared/domain/entity/domain/dxid' import { Uid } from '@shared/domain/entity/domain/uid' import { EntityScope } from '@shared/types/common' import { CliJobScopeFacade } from '../facade/cli/cli-job-scope.facade' -import { CliListJobsFacade } from '../facade/cli/cli-list-jobs.facade' +import { CliJobsListFacade } from '../facade/cli/cli-jobs-list.facade' import { CliTerminateJobFacade } from '../facade/cli/cli-terminate-job.facade' import { UserContextGuard } from '../user-context/guard/user-context.guard' import { UidValidationPipe } from '../validation/pipes/uid.pipe' @@ -16,7 +16,7 @@ export class CliJobsController { constructor( private readonly cliJobScopeFacade: CliJobScopeFacade, private readonly cliTerminateJobFacade: CliTerminateJobFacade, - private readonly cliListJobsFacade: CliListJobsFacade, + private readonly cliJobsListFacade: CliJobsListFacade, ) {} @UseGuards(UserContextGuard) @@ -29,8 +29,8 @@ export class CliJobsController { @UseGuards(UserContextGuard) @Get() - async listJobs(@Query() query: CliScopeQueryDTO): Promise { - return this.cliListJobsFacade.listJobs(query.scope) + async listJobs(@Query() query: CliScopeQueryDTO): Promise { + return this.cliJobsListFacade.listJobs(query.scope) } @UseGuards(UserContextGuard) diff --git a/packages/server/apps/api/src/cli/cli-spaces.controller.ts b/packages/server/apps/api/src/cli/cli-spaces.controller.ts index 129b3916dc..2e3a0f0431 100644 --- a/packages/server/apps/api/src/cli/cli-spaces.controller.ts +++ b/packages/server/apps/api/src/cli/cli-spaces.controller.ts @@ -1,40 +1,40 @@ import { Body, Controller, Get, HttpCode, Param, ParseIntPipe, Post, Query, UseGuards } from '@nestjs/common' import { CliCreateDiscussionDTO } from '@shared/domain/cli/dto/cli-create-discussion.dto' import { CliDiscussionDTO } from '@shared/domain/cli/dto/cli-discussion.dto' -import { CliListSpaceDTO } from '@shared/domain/cli/dto/cli-list-spaces.dto' -import { CliListSpacesQueryDTO } from '@shared/domain/cli/dto/cli-list-spaces-query.dto' +import { CliSpaceListDTO } from '@shared/domain/cli/dto/cli-spaces-list.dto' +import { CliSpacesListQueryDTO } from '@shared/domain/cli/dto/cli-spaces-list-query.dto' import { CliSpaceMemberDTO } from '@shared/domain/cli/dto/cli-space-member.dto' import { CliCreateDiscussionFacade } from '../facade/cli/cli-create-discussion.facade' -import { CliListDiscussionsFacade } from '../facade/cli/cli-list-discussions.facade' -import { CliListMembersFacade } from '../facade/cli/cli-list-members.facade' -import { CliListSpacesFacade } from '../facade/cli/cli-list-spaces.facade' +import { CliDiscussionsListFacade } from '../facade/cli/cli-discussions-list.facade' +import { CliMembersListFacade } from '../facade/cli/cli-members-list.facade' +import { CliSpacesListFacade } from '../facade/cli/cli-spaces-list.facade' import { UserContextGuard } from '../user-context/guard/user-context.guard' @Controller('/cli/spaces') export class CliSpacesController { constructor( - private readonly cliListSpacesFacade: CliListSpacesFacade, - private readonly cliListMembersFacade: CliListMembersFacade, - private readonly cliListDiscussionsFacade: CliListDiscussionsFacade, + private readonly cliSpacesListFacade: CliSpacesListFacade, + private readonly cliMembersListFacade: CliMembersListFacade, + private readonly cliDiscussionsListFacade: CliDiscussionsListFacade, private readonly cliCreateDiscussionFacade: CliCreateDiscussionFacade, ) {} @UseGuards(UserContextGuard) @Get() - async listSpaces(@Query() query: CliListSpacesQueryDTO): Promise { - return this.cliListSpacesFacade.listSpaces(query) + async listSpaces(@Query() query: CliSpacesListQueryDTO): Promise { + return this.cliSpacesListFacade.listSpaces(query) } @UseGuards(UserContextGuard) @Get('/:id/members') async listMembers(@Param('id', ParseIntPipe) spaceId: number): Promise { - return this.cliListMembersFacade.listSpaceMembers(spaceId) + return this.cliMembersListFacade.listSpaceMembers(spaceId) } @UseGuards(UserContextGuard) @Get('/:id/discussions') async listDiscussions(@Param('id', ParseIntPipe) spaceId: number): Promise { - return this.cliListDiscussionsFacade.listDiscussions(spaceId) + return this.cliDiscussionsListFacade.listDiscussions(spaceId) } @UseGuards(UserContextGuard) diff --git a/packages/server/apps/api/src/cli/cli.api.module.ts b/packages/server/apps/api/src/cli/cli.api.module.ts index dcb746f740..7f64363cd3 100644 --- a/packages/server/apps/api/src/cli/cli.api.module.ts +++ b/packages/server/apps/api/src/cli/cli.api.module.ts @@ -7,7 +7,7 @@ import { DiscussionApiFacadeModule } from '../facade/discussion/discussion-api-f import { UserFileApiFacadeModule } from '../facade/user-file/user-file-api-facade.module' import { CliController } from './cli.controller' import { CliAssetsController } from './cli-assets.controller' -import { CliDbClustersController } from './cli-dbclusters.controller' +import { CliDbClustersController } from './cli-db-clusters.controller' import { CliDescribeController } from './cli-describe.controller' import { CliDiscussionsController } from './cli-discussions.controller' import { CliFilesController } from './cli-files.controller' diff --git a/packages/server/apps/api/src/dbclusters/dbcluster.controller.ts b/packages/server/apps/api/src/dbclusters/db-clusters.controller.ts similarity index 94% rename from packages/server/apps/api/src/dbclusters/dbcluster.controller.ts rename to packages/server/apps/api/src/dbclusters/db-clusters.controller.ts index 0d966b8495..e702e878a7 100644 --- a/packages/server/apps/api/src/dbclusters/dbcluster.controller.ts +++ b/packages/server/apps/api/src/dbclusters/db-clusters.controller.ts @@ -12,7 +12,7 @@ import { Uid } from '@shared/domain/entity/domain/uid' import { DbClusterActionFacade } from '../facade/db-cluster/action-facade/db-cluster-action.facade' import { DbClusterCreateFacade } from '../facade/db-cluster/create-facade/db-cluster-create.facade' import { DbClusterGetFacade } from '../facade/db-cluster/get-facade/db-cluster-get.facade' -import { DbClusterListFacade } from '../facade/db-cluster/list-facade/db-cluster-list.facade' +import { DbClustersListFacade } from '../facade/db-cluster/list-facade/db-clusters-list.facade' import { DbClusterSynchronizeFacade } from '../facade/db-cluster/synchronize-facade/db-cluster-synchronize.facade' import { DbClusterUpdateFacade } from '../facade/db-cluster/update-facade/db-cluster-update.facade' import { InternalRouteGuard } from '../internal/guard/internal.guard' @@ -22,21 +22,21 @@ import { DbClusterUidParamDto } from './model/dbcluster-uid-param.dto' @ApiTags('dbclusters') @UseGuards(UserContextGuard) @Controller('/dbclusters') -export class DbClusterController { +export class DbClustersController { constructor( private readonly dbClusterSynchronizeFacade: DbClusterSynchronizeFacade, private readonly dbClusterCreateFacade: DbClusterCreateFacade, private readonly dbClusterUpdateFacade: DbClusterUpdateFacade, private readonly dbClusterActionFacade: DbClusterActionFacade, private readonly dbClusterGetFacade: DbClusterGetFacade, - private readonly dbClusterListFacade: DbClusterListFacade, + private readonly dbClustersListFacade: DbClustersListFacade, ) {} @ApiOperation({ summary: 'List db clusters' }) @ApiOkResponse({ description: 'Paginated list of db clusters' }) @Get() async list(@Query() query: DbClusterPaginationDTO): Promise> { - return await this.dbClusterListFacade.listDbClusters(query) + return await this.dbClustersListFacade.listDbClusters(query) } @ApiOperation({ summary: 'Get db cluster by uid' }) diff --git a/packages/server/apps/api/src/dbclusters/dbcluster.api.module.ts b/packages/server/apps/api/src/dbclusters/dbcluster.api.module.ts index 314e784f65..0ea45d72d0 100644 --- a/packages/server/apps/api/src/dbclusters/dbcluster.api.module.ts +++ b/packages/server/apps/api/src/dbclusters/dbcluster.api.module.ts @@ -2,10 +2,10 @@ import { Module } from '@nestjs/common' import { DbClusterActionFacadeModule } from '../facade/db-cluster/action-facade/db-cluster-action-facade.module' import { DbClusterCreateFacadeModule } from '../facade/db-cluster/create-facade/db-cluster-create-facade.module' import { DbClusterGetFacadeModule } from '../facade/db-cluster/get-facade/db-cluster-get-facade.module' -import { DbClusterListFacadeModule } from '../facade/db-cluster/list-facade/db-cluster-list-facade.module' +import { DbClustersListFacadeModule } from '../facade/db-cluster/list-facade/db-clusters-list-facade.module' import { DbClusterSynchronizeFacadeModule } from '../facade/db-cluster/synchronize-facade/db-cluster-synchronize-facade.module' import { DbClusterUpdateFacadeModule } from '../facade/db-cluster/update-facade/db-cluster-update-facade.module' -import { DbClusterController } from './dbcluster.controller' +import { DbClustersController } from './db-clusters.controller' @Module({ imports: [ @@ -14,8 +14,8 @@ import { DbClusterController } from './dbcluster.controller' DbClusterUpdateFacadeModule, DbClusterActionFacadeModule, DbClusterGetFacadeModule, - DbClusterListFacadeModule, + DbClustersListFacadeModule, ], - controllers: [DbClusterController], + controllers: [DbClustersController], }) export class DbClusterApiModule {} diff --git a/packages/server/apps/api/src/emails/email.api.module.ts b/packages/server/apps/api/src/emails/email.api.module.ts index 478124b34f..806b1576da 100644 --- a/packages/server/apps/api/src/emails/email.api.module.ts +++ b/packages/server/apps/api/src/emails/email.api.module.ts @@ -1,9 +1,9 @@ import { Module } from '@nestjs/common' import { EmailModule } from '@shared/domain/email/email.module' -import { EmailController } from './email.controller' +import { EmailsController } from './emails.controller' @Module({ imports: [EmailModule], - controllers: [EmailController], + controllers: [EmailsController], }) export class EmailApiModule {} diff --git a/packages/server/apps/api/src/emails/email.controller.ts b/packages/server/apps/api/src/emails/emails.controller.ts similarity index 95% rename from packages/server/apps/api/src/emails/email.controller.ts rename to packages/server/apps/api/src/emails/emails.controller.ts index 18a3cc6fc4..b22e5d0d6f 100644 --- a/packages/server/apps/api/src/emails/email.controller.ts +++ b/packages/server/apps/api/src/emails/emails.controller.ts @@ -6,7 +6,7 @@ import { InternalRouteGuard } from '../internal/guard/internal.guard' @UseGuards(InternalRouteGuard) @Controller('/emails') -export class EmailController { +export class EmailsController { constructor(private readonly emailService: EmailService) {} @HttpCode(200) diff --git a/packages/server/apps/api/src/facade/cli/cli-api-facade.module.ts b/packages/server/apps/api/src/facade/cli/cli-api-facade.module.ts index 41ea36ebc4..999cdd7562 100644 --- a/packages/server/apps/api/src/facade/cli/cli-api-facade.module.ts +++ b/packages/server/apps/api/src/facade/cli/cli-api-facade.module.ts @@ -16,11 +16,11 @@ import { UserFileApiFacadeModule } from '../user-file/user-file-api-facade.modul import { CliDescribeEntityFacade } from './cli-describe-entity.facade' import { CliFindNodesFacade } from './cli-find-nodes.facade' import { CliJobScopeFacade } from './cli-job-scope.facade' -import { CliListAssetsFacade } from './cli-list-assets.facade' -import { CliListDiscussionsFacade } from './cli-list-discussions.facade' -import { CliListJobsFacade } from './cli-list-jobs.facade' -import { CliListMembersFacade } from './cli-list-members.facade' -import { CliListSpacesFacade } from './cli-list-spaces.facade' +import { CliAssetsListFacade } from './cli-assets-list.facade' +import { CliDiscussionsListFacade } from './cli-discussions-list.facade' +import { CliJobsListFacade } from './cli-jobs-list.facade' +import { CliMembersListFacade } from './cli-members-list.facade' +import { CliSpacesListFacade } from './cli-spaces-list.facade' import { CliNodeRemoveFacade } from './cli-node-remove.facade' import { CliRunAppFacade } from './cli-run-app.facade' import { CliTerminateJobFacade } from './cli-terminate-job.facade' @@ -46,27 +46,27 @@ import { CliTerminateJobFacade } from './cli-terminate-job.facade' CliDescribeEntityFacade, CliJobScopeFacade, CliNodeRemoveFacade, - CliListMembersFacade, - CliListDiscussionsFacade, + CliMembersListFacade, + CliDiscussionsListFacade, CliFindNodesFacade, CliRunAppFacade, CliTerminateJobFacade, - CliListSpacesFacade, - CliListAssetsFacade, - CliListJobsFacade, + CliSpacesListFacade, + CliAssetsListFacade, + CliJobsListFacade, ], exports: [ CliDescribeEntityFacade, CliJobScopeFacade, CliNodeRemoveFacade, - CliListMembersFacade, - CliListDiscussionsFacade, + CliMembersListFacade, + CliDiscussionsListFacade, CliFindNodesFacade, CliRunAppFacade, CliTerminateJobFacade, - CliListSpacesFacade, - CliListAssetsFacade, - CliListJobsFacade, + CliSpacesListFacade, + CliAssetsListFacade, + CliJobsListFacade, ], }) export class CliApiFacadeModule {} diff --git a/packages/server/apps/api/src/facade/cli/cli-list-assets.facade.ts b/packages/server/apps/api/src/facade/cli/cli-assets-list.facade.ts similarity index 86% rename from packages/server/apps/api/src/facade/cli/cli-list-assets.facade.ts rename to packages/server/apps/api/src/facade/cli/cli-assets-list.facade.ts index 439af5b868..b314cce505 100644 --- a/packages/server/apps/api/src/facade/cli/cli-list-assets.facade.ts +++ b/packages/server/apps/api/src/facade/cli/cli-assets-list.facade.ts @@ -1,6 +1,6 @@ import { FilterQuery } from '@mikro-orm/mysql' import { Injectable } from '@nestjs/common' -import { CliListAssetDTO } from '@shared/domain/cli/dto/cli-list-assets.dto' +import { CliAssetListDTO } from '@shared/domain/cli/dto/cli-assets-list.dto' import { SpaceService } from '@shared/domain/space/service/space.service' import { UserContext } from '@shared/domain/user-context/model/user-context' import { Asset } from '@shared/domain/user-file/asset.entity' @@ -11,14 +11,14 @@ import { EntityScope } from '@shared/types/common' import { EntityScopeUtils } from '@shared/utils/entity-scope.utils' @Injectable() -export class CliListAssetsFacade { +export class CliAssetsListFacade { constructor( private readonly nodeService: NodeService, private readonly user: UserContext, private readonly spaceService: SpaceService, ) {} - async listAssets(scope: EntityScope): Promise { + async listAssets(scope: EntityScope): Promise { let where: FilterQuery if (EntityScopeUtils.isSpaceScope(scope)) { @@ -40,6 +40,6 @@ export class CliListAssetsFacade { orderBy: { createdAt: 'DESC' } as const, }) - return assets.map(asset => CliListAssetDTO.fromEntity(asset)) + return assets.map(asset => CliAssetListDTO.fromEntity(asset)) } } diff --git a/packages/server/apps/api/src/facade/cli/cli-list-discussions.facade.ts b/packages/server/apps/api/src/facade/cli/cli-discussions-list.facade.ts similarity index 95% rename from packages/server/apps/api/src/facade/cli/cli-list-discussions.facade.ts rename to packages/server/apps/api/src/facade/cli/cli-discussions-list.facade.ts index 105bf43de6..1223817e19 100644 --- a/packages/server/apps/api/src/facade/cli/cli-list-discussions.facade.ts +++ b/packages/server/apps/api/src/facade/cli/cli-discussions-list.facade.ts @@ -5,7 +5,7 @@ import { DiscussionService } from '@shared/domain/discussion/services/discussion import { EntityScopeUtils } from '@shared/utils/entity-scope.utils' @Injectable() -export class CliListDiscussionsFacade { +export class CliDiscussionsListFacade { constructor(private readonly discussionService: DiscussionService) {} async listDiscussions(spaceId: number): Promise { diff --git a/packages/server/apps/api/src/facade/cli/cli-list-jobs.facade.ts b/packages/server/apps/api/src/facade/cli/cli-jobs-list.facade.ts similarity index 86% rename from packages/server/apps/api/src/facade/cli/cli-list-jobs.facade.ts rename to packages/server/apps/api/src/facade/cli/cli-jobs-list.facade.ts index 06b1d15f3f..4d7d244365 100644 --- a/packages/server/apps/api/src/facade/cli/cli-list-jobs.facade.ts +++ b/packages/server/apps/api/src/facade/cli/cli-jobs-list.facade.ts @@ -1,6 +1,6 @@ import { FilterQuery } from '@mikro-orm/mysql' import { Injectable } from '@nestjs/common' -import { CliListJobDTO } from '@shared/domain/cli/dto/cli-list-jobs.dto' +import { CliJobListDTO } from '@shared/domain/cli/dto/cli-jobs-list.dto' import { Job } from '@shared/domain/job/job.entity' import { JobService } from '@shared/domain/job/job.service' import { SpaceService } from '@shared/domain/space/service/space.service' @@ -11,14 +11,14 @@ import { EntityScope } from '@shared/types/common' import { EntityScopeUtils } from '@shared/utils/entity-scope.utils' @Injectable() -export class CliListJobsFacade { +export class CliJobsListFacade { constructor( private readonly user: UserContext, private readonly jobService: JobService, private readonly spaceService: SpaceService, ) {} - async listJobs(scope: EntityScope): Promise { + async listJobs(scope: EntityScope): Promise { let where: FilterQuery if (EntityScopeUtils.isSpaceScope(scope)) { @@ -43,6 +43,6 @@ export class CliListJobsFacade { orderBy: { createdAt: 'DESC' }, }) - return jobs.map(job => CliListJobDTO.fromEntity(job)) + return jobs.map(job => CliJobListDTO.fromEntity(job)) } } diff --git a/packages/server/apps/api/src/facade/cli/cli-list-members.facade.ts b/packages/server/apps/api/src/facade/cli/cli-members-list.facade.ts similarity index 93% rename from packages/server/apps/api/src/facade/cli/cli-list-members.facade.ts rename to packages/server/apps/api/src/facade/cli/cli-members-list.facade.ts index 18d0837285..cdd45e67b0 100644 --- a/packages/server/apps/api/src/facade/cli/cli-list-members.facade.ts +++ b/packages/server/apps/api/src/facade/cli/cli-members-list.facade.ts @@ -3,7 +3,7 @@ import { CliSpaceMemberDTO } from '@shared/domain/cli/dto/cli-space-member.dto' import { SpaceService } from '@shared/domain/space/service/space.service' @Injectable() -export class CliListMembersFacade { +export class CliMembersListFacade { constructor(private readonly spaceService: SpaceService) {} async listSpaceMembers(spaceId: number): Promise { diff --git a/packages/server/apps/api/src/facade/cli/cli-list-spaces.facade.ts b/packages/server/apps/api/src/facade/cli/cli-spaces-list.facade.ts similarity index 75% rename from packages/server/apps/api/src/facade/cli/cli-list-spaces.facade.ts rename to packages/server/apps/api/src/facade/cli/cli-spaces-list.facade.ts index f6db6417fd..eb312fa594 100644 --- a/packages/server/apps/api/src/facade/cli/cli-list-spaces.facade.ts +++ b/packages/server/apps/api/src/facade/cli/cli-spaces-list.facade.ts @@ -1,20 +1,20 @@ import { FilterQuery } from '@mikro-orm/mysql' import { Injectable } from '@nestjs/common' -import { CliListSpaceDTO } from '@shared/domain/cli/dto/cli-list-spaces.dto' -import { CliListSpacesQueryDTO } from '@shared/domain/cli/dto/cli-list-spaces-query.dto' +import { CliSpaceListDTO } from '@shared/domain/cli/dto/cli-spaces-list.dto' +import { CliSpacesListQueryDTO } from '@shared/domain/cli/dto/cli-spaces-list-query.dto' import { SpaceService } from '@shared/domain/space/service/space.service' import { Space } from '@shared/domain/space/space.entity' import { SPACE_STATE } from '@shared/domain/space/space.enum' import { UserContext } from '@shared/domain/user-context/model/user-context' @Injectable() -export class CliListSpacesFacade { +export class CliSpacesListFacade { constructor( private readonly user: UserContext, private readonly spaceService: SpaceService, ) {} - async listSpaces(query: CliListSpacesQueryDTO): Promise { + async listSpaces(query: CliSpacesListQueryDTO): Promise { const state = query.state ?? SPACE_STATE.ACTIVE const where: FilterQuery = { state } @@ -33,7 +33,7 @@ export class CliListSpacesFacade { return spaces.map(space => { const membership = space.spaceMemberships.getItems().find(m => m.user.id === this.user.id && m.active) - return CliListSpaceDTO.fromEntity(space, membership) + return CliSpaceListDTO.fromEntity(space, membership) }) } } diff --git a/packages/server/apps/api/src/facade/db-cluster/list-facade/db-cluster-list-facade.module.ts b/packages/server/apps/api/src/facade/db-cluster/list-facade/db-clusters-list-facade.module.ts similarity index 71% rename from packages/server/apps/api/src/facade/db-cluster/list-facade/db-cluster-list-facade.module.ts rename to packages/server/apps/api/src/facade/db-cluster/list-facade/db-clusters-list-facade.module.ts index fe88d828d4..90017deab9 100644 --- a/packages/server/apps/api/src/facade/db-cluster/list-facade/db-cluster-list-facade.module.ts +++ b/packages/server/apps/api/src/facade/db-cluster/list-facade/db-clusters-list-facade.module.ts @@ -3,11 +3,11 @@ import { DbClusterModule } from '@shared/domain/db-cluster/db-cluster.module' import { LicenseModule } from '@shared/domain/license/license.module' import { SpaceModule } from '@shared/domain/space/space.module' import { SpaceMembershipModule } from '@shared/domain/space-membership/space-membership.module' -import { DbClusterListFacade } from './db-cluster-list.facade' +import { DbClustersListFacade } from './db-clusters-list.facade' @Module({ imports: [DbClusterModule, SpaceModule, SpaceMembershipModule, LicenseModule], - providers: [DbClusterListFacade], - exports: [DbClusterListFacade], + providers: [DbClustersListFacade], + exports: [DbClustersListFacade], }) -export class DbClusterListFacadeModule {} +export class DbClustersListFacadeModule {} diff --git a/packages/server/apps/api/src/facade/db-cluster/list-facade/db-cluster-list.facade.ts b/packages/server/apps/api/src/facade/db-cluster/list-facade/db-clusters-list.facade.ts similarity index 99% rename from packages/server/apps/api/src/facade/db-cluster/list-facade/db-cluster-list.facade.ts rename to packages/server/apps/api/src/facade/db-cluster/list-facade/db-clusters-list.facade.ts index b21cf63e20..0424040893 100644 --- a/packages/server/apps/api/src/facade/db-cluster/list-facade/db-cluster-list.facade.ts +++ b/packages/server/apps/api/src/facade/db-cluster/list-facade/db-clusters-list.facade.ts @@ -15,7 +15,7 @@ import { PermissionError } from '@shared/errors' import { ServiceLogger } from '@shared/logger/decorator/service-logger' @Injectable() -export class DbClusterListFacade { +export class DbClustersListFacade { @ServiceLogger() private readonly logger: Logger diff --git a/packages/server/apps/api/src/facade/space-membership/space-membership-api-facade.module.ts b/packages/server/apps/api/src/facade/space-membership/space-membership-api-facade.module.ts index 4e3329a14c..402fb7eb06 100644 --- a/packages/server/apps/api/src/facade/space-membership/space-membership-api-facade.module.ts +++ b/packages/server/apps/api/src/facade/space-membership/space-membership-api-facade.module.ts @@ -1,13 +1,13 @@ import { Module } from '@nestjs/common' import { DbClusterSynchronizeFacadeModule } from 'apps/api/src/facade/db-cluster/synchronize-facade/db-cluster-synchronize-facade.module' -import { SpaceMembershipListApiFacade } from 'apps/api/src/facade/space-membership/space-membership-list-api.facade' +import { SpaceMembershipsListApiFacade } from 'apps/api/src/facade/space-membership/space-memberships-list-api.facade' import { SpaceMembershipUpdateApiFacade } from 'apps/api/src/facade/space-membership/space-membership-update-api.facade' import { SpaceModule } from '@shared/domain/space/space.module' import { SpaceMembershipFacadeModule } from '@shared/facade/space-membership/space-membership-facade.module' @Module({ imports: [SpaceMembershipFacadeModule, DbClusterSynchronizeFacadeModule, SpaceModule], - providers: [SpaceMembershipUpdateApiFacade, SpaceMembershipListApiFacade], - exports: [SpaceMembershipUpdateApiFacade, SpaceMembershipListApiFacade], + providers: [SpaceMembershipUpdateApiFacade, SpaceMembershipsListApiFacade], + exports: [SpaceMembershipUpdateApiFacade, SpaceMembershipsListApiFacade], }) export class SpaceMembershipApiFacadeModule {} diff --git a/packages/server/apps/api/src/facade/space-membership/space-membership-list-api.facade.ts b/packages/server/apps/api/src/facade/space-membership/space-memberships-list-api.facade.ts similarity index 93% rename from packages/server/apps/api/src/facade/space-membership/space-membership-list-api.facade.ts rename to packages/server/apps/api/src/facade/space-membership/space-memberships-list-api.facade.ts index 8733fdd549..b7c6983f99 100644 --- a/packages/server/apps/api/src/facade/space-membership/space-membership-list-api.facade.ts +++ b/packages/server/apps/api/src/facade/space-membership/space-memberships-list-api.facade.ts @@ -4,7 +4,7 @@ import { SpaceService } from '@shared/domain/space/service/space.service' import { SpaceMemberDTO } from '@shared/domain/space-membership/dto/space-member.dto' @Injectable() -export class SpaceMembershipListApiFacade { +export class SpaceMembershipsListApiFacade { constructor( private readonly em: SqlEntityManager, private readonly spaceService: SpaceService, diff --git a/packages/server/apps/api/src/folders/folder.api.module.ts b/packages/server/apps/api/src/folders/folder.api.module.ts index 55fdb4a239..71cd79ad56 100644 --- a/packages/server/apps/api/src/folders/folder.api.module.ts +++ b/packages/server/apps/api/src/folders/folder.api.module.ts @@ -1,9 +1,9 @@ import { Module } from '@nestjs/common' import { UserFileModule } from '@shared/domain/user-file/user-file.module' -import { FolderController } from './folder.controller' +import { FoldersController } from './folders.controller' @Module({ imports: [UserFileModule], - controllers: [FolderController], + controllers: [FoldersController], }) export class FolderApiModule {} diff --git a/packages/server/apps/api/src/folders/folder.controller.ts b/packages/server/apps/api/src/folders/folders.controller.ts similarity index 94% rename from packages/server/apps/api/src/folders/folder.controller.ts rename to packages/server/apps/api/src/folders/folders.controller.ts index 044af7e532..be061a7ed7 100644 --- a/packages/server/apps/api/src/folders/folder.controller.ts +++ b/packages/server/apps/api/src/folders/folders.controller.ts @@ -6,7 +6,7 @@ import { FetchChildrenDTO } from './model/fetch-children.dto' @UseGuards(UserContextGuard) @Controller('/folders') -export class FolderController { +export class FoldersController { constructor(private readonly nodeService: NodeService) {} @Get('/children') diff --git a/packages/server/apps/api/src/jobs/job.api.module.ts b/packages/server/apps/api/src/jobs/job.api.module.ts index c0c8b729d1..97678a4ef7 100644 --- a/packages/server/apps/api/src/jobs/job.api.module.ts +++ b/packages/server/apps/api/src/jobs/job.api.module.ts @@ -2,10 +2,10 @@ import { Module } from '@nestjs/common' import { JobModule } from '@shared/domain/job/job.module' import { JobFacadeModule } from '@shared/facade/job/job-facade.module' import { JobGetFacadeModule } from '../facade/job/get-facade/job-get-facade.module' -import { JobController } from './job.controller' +import { JobsController } from './jobs.controller' @Module({ imports: [JobModule, JobFacadeModule, JobGetFacadeModule], - controllers: [JobController], + controllers: [JobsController], }) export class JobApiModule {} diff --git a/packages/server/apps/api/src/jobs/job.controller.ts b/packages/server/apps/api/src/jobs/jobs.controller.ts similarity index 99% rename from packages/server/apps/api/src/jobs/job.controller.ts rename to packages/server/apps/api/src/jobs/jobs.controller.ts index 23f87372a8..c30041c8d2 100644 --- a/packages/server/apps/api/src/jobs/job.controller.ts +++ b/packages/server/apps/api/src/jobs/jobs.controller.ts @@ -18,7 +18,7 @@ import { DxidValidationPipe } from '../validation/pipes/dxid.pipe' @UseGuards(UserContextGuard) @Controller('/jobs') -export class JobController { +export class JobsController { constructor( private readonly jobSynchronizationService: JobSynchronizationService, private readonly jobService: JobService, diff --git a/packages/server/apps/api/src/licenses/license.api.module.ts b/packages/server/apps/api/src/licenses/license.api.module.ts index 5389c9e1ef..cddf7dfe56 100644 --- a/packages/server/apps/api/src/licenses/license.api.module.ts +++ b/packages/server/apps/api/src/licenses/license.api.module.ts @@ -2,10 +2,10 @@ import { Module } from '@nestjs/common' import { AcceptedLicenseModule } from '@shared/domain/accepted-license/accepted-license.module' import { LicenseModule } from '@shared/domain/license/license.module' import { LicenseApiFacadeModule } from '../facade/license/license-api-facade.module' -import { LicenseController } from './license.controller' +import { LicensesController } from './licenses.controller' @Module({ imports: [LicenseModule, AcceptedLicenseModule, LicenseApiFacadeModule], - controllers: [LicenseController], + controllers: [LicensesController], }) export class LicenseApiModule {} diff --git a/packages/server/apps/api/src/licenses/license.controller.ts b/packages/server/apps/api/src/licenses/licenses.controller.ts similarity index 99% rename from packages/server/apps/api/src/licenses/license.controller.ts rename to packages/server/apps/api/src/licenses/licenses.controller.ts index 0b0b67bad4..32d48b2741 100644 --- a/packages/server/apps/api/src/licenses/license.controller.ts +++ b/packages/server/apps/api/src/licenses/licenses.controller.ts @@ -14,7 +14,7 @@ import { UpdateLicenseDto } from './model/update-license.dto' @ApiCookieAuth() @UseGuards(UserContextGuard) @Controller('/licenses') -export class LicenseController { +export class LicensesController { constructor( private readonly licenseService: LicenseService, private readonly acceptedLicenseService: AcceptedLicenseService, diff --git a/packages/server/apps/api/src/news/news.api.module.ts b/packages/server/apps/api/src/news/news.api.module.ts index 195cc61f6f..c896fe9352 100644 --- a/packages/server/apps/api/src/news/news.api.module.ts +++ b/packages/server/apps/api/src/news/news.api.module.ts @@ -1,9 +1,9 @@ import { Module } from '@nestjs/common' -import { NewsModule } from '@shared/domain/news-item/news-item.module' +import { NewsItemModule } from '@shared/domain/news-item/news-item.module' import { NewsController } from './news.controller' @Module({ - imports: [NewsModule], + imports: [NewsItemModule], controllers: [NewsController], }) export class NewsApiModule {} diff --git a/packages/server/apps/api/src/news/news.controller.ts b/packages/server/apps/api/src/news/news.controller.ts index 0f6b3dd048..d457b4d46d 100644 --- a/packages/server/apps/api/src/news/news.controller.ts +++ b/packages/server/apps/api/src/news/news.controller.ts @@ -15,52 +15,52 @@ import { PaginatedResult } from '@shared/domain/entity/domain/paginated.result' import { NewsItemDTO } from '@shared/domain/news-item/dto/news-item.dto' import { NewsListDTO } from '@shared/domain/news-item/dto/news-list.dto' import { NewsItem } from '@shared/domain/news-item/news-item.entity' -import { NewsService } from '@shared/domain/news-item/service/new-item.service' +import { NewsItemService } from '@shared/domain/news-item/service/news-item.service' import { SiteAdminGuard } from '../admin/guards/site-admin.guard' @Controller('/news') export class NewsController { - constructor(private readonly newsService: NewsService) {} + constructor(private readonly newsItemService: NewsItemService) {} @Get() async listNews(@Query() query: NewsListDTO): Promise> { - return await this.newsService.listNews(query) + return await this.newsItemService.listNews(query) } @UseGuards(SiteAdminGuard) @Get('/all') async getAllNews(@Query() query: NewsListDTO): Promise { - return await this.newsService.getAllNews(query) + return await this.newsItemService.getAllNews(query) } @Get('/years') async listYears(): Promise { - return await this.newsService.listYears() + return await this.newsItemService.listYears() } @Get('/:id') async getNews(@Param('id', ParseIntPipe) id: number): Promise { - return await this.newsService.getNews(id) + return await this.newsItemService.getNews(id) } @UseGuards(SiteAdminGuard) @HttpCode(204) @Delete('/:id') async deleteNews(@Param('id', ParseIntPipe) id: number): Promise { - await this.newsService.deleteNews(id) + await this.newsItemService.deleteNews(id) } @UseGuards(SiteAdminGuard) @HttpCode(201) @Post() async createNews(@Body() body: NewsItemDTO): Promise> { - return await this.newsService.createNews(body) + return await this.newsItemService.createNews(body) } @UseGuards(SiteAdminGuard) @HttpCode(204) @Put('/:id') async updateNews(@Param('id', ParseIntPipe) id: number, @Body() body: NewsItemDTO): Promise { - await this.newsService.updateNews(id, body) + await this.newsItemService.updateNews(id, body) } } diff --git a/packages/server/apps/api/src/space-memberships/space-memberships.controller.ts b/packages/server/apps/api/src/space-memberships/space-memberships.controller.ts index 504f987b1d..2dc06b28ce 100644 --- a/packages/server/apps/api/src/space-memberships/space-memberships.controller.ts +++ b/packages/server/apps/api/src/space-memberships/space-memberships.controller.ts @@ -1,6 +1,6 @@ import { Body, Controller, Get, HttpCode, Param, ParseIntPipe, Patch, Post, UseGuards } from '@nestjs/common' import { ApiOperation } from '@nestjs/swagger' -import { SpaceMembershipListApiFacade } from 'apps/api/src/facade/space-membership/space-membership-list-api.facade' +import { SpaceMembershipsListApiFacade } from 'apps/api/src/facade/space-membership/space-memberships-list-api.facade' import { SpaceLeadRecoverDTO } from '@shared/domain/space-membership/dto/space-lead-recover.dto' import { SpaceMemberDTO } from '@shared/domain/space-membership/dto/space-member.dto' import { UpdateSpaceMembershipDTO } from '@shared/domain/space-membership/dto/update-space-membership.dto' @@ -13,12 +13,12 @@ import { UserContextGuard } from '../user-context/guard/user-context.guard' export class SpaceMembershipsController { constructor( private readonly spaceMembershipUpdateApiFacade: SpaceMembershipUpdateApiFacade, - private readonly spaceMembershipListApiFacade: SpaceMembershipListApiFacade, + private readonly spaceMembershipsListApiFacade: SpaceMembershipsListApiFacade, ) {} @Get('/') async listMembers(@Param('spaceId', ParseIntPipe) spaceId: number): Promise { - return this.spaceMembershipListApiFacade.listSpaceMembers(spaceId) + return this.spaceMembershipsListApiFacade.listSpaceMembers(spaceId) } @ApiOperation({ summary: 'Recover space lead for orphaned spaces' }) diff --git a/packages/server/apps/api/src/validation/pipes/uid.pipe.ts b/packages/server/apps/api/src/validation/pipes/uid.pipe.ts index 31d840db21..4d3e069565 100644 --- a/packages/server/apps/api/src/validation/pipes/uid.pipe.ts +++ b/packages/server/apps/api/src/validation/pipes/uid.pipe.ts @@ -16,7 +16,7 @@ type UidValidationPipeOptions = { * is thrown and the request is rejected. * * @example usage can be found in - * DbClusterController#updateDbCluster + * DbClustersController#updateDbCluster * * @example with entity type * @Param('uid', new UidValidationPipe({ entityType: 'job' })) uid: Uid<'job'> diff --git a/packages/server/apps/api/src/workflows/workflow.api.module.ts b/packages/server/apps/api/src/workflows/workflow.api.module.ts index ae75269a54..2e8dde9d7f 100644 --- a/packages/server/apps/api/src/workflows/workflow.api.module.ts +++ b/packages/server/apps/api/src/workflows/workflow.api.module.ts @@ -1,9 +1,9 @@ import { Module } from '@nestjs/common' import { LicenseApiFacadeModule } from '../facade/license/license-api-facade.module' -import { WorkflowController } from './workflow.controller' +import { WorkflowsController } from './workflows.controller' @Module({ imports: [LicenseApiFacadeModule], - controllers: [WorkflowController], + controllers: [WorkflowsController], }) export class WorkflowApiModule {} diff --git a/packages/server/apps/api/src/workflows/workflow.controller.ts b/packages/server/apps/api/src/workflows/workflows.controller.ts similarity index 95% rename from packages/server/apps/api/src/workflows/workflow.controller.ts rename to packages/server/apps/api/src/workflows/workflows.controller.ts index 08ca31bfa2..9b487921f6 100644 --- a/packages/server/apps/api/src/workflows/workflow.controller.ts +++ b/packages/server/apps/api/src/workflows/workflows.controller.ts @@ -6,7 +6,7 @@ import { WorkflowUidParamDto } from './model/workflow-uid-param.dto' @UseGuards(UserContextGuard) @Controller('/workflows') -export class WorkflowController { +export class WorkflowsController { constructor(private readonly licensesForWorkflowFacade: LicensesForWorkflowFacade) {} @Get('/:workflowUid/licenses-to-accept') diff --git a/packages/server/apps/api/test/integration/news/news.spec.ts b/packages/server/apps/api/test/integration/news/news.spec.ts index abf9dd4da2..b93063dc10 100644 --- a/packages/server/apps/api/test/integration/news/news.spec.ts +++ b/packages/server/apps/api/test/integration/news/news.spec.ts @@ -181,8 +181,8 @@ describe('/news', () => { .expect(201) expect(body).to.deep.eq({ id: body.id }) - const newsRepo = em.getRepository(NewsItem) - const newsItemFromDb = await newsRepo.findOne({ id: body.id }) + const newsItemRepo = em.getRepository(NewsItem) + const newsItemFromDb = await newsItemRepo.findOne({ id: body.id }) expect(newsItemFromDb.title).to.be.eq(data.title) expect(newsItemFromDb.content).to.be.eq(data.content) expect(newsItemFromDb.link).to.be.eq(data.link) diff --git a/packages/server/apps/api/test/unit/facade/cli-list-assets.facade.spec.ts b/packages/server/apps/api/test/unit/facade/cli-assets-list.facade.spec.ts similarity index 92% rename from packages/server/apps/api/test/unit/facade/cli-list-assets.facade.spec.ts rename to packages/server/apps/api/test/unit/facade/cli-assets-list.facade.spec.ts index 0e4c439f52..b7b3690055 100644 --- a/packages/server/apps/api/test/unit/facade/cli-list-assets.facade.spec.ts +++ b/packages/server/apps/api/test/unit/facade/cli-assets-list.facade.spec.ts @@ -5,7 +5,7 @@ import { UserContext } from '@shared/domain/user-context/model/user-context' import { NodeService } from '@shared/domain/user-file/node.service' import { STATIC_SCOPE } from '@shared/enums' import { NotFoundError } from '@shared/errors' -import { CliListAssetsFacade } from '../../../src/facade/cli/cli-list-assets.facade' +import { CliAssetsListFacade } from '../../../src/facade/cli/cli-assets-list.facade' const USER_ID = 42 const DXUSER = 'user-test' @@ -19,7 +19,7 @@ function createUserContext(overrides?: Partial): UserContext { } as unknown as UserContext } -describe('CliListAssetsFacade', () => { +describe('CliAssetsListFacade', () => { let listAccessibleAssetsStub: SinonStub let loadEntityStub: SinonStub let spaceGetAccessibleByIdStub: SinonStub @@ -30,7 +30,7 @@ describe('CliListAssetsFacade', () => { spaceGetAccessibleByIdStub = stub().resolves(null) }) - function getInstance(): CliListAssetsFacade { + function getInstance(): CliAssetsListFacade { const nodeService = { listAccessibleAssets: listAccessibleAssetsStub, } as unknown as NodeService @@ -38,7 +38,7 @@ describe('CliListAssetsFacade', () => { const spaceService = { getAccessibleById: spaceGetAccessibleByIdStub, } as unknown as SpaceService - return new CliListAssetsFacade(nodeService, user, spaceService) + return new CliAssetsListFacade(nodeService, user, spaceService) } it('queries with scope: PUBLIC when scope is STATIC_SCOPE.PUBLIC', async () => { diff --git a/packages/server/apps/api/test/unit/facade/cli-dto-validation.spec.ts b/packages/server/apps/api/test/unit/facade/cli-dto-validation.spec.ts index eb9022d1c1..06438ecb17 100644 --- a/packages/server/apps/api/test/unit/facade/cli-dto-validation.spec.ts +++ b/packages/server/apps/api/test/unit/facade/cli-dto-validation.spec.ts @@ -1,13 +1,13 @@ import { expect } from 'chai' import { plainToInstance } from 'class-transformer' import { validate } from 'class-validator' -import { CliListSpacesQueryDTO } from '@shared/domain/cli/dto/cli-list-spaces-query.dto' +import { CliSpacesListQueryDTO } from '@shared/domain/cli/dto/cli-spaces-list-query.dto' import { CliScopeQueryDTO } from '@shared/domain/cli/dto/cli-scope-query.dto' import { SPACE_STATE, SPACE_TYPE } from '@shared/domain/space/space.enum' -describe('CliListSpacesQueryDTO', () => { - const toInstance = (plain: Record): CliListSpacesQueryDTO => - plainToInstance(CliListSpacesQueryDTO, plain, { enableImplicitConversion: false }) +describe('CliSpacesListQueryDTO', () => { + const toInstance = (plain: Record): CliSpacesListQueryDTO => + plainToInstance(CliSpacesListQueryDTO, plain, { enableImplicitConversion: false }) describe('state', () => { it('transforms "active" to SPACE_STATE.ACTIVE', async () => { diff --git a/packages/server/apps/api/test/unit/facade/cli-list-jobs.facade.spec.ts b/packages/server/apps/api/test/unit/facade/cli-jobs-list.facade.spec.ts similarity index 92% rename from packages/server/apps/api/test/unit/facade/cli-list-jobs.facade.spec.ts rename to packages/server/apps/api/test/unit/facade/cli-jobs-list.facade.spec.ts index 23aef4d588..5fa0f313d7 100644 --- a/packages/server/apps/api/test/unit/facade/cli-list-jobs.facade.spec.ts +++ b/packages/server/apps/api/test/unit/facade/cli-jobs-list.facade.spec.ts @@ -5,7 +5,7 @@ import { SpaceService } from '@shared/domain/space/service/space.service' import { UserContext } from '@shared/domain/user-context/model/user-context' import { STATIC_SCOPE } from '@shared/enums' import { NotFoundError } from '@shared/errors' -import { CliListJobsFacade } from '../../../src/facade/cli/cli-list-jobs.facade' +import { CliJobsListFacade } from '../../../src/facade/cli/cli-jobs-list.facade' const USER_ID = 42 const DXUSER = 'user-test' @@ -19,7 +19,7 @@ function createUserContext(overrides?: Partial): UserContext { } as unknown as UserContext } -describe('CliListJobsFacade', () => { +describe('CliJobsListFacade', () => { let jobListAccessibleStub: SinonStub let spaceGetAccessibleByIdStub: SinonStub let loadEntityStub: SinonStub @@ -30,7 +30,7 @@ describe('CliListJobsFacade', () => { loadEntityStub = stub().resolves({ id: USER_ID }) }) - function getInstance(): CliListJobsFacade { + function getInstance(): CliJobsListFacade { const user = createUserContext({ loadEntity: loadEntityStub }) const jobService = { listAccessible: jobListAccessibleStub, @@ -38,7 +38,7 @@ describe('CliListJobsFacade', () => { const spaceService = { getAccessibleById: spaceGetAccessibleByIdStub, } as unknown as SpaceService - return new CliListJobsFacade(user, jobService, spaceService) + return new CliJobsListFacade(user, jobService, spaceService) } it('queries with scope: space-123 when scope is a space scope and space exists', async () => { diff --git a/packages/server/apps/api/test/unit/facade/cli-list-spaces.facade.spec.ts b/packages/server/apps/api/test/unit/facade/cli-spaces-list.facade.spec.ts similarity index 92% rename from packages/server/apps/api/test/unit/facade/cli-list-spaces.facade.spec.ts rename to packages/server/apps/api/test/unit/facade/cli-spaces-list.facade.spec.ts index c31685d1f4..77c95acee4 100644 --- a/packages/server/apps/api/test/unit/facade/cli-list-spaces.facade.spec.ts +++ b/packages/server/apps/api/test/unit/facade/cli-spaces-list.facade.spec.ts @@ -4,7 +4,7 @@ import { SpaceService } from '@shared/domain/space/service/space.service' import { SPACE_STATE, SPACE_TYPE } from '@shared/domain/space/space.enum' import { SPACE_MEMBERSHIP_ROLE, SPACE_MEMBERSHIP_SIDE } from '@shared/domain/space-membership/space-membership.enum' import { UserContext } from '@shared/domain/user-context/model/user-context' -import { CliListSpacesFacade } from '../../../src/facade/cli/cli-list-spaces.facade' +import { CliSpacesListFacade } from '../../../src/facade/cli/cli-spaces-list.facade' const USER_ID = 42 const DXUSER = 'user-test' @@ -18,19 +18,19 @@ function createUserContext(overrides?: Partial): UserContext { } as unknown as UserContext } -describe('CliListSpacesFacade', () => { +describe('CliSpacesListFacade', () => { let listAccessibleStub: SinonStub beforeEach(() => { listAccessibleStub = stub().resolves([]) }) - function getInstance(): CliListSpacesFacade { + function getInstance(): CliSpacesListFacade { const user = createUserContext() const spaceService = { listAccessible: listAccessibleStub, } as unknown as SpaceService - return new CliListSpacesFacade(user, spaceService) + return new CliSpacesListFacade(user, spaceService) } it('calls spaceService.listAccessible with SPACE_STATE.ACTIVE when state is not provided in query', async () => { @@ -85,7 +85,7 @@ describe('CliListSpacesFacade', () => { expect(where).to.not.have.property('type') }) - it('maps results using CliListSpaceDTO.fromEntity', async () => { + it('maps results using CliSpaceListDTO.fromEntity', async () => { const mockMembership = { user: { id: USER_ID }, active: true, diff --git a/packages/server/libs/shared/src/domain/cli/dto/cli-list-assets.dto.ts b/packages/server/libs/shared/src/domain/cli/dto/cli-assets-list.dto.ts similarity index 91% rename from packages/server/libs/shared/src/domain/cli/dto/cli-list-assets.dto.ts rename to packages/server/libs/shared/src/domain/cli/dto/cli-assets-list.dto.ts index 18bc7c2eee..0c2e32db65 100644 --- a/packages/server/libs/shared/src/domain/cli/dto/cli-list-assets.dto.ts +++ b/packages/server/libs/shared/src/domain/cli/dto/cli-assets-list.dto.ts @@ -1,7 +1,7 @@ import { Uid } from '@shared/domain/entity/domain/uid' import { Asset } from '@shared/domain/user-file/asset.entity' -export class CliListAssetDTO { +export class CliAssetListDTO { id: number uid: Uid<'file'> name: string @@ -15,7 +15,7 @@ export class CliListAssetDTO { archiveContent: string[] properties: Record - static fromEntity(asset: Asset): CliListAssetDTO { + static fromEntity(asset: Asset): CliAssetListDTO { const props: Record = {} asset.properties.getItems().forEach(p => { props[p.propertyName] = p.propertyValue diff --git a/packages/server/libs/shared/src/domain/cli/dto/cli-list-jobs.dto.ts b/packages/server/libs/shared/src/domain/cli/dto/cli-jobs-list.dto.ts similarity index 91% rename from packages/server/libs/shared/src/domain/cli/dto/cli-list-jobs.dto.ts rename to packages/server/libs/shared/src/domain/cli/dto/cli-jobs-list.dto.ts index a81f6f02aa..e60cdc9c3a 100644 --- a/packages/server/libs/shared/src/domain/cli/dto/cli-list-jobs.dto.ts +++ b/packages/server/libs/shared/src/domain/cli/dto/cli-jobs-list.dto.ts @@ -2,7 +2,7 @@ import { DxId } from '@shared/domain/entity/domain/dxid' import { Uid } from '@shared/domain/entity/domain/uid' import { Job } from '@shared/domain/job/job.entity' -export class CliListJobDTO { +export class CliJobListDTO { id: number uid: Uid<'job'> dxid: DxId<'job'> @@ -30,7 +30,7 @@ export class CliListJobDTO { runInputData: RunDataItem[] runOutputData: RunDataItem[] - static fromEntity(job: Job): CliListJobDTO { + static fromEntity(job: Job): CliJobListDTO { let appTitle: string | null = null let appUid: Uid<'app'> | null = null let appRevision: number | null = null @@ -56,11 +56,11 @@ export class CliListJobDTO { .map(t => t.tag?.name) .filter(Boolean) as string[] - const runtime = CliListJobDTO.getRuntime(job) - const energy = CliListJobDTO.getEnergy(job) + const runtime = CliJobListDTO.getRuntime(job) + const energy = CliJobListDTO.getEnergy(job) - const runInputData = CliListJobDTO.buildRunData(job.runData?.run_inputs) - const runOutputData = CliListJobDTO.buildRunData(job.runData?.run_outputs) + const runInputData = CliJobListDTO.buildRunData(job.runData?.run_inputs) + const runOutputData = CliJobListDTO.buildRunData(job.runData?.run_outputs) return { id: job.id, uid: job.uid, diff --git a/packages/server/libs/shared/src/domain/cli/dto/cli-list-spaces-query.dto.ts b/packages/server/libs/shared/src/domain/cli/dto/cli-spaces-list-query.dto.ts similarity index 94% rename from packages/server/libs/shared/src/domain/cli/dto/cli-list-spaces-query.dto.ts rename to packages/server/libs/shared/src/domain/cli/dto/cli-spaces-list-query.dto.ts index ba4612208e..6ca2b7bca5 100644 --- a/packages/server/libs/shared/src/domain/cli/dto/cli-list-spaces-query.dto.ts +++ b/packages/server/libs/shared/src/domain/cli/dto/cli-spaces-list-query.dto.ts @@ -4,7 +4,7 @@ import { SPACE_STATE, SPACE_TYPE } from '@shared/domain/space/space.enum' import { TransformAndValidateBoolean } from '@shared/utils/transformers/is-valid-boolean' import { TransformEnumKey } from '@shared/utils/transformers/transform-enum-key.decorator' -export class CliListSpacesQueryDTO { +export class CliSpacesListQueryDTO { @IsOptional() @TransformEnumKey(SPACE_STATE) @IsEnum(SPACE_STATE) diff --git a/packages/server/libs/shared/src/domain/cli/dto/cli-list-spaces.dto.ts b/packages/server/libs/shared/src/domain/cli/dto/cli-spaces-list.dto.ts similarity index 95% rename from packages/server/libs/shared/src/domain/cli/dto/cli-list-spaces.dto.ts rename to packages/server/libs/shared/src/domain/cli/dto/cli-spaces-list.dto.ts index 8cdc4f9670..1beaa0c976 100644 --- a/packages/server/libs/shared/src/domain/cli/dto/cli-list-spaces.dto.ts +++ b/packages/server/libs/shared/src/domain/cli/dto/cli-spaces-list.dto.ts @@ -3,7 +3,7 @@ import { SPACE_STATE, SPACE_TYPE } from '@shared/domain/space/space.enum' import { SpaceMembership } from '@shared/domain/space-membership/space-membership.entity' import { SPACE_MEMBERSHIP_ROLE, SPACE_MEMBERSHIP_SIDE } from '@shared/domain/space-membership/space-membership.enum' -export class CliListSpaceDTO { +export class CliSpaceListDTO { id: number title: string type: string @@ -14,7 +14,7 @@ export class CliListSpaceDTO { // membership may be undefined for site admins: SpaceRepository.getAccessibleWhere() // grants visibility to all spaces including ones they have no membership in. - static fromEntity(space: Space, membership?: SpaceMembership): CliListSpaceDTO { + static fromEntity(space: Space, membership?: SpaceMembership): CliSpaceListDTO { return { id: space.id, title: space.name, diff --git a/packages/server/libs/shared/src/domain/news-item/news-item.entity.ts b/packages/server/libs/shared/src/domain/news-item/news-item.entity.ts index ad84619403..e518451779 100644 --- a/packages/server/libs/shared/src/domain/news-item/news-item.entity.ts +++ b/packages/server/libs/shared/src/domain/news-item/news-item.entity.ts @@ -1,9 +1,9 @@ import { Entity, ManyToOne, Property, Ref, Reference } from '@mikro-orm/core' import { User } from '@shared/domain/user/user.entity' import { BaseEntity } from '../../database/base.entity' -import { NewsRepository } from './news-item.repository' +import { NewsItemRepository } from './news-item.repository' -@Entity({ tableName: 'news_items', repository: () => NewsRepository }) +@Entity({ tableName: 'news_items', repository: () => NewsItemRepository }) class NewsItem extends BaseEntity { @Property() title?: string diff --git a/packages/server/libs/shared/src/domain/news-item/news-item.module.ts b/packages/server/libs/shared/src/domain/news-item/news-item.module.ts index 31732fe96e..128773d65e 100644 --- a/packages/server/libs/shared/src/domain/news-item/news-item.module.ts +++ b/packages/server/libs/shared/src/domain/news-item/news-item.module.ts @@ -1,11 +1,11 @@ import { MikroOrmModule } from '@mikro-orm/nestjs' import { Module } from '@nestjs/common' import { NewsItem } from './news-item.entity' -import { NewsService } from './service/new-item.service' +import { NewsItemService } from './service/news-item.service' @Module({ imports: [MikroOrmModule.forFeature([NewsItem])], - providers: [NewsService], - exports: [NewsService], + providers: [NewsItemService], + exports: [NewsItemService], }) -export class NewsModule {} +export class NewsItemModule {} diff --git a/packages/server/libs/shared/src/domain/news-item/news-item.repository.ts b/packages/server/libs/shared/src/domain/news-item/news-item.repository.ts index 1a6febb61b..84d5258b26 100644 --- a/packages/server/libs/shared/src/domain/news-item/news-item.repository.ts +++ b/packages/server/libs/shared/src/domain/news-item/news-item.repository.ts @@ -1,7 +1,7 @@ import { PaginatedRepository } from '@shared/database/repository/paginated.repository' import { NewsItem } from './news-item.entity' -export class NewsRepository extends PaginatedRepository { +export class NewsItemRepository extends PaginatedRepository { async getDistinctYears(): Promise { const allYears: { year: number }[] = await this.em.execute( 'SELECT DISTINCT YEAR(created_at) as year FROM news_items ORDER BY year DESC', diff --git a/packages/server/libs/shared/src/domain/news-item/service/new-item.service.ts b/packages/server/libs/shared/src/domain/news-item/service/news-item.service.ts similarity index 85% rename from packages/server/libs/shared/src/domain/news-item/service/new-item.service.ts rename to packages/server/libs/shared/src/domain/news-item/service/news-item.service.ts index 307b265cf2..99d8be73b2 100644 --- a/packages/server/libs/shared/src/domain/news-item/service/new-item.service.ts +++ b/packages/server/libs/shared/src/domain/news-item/service/news-item.service.ts @@ -7,16 +7,16 @@ import { ServiceLogger } from '@shared/logger/decorator/service-logger' import { NewsItemDTO } from '../dto/news-item.dto' import { NewsListDTO, PUBLICATION_TYPE } from '../dto/news-list.dto' import { NewsItem } from '../news-item.entity' -import { NewsRepository } from '../news-item.repository' +import { NewsItemRepository } from '../news-item.repository' @Injectable() -export class NewsService { +export class NewsItemService { @ServiceLogger() private readonly logger: Logger constructor( private readonly em: SqlEntityManager, private readonly user: UserContext, - private readonly newsRepo: NewsRepository, + private readonly newsItemRepo: NewsItemRepository, ) {} async listNews(query: NewsListDTO): Promise> { @@ -34,7 +34,7 @@ export class NewsService { typeWhere = { isPublication: query.type !== PUBLICATION_TYPE.ARTICLE } } - return await this.newsRepo.paginate(query, { + return await this.newsItemRepo.paginate(query, { ...whereYear, ...typeWhere, published: true, @@ -46,15 +46,15 @@ export class NewsService { if (query.type === PUBLICATION_TYPE.ARTICLE) whereType = { isPublication: false } if (query.type === PUBLICATION_TYPE.PUBLICATION) whereType = { isPublication: true } - return this.newsRepo.find(whereType, { orderBy: { createdAt: -1 } }) + return this.newsItemRepo.find(whereType, { orderBy: { createdAt: -1 } }) } async listYears(): Promise { - return await this.newsRepo.getDistinctYears() + return await this.newsItemRepo.getDistinctYears() } async getNews(id: number): Promise { - return await this.newsRepo.findOne({ id }) + return await this.newsItemRepo.findOne({ id }) } async deleteNews(id: number): Promise { @@ -79,7 +79,7 @@ export class NewsService { } async updateNews(id: number, body: NewsItemDTO): Promise { - const existing = await this.newsRepo.findOneOrFail({ id }) + const existing = await this.newsItemRepo.findOneOrFail({ id }) const toSave = wrap(existing).assign(body, { mergeObjectProperties: true }) await this.em.persistAndFlush(toSave) } diff --git a/packages/server/libs/shared/src/facade/admin-membership/admin-membership-facade.module.ts b/packages/server/libs/shared/src/facade/admin-membership/admin-membership-facade.module.ts index d0be2fc3a9..6c178615f5 100644 --- a/packages/server/libs/shared/src/facade/admin-membership/admin-membership-facade.module.ts +++ b/packages/server/libs/shared/src/facade/admin-membership/admin-membership-facade.module.ts @@ -5,12 +5,12 @@ import { SpaceMembershipModule } from '@shared/domain/space-membership/space-mem import { UserModule } from '@shared/domain/user/user.module' import { PlatformClientModule } from '@shared/platform-client/platform-client.module' import { CreateAdminMembershipFacade } from './create-admin-membership.facade' -import { ListAdminMembershipFacade } from './list-admin-membership.facade' +import { AdminMembershipsListFacade } from './admin-memberships-list.facade' import { RemoveAdminMembershipFacade } from './remove-admin-membership.facade' @Module({ imports: [AdminMembershipModule, SpaceMembershipModule, SpaceModule, UserModule, PlatformClientModule], - providers: [ListAdminMembershipFacade, CreateAdminMembershipFacade, RemoveAdminMembershipFacade], - exports: [ListAdminMembershipFacade, CreateAdminMembershipFacade, RemoveAdminMembershipFacade], + providers: [AdminMembershipsListFacade, CreateAdminMembershipFacade, RemoveAdminMembershipFacade], + exports: [AdminMembershipsListFacade, CreateAdminMembershipFacade, RemoveAdminMembershipFacade], }) export class AdminMembershipFacadeModule {} diff --git a/packages/server/libs/shared/src/facade/admin-membership/list-admin-membership.facade.ts b/packages/server/libs/shared/src/facade/admin-membership/admin-memberships-list.facade.ts similarity index 94% rename from packages/server/libs/shared/src/facade/admin-membership/list-admin-membership.facade.ts rename to packages/server/libs/shared/src/facade/admin-membership/admin-memberships-list.facade.ts index 24ae15a654..ff84e714a5 100644 --- a/packages/server/libs/shared/src/facade/admin-membership/list-admin-membership.facade.ts +++ b/packages/server/libs/shared/src/facade/admin-membership/admin-memberships-list.facade.ts @@ -5,7 +5,7 @@ import { PaginatedResult } from '@shared/domain/entity/domain/paginated.result' import { UserService } from '@shared/domain/user/service/user.service' @Injectable() -export class ListAdminMembershipFacade { +export class AdminMembershipsListFacade { constructor(private readonly userService: UserService) {} async listUsersWithRoles(query: AdminMembershipPaginationDTO): Promise> { diff --git a/packages/server/libs/shared/test/unit/domain/db-cluster-list.facade.spec.ts b/packages/server/libs/shared/test/unit/domain/db-clusters-list.facade.spec.ts similarity index 96% rename from packages/server/libs/shared/test/unit/domain/db-cluster-list.facade.spec.ts rename to packages/server/libs/shared/test/unit/domain/db-clusters-list.facade.spec.ts index 20acd9fce8..c5cf283e67 100644 --- a/packages/server/libs/shared/test/unit/domain/db-cluster-list.facade.spec.ts +++ b/packages/server/libs/shared/test/unit/domain/db-clusters-list.facade.spec.ts @@ -1,5 +1,5 @@ import { EntityManager } from '@mikro-orm/mysql' -import { DbClusterListFacade } from 'apps/api/src/facade/db-cluster/list-facade/db-cluster-list.facade' +import { DbClustersListFacade } from 'apps/api/src/facade/db-cluster/list-facade/db-clusters-list.facade' import { expect } from 'chai' import { match, stub } from 'sinon' import { STATUS } from '@shared/domain/db-cluster/db-cluster.enum' @@ -16,7 +16,7 @@ import { UserContext } from '@shared/domain/user-context/model/user-context' import { STATIC_SCOPE } from '@shared/enums' import { PermissionError } from '@shared/errors' -describe('DbClusterListFacade', () => { +describe('DbClustersListFacade', () => { const USER_ID = 0 const accessibleSpaces = stub() const USER = { @@ -267,7 +267,7 @@ describe('DbClusterListFacade', () => { expect(result.data).to.have.length(0) }) - function getInstance(): DbClusterListFacade { + function getInstance(): DbClustersListFacade { const em = {} as unknown as EntityManager const dbClusterRepo = { paginate: paginateStub, @@ -291,6 +291,6 @@ describe('DbClusterListFacade', () => { findLicenseRefsByLicenseableIds: findLicenseRefsByLicenseableIdsStub, } as unknown as LicenseService - return new DbClusterListFacade(dbClusterService, userContext, spaceService, spaceMembershipService, licenseService) + return new DbClustersListFacade(dbClusterService, userContext, spaceService, spaceMembershipService, licenseService) } }) diff --git a/packages/server/libs/shared/test/unit/facade/list-admin-membership.facade.spec.ts b/packages/server/libs/shared/test/unit/facade/admin-memberships-list.facade.spec.ts similarity index 90% rename from packages/server/libs/shared/test/unit/facade/list-admin-membership.facade.spec.ts rename to packages/server/libs/shared/test/unit/facade/admin-memberships-list.facade.spec.ts index b525f2aa8d..8c95fa78d8 100644 --- a/packages/server/libs/shared/test/unit/facade/list-admin-membership.facade.spec.ts +++ b/packages/server/libs/shared/test/unit/facade/admin-memberships-list.facade.spec.ts @@ -4,9 +4,9 @@ import { AdminMembershipPaginationDTO } from '@shared/domain/admin-membership/dt import { UserWithAdminRolesDTO } from '@shared/domain/admin-membership/dto/user-with-admin-roles.dto' import { UserService } from '@shared/domain/user/service/user.service' import { User } from '@shared/domain/user/user.entity' -import { ListAdminMembershipFacade } from '@shared/facade/admin-membership/list-admin-membership.facade' +import { AdminMembershipsListFacade } from '@shared/facade/admin-membership/admin-memberships-list.facade' -describe('ListAdminMembershipFacade', () => { +describe('AdminMembershipsListFacade', () => { const paginateUsersWithAdminRolesStub = stub() let fromEntityStub: SinonStub @@ -26,8 +26,8 @@ describe('ListAdminMembershipFacade', () => { fromEntityStub.restore() }) - function getInstance(): ListAdminMembershipFacade { - return new ListAdminMembershipFacade(userService) + function getInstance(): AdminMembershipsListFacade { + return new AdminMembershipsListFacade(userService) } describe('#listUsersWithRoles', () => { From 12329de582a80696e166185f6adf7272a6dd7f82 Mon Sep 17 00:00:00 2001 From: Dave Date: Fri, 5 Jun 2026 08:48:41 +0200 Subject: [PATCH 10/16] PFDA-6878 - refactor: serve static assets through nginx (#3985) Co-authored-by: Shifaiz Mohamed --- .../actions/build-docker-images/action.yml | 4 + docker/.env.example | 20 +- docker/base.services.yml | 6 +- docker/dev.docker-compose.yml | 8 + docs/guides/frontend.md | 6 +- infra/ecs/deploy-ecs-service.py | 5 +- package.json | 3 +- packages/client/README.md | 2 +- packages/client/index.html | 28 ++- .../client/public/assets/beta-release.png | Bin 0 -> 53164 bytes .../public/assets}/participants/23andme.png | Bin .../public/assets}/participants/aacr.jpg | Bin .../public/assets}/participants/aha.png | Bin .../public/assets}/participants/baylor.png | Bin .../participants/blueprint_genetics.png | Bin .../public/assets}/participants/broad.png | Bin .../public/assets}/participants/cdc.png | Bin .../public/assets}/participants/counsyl.png | Bin .../assets}/participants/crystal_genetics.png | Bin .../assets}/participants/dennis_wall.jpg | Bin .../public/assets}/participants/dnanexus.png | Bin .../public/assets}/participants/dream.png | Bin .../public/assets}/participants/edico.png | Bin .../public/assets}/participants/emory.png | Bin .../assets}/participants/euan_ashley.jpg | Bin .../public/assets}/participants/fda.png | Bin .../friends_of_cancer_research.png | Bin .../public/assets}/participants/frontline.png | Bin .../public/assets}/participants/garvan.png | Bin .../public/assets}/participants/genedx.png | Bin .../george_washington_university.png | Bin .../participants/georgetown_university.png | Bin .../assets}/participants/hans_nelsen.jpg | Bin .../assets}/participants/humanlongevity.png | Bin .../public/assets}/participants/illumina.png | Bin .../public/assets}/participants/intel.png | Bin .../public/assets}/participants/ireceptor.png | Bin .../assets}/participants/lester_carter.jpg | Bin .../public/assets}/participants/macrogen.png | Bin .../public/assets}/participants/mark_woon.jpg | Bin .../assets}/participants/mark_wright.jpg | Bin .../public/assets}/participants/miodx.png | Bin .../public/assets}/participants/natera.png | Bin .../public/assets}/participants/nci.png | Bin .../public/assets}/participants/nih.png | Bin .../public/assets}/participants/nist.png | Bin .../public/assets}/participants/ostp.png | Bin .../assets}/participants/personalis.png | Bin .../assets}/participants/peter_tonellato.jpg | Bin .../public/assets}/participants/pharmgkb.png | Bin .../assets}/participants/placeholder.png | Bin .../public/assets}/participants/qiagen.png | Bin .../assets}/participants/rachel_goldfeder.png | Bin .../public/assets}/participants/roche.png | Bin .../public/assets}/participants/rtg.png | Bin .../assets}/participants/russ_altman.jpg | Bin .../public/assets}/participants/sequenom.png | Bin .../public/assets}/participants/seracare.png | Bin .../assets}/participants/snehit_prabhu.jpg | Bin .../public/assets}/participants/stanford.png | Bin .../assets}/participants/teri_klein.jpg | Bin .../us-house-of-representatives.png | Bin .../public/assets}/participants/vha_ie.png | Bin packages/client/public/favicon.png | Bin 0 -> 1945 bytes packages/client/public/og-image.png | Bin 0 -> 6951 bytes packages/client/src/assets/beta-release.png | Bin 0 -> 53164 bytes packages/client/src/features/auth/api.ts | 13 +- .../useFileUploadModal/fileUpload.ts | 6 +- .../useFileUploadModal/worker/api.ts | 18 +- packages/client/src/hooks/usePageMeta.tsx | 17 +- .../client/src/hooks/useRailsFlashMessages.ts | 28 +++ packages/client/src/index.html | 17 -- packages/client/src/index.tsx | 29 ++- packages/client/src/lib/pageMeta.ts | 85 +++++++ packages/client/src/pages/AboutPage/index.tsx | 3 +- packages/client/src/routes/root.tsx | 14 +- packages/client/src/utils/api.ts | 56 +++-- packages/client/src/utils/csrf.ts | 52 +++++ packages/client/vite.config.ts | 12 +- packages/nginx/default.conf.template | 178 ++++++++++++-- packages/nginx/docker/images/Dockerfile | 28 +++ packages/nginx/entrypoint.sh | 14 ++ packages/nginx/nginx.conf | 220 +++++++++++++++++- .../app/controllers/api/base_controller.rb | 29 +++ .../rails/app/controllers/main_controller.rb | 2 +- packages/rails/app/helpers/vite_helper.rb | 51 ---- .../app/views/_partials/_btn_publish.html.erb | 2 +- .../app/views/_partials/_head_react.html.erb | 5 - .../rails/app/views/experts/edit.html.erb | 2 +- packages/rails/app/views/experts/new.html.erb | 2 +- packages/rails/config/routes.rb | 4 + .../docker/entrypoint/prod.entrypoint.sh | 1 - packages/rails/docker/images/Dockerfile | 19 -- .../api/src/session/csrf-token.controller.ts | 43 ++++ .../api/src/session/session.api.module.ts | 3 +- 95 files changed, 824 insertions(+), 211 deletions(-) create mode 100644 packages/client/public/assets/beta-release.png rename packages/{rails/app/assets/images => client/public/assets}/participants/23andme.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/aacr.jpg (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/aha.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/baylor.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/blueprint_genetics.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/broad.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/cdc.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/counsyl.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/crystal_genetics.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/dennis_wall.jpg (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/dnanexus.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/dream.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/edico.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/emory.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/euan_ashley.jpg (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/fda.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/friends_of_cancer_research.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/frontline.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/garvan.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/genedx.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/george_washington_university.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/georgetown_university.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/hans_nelsen.jpg (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/humanlongevity.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/illumina.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/intel.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/ireceptor.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/lester_carter.jpg (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/macrogen.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/mark_woon.jpg (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/mark_wright.jpg (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/miodx.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/natera.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/nci.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/nih.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/nist.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/ostp.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/personalis.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/peter_tonellato.jpg (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/pharmgkb.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/placeholder.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/qiagen.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/rachel_goldfeder.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/roche.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/rtg.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/russ_altman.jpg (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/sequenom.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/seracare.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/snehit_prabhu.jpg (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/stanford.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/teri_klein.jpg (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/us-house-of-representatives.png (100%) rename packages/{rails/app/assets/images => client/public/assets}/participants/vha_ie.png (100%) create mode 100644 packages/client/public/favicon.png create mode 100644 packages/client/public/og-image.png create mode 100644 packages/client/src/assets/beta-release.png create mode 100644 packages/client/src/hooks/useRailsFlashMessages.ts delete mode 100644 packages/client/src/index.html create mode 100644 packages/client/src/lib/pageMeta.ts create mode 100644 packages/client/src/utils/csrf.ts delete mode 100644 packages/rails/app/helpers/vite_helper.rb create mode 100644 packages/server/apps/api/src/session/csrf-token.controller.ts diff --git a/.github/actions/build-docker-images/action.yml b/.github/actions/build-docker-images/action.yml index a16b9c6080..37432506fc 100644 --- a/.github/actions/build-docker-images/action.yml +++ b/.github/actions/build-docker-images/action.yml @@ -74,6 +74,10 @@ runs: SHA_CLIENT=$(git rev-parse HEAD:packages/client) SHA_RAILS=$(git rev-parse HEAD:packages/rails) SHORT_SHA=$(echo "${SHA_CLIENT}_${SHA_RAILS}" | sha1sum | cut -c1-7) + elif [ "${{ inputs.package }}" == "nginx" ]; then + SHA_CLIENT=$(git rev-parse HEAD:packages/client) + SHA_NGINX=$(git rev-parse HEAD:packages/nginx) + SHORT_SHA=$(echo "${SHA_CLIENT}_${SHA_NGINX}" | sha1sum | cut -c1-7) else SHORT_SHA=$(git rev-parse --short HEAD:packages/${{ inputs.package }}) fi diff --git a/docker/.env.example b/docker/.env.example index d6baf9a6fd..46de7ce614 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -22,12 +22,18 @@ SKIP_DB_SETUP=0 NODEJS_DB_POLLING_INTERVAL=5 # When 0, Nest dev runs without --watch (faster container stops). Default 1 (watch enabled). -NODE_DEV_WATCH=1 +NODE_DEV_WATCH=0 -# URL - nodejs API url -NODE_API_URL=https://host.docker.internal:3001 -# URL - ruby API url -RUBY_API_URL=https://host.docker.internal:5012 -DOCS_URL=http://host.docker.internal:4040 -# for native node +# Upstream URLs for the nginx container (Docker Compose service names, not host ports). +# Do NOT use host.docker.internal here — host port 3001 is often occupied by a local +# Node/Vite process speaking plain HTTP, which causes SSL handshake failures (502). +NODE_API_URL=https://nodejs-api:3001 +RUBY_API_URL=https://web:3000 +DOCS_URL=http://docs:4040 + +RECAPTCHA_SITE_KEY=NEED_A_KEY_4_TEST + +# VITE_OUT_DIR=dist +# Only when running Node/Rails natively on the host (outside Docker): # NODE_API_URL=https://host.docker.internal:3001 +# RUBY_API_URL=https://host.docker.internal:3005 diff --git a/docker/base.services.yml b/docker/base.services.yml index 15d52732da..4a85aaebb4 100644 --- a/docker/base.services.yml +++ b/docker/base.services.yml @@ -30,7 +30,7 @@ services: - ../key.pem:/key.pem working_dir: /precision-fda ports: - - "5012:3000" + - "3005:3000" extra_hosts: - "host.docker.internal:host-gateway" entrypoint: ./docker/entrypoint/dev.entrypoint.sh @@ -45,11 +45,10 @@ services: args: - FRONTEND_IMAGE_TAG=24.15.0-slim environment: - - VITE_OUT_DIR=dist - SKIP_FRONTEND_DEPS_SETUP=${SKIP_FRONTEND_DEPS_SETUP} volumes: - type: bind - source: ../packages/rails/public/packs + source: ../packages/client/dist target: /precision-fda/dist working_dir: /precision-fda command: pnpm run build @@ -121,5 +120,6 @@ services: - ../cert.pem:/keys/cert.pem - ../key.pem:/keys/key.pem - ../packages/nginx:/etc/nginx/templates + - ../packages/client/dist:/usr/share/nginx/html:ro ports: - "3000:443" diff --git a/docker/dev.docker-compose.yml b/docker/dev.docker-compose.yml index 881cd94c5e..3870dad3c2 100644 --- a/docker/dev.docker-compose.yml +++ b/docker/dev.docker-compose.yml @@ -40,6 +40,7 @@ services: dockerfile: ./docker/images/dev.Dockerfile environment: - SKIP_FRONTEND_DEPS_SETUP=${SKIP_FRONTEND_DEPS_SETUP} + - VITE_OUT_DIR=dist volumes: - type: volume source: vite-cache-client @@ -141,3 +142,10 @@ services: extends: file: ./base.services.yml service: nginx + depends_on: + nodejs-api: + condition: service_started + web: + condition: service_started + docs: + condition: service_started diff --git a/docs/guides/frontend.md b/docs/guides/frontend.md index 20240db1e1..b013716159 100644 --- a/docs/guides/frontend.md +++ b/docs/guides/frontend.md @@ -438,11 +438,7 @@ export async function deleteItem(id: number) { } ``` -CSRF tokens are set globally in `src/index.tsx`: - -```tsx -Axios.defaults.headers.common['X-CSRF-Token'] = getAuthenticityToken() -``` +CSRF tokens are attached per request in `src/index.tsx` via an axios interceptor that calls `getCsrfToken()` from `@/utils/csrf` for non-GET requests. Fetch-based code (e.g. upload workers) should import helpers from the same module. --- diff --git a/infra/ecs/deploy-ecs-service.py b/infra/ecs/deploy-ecs-service.py index 78237697f4..b5a472b777 100644 --- a/infra/ecs/deploy-ecs-service.py +++ b/infra/ecs/deploy-ecs-service.py @@ -73,7 +73,8 @@ def __init__(self, services_file="services.yml"): self.stages = [ ["pfda-db-migrate"], ["pfda-nodejs-api", "pfda-nodejs-api-internal", "pfda-nodejs-worker", - "pfda-nodejs-admin-platform-client", "pfda-web", "pfda-docs", "pfda-nginx"] + "pfda-nodejs-admin-platform-client", "pfda-docs", "pfda-nginx"], + ["pfda-web"] ] if self.deployment_type == "gsrs": @@ -725,6 +726,8 @@ def _get_ssm_secrets(self, service_name, service_config): ecs_secrets.append({"name": "SSL_CERT", "valueFrom": param["Name"]}) elif param["Name"].endswith("/environment/UNII_HOST"): ecs_secrets.append({"name": "UNII_HOST", "valueFrom": param["Name"]}) + elif param["Name"].endswith("RECAPTCHA_SITE_KEY"): + ecs_secrets.append({"name": "RECAPTCHA_SITE_KEY", "valueFrom": param["Name"]}) elif not any(excl in service_name.lower() for excl in exclusions): # Include other parameters only if service is not Nginx ecs_secrets.append({"name": param["Name"].split("/")[-1], "valueFrom": param["Name"]}) diff --git a/package.json b/package.json index f43c3b84b7..339ef5d18e 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "packageManager": "pnpm@11.1.1", "scripts": { "build": "turbo run build", - "test": "turbo run test" + "test": "turbo run test", + "compose:up": "docker compose --env-file docker/.env -p precision-fda -f docker/arm64v8.dev.docker-compose.yml up --build" }, "repository": {}, "author": "", diff --git a/packages/client/README.md b/packages/client/README.md index be4716cc00..e129ebabd7 100644 --- a/packages/client/README.md +++ b/packages/client/README.md @@ -65,7 +65,7 @@ docker compose -p precision-fda --env-file docker/.env -f docker/dev.docker-comp | Service | Description | Port | |-----------------|-----------------------|----------------------| | `frontend` | Vite build for client | - | -| `web` | Rails API server | 5012 (internal 3000) | +| `web` | Rails API server | 3005 (internal 3000) | | `nodejs-api` | Node.js API server | 3001 | | `nodejs-worker` | Background worker | - | | `nginx` | Reverse proxy | 3000 (HTTPS) | diff --git a/packages/client/index.html b/packages/client/index.html index e6b2580254..18a32efd53 100644 --- a/packages/client/index.html +++ b/packages/client/index.html @@ -1,9 +1,31 @@ - - - pFDA + + + + + + + + + + + + + + + precisionFDA + diff --git a/packages/client/public/assets/beta-release.png b/packages/client/public/assets/beta-release.png new file mode 100644 index 0000000000000000000000000000000000000000..f7998e9438a74b6e322c6e157a7f63c85d459a18 GIT binary patch literal 53164 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%0AgzQfkxL%Ln-MmQ{`s76$DIPbab#G2 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 literal 0 HcmV?d00001 diff --git a/packages/client/src/assets/beta-release.png b/packages/client/src/assets/beta-release.png new file mode 100644 index 0000000000000000000000000000000000000000..f7998e9438a74b6e322c6e157a7f63c85d459a18 GIT binary patch literal 53164 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%0AgzQfkxL%Ln-MmQ{`s76$DIPbab#G2 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 { this.resolveStart = resolve this.rejectStart = reject @@ -107,7 +109,7 @@ export class FileUploadController { baseDelayMs: this.config.retryBackoffMs ?? DEFAULT_RETRY_BACKOFF_MS, }, concurrency: this.config.concurrency ?? DEFAULT_CHUNK_CONCURRENCY, - csrfToken: getAuthenticityToken() ?? undefined, + csrfToken: csrfToken, } this.worker.postMessage({ diff --git a/packages/client/src/features/files/actionModals/useFileUploadModal/worker/api.ts b/packages/client/src/features/files/actionModals/useFileUploadModal/worker/api.ts index 66357dd862..c7655430f1 100644 --- a/packages/client/src/features/files/actionModals/useFileUploadModal/worker/api.ts +++ b/packages/client/src/features/files/actionModals/useFileUploadModal/worker/api.ts @@ -2,20 +2,16 @@ * API request functions for file upload operations */ +import { buildCsrfHeaders, fetchCsrfToken } from '@/utils/csrf' import { ChunkUploadError, CreateFileError } from './errors' import type { UploadUrlResponse, WorkerSession } from './types' import { cleanObject, toError } from './utils' function buildRequestHeaders(csrfToken?: string): Record { - const headers: Record = { + return { 'Content-Type': 'application/json', + ...buildCsrfHeaders(csrfToken), } - - if (csrfToken) { - headers['X-CSRF-Token'] = csrfToken - } - - return headers } /** @@ -134,10 +130,14 @@ export async function requestUploadUrl( /** * Close a file after all chunks are uploaded */ -export async function closeFileRequest(uid: string, csrfToken?: string): Promise { +export async function closeFileRequest(uid: string, _csrfToken?: string): Promise { + // Always fetch a fresh CSRF token before closing — the original token may + // have been null at the start of the upload, or may have been rotated + // during a long-running upload. + const freshToken = (await fetchCsrfToken()) ?? _csrfToken ?? undefined const response = await fetch(`/api/v2/files/${uid}/close`, { method: 'PATCH', - headers: buildRequestHeaders(csrfToken), + headers: buildRequestHeaders(freshToken), }) if (!response.ok) { diff --git a/packages/client/src/hooks/usePageMeta.tsx b/packages/client/src/hooks/usePageMeta.tsx index dc36d4ae7f..3b1402f598 100644 --- a/packages/client/src/hooks/usePageMeta.tsx +++ b/packages/client/src/hooks/usePageMeta.tsx @@ -1,12 +1,15 @@ import { useEffect } from 'react' +import { applyPageMeta, PAGE_META, type PageMetaInput } from '@/lib/pageMeta' -const defaultDescription = 'Advancing regulatory standards for bioinformatics, RWD, and AI, through community-sourced science.' +export type UsePageMetaOptions = PageMetaInput -export const usePageMeta = ({ title = 'PFDA', description = defaultDescription }: { title?: string; description?: string }) => { +export const usePageMeta = ({ + title = PAGE_META.defaultTitle, + description = PAGE_META.defaultDescription, + imagePath, + url, +}: UsePageMetaOptions = {}) => { useEffect(() => { - if (document) { - document.title = title - document.querySelector("meta[name='description']")?.setAttribute('content', description) - } - }, [title, description]) + applyPageMeta({ title, description, imagePath, url }) + }, [title, description, imagePath, url]) } diff --git a/packages/client/src/hooks/useRailsFlashMessages.ts b/packages/client/src/hooks/useRailsFlashMessages.ts new file mode 100644 index 0000000000..c28f7a9453 --- /dev/null +++ b/packages/client/src/hooks/useRailsFlashMessages.ts @@ -0,0 +1,28 @@ +import { useEffect } from 'react' +import { displayPayloadMessage, type Payload } from '@/utils/api' + +export function useRailsFlashMessages() { + useEffect(() => { + let isCancelled = false + + const fetchFlashMessages = async () => { + try { + const response = await fetch('/api/flash_messages', { credentials: 'same-origin' }) + if (!response.ok) return + + const payload: Payload = await response.json() + if (!isCancelled) { + displayPayloadMessage(payload) + } + } catch (error) { + console.error('Failed to fetch Rails flash messages', error) + } + } + + void fetchFlashMessages() + + return () => { + isCancelled = true + } + }, []) +} diff --git a/packages/client/src/index.html b/packages/client/src/index.html deleted file mode 100644 index d16e391691..0000000000 --- a/packages/client/src/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - pFDA - - - -
- - diff --git a/packages/client/src/index.tsx b/packages/client/src/index.tsx index 69dd1ae0c4..46070ba008 100644 --- a/packages/client/src/index.tsx +++ b/packages/client/src/index.tsx @@ -6,8 +6,9 @@ import { loadRuntimeEnv } from '@/utils/runtimeEnv' import './styles/tailwind.css' import './styles/variables.css' import './styles/app-globals.css' +import { applyPageMeta } from '@/lib/pageMeta' import Root from './routes/root' -import { getAuthenticityToken } from './utils/api' +import { getCsrfToken } from './utils/csrf' async function enableMocking() { if (!ENABLE_DEV_MSW) { @@ -26,20 +27,34 @@ async function enableMocking() { }) } -Axios.defaults.headers.common['X-CSRF-Token'] = getAuthenticityToken() +Axios.interceptors.request.use(async config => { + const method = config.method?.toLowerCase() + if (method && !['get', 'head', 'options'].includes(method)) { + const token = await getCsrfToken() + if (token) { + config.headers['X-CSRF-Token'] = token + } + } + return config +}) const renderApp = () => { + applyPageMeta() + const container = document.getElementById('app-root') - const root = createRoot(container!) + if (!container) { + return + } - if (container) { - ReactModal.setAppElement('#app-root') - loadRuntimeEnv().then(() => { + const root = createRoot(container) + ReactModal.setAppElement('#app-root') + loadRuntimeEnv().then(() => { + getCsrfToken().then(() => { enableMocking().then(() => { root.render() }) }) - } + }) } document.addEventListener('DOMContentLoaded', renderApp) document.addEventListener('page:load', renderApp) diff --git a/packages/client/src/lib/pageMeta.ts b/packages/client/src/lib/pageMeta.ts new file mode 100644 index 0000000000..14b74879dd --- /dev/null +++ b/packages/client/src/lib/pageMeta.ts @@ -0,0 +1,85 @@ +export const PAGE_META = { + siteName: 'precisionFDA', + defaultTitle: 'precisionFDA', + defaultDescription: + 'A secure, collaborative, cloud-based high-performance computing environment advancing regulatory science and AI innovation for the FDA.', + imageFile: 'og-image.png', + type: 'website', + locale: 'en_US', + twitterCard: 'summary_large_image', +} as const + +export type PageMetaInput = { + title?: string + description?: string + imagePath?: string + url?: string +} + +const metaAttribute = (attribute: 'name' | 'property', key: string): string => `meta[${attribute}="${key}"]` + +const setMetaContent = (attribute: 'name' | 'property', key: string, content: string): void => { + if (typeof document === 'undefined') { + return + } + + let element = document.querySelector(metaAttribute(attribute, key)) + if (!element) { + element = document.createElement('meta') + element.setAttribute(attribute, key) + document.head.appendChild(element) + } + element.setAttribute('content', content) +} + +export const resolveAssetUrl = (path: string): string => { + const base = import.meta.env.BASE_URL || '/' + const normalizedBase = base.endsWith('/') ? base : `${base}/` + const normalizedPath = path.startsWith('/') ? path.slice(1) : path + return new URL(`${normalizedBase}${normalizedPath}`, window.location.origin).href +} + +export const resolvePageMeta = ({ + title = PAGE_META.defaultTitle, + description = PAGE_META.defaultDescription, + imagePath = PAGE_META.imageFile, + url, +}: PageMetaInput = {}) => { + const pageUrl = url ?? (typeof window !== 'undefined' ? window.location.href : undefined) + + return { + title, + description, + imageUrl: typeof window !== 'undefined' ? resolveAssetUrl(imagePath) : undefined, + url: pageUrl, + } +} + +export const applyPageMeta = (input: PageMetaInput = {}): void => { + if (typeof document === 'undefined') { + return + } + + const { title, description, imageUrl, url } = resolvePageMeta(input) + + document.title = title + + setMetaContent('name', 'description', description) + setMetaContent('property', 'og:title', title) + setMetaContent('property', 'og:description', description) + setMetaContent('property', 'og:site_name', PAGE_META.siteName) + setMetaContent('property', 'og:type', PAGE_META.type) + setMetaContent('property', 'og:locale', PAGE_META.locale) + setMetaContent('name', 'twitter:card', PAGE_META.twitterCard) + setMetaContent('name', 'twitter:title', title) + setMetaContent('name', 'twitter:description', description) + + if (imageUrl) { + setMetaContent('property', 'og:image', imageUrl) + setMetaContent('name', 'twitter:image', imageUrl) + } + + if (url) { + setMetaContent('property', 'og:url', url) + } +} diff --git a/packages/client/src/pages/AboutPage/index.tsx b/packages/client/src/pages/AboutPage/index.tsx index da14833429..c59b29c2ed 100644 --- a/packages/client/src/pages/AboutPage/index.tsx +++ b/packages/client/src/pages/AboutPage/index.tsx @@ -1,4 +1,5 @@ import { useState } from 'react' +import betaReleaseTimeline from '../../assets/beta-release.png' import { Button } from '../../components/Button' import NavigationBar from '../../components/NavigationBar/NavigationBar' import { PageContainerMargin } from '../../components/Page/page.styles' @@ -73,7 +74,7 @@ const AboutPage = () => {

- Beta release Timeline: Beta launch on Dec 2015 + Beta release Timeline: Beta launch on Dec 2015

diff --git a/packages/client/src/routes/root.tsx b/packages/client/src/routes/root.tsx index bd96c04d4e..c274c6e343 100644 --- a/packages/client/src/routes/root.tsx +++ b/packages/client/src/routes/root.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react' +import React, { useEffect } from 'react' import 'react-tooltip/dist/react-tooltip.css' import { QueryClientProvider } from '@tanstack/react-query' import { createBrowserRouter, Navigate, Outlet, useLocation } from 'react-router' @@ -8,6 +8,7 @@ import { ExpiringSessionModal } from '@/features/auth/ExpiringSessionModal' import { SessionExpiredModal } from '@/features/auth/SessionExpiredModal' import { FileUploadModalProvider } from '@/features/files/actionModals/useFileUploadModal' import { useModal } from '@/features/modal/useModal' +import { useRailsFlashMessages } from '@/hooks/useRailsFlashMessages' import { LayoutLoader, UserLayout } from '@/layouts/UserLayout' import { OnlineStatusProvider } from '@/utils/OnlineStatusContext' import { PFDAToastContainer } from '@/utils/PFDAToastContainer' @@ -69,23 +70,16 @@ const AdminRouteRedirect = () => { const RootComponent = () => { const sessionExpiredModal = useModal() const expiringSessionModal = useModal() - const [railsAlertHeight, setRailsAlertHeight] = useState(0) useEffect(() => { setAuthFailureCallback(() => sessionExpiredModal.setShowModal(true)) }, []) - useEffect(() => { - // Calculate the height of the rails-alert element - const alertElement = document.querySelector('.rails-alert') - if (alertElement) { - setRailsAlertHeight(alertElement.clientHeight as number) - } - }, []) + useRailsFlashMessages() return ( - + diff --git a/packages/client/src/utils/api.ts b/packages/client/src/utils/api.ts index 28ff7d3993..8ee54923d9 100644 --- a/packages/client/src/utils/api.ts +++ b/packages/client/src/utils/api.ts @@ -1,10 +1,11 @@ import axios from 'axios' -import { toastError, toastSuccess, toastWarning } from '../components/NotificationCenter/ToastHelper' +import { toastError, toastInfo, toastSuccess, toastWarning } from '../components/NotificationCenter/ToastHelper' export enum MESSAGE_TYPE { SUCCESS = 'success', WARNING = 'warning', ERROR = 'error', + INFO = 'info', } interface PayloadMessage { @@ -23,44 +24,55 @@ export interface Payload { } } -export const displayPayloadMessage = (payload: Payload) => { - // The response messaging from the API is a bit eclectic, as seen with the following scenarios that - // we've seen (so far). Thus this function needs to be able to handle the delivery of messages to - // the user under all scenarios. - // - // In general: { message: { type: "success", text: "hello" }} - // /api/files/copy: { message: { type: "success", text: ["hello1", ... ]}} - // /api/spaces/{id}/files/move_nodes: { meta: { messages: [ { type: "success", message: "hello" }, ... ]}} +const getMessageTexts = (message: PayloadMessage): string[] => { + const text = message.text ?? message.message + if (Array.isArray(text)) return text.filter(Boolean) + return text ? [text] : [] +} - // TODO: consolidate backend message format, perhaps making messages a string[] for all responses +const displayMessage = (message: PayloadMessage) => { + const texts = getMessageTexts(message) - const message = Array.isArray(payload.meta?.messages) ? payload.meta.messages[0] : payload.message - if (message) { - const errorMessage = Array.isArray(message.text) ? message.text[0] : (message.text ?? message.message) - console.log(errorMessage) + texts.forEach(text => { switch (message.type) { case MESSAGE_TYPE.SUCCESS: - toastSuccess(errorMessage) + toastSuccess(text) break case MESSAGE_TYPE.WARNING: - toastWarning(errorMessage) + toastWarning(text) + break + case MESSAGE_TYPE.INFO: + toastInfo(text) break case MESSAGE_TYPE.ERROR: - toastError(errorMessage) + toastError(text) break default: break } + }) +} + +export const displayPayloadMessage = (payload: Payload) => { + // The response messaging from the API is a bit eclectic, as seen with the following scenarios that + // we've seen (so far). Thus this function needs to be able to handle the delivery of messages to + // the user under all scenarios. + // + // In general: { message: { type: "success", text: "hello" }} + // /api/files/copy: { message: { type: "success", text: ["hello1", ... ]}} + // /api/spaces/{id}/files/move_nodes: { meta: { messages: [ { type: "success", message: "hello" }, ... ]}} + + // TODO: consolidate backend message format, perhaps making messages a string[] for all responses + + if (Array.isArray(payload.meta?.messages) && payload.meta.messages.length > 0) { + payload.meta.messages.forEach(displayMessage) + } else if (payload.message) { + displayMessage(payload.message) } else if (payload.error) { toastError(payload.error.message) } } -export const getAuthenticityToken = () => { - const CSRFHolder = document.getElementsByName('csrf-token')[0] as HTMLMetaElement - return CSRFHolder ? CSRFHolder.content : null -} - export const refreshSession = async (): Promise => { return axios.get('/api/v2/session/refresh').then(() => {}) } diff --git a/packages/client/src/utils/csrf.ts b/packages/client/src/utils/csrf.ts new file mode 100644 index 0000000000..7445651f04 --- /dev/null +++ b/packages/client/src/utils/csrf.ts @@ -0,0 +1,52 @@ +const CSRF_TOKEN_URL = '/api/v2/csrf-token' + +let cachedCsrfToken: string | null = null +let csrfTokenPromise: Promise | null = null + +/** + * Fetch a CSRF token from the server without using the cache. + * Use when a fresh token is required (e.g. end of a long upload). + */ +export async function fetchCsrfToken(): Promise { + try { + const response = await fetch(CSRF_TOKEN_URL, { credentials: 'same-origin' }) + if (!response.ok) return null + const data = await response.json() + return data.token ?? null + } catch { + return null + } +} + +/** + * Return a cached CSRF token, coalescing concurrent cache misses into one request. + */ +export const getCsrfToken = async (): Promise => { + if (cachedCsrfToken) return cachedCsrfToken + if (csrfTokenPromise) return csrfTokenPromise + + csrfTokenPromise = fetchCsrfToken() + .then(token => { + cachedCsrfToken = token + return token + }) + .catch(e => { + console.error('Failed to fetch CSRF token', e) + return null + }) + .finally(() => { + csrfTokenPromise = null + }) + + return csrfTokenPromise +} + +export const clearCsrfToken = (): void => { + cachedCsrfToken = null + csrfTokenPromise = null +} + +export function buildCsrfHeaders(token?: string | null): Record { + if (!token) return {} + return { 'X-CSRF-Token': token } +} diff --git a/packages/client/vite.config.ts b/packages/client/vite.config.ts index f2c04ceffb..29af0a60ac 100644 --- a/packages/client/vite.config.ts +++ b/packages/client/vite.config.ts @@ -36,8 +36,8 @@ export default defineConfig(({ command, mode }) => { ] return { - // Base path for rails production - chunks will be loaded from /packs/ - base: isProduction ? '/packs/' : '/', + // Base path: defaults to '/'. Set VITE_BASE_PATH='/packs/' when building for Rails. + base: env.VITE_BASE_PATH || '/', resolve: { tsconfigPaths: true, @@ -73,12 +73,16 @@ export default defineConfig(({ command, mode }) => { build: { target: 'es2022', assetsInlineLimit: filePath => (fontAssetPattern.test(filePath) ? false : undefined), - outDir: env.VITE_OUT_DIR || (isProduction ? '../rails/public/packs' : 'dist'), + outDir: env.VITE_OUT_DIR || 'dist', + assetsDir: 'static', emptyOutDir: true, manifest: true, sourcemap: !isProduction, rolldownOptions: { - input: path.resolve(__dirname, 'src/index.tsx'), + // Temporary adding input for transitioning to hosting through nginx. + ...(env.VITE_BASE_PATH && { + input: path.resolve(__dirname, 'src/index.tsx'), + }), output: { format: 'es', entryFileNames: 'bundle-[hash].js', diff --git a/packages/nginx/default.conf.template b/packages/nginx/default.conf.template index f3811dd447..6b3dfa02eb 100644 --- a/packages/nginx/default.conf.template +++ b/packages/nginx/default.conf.template @@ -1,8 +1,3 @@ -map $uri $proxy_uri { - default ""; - ~^/api/create_file$ /files; -} - server { listen 443 ssl; listen [::]:443 ssl; @@ -12,6 +7,9 @@ server { ssl_certificate /keys/cert.pem; ssl_certificate_key /keys/key.pem; + root /usr/share/nginx/html; + index index.html; + location /docs { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; @@ -54,16 +52,13 @@ server { return 301 $scheme://$http_host/api/v2/files/$1/$2$is_args$args; } - location / { - proxy_set_header Host $http_host; + location = /api/create_file { + proxy_pass ${NODE_API_URL}/files; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $http_host; proxy_http_version 1.1; - resolver 127.0.0.11 valid=30s; - set $pfda_upstream ${RUBY_API_URL}; - if ($proxy_uri) { - set $pfda_upstream ${NODE_API_URL}$proxy_uri; - } - proxy_pass $pfda_upstream; + proxy_redirect off; } # Redirect deprecated singular /job/ path to plural /jobs/ @@ -74,6 +69,163 @@ server { location /api/v2/ { proxy_pass ${NODE_API_URL}/; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Host $http_host; + proxy_http_version 1.1; + } + + location /api/docs/ { + proxy_pass ${NODE_API_URL}/api/docs/; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Host $http_host; + proxy_http_version 1.1; + } + + location ~ ^/(logout|return_from_login|login|pdfs|notes|comparisons|licenses|users|profile|guidelines|jobs|set_tags|presskit)(/|$) { + proxy_pass ${RUBY_API_URL}; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $http_host; + proxy_http_version 1.1; + proxy_redirect off; + } + + location ~ ^/(apps|workflows|jobs|files|assets|comparisons|notes)/.+/comments(/.*)?$ { + proxy_pass ${RUBY_API_URL}; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $http_host; + proxy_http_version 1.1; + } + + location = /experts/new { + proxy_pass ${RUBY_API_URL}; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $http_host; + proxy_http_version 1.1; + } + + location = /experts/create { + proxy_pass ${RUBY_API_URL}; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $http_host; + proxy_http_version 1.1; + } + + location ~ ^/experts/.+/(edit|qa)/?$ { + proxy_pass ${RUBY_API_URL}; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $http_host; + proxy_http_version 1.1; + } + + location ~ ^/challenges/.+/(editor/resources|challenge_resources/new)/?$ { + proxy_pass ${RUBY_API_URL}; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $http_host; + proxy_http_version 1.1; + } + + location = /workflows/new { + proxy_pass ${RUBY_API_URL}; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $http_host; + proxy_http_version 1.1; + } + + location ~ ^/workflows/.+/(edit|fork)/?$ { + proxy_pass ${RUBY_API_URL}; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $http_host; + proxy_http_version 1.1; + } + + location ~ ^/workflows/.+/(batch_workflow|run_batch|terminate_batch|output_folders_list|output_folder_create|output_folder_update)/?$ { + proxy_pass ${RUBY_API_URL}; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $http_host; + proxy_http_version 1.1; + } + + location = /workflows/convert_file_with_strings { + proxy_pass ${RUBY_API_URL}; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $http_host; + proxy_http_version 1.1; + } + + location ~ ^/apps/.+/(export|cwl_export|wdl_export)/?$ { + proxy_pass ${RUBY_API_URL}; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $http_host; + proxy_http_version 1.1; + } + + location ~ ^/workflows/.+/(cwl_export|wdl_export)/?$ { + proxy_pass ${RUBY_API_URL}; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $http_host; + proxy_http_version 1.1; + } + + location ~ ^/admin/(comparator_settings|org_action_requests)(/|$) { + proxy_pass ${RUBY_API_URL}; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $http_host; + proxy_http_version 1.1; + proxy_redirect off; + } + + location ~ ^/admin/activity_reports(/|$) { + proxy_pass ${RUBY_API_URL}; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $http_host; + proxy_http_version 1.1; + proxy_redirect off; + } + + location = /admin/users_list { + proxy_pass ${RUBY_API_URL}; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $http_host; proxy_http_version 1.1; } + + # Client build ships /assets/participants/* etc.; Rails asset pipeline serves the rest. + location /assets/ { + try_files $uri @rails_assets; + } + + location @rails_assets { + proxy_pass ${RUBY_API_URL}; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $http_host; + proxy_http_version 1.1; + } + + location /api/ { + proxy_pass ${RUBY_API_URL}; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $http_host; + proxy_http_version 1.1; + proxy_redirect off; + } + + location / { + try_files $uri $uri/ /index.html; + } } diff --git a/packages/nginx/docker/images/Dockerfile b/packages/nginx/docker/images/Dockerfile index 96c6bd034d..b66fe9d54e 100644 --- a/packages/nginx/docker/images/Dockerfile +++ b/packages/nginx/docker/images/Dockerfile @@ -1,3 +1,24 @@ +FROM node:22.15.0-slim AS client-builder + +WORKDIR /app + +RUN apt-get update && \ + apt-get install -y --no-install-recommends build-essential python3 && \ + rm -rf /var/lib/apt/lists/* + +RUN npm install -g pnpm@10.10.0 + +COPY packages/client/package.json ./package.json +COPY packages/client/pnpm-lock.yaml ./pnpm-lock.yaml +COPY packages/client/pnpm-workspace.yaml ./pnpm-workspace.yaml + +RUN pnpm install --frozen-lockfile + +COPY packages/client/ . + +ENV VITE_OUT_DIR=/app/dist +RUN pnpm run build + FROM nginx:stable-alpine # Create SSL directory @@ -12,6 +33,13 @@ RUN adduser -S -G www-data www-data COPY packages/nginx/nginx.conf /etc/nginx/nginx.conf COPY packages/nginx/json_analytics_log_format_for_prometheus.conf /etc/nginx/conf.d/ + +# Remove default nginx content +RUN rm -rf /usr/share/nginx/html/* + +# Copy built client assets +COPY --from=client-builder /app/dist /usr/share/nginx/html + # Entrypoint COPY packages/nginx/entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh diff --git a/packages/nginx/entrypoint.sh b/packages/nginx/entrypoint.sh index 92523a92da..69e3295e43 100644 --- a/packages/nginx/entrypoint.sh +++ b/packages/nginx/entrypoint.sh @@ -7,5 +7,19 @@ echo "$SSL_KEY" > /etc/nginx/ssl/pfda.key sed -i "s|\${UNII_HOST}|$UNII_HOST|g" /etc/nginx/nginx.conf +RUNTIME_ENV_DIR="/usr/share/nginx/html/env" +RUNTIME_ENV_PATH="${RUNTIME_ENV_DIR}/keys.json" + +mkdir -p "$RUNTIME_ENV_DIR" + +cat > "$RUNTIME_ENV_PATH" < <% if can_be_public %> - <%= link_to publish_path + "?" + { identifier: item.uid, type: item.klass }.to_param, method: :get, class: "btn btn-success #{defined?(classes) ? classes : ''}" do %> + <%= link_to publish_path + "?" + { identifier: item.uid, type: item.klass }.to_param, data: { turbolinks: false }, class: "btn btn-success #{defined?(classes) ? classes : ''}" do %> Publish publicly <% end %> <% end %> diff --git a/packages/rails/app/views/_partials/_head_react.html.erb b/packages/rails/app/views/_partials/_head_react.html.erb index fb9673f0f1..ff0fc35fe9 100644 --- a/packages/rails/app/views/_partials/_head_react.html.erb +++ b/packages/rails/app/views/_partials/_head_react.html.erb @@ -1,8 +1,3 @@ <%= render '_partials/head_common' %> <%= javascript_include_tag 'next_application' %> - -<% vite_css_paths("src/index.tsx").each do |css_path| %> - -<% end %> - diff --git a/packages/rails/app/views/experts/edit.html.erb b/packages/rails/app/views/experts/edit.html.erb index 366e4fa3b7..e5379d684e 100644 --- a/packages/rails/app/views/experts/edit.html.erb +++ b/packages/rails/app/views/experts/edit.html.erb @@ -10,7 +10,7 @@
- <%= form_for @expert, url: expert_path(@expert), method: :put, html: {class: 'form form-horizontal'} do |f| %> + <%= form_for @expert, url: update_expert_path(@expert), method: :post, html: {class: 'form form-horizontal'} do |f| %> <%= render "experts/form_fields", f: f %> diff --git a/packages/rails/app/views/experts/new.html.erb b/packages/rails/app/views/experts/new.html.erb index 09d13f7429..b3e077ee92 100644 --- a/packages/rails/app/views/experts/new.html.erb +++ b/packages/rails/app/views/experts/new.html.erb @@ -10,7 +10,7 @@
- <%= form_for @expert, url: experts_path, html: {class: 'form form-horizontal'} do |f| %> + <%= form_for @expert, url: create_experts_path, html: {class: 'form form-horizontal'} do |f| %> <%= render "experts/form_fields", f: f %> diff --git a/packages/rails/config/routes.rb b/packages/rails/config/routes.rb index d49fe70e9a..5c0a715c1f 100644 --- a/packages/rails/config/routes.rb +++ b/packages/rails/config/routes.rb @@ -162,6 +162,7 @@ # API namespace "api" do get "auth_key" => "base#auth_key" + get "flash_messages" => "base#flash_messages" get "update_active", to: "base#update_active" resource :user, only: %i(show) @@ -587,6 +588,9 @@ via: %i(get post) end + post "/experts/create", to: "experts#create", as: :create_experts + post "/experts/:id/edit", to: "experts#update", as: :update_expert + resources :experts do post "ask_question", on: :member post "open", on: :member diff --git a/packages/rails/docker/entrypoint/prod.entrypoint.sh b/packages/rails/docker/entrypoint/prod.entrypoint.sh index a504e5b5d9..deec23bd81 100644 --- a/packages/rails/docker/entrypoint/prod.entrypoint.sh +++ b/packages/rails/docker/entrypoint/prod.entrypoint.sh @@ -4,7 +4,6 @@ set -e # ------------------------------ # Generate runtime environment for frontend # ------------------------------ -source /precision-fda/docker/entrypoint/runtime-env.sh source /precision-fda/docker/entrypoint/robots-txt.sh # ------------------------------ # Generate database.yml from DATABASE_URL diff --git a/packages/rails/docker/images/Dockerfile b/packages/rails/docker/images/Dockerfile index 20e529ac8c..9202a2cfb7 100644 --- a/packages/rails/docker/images/Dockerfile +++ b/packages/rails/docker/images/Dockerfile @@ -69,25 +69,6 @@ RUN chmod +x ./docker/entrypoint/prod.entrypoint.sh RUN chmod +x ./docker/entrypoint/runtime-env.sh RUN chmod +x ./docker/entrypoint/robots-txt.sh -# ========================= -# Build frontend assets -# ========================= - -# Copy only dependency files for caching Node modules -WORKDIR $APP_DIR/frontend -COPY packages/client/package.json $APP_DIR/frontend/package.json -COPY packages/client/pnpm-lock.yaml $APP_DIR/frontend/pnpm-lock.yaml -COPY packages/client/pnpm-workspace.yaml $APP_DIR/frontend/pnpm-workspace.yaml -RUN pnpm install --frozen-lockfile - -# Copy the rest of the frontend code and build -COPY packages/client/ $APP_DIR/frontend -# Override VITE_OUT_DIR since the default '../rails/public/packs' is relative to packages/client -# but in Docker, frontend is at /precision-fda/frontend and Rails is at /precision-fda -ENV VITE_OUT_DIR=$APP_DIR/public/packs -ENV CI=true -RUN pnpm run build - WORKDIR $APP_DIR RUN mv .env.do_not_delete .env RUN mv config/database.do_not_delete.yml config/database.yml diff --git a/packages/server/apps/api/src/session/csrf-token.controller.ts b/packages/server/apps/api/src/session/csrf-token.controller.ts new file mode 100644 index 0000000000..3ef7b26c1e --- /dev/null +++ b/packages/server/apps/api/src/session/csrf-token.controller.ts @@ -0,0 +1,43 @@ +import crypto from 'node:crypto' +import { Controller, Get, Req, Res } from '@nestjs/common' +import { Request, Response } from 'express' +import { COOKIE_SESSION_KEY } from '@shared/config/consts' +import { CookieUtils } from '@shared/utils/cookie.utils' +import { CSRFUtils } from '@shared/utils/csrf.utils' +import { Encryptor } from '@shared/utils/encryptors/encryptor' + +@Controller('/csrf-token') +export class CsrfTokenController { + @Get() + getCsrfToken(@Req() req: Request, @Res() res: Response): void { + const cookie = CookieUtils.getCookie(COOKIE_SESSION_KEY, req.headers.cookie) + if (!cookie) { + res.json({ token: null }) + return + } + try { + const session = Encryptor.decrypt(cookie) + if (!session) { + res.json({ token: null }) + return + } + + if (!session._csrf_token) { + // Generate a _csrf_token if Rails hasn't set one yet. + // This matches Rails' behavior: a 32-byte random value, base64-encoded. + session._csrf_token = crypto.randomBytes(32).toString('base64') + const encryptedSession = Encryptor.encrypt(session) + res.cookie(COOKIE_SESSION_KEY, encryptedSession, { + httpOnly: true, + secure: true, + sameSite: 'lax', + path: '/', + }) + } + + res.json({ token: CSRFUtils.generateToken(session._csrf_token) }) + } catch { + res.json({ token: null }) + } + } +} diff --git a/packages/server/apps/api/src/session/session.api.module.ts b/packages/server/apps/api/src/session/session.api.module.ts index 5bd10d77ff..fa9a8d9209 100644 --- a/packages/server/apps/api/src/session/session.api.module.ts +++ b/packages/server/apps/api/src/session/session.api.module.ts @@ -1,7 +1,8 @@ import { Module } from '@nestjs/common' +import { CsrfTokenController } from './csrf-token.controller' import { SessionController } from './session.controller' @Module({ - controllers: [SessionController], + controllers: [SessionController, CsrfTokenController], }) export class SessionApiModule {} From d8a55136a44363e8e0dad5451e86f5fc1f4b4e8c Mon Sep 17 00:00:00 2001 From: Julie Pham <35426376+nganphtgit@users.noreply.github.com> Date: Fri, 5 Jun 2026 16:53:58 +0700 Subject: [PATCH 11/16] PFDA-6978 - fix: expert image upload (#3988) --- .../rails/app/assets/javascripts/experts/edit_and_new.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rails/app/assets/javascripts/experts/edit_and_new.coffee b/packages/rails/app/assets/javascripts/experts/edit_and_new.coffee index 3e83bf224c..1c09d65155 100644 --- a/packages/rails/app/assets/javascripts/experts/edit_and_new.coffee +++ b/packages/rails/app/assets/javascripts/experts/edit_and_new.coffee @@ -3,7 +3,7 @@ class ExpertsEditView @modalUploader = new window.Precision.ModalImageUploader( params.imageUrl, params.fileId, - { public_scope: true } + { scope: 'public' } ) ######################################################### From 96624f9fc7385a2471327ccc4d562db432565979 Mon Sep 17 00:00:00 2001 From: Julie Pham <35426376+nganphtgit@users.noreply.github.com> Date: Fri, 5 Jun 2026 18:27:35 +0700 Subject: [PATCH 12/16] PFDA-6983 - fix: always fetch the fresh spaceMemberships to find project (#3991) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jiří Lagan <43816355+jirkalagan@users.noreply.github.com> --- .../test/integration/files/file-create.spec.ts | 17 +++++++++++++++-- .../libs/shared/src/domain/user/user.entity.ts | 18 +++++++++++------- .../src/facade/node-copy/copy-nodes.facade.ts | 2 +- .../test/unit/domain/copy-nodes.facade.spec.ts | 4 ++-- 4 files changed, 29 insertions(+), 12 deletions(-) diff --git a/packages/server/apps/api/test/integration/files/file-create.spec.ts b/packages/server/apps/api/test/integration/files/file-create.spec.ts index f700c041d4..b296dfd76c 100644 --- a/packages/server/apps/api/test/integration/files/file-create.spec.ts +++ b/packages/server/apps/api/test/integration/files/file-create.spec.ts @@ -265,6 +265,17 @@ describe('POST /files', () => { }) it('should create file in scope folder if folderId is provided and scope is space', async () => { + const newSpace = create.spacesHelper.create(em, { + type: SPACE_TYPE.GROUPS, + hostProject: 'project-host2', + guestProject: 'project-guest2', + }) + create.spacesHelper.addMember( + em, + { space: newSpace, user }, + { role: SPACE_MEMBERSHIP_ROLE.CONTRIBUTOR, side: SPACE_MEMBERSHIP_SIDE.GUEST }, + ) + await em.flush() const folder = create.filesHelper.createFolder( em, { @@ -272,7 +283,7 @@ describe('POST /files', () => { parentFolder: null, }, { - scope: `space-${space.id}`, + scope: newSpace.scope, }, ) await em.flush() @@ -283,13 +294,15 @@ describe('POST /files', () => { .send({ name: 'test_file.txt', folderId: folder.id, - scope: `space-${space.id}`, + scope: newSpace.scope, }) .expect(201) const file = await fileRepo.findOne({ uid: result.body.uid }) expect(file.parentFolderId).to.be.null() expect(file.scopedParentFolderId).to.equal(folder.id) + expect(file.scope).to.equal(newSpace.scope) + expect(file.project).to.equal(newSpace.guestProject) }) }) diff --git a/packages/server/libs/shared/src/domain/user/user.entity.ts b/packages/server/libs/shared/src/domain/user/user.entity.ts index 05155d0e49..c80d2a6ff7 100644 --- a/packages/server/libs/shared/src/domain/user/user.entity.ts +++ b/packages/server/libs/shared/src/domain/user/user.entity.ts @@ -397,17 +397,21 @@ export class User extends BaseEntity { return this.privateFilesProject } else if (EntityScopeUtils.isSpaceScope(scope)) { const spaceId = EntityScopeUtils.getSpaceIdFromScope(scope) - const spaceMembership = await this.spaceMemberships - .loadItems({ - where: this.spaceMembershipWhere(mode, spaceId), - }) - .then(memberships => memberships[0]) + + const spaceMemberships = await this.spaceMemberships.loadItems({ + where: this.spaceMembershipWhere(mode, spaceId), + refresh: true, + }) + if (spaceMemberships.length > 1) { + throw new Error(`Data integrity error: user ${this.dxuser} has multiple memberships for space ${spaceId}`) + } + const spaceMembership = spaceMemberships[0] if (!spaceMembership) { return null } await spaceMembership.spaces.load() - const space = spaceMembership.spaces[0] - return spaceMembership.isHost ? space.hostProject : space.guestProject + const space = spaceMembership.spaces.find(space => space.id === spaceId) + return spaceMembership.isHost() ? space.hostProject : space.guestProject } } } diff --git a/packages/server/libs/shared/src/facade/node-copy/copy-nodes.facade.ts b/packages/server/libs/shared/src/facade/node-copy/copy-nodes.facade.ts index 6ff7e6678c..ba2f0f4fe5 100644 --- a/packages/server/libs/shared/src/facade/node-copy/copy-nodes.facade.ts +++ b/packages/server/libs/shared/src/facade/node-copy/copy-nodes.facade.ts @@ -431,7 +431,7 @@ export class CopyNodesFacade { const spaceId = EntityScopeUtils.getSpaceIdFromScope(scope) const membership = await this.spaceMembershipRepo.getMembership(spaceId, user.id) await membership.spaces.load() - return membership.isHost ? membership.spaces[0].hostProject : membership.spaces[0].guestProject + return membership.isHost() ? membership.spaces[0].hostProject : membership.spaces[0].guestProject } } } diff --git a/packages/server/libs/shared/test/unit/domain/copy-nodes.facade.spec.ts b/packages/server/libs/shared/test/unit/domain/copy-nodes.facade.spec.ts index 7d0746409b..96e3cd1d4d 100644 --- a/packages/server/libs/shared/test/unit/domain/copy-nodes.facade.spec.ts +++ b/packages/server/libs/shared/test/unit/domain/copy-nodes.facade.spec.ts @@ -357,7 +357,7 @@ describe('CopyNodesFacade', () => { spacesCollection.load = stub().resolves() const spaceMembership = { - isHost: true, + isHost: () => true, spaces: spacesCollection, } as unknown as SpaceMembership @@ -366,7 +366,7 @@ describe('CopyNodesFacade', () => { spaceMemberships: [ { spaces: [{ id: spaceId, hostProject: 'project-host' }], - isHost: true, + isHost: () => true, }, ], }) From 0b47cc5d84e467f15d00404467f96e095e505337 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jun 2026 10:28:16 +0200 Subject: [PATCH 13/16] Bump net-imap from 0.5.14 to 0.5.15 in /packages/rails (#4000) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- packages/rails/Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rails/Gemfile.lock b/packages/rails/Gemfile.lock index d433db83ce..99ce9f966c 100644 --- a/packages/rails/Gemfile.lock +++ b/packages/rails/Gemfile.lock @@ -326,7 +326,7 @@ GEM mutex_m (0.3.0) mysql2 (0.5.5) nenv (0.3.0) - net-imap (0.5.14) + net-imap (0.5.15) date net-protocol net-pop (0.1.2) From c60cbfe4bf0bc773475bf6ecd226014981267aef Mon Sep 17 00:00:00 2001 From: Pavel Kubal Date: Wed, 10 Jun 2026 13:08:26 +0200 Subject: [PATCH 14/16] PFDA-6582 added creation of user deactivated event (#3974) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jiří Lagan <43816355+jirkalagan@users.noreply.github.com> --- .../shared/src/domain/event/event.entity.ts | 1 + .../shared/src/domain/event/event.helper.ts | 16 ++++++- .../user/service/user-management.service.ts | 12 ++++- .../profile/org-member-action.facade.ts | 9 +++- .../domain/user-management.service.spec.ts | 43 +++++++++++++++++- .../facade/org-member-action.facade.spec.ts | 45 ++++++++++++------- 6 files changed, 104 insertions(+), 22 deletions(-) diff --git a/packages/server/libs/shared/src/domain/event/event.entity.ts b/packages/server/libs/shared/src/domain/event/event.entity.ts index e57e96885b..cca7ab308e 100644 --- a/packages/server/libs/shared/src/domain/event/event.entity.ts +++ b/packages/server/libs/shared/src/domain/event/event.entity.ts @@ -25,6 +25,7 @@ export enum EVENT_TYPES { JOB_RUN = 'Event::JobRun', SUBMISSION_CREATED = 'Event::SubmissionCreated', SIGNED_UP_FOR_CHALLENGE = 'Event::SignedUpForChallenge', + USER_DEACTIVATED = 'Event::UserDeactivated', } @Entity({ tableName: 'events' }) diff --git a/packages/server/libs/shared/src/domain/event/event.helper.ts b/packages/server/libs/shared/src/domain/event/event.helper.ts index caac3d8eaa..8a2013d459 100644 --- a/packages/server/libs/shared/src/domain/event/event.helper.ts +++ b/packages/server/libs/shared/src/domain/event/event.helper.ts @@ -166,4 +166,18 @@ const createJobClosed = async (user: User, job: Job, platformJobData: JobDescrib return event } -export { createAppCreated, createAppPublished, createDbClusterPasswordRotated, createJobClosed } +const createUserDeactivated = async (actor: User, targetUser: User): Promise => { + const event = new Event() + const organization = await actor.organization.load() + wrap(event).assign({ + type: EVENT_TYPES.USER_DEACTIVATED, + orgHandle: organization.handle, + dxuser: actor.dxuser, + param1: targetUser.dxuser, + param2: targetUser.id.toString(), + data: JSON.stringify({}), + }) + return event +} + +export { createAppCreated, createAppPublished, createDbClusterPasswordRotated, createJobClosed, createUserDeactivated } diff --git a/packages/server/libs/shared/src/domain/user/service/user-management.service.ts b/packages/server/libs/shared/src/domain/user/service/user-management.service.ts index c6d0bbea43..224e42a049 100644 --- a/packages/server/libs/shared/src/domain/user/service/user-management.service.ts +++ b/packages/server/libs/shared/src/domain/user/service/user-management.service.ts @@ -1,7 +1,9 @@ import { Inject, Logger } from '@nestjs/common' +import { EntityManager } from '@mikro-orm/mysql' import { DNANEXUS_INVALID_EMAIL, ORG_EVERYONE } from '@shared/config/consts' import { ObjectFilterQuery } from '@shared/database/domain/object-filter-query' import { PaginatedResult } from '@shared/domain/entity/domain/paginated.result' +import { createUserDeactivated } from '@shared/domain/event/event.helper' import { PendingUserDTO } from '@shared/domain/user/dto/pending-user.dto' import { UserPaginationDto } from '@shared/domain/user/dto/user-pagination.dto' import { Resource, USER_STATE, User } from '@shared/domain/user/user.entity' @@ -17,6 +19,7 @@ export class UserManagementService { private readonly logger: Logger constructor( + private readonly em: EntityManager, private readonly user: UserContext, private readonly userRepo: UserRepository, @Inject(ADMIN_PLATFORM_CLIENT) @@ -144,8 +147,10 @@ export class UserManagementService { const encodeEmail = (email: string): string => Buffer.from(email, 'utf8').toString('base64').replace('\n', '') + DNANEXUS_INVALID_EMAIL + const actor = await this.user.loadEntity() + await this.userRepo.transactional(async () => { - users.forEach(user => { + for (const user of users) { user.disableMessage = `Deactivated by admin: ${this.user.dxuser}` user.userState = USER_STATE.DEACTIVATED @@ -155,7 +160,10 @@ export class UserManagementService { if (user.normalizedEmail) { user.normalizedEmail = encodeEmail(user.normalizedEmail) } - }) + + const event = await createUserDeactivated(actor, user) + this.em.persist(event) + } }) } diff --git a/packages/server/libs/shared/src/facade/profile/org-member-action.facade.ts b/packages/server/libs/shared/src/facade/profile/org-member-action.facade.ts index be8d4293c4..0abbe1e2ac 100644 --- a/packages/server/libs/shared/src/facade/profile/org-member-action.facade.ts +++ b/packages/server/libs/shared/src/facade/profile/org-member-action.facade.ts @@ -1,5 +1,6 @@ import { EntityManager } from '@mikro-orm/mysql' import { Injectable, Logger } from '@nestjs/common' +import { createUserDeactivated } from '@shared/domain/event/event.helper' import { OrgActionRequestService } from '@shared/domain/org-action-request/org-action-request.service' import { Organization } from '@shared/domain/org/organization.entity' import { UserContext } from '@shared/domain/user-context/model/user-context' @@ -40,8 +41,12 @@ export class OrgMemberActionFacade { throw new InvalidStateError('User is already deactivated') } - targetUser.userState = USER_STATE.DEACTIVATED - await this.em.flush() + await this.em.transactional(async () => { + targetUser.userState = USER_STATE.DEACTIVATED + + const event = await createUserDeactivated(currentUser, targetUser) + this.em.persist(event) + }) this.logger.log( `User ${targetUserId} deactivated by org admin ${currentUser.id} in org ${org.id}`, diff --git a/packages/server/libs/shared/test/unit/domain/user-management.service.spec.ts b/packages/server/libs/shared/test/unit/domain/user-management.service.spec.ts index c8dec96ed9..71c97cfff9 100644 --- a/packages/server/libs/shared/test/unit/domain/user-management.service.spec.ts +++ b/packages/server/libs/shared/test/unit/domain/user-management.service.spec.ts @@ -1,6 +1,8 @@ import { expect } from 'chai' import { stub } from 'sinon' +import { EntityManager } from '@mikro-orm/mysql' import { ORG_EVERYONE } from '@shared/config/consts' +import { EVENT_TYPES } from '@shared/domain/event/event.entity' import { UserManagementService } from '@shared/domain/user/service/user-management.service' import { USER_STATE, User } from '@shared/domain/user/user.entity' import { UserRepository } from '@shared/domain/user/user.repository' @@ -11,9 +13,17 @@ import { createRepositoryStub } from '../../factory/repository' describe('user-management service tests', () => { const userUnlockStub = stub() const userResetMfaStub = stub() + const emPersistStub = stub() + const emPopulateStub = stub() + const loadEntityStub = stub() const userRepo = createRepositoryStub() + const em = { + persist: emPersistStub, + populate: emPopulateStub, + } as unknown as EntityManager + const getInstance = (): UserManagementService => { const platformClient = { userUnlock: userUnlockStub, @@ -21,11 +31,12 @@ describe('user-management service tests', () => { } as unknown as PlatformClient return new UserManagementService( + em, { id: 666, dxuser: 'user1', accessToken: 'access_token', - loadEntity: () => null, + loadEntity: loadEntityStub, }, userRepo as unknown as UserRepository, platformClient, @@ -36,8 +47,17 @@ describe('user-management service tests', () => { userRepo.stubs.reset() userUnlockStub.reset() userResetMfaStub.reset() + emPersistStub.reset() + emPopulateStub.reset() + loadEntityStub.reset() userUnlockStub.throws() userResetMfaStub.throws() + emPopulateStub.resolves() + loadEntityStub.resolves({ + id: 666, + dxuser: 'user1', + organization: { load: stub().resolves({ handle: 'test-org' }) }, + }) }) describe('#deactivateUsers', () => { @@ -53,6 +73,27 @@ describe('user-management service tests', () => { expect(userRepo.stubs.find.calledOnceWithExactly({ id: { $in: [1, 2] } })).to.be.true() }) + it('persists a UserDeactivated event per user', async () => { + const instance = getInstance() + + userRepo.stubs.find.resolves([ + { id: 1, userState: USER_STATE.ENABLED, dxuser: 'userA' }, + { id: 2, userState: USER_STATE.ENABLED, dxuser: 'userB' }, + ]) + + await instance.deactivateUsers([1, 2]) + + expect(emPersistStub.callCount).to.equal(2) + const event1 = emPersistStub.firstCall.firstArg + expect(event1.type).to.equal(EVENT_TYPES.USER_DEACTIVATED) + expect(event1.param1).to.equal('userA') + expect(event1.dxuser).to.equal('user1') + + const event2 = emPersistStub.secondCall.firstArg + expect(event2.type).to.equal(EVENT_TYPES.USER_DEACTIVATED) + expect(event2.param1).to.equal('userB') + }) + it('fails for themself', async () => { const instance = getInstance() diff --git a/packages/server/libs/shared/test/unit/facade/org-member-action.facade.spec.ts b/packages/server/libs/shared/test/unit/facade/org-member-action.facade.spec.ts index bbde32114a..0927e7a97f 100644 --- a/packages/server/libs/shared/test/unit/facade/org-member-action.facade.spec.ts +++ b/packages/server/libs/shared/test/unit/facade/org-member-action.facade.spec.ts @@ -1,19 +1,19 @@ -import { EntityManager } from '@mikro-orm/mysql'; -import { expect } from 'chai'; -import { stub } from 'sinon'; -import { OrgActionRequestService } from '@shared/domain/org-action-request/org-action-request.service'; -import { Organization } from '@shared/domain/org/organization.entity'; -import { UserContext } from '@shared/domain/user-context/model/user-context' -import { User, USER_STATE } from '@shared/domain/user/user.entity'; -import { UserService } from '@shared/domain/user/service/user.service'; -import { InvalidStateError, NotFoundError, PermissionError } from '@shared/errors'; -import { OrgMemberActionFacade } from '@shared/facade/profile/org-member-action.facade'; import { Ref } from '@mikro-orm/core' - +import { EntityManager } from '@mikro-orm/mysql' +import { expect } from 'chai' +import { stub } from 'sinon' +import { Organization } from '@shared/domain/org/organization.entity' +import { OrgActionRequestService } from '@shared/domain/org-action-request/org-action-request.service' +import { UserService } from '@shared/domain/user/service/user.service' +import { USER_STATE, User } from '@shared/domain/user/user.entity' +import { UserContext } from '@shared/domain/user-context/model/user-context' +import { InvalidStateError, NotFoundError, PermissionError } from '@shared/errors' +import { OrgMemberActionFacade } from '@shared/facade/profile/org-member-action.facade' describe('OrgMemberActionFacade', () => { const populateStub = stub() const flushStub = stub() + const persistStub = stub().returnsThis() const loadEntityStub = stub() const getUserInOrganizationStub = stub() const findPendingRemoveMemberRequestStub = stub() @@ -22,6 +22,12 @@ describe('OrgMemberActionFacade', () => { const em = { populate: populateStub, flush: flushStub, + persist: persistStub, + transactional: async (cb: (...args: unknown[]) => Promise) => { + const result = await cb(em) + await flushStub() + return result + }, } as unknown as EntityManager const userCtx = { @@ -41,11 +47,16 @@ describe('OrgMemberActionFacade', () => { id: 10, singular: false, admin: { id: 1 }, + handle: 'test-org', } as Organization const ADMIN_USER = { id: 1, - organization: { getEntity: (): Organization => ORG }, + dxuser: 'admin-user', + organization: { + getEntity: (): Organization => ORG, + load: async () => ORG, + }, } beforeEach(() => { @@ -53,6 +64,8 @@ describe('OrgMemberActionFacade', () => { populateStub.resolves() flushStub.reset() flushStub.resolves() + persistStub.reset() + persistStub.returnsThis() loadEntityStub.reset() loadEntityStub.resolves(ADMIN_USER) getUserInOrganizationStub.reset() @@ -68,7 +81,7 @@ describe('OrgMemberActionFacade', () => { describe('#deactivateOrgUser', () => { it('deactivates an enabled member', async () => { - const targetUser = { id: 5, userState: USER_STATE.ENABLED } + const targetUser = { id: 5, dxuser: 'target-user', userState: USER_STATE.ENABLED } getUserInOrganizationStub.resolves(targetUser) const facade = getInstance() @@ -123,7 +136,7 @@ describe('OrgMemberActionFacade', () => { const nonAdminUser = { id: 2, organization: { - getEntity: (): Organization => ({ id: 10, singular: false, admin: { id: 1 } as Ref } as Organization), + getEntity: (): Organization => ({ id: 10, singular: false, admin: { id: 1 } as Ref }) as Organization, }, } loadEntityStub.resolves(nonAdminUser) @@ -144,7 +157,7 @@ describe('OrgMemberActionFacade', () => { const singularUser = { id: 1, organization: { - getEntity: (): Organization => ({ id: 20, singular: true, admin: { id: 1 } as Ref } as Organization), + getEntity: (): Organization => ({ id: 20, singular: true, admin: { id: 1 } as Ref }) as Organization, }, } loadEntityStub.resolves(singularUser) @@ -220,7 +233,7 @@ describe('OrgMemberActionFacade', () => { const nonAdminUser = { id: 2, organization: { - getEntity: (): Organization => ({ id: 10, singular: false, admin: { id: 1 } as Ref } as Organization), + getEntity: (): Organization => ({ id: 10, singular: false, admin: { id: 1 } as Ref }) as Organization, }, } loadEntityStub.resolves(nonAdminUser) From d33508d167a0d20d2920ce7421677a6b43fe46aa Mon Sep 17 00:00:00 2001 From: Pavel Kubal Date: Wed, 10 Jun 2026 14:01:31 +0200 Subject: [PATCH 15/16] PFDA-6766 forked apps copy tags as well (#3954) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: Jiří Lagan <43816355+jirkalagan@users.noreply.github.com> --- docs/backend/backend-coding-guide.md | 5 + .../app-series/service/app-series.service.ts | 19 +-- .../src/domain/tagging/tagging.service.ts | 39 +++-- .../src/facade/app/app-create.facade.ts | 128 +++++++++++---- .../src/facade/app/app-facade.module.ts | 2 + .../unit/domain/app-series.service.spec.ts | 18 --- .../test/unit/domain/tagging.service.spec.ts | 117 ++++++++------ .../unit/facade/app-create.facade.spec.ts | 153 +++++++++++++++++- 8 files changed, 342 insertions(+), 139 deletions(-) diff --git a/docs/backend/backend-coding-guide.md b/docs/backend/backend-coding-guide.md index d8c7f2e987..975783db8b 100644 --- a/docs/backend/backend-coding-guide.md +++ b/docs/backend/backend-coding-guide.md @@ -145,6 +145,11 @@ await this.spaceMembershipRepository.transactional(async () => { }) ``` +- Do not pass transaction-scoped `EntityManager` instances between service/facade methods. +- Start transaction boundaries in the owning service/facade (`this.em.transactional(...)` or repository `.transactional(...)`) and use `this.em` plus constructor-injected repositories inside called methods. +- Prefer repository reads/writes over direct `em.find*` calls for domain entities. + + **Persist pattern:** ```ts // Stage + flush separately (preferred - easy to mock) diff --git a/packages/server/libs/shared/src/domain/app-series/service/app-series.service.ts b/packages/server/libs/shared/src/domain/app-series/service/app-series.service.ts index b6bf31cb9a..03f3a92859 100644 --- a/packages/server/libs/shared/src/domain/app-series/service/app-series.service.ts +++ b/packages/server/libs/shared/src/domain/app-series/service/app-series.service.ts @@ -1,19 +1,13 @@ -import { Injectable, Logger } from '@nestjs/common' -import { constructDxid } from '@shared/domain/app/app.helper' +import { Injectable } from '@nestjs/common' import { AppSeries } from '@shared/domain/app-series/app-series.entity' import { AppSeriesRepository } from '@shared/domain/app-series/app-series.repository' import { AppSeriesCountService } from '@shared/domain/app-series/app-series-count.service' import { ScopeFilterContext } from '@shared/domain/counters/counters.types' -import { User } from '@shared/domain/user/user.entity' import { UserContext } from '@shared/domain/user-context/model/user-context' -import { ServiceLogger } from '@shared/logger/decorator/service-logger' import { EntityScope } from '@shared/types/common' @Injectable() export class AppSeriesService { - @ServiceLogger() - private readonly logger: Logger - constructor( private readonly user: UserContext, private readonly appSeriesRepository: AppSeriesRepository, @@ -34,15 +28,4 @@ export class AppSeriesService { user: this.user.id, }) } - - async createAppSeries(appName: string, user: User, scope?: EntityScope): Promise { - const appSeriesDxid = constructDxid(this.user.dxuser, appName, scope) - const appSeries = new AppSeries(user) - appSeries.name = appName - appSeries.dxid = appSeriesDxid - appSeries.scope = scope - this.logger.log(`Creating app series ${appSeries.dxid}`) - await this.appSeriesRepository.persistAndFlush(appSeries) - return appSeries - } } diff --git a/packages/server/libs/shared/src/domain/tagging/tagging.service.ts b/packages/server/libs/shared/src/domain/tagging/tagging.service.ts index ac9d181474..99680ed8ed 100644 --- a/packages/server/libs/shared/src/domain/tagging/tagging.service.ts +++ b/packages/server/libs/shared/src/domain/tagging/tagging.service.ts @@ -1,6 +1,5 @@ import { SqlEntityManager } from '@mikro-orm/mysql' import { Injectable, Logger } from '@nestjs/common' -import { Tag } from '@shared/domain/tag/tag.entity' import { TagRepository } from '@shared/domain/tag/tag.repository' import { Tagging } from '@shared/domain/tagging/tagging.entity' import { TaggingRepository } from '@shared/domain/tagging/tagging.repository' @@ -28,28 +27,24 @@ export class TaggingService { this.logger.log( `Adding tag ${name} for entity with id: ${taggableId}, type ${taggableType}, taggerId: ${taggerId}, taggerType: ${taggerType}`, ) - let tag = await this.tagRepo.findOne({ name }) + let activeTag = await this.tagRepo.findOne({ name }) + if (!activeTag) { + activeTag = this.tagRepo.create({ name }) + await this.em.persist(activeTag).flush() + } - return this.em.transactional(async em => { - if (!tag) { - tag = new Tag() - tag.name = name - await em.persistAndFlush(tag) - } - - const existingTagging = await this.taggingRepo.findOne({ tag, taggableType, taggableId }) - if (existingTagging) return + const existingTagging = await this.taggingRepo.findOne({ tag: activeTag, taggableType, taggableId }) + if (existingTagging) return - const tagging = new Tagging() - tagging.tagId = tag.id - tagging.taggableType = taggableType - tagging.taggableId = taggableId - tagging.taggerType = taggerType - tagging.taggerId = taggerId - tagging.context = 'tags' + const tagging = new Tagging() + tagging.tagId = activeTag.id + tagging.taggableType = taggableType + tagging.taggableId = taggableId + tagging.taggerType = taggerType + tagging.taggerId = taggerId + tagging.context = 'tags' - em.persist(tagging) - }) + await this.em.persist(tagging).flush() } /** @@ -73,4 +68,8 @@ export class TaggingService { } }) } + + async getTaggingsForEntity(id: number, type: TAGGABLE_TYPE): Promise { + return this.taggingRepo.findForTaggable(id, type) + } } diff --git a/packages/server/libs/shared/src/facade/app/app-create.facade.ts b/packages/server/libs/shared/src/facade/app/app-create.facade.ts index d1922e7dd5..feed89a04e 100644 --- a/packages/server/libs/shared/src/facade/app/app-create.facade.ts +++ b/packages/server/libs/shared/src/facade/app/app-create.facade.ts @@ -7,6 +7,7 @@ import { App, AppSpec, Internal } from '@shared/domain/app/app.entity' import { ENTITY_TYPE } from '@shared/domain/app/app.enum' import { APPKIT_LATEST_VERSION, + constructDxid, constructDxName, getCLIKeyInputSpec, getEntityType, @@ -22,6 +23,10 @@ import { DxId } from '@shared/domain/entity/domain/dxid' import { Uid } from '@shared/domain/entity/domain/uid' import { createAppCreated } from '@shared/domain/event/event.helper' import { allowedInstanceTypes } from '@shared/domain/job/job.enum' +import { Tag } from '@shared/domain/tag/tag.entity' +import { Tagging } from '@shared/domain/tagging/tagging.entity' +import { TaggingService } from '@shared/domain/tagging/tagging.service' +import { TAGGABLE_TYPE } from '@shared/domain/tagging/tagging.types' import { User } from '@shared/domain/user/user.entity' import { UserContext } from '@shared/domain/user-context/model/user-context' import { Asset } from '@shared/domain/user-file/asset.entity' @@ -48,6 +53,7 @@ export class AppCreateFacade { private readonly nodeService: NodeService, private readonly appService: AppService, private readonly appSeriesService: AppSeriesService, + private readonly taggingService: TaggingService, ) {} /** @@ -65,23 +71,20 @@ export class AppCreateFacade { await this.validateAppInput(appInput, assets) await this.validateScopeAndUser(user, appInput.scope) - await this.validateForkedApp(appInput.forked_from as Uid<'app'>) + const forkedApp = await this.validateForkedApp(appInput.forked_from as Uid<'app'>) // - create app series let appSeries = await this.appSeriesService.getAppSeriesByName(appInput.name, appInput.scope) + const appSeriesCreated = !appSeries this.validateAppSeriesCreation(appSeries, appInput.createAppSeries) this.validateAppRevisionCreation(appSeries, appInput.createAppRevision) const previousVersionAppDxid = appSeries ? (await this.getLatestRevisionApp(appSeries)).dxid : null - if (!appSeries && appInput.createAppSeries) { - appSeries = await this.appSeriesService.createAppSeries(appInput.name, user, appInput.scope) - this.logger.log(`App series for dxid ${appSeries.dxid} did not exist and user requested its creation`) - } // - get release const release = appInput.release ? appInput.release : UBUNTU_20 // - find the latest revision and increase it by one - const revision = await this.getAppRevision(appSeries.latestRevisionAppId) + const revision = appSeries ? await this.getAppRevision(appSeries.latestRevisionAppId) : 1 // - create new applet in platform const appletId = await this.createApplet(user, appInput, release) @@ -105,28 +108,43 @@ export class AppCreateFacade { await this.publishAppInSpace(user, EntityScopeUtils.getSpaceIdFromScope(appInput.scope), platformAppId) } - await this.em.begin() - try { + return this.em.transactional(async () => { + if (!appSeries && appInput.createAppSeries) { + const appSeriesDxid = constructDxid(this.user.dxuser, appInput.name, appInput.scope) + appSeries = new AppSeries(user) + appSeries.name = appInput.name + appSeries.dxid = appSeriesDxid + appSeries.scope = appInput.scope + await this.em.persist(appSeries).flush() + this.logger.log(`App series for dxid ${appSeries.dxid} did not exist and user requested its creation`) + } + + if (!appSeries) { + throw new ValidationError('App series is missing and cannot proceed with app creation.', { + code: ErrorCodes.APP_SERIES_CREATION_NOT_REQUESTED, + }) + } + // - store app in a database - const app = await this.saveAppInDB(user, platformAppId, revision, release, assets, appInput, appSeries.id) + const app = this.buildApp(user, platformAppId, revision, release, assets, appInput, appSeries.id) + await this.em.persist(app).flush() // - update app series (version, revision, deleted - why?) - await this.updateAppSeries(appSeries, appInput, app) + this.updateAppSeries(appSeries, appInput, app) + + // - copy tags from forked app + if (appSeriesCreated && forkedApp) { + await this.copyForkedAppTags(forkedApp, appSeries) + } // - store app event await this.createAppEvent(user, app) - await this.em.commit() - return app.uid - } catch (error) { - this.logger.error('Error creating an app', error) - await this.em.rollback() - throw error - } + }) } - private async publishAppInSpace(user: User, spaceId: number, appDxid): Promise { + private async publishAppInSpace(user: User, spaceId: number, appDxid: DxId<'app'>): Promise { const space = (await user.editableSpaces()).find(space => space.id === spaceId) if (!space) { @@ -147,11 +165,11 @@ export class AppCreateFacade { private async createAppEvent(user: User, app: App): Promise { this.logger.log(`Creating app event for app ${app.uid} and user ${user.id}`) - const createAppEvent = await createAppCreated(user, app) - await this.em.persist(createAppEvent).flush() + const event = await createAppCreated(user, app) + await this.em.persist(event).flush() } - private async updateAppSeries(appSeries: AppSeries, appInput: SaveAppDTO, app: App): Promise { + private updateAppSeries(appSeries: AppSeries, appInput: SaveAppDTO, app: App): void { this.logger.log(`Updating app series ${appSeries.dxid}`) appSeries.latestRevisionAppId = app.id if (appInput.scope && appInput.scope !== STATIC_SCOPE.PRIVATE) { @@ -165,7 +183,7 @@ export class AppCreateFacade { } } - private async saveAppInDB( + private buildApp( user: User, platformAppId: DxId<'app'>, revision: number, @@ -173,7 +191,7 @@ export class AppCreateFacade { assets: Asset[], appInput: SaveAppDTO, appSeriesId: number, - ): Promise { + ): App { this.logger.log(`Saving app in DB with platformAppId: ${platformAppId}`) const app = new App(user) app.dxid = platformAppId @@ -200,7 +218,6 @@ export class AppCreateFacade { assets.forEach(asset => app.assets.add(asset)) app.release = release - await this.em.persist(app).flush() return app } @@ -313,18 +330,67 @@ export class AppCreateFacade { } } - private async validateForkedApp(forkFrom?: Uid<'app'>): Promise { - if (forkFrom) { - const forkedApp = await this.appService.getAccessibleEntityByUid(forkFrom) + private async validateForkedApp(forkFrom?: Uid<'app'>): Promise { + if (!forkFrom) { + return null + } + + const forkedApp = await this.appService.getAccessibleEntityByUid(forkFrom) + + if (!forkedApp) { + throw new NotFoundError('Forked app does not exist or is not accessible.') + } + + if (forkedApp.entityType === ENTITY_TYPE.HTTPS) { + throw new InvalidRequestError('Forking from this app is not allowed.') + } + + return forkedApp + } + + private async copyForkedAppTags(forkedApp: App, targetAppSeries: AppSeries): Promise { + if (!forkedApp.appSeriesId) { + return + } - if (!forkedApp) { - throw new NotFoundError('Forked app does not exist or is not accessible.') + const sourceTaggings = await this.taggingService.getTaggingsForEntity( + forkedApp.appSeriesId, + TAGGABLE_TYPE.APP_SERIES, + ) + if (!sourceTaggings.length) { + return + } + + for (const sourceTagging of sourceTaggings) { + if (!sourceTagging.tag?.name) { + continue } - if (forkedApp.entityType === ENTITY_TYPE.HTTPS) { - throw new InvalidRequestError('Forking from this app is not allowed.') + let activeTag = await this.em.findOne(Tag, { name: sourceTagging.tag.name }) + if (!activeTag) { + activeTag = new Tag() + activeTag.name = sourceTagging.tag.name + await this.em.persist(activeTag).flush() } + + const existingTagging = await this.em.findOne(Tagging, { + tag: activeTag, + taggableType: TAGGABLE_TYPE.APP_SERIES, + taggableId: targetAppSeries.id, + }) + if (existingTagging) continue + + const tagging = new Tagging() + tagging.tagId = activeTag.id + tagging.taggableType = TAGGABLE_TYPE.APP_SERIES + tagging.taggableId = targetAppSeries.id + tagging.taggerType = sourceTagging.taggerType + tagging.taggerId = sourceTagging.taggerId + tagging.context = 'tags' + this.em.persist(tagging) } + + await this.em.flush() } private async validateScopeAndUser(user: User, scope: EntityScope): Promise { diff --git a/packages/server/libs/shared/src/facade/app/app-facade.module.ts b/packages/server/libs/shared/src/facade/app/app-facade.module.ts index 9f6ead00ef..789a2b4e3f 100644 --- a/packages/server/libs/shared/src/facade/app/app-facade.module.ts +++ b/packages/server/libs/shared/src/facade/app/app-facade.module.ts @@ -6,6 +6,7 @@ import { CliExchangeTokenModule } from '@shared/domain/cli-exchange-token/cli-ex import { JobModule } from '@shared/domain/job/job.module' import { LicenseModule } from '@shared/domain/license/license.module' import { SpaceMembershipModule } from '@shared/domain/space-membership/space-membership.module' +import { TaggingModule } from '@shared/domain/tagging/tagging.module' import { UserModule } from '@shared/domain/user/user.module' import { UserFileModule } from '@shared/domain/user-file/user-file.module' import { PlatformClientModule } from '@shared/platform-client/platform-client.module' @@ -16,6 +17,7 @@ import { AppRunFacade } from './app-run.facade' imports: [ AppModule, AppSeriesModule, + TaggingModule, JobModule, AuthModule, LicenseModule, diff --git a/packages/server/libs/shared/test/unit/domain/app-series.service.spec.ts b/packages/server/libs/shared/test/unit/domain/app-series.service.spec.ts index 32eccd1cd4..b626431174 100644 --- a/packages/server/libs/shared/test/unit/domain/app-series.service.spec.ts +++ b/packages/server/libs/shared/test/unit/domain/app-series.service.spec.ts @@ -49,24 +49,6 @@ describe('AppSeriesService', () => { }) }) - context('createAppSeries', () => { - it('should create a new app series', async () => { - const appSeriesService = getInstance() - const appName = 'Test App Series' - const scope = 'private' - const appSeries = await appSeriesService.createAppSeries(appName, user, scope) - - expect(appSeries).to.be.instanceOf(AppSeries) - expect(appSeries.name).to.equal(appName) - expect(appSeries.scope).to.equal(scope) - expect(appSeries.user?.id).to.equal(user.id) - - const foundAppSeries = await em.findOne(AppSeries, { id: appSeries.id }) - expect(foundAppSeries).to.not.be.null - expect(foundAppSeries?.name).to.equal(appName) - }) - }) - function getInstance(): AppSeriesService { return new AppSeriesService(userCtx, appSeriesRepository, appSeriesCountService) } diff --git a/packages/server/libs/shared/test/unit/domain/tagging.service.spec.ts b/packages/server/libs/shared/test/unit/domain/tagging.service.spec.ts index f35cf1a026..9d1b630363 100644 --- a/packages/server/libs/shared/test/unit/domain/tagging.service.spec.ts +++ b/packages/server/libs/shared/test/unit/domain/tagging.service.spec.ts @@ -1,4 +1,4 @@ -import { SqlEntityManager } from '@mikro-orm/mysql' +import { EntityManager } from '@mikro-orm/mysql' import { expect } from 'chai' import sinon from 'sinon' import { TagRepository } from '@shared/domain/tag/tag.repository' @@ -7,40 +7,61 @@ import { TaggingService } from '@shared/domain/tagging/tagging.service' import { TAGGABLE_TYPE } from '@shared/domain/tagging/tagging.types' describe('TaggingService', () => { + const emTransactionalStub = sinon.stub() + const emPersistStub = sinon.stub() + const emPersistFlushStub = sinon.stub() + const emRemoveStub = sinon.stub() + const tagRepoFindOneStub = sinon.stub() + const tagRepoCreateStub = sinon.stub() + const taggingRepoFindForTaggableStub = sinon.stub() const taggingRepoFindOneStub = sinon.stub() const taggingRepoCountStub = sinon.stub() - const emTransactionalStub = sinon.stub() - const emRemoveStub = sinon.stub() - const emPersistAndFlushStub = sinon.stub() - const emPersistStub = sinon.stub() - const em = { - transactional: emTransactionalStub, - remove: emRemoveStub, - persistAndFlush: emPersistAndFlushStub, - persist: emPersistStub, - } as unknown as SqlEntityManager - - emTransactionalStub.callsFake(async callback => { - return callback(em) - }) + emPersistStub.callsFake(() => ({ flush: emPersistFlushStub })) - const getTaggingService = () => { + const getTaggingService = (): TaggingService => { const taggingRepository = { findForTaggable: taggingRepoFindForTaggableStub, findOne: taggingRepoFindOneStub, count: taggingRepoCountStub, } as unknown as TaggingRepository + const tagRepository = { findOne: tagRepoFindOneStub, + create: tagRepoCreateStub, } as unknown as TagRepository + const em = { + transactional: emTransactionalStub, + persist: emPersistStub, + remove: emRemoveStub, + getRepository: sinon.stub().callsFake((entity: unknown) => { + const entityName = (entity as { name?: string })?.name + if (entityName === 'Tag') return tagRepository + if (entityName === 'Tagging') return taggingRepository + return undefined + }), + } as unknown as EntityManager + + emTransactionalStub.callsFake(async callback => callback(em)) + return new TaggingService(em, taggingRepository, tagRepository) } beforeEach(() => { + emTransactionalStub.reset() + + emPersistStub.reset() + emPersistStub.callsFake(() => ({ flush: emPersistFlushStub })) + + emPersistFlushStub.reset() + emPersistFlushStub.resolves() + + emRemoveStub.reset() + emRemoveStub.returns(undefined) + taggingRepoFindForTaggableStub.reset() taggingRepoFindForTaggableStub.throws() @@ -50,20 +71,11 @@ describe('TaggingService', () => { taggingRepoCountStub.reset() taggingRepoCountStub.throws() - emRemoveStub.reset() - emRemoveStub.throws() - tagRepoFindOneStub.reset() tagRepoFindOneStub.throws() - emPersistAndFlushStub.reset() - emPersistAndFlushStub.throws() - - emPersistStub.reset() - emPersistStub.throws() - - emTransactionalStub.reset() - emTransactionalStub.callsFake(cb => cb(em)) + tagRepoCreateStub.reset() + tagRepoCreateStub.callsFake((data: { name: string }) => ({ name: data.name })) }) describe('#addTaggingForEntity', () => { @@ -74,38 +86,43 @@ describe('TaggingService', () => { it('non existing tag and existing taggings', async () => { tagRepoFindOneStub.resolves(null) taggingRepoFindOneStub.resolves(null) - emPersistAndFlushStub.reset() - emPersistAndFlushStub.callsFake(entity => { - entity.id = TAG_ID - }) emPersistStub.reset() + emPersistStub.callsFake((entity: { id?: number }) => { + if (!entity.id) { + entity.id = TAG_ID + } + return { flush: emPersistFlushStub } + }) const service = getTaggingService() await service.addTaggingForEntity('tag', 'taggerType', USER_ID, TAGGABLE_ID, TAGGABLE_TYPE.NODE) - expect(emTransactionalStub.calledOnce).to.be.true() + expect(emTransactionalStub.notCalled).to.be.true() expect(tagRepoFindOneStub.calledOnce).to.be.true() - expect(emPersistAndFlushStub.calledOnce).to.be.true() - expect(emPersistAndFlushStub.firstCall.args[0].name).to.eq('tag') - expect(emPersistStub.calledOnce).to.be.true() - expect(emPersistStub.firstCall.args[0].tagId).to.eq(TAG_ID) - expect(emPersistStub.firstCall.args[0].taggableType).to.eq(TAGGABLE_TYPE.NODE) - expect(emPersistStub.firstCall.args[0].taggableId).to.eq(TAGGABLE_ID) - expect(emPersistStub.firstCall.args[0].taggerType).to.eq('taggerType') - expect(emPersistStub.firstCall.args[0].taggerId).to.eq(USER_ID) - expect(emPersistStub.firstCall.args[0].context).to.eq('tags') + expect(tagRepoCreateStub.calledOnceWithExactly({ name: 'tag' })).to.be.true() + expect(emPersistStub.calledTwice).to.be.true() + expect(emPersistStub.firstCall.args[0].name).to.eq('tag') + expect(emPersistStub.secondCall.args[0].tagId).to.eq(TAG_ID) + expect(emPersistStub.secondCall.args[0].taggableType).to.eq(TAGGABLE_TYPE.NODE) + expect(emPersistStub.secondCall.args[0].taggableId).to.eq(TAGGABLE_ID) + expect(emPersistStub.secondCall.args[0].taggerType).to.eq('taggerType') + expect(emPersistStub.secondCall.args[0].taggerId).to.eq(USER_ID) + expect(emPersistStub.secondCall.args[0].context).to.eq('tags') + expect(emPersistFlushStub.callCount).to.eq(2) }) it('existing tag and non existing taggings', async () => { tagRepoFindOneStub.resolves({ id: TAG_ID }) taggingRepoFindOneStub.resolves(null) emPersistStub.reset() + emPersistStub.callsFake(() => ({ flush: emPersistFlushStub })) const service = getTaggingService() await service.addTaggingForEntity('tag', 'taggerType', USER_ID, TAGGABLE_ID, TAGGABLE_TYPE.NODE) - expect(emTransactionalStub.calledOnce).to.be.true() + expect(emTransactionalStub.notCalled).to.be.true() expect(tagRepoFindOneStub.calledOnce).to.be.true() + expect(tagRepoCreateStub.notCalled).to.be.true() expect(emPersistStub.calledOnce).to.be.true() expect(emPersistStub.firstCall.args[0].tagId).to.eq(TAG_ID) expect(emPersistStub.firstCall.args[0].taggableType).to.eq(TAGGABLE_TYPE.NODE) @@ -113,6 +130,7 @@ describe('TaggingService', () => { expect(emPersistStub.firstCall.args[0].taggerType).to.eq('taggerType') expect(emPersistStub.firstCall.args[0].taggerId).to.eq(USER_ID) expect(emPersistStub.firstCall.args[0].context).to.eq('tags') + expect(emPersistFlushStub.calledOnce).to.be.true() }) it('existing tag and existing taggings', async () => { @@ -122,20 +140,21 @@ describe('TaggingService', () => { const service = getTaggingService() await service.addTaggingForEntity('tag', 'taggerType', USER_ID, TAGGABLE_ID, TAGGABLE_TYPE.NODE) - expect(emTransactionalStub.calledOnce).to.be.true() + expect(emTransactionalStub.notCalled).to.be.true() expect(tagRepoFindOneStub.calledOnce).to.be.true() + expect(tagRepoCreateStub.notCalled).to.be.true() expect(emPersistStub.notCalled).to.be.true() - expect(emPersistAndFlushStub.notCalled).to.be.true() + expect(emPersistFlushStub.notCalled).to.be.true() }) }) describe('#removeTaggings', () => { it('should remove taggings for entity with id and type', async () => { const tag = { id: 5 } - const tagging = { tag } + const tagging = { tag, tagId: tag.id } taggingRepoFindForTaggableStub.withArgs(1, TAGGABLE_TYPE.NODE).resolves([tagging]) taggingRepoCountStub.reset() - taggingRepoCountStub.withArgs({ tagId: 1 }).resolves(2) + taggingRepoCountStub.withArgs({ tagId: tag.id }).resolves(2) emRemoveStub.reset() const service = getTaggingService() @@ -168,9 +187,9 @@ describe('TaggingService', () => { expect(emTransactionalStub.calledOnce).to.be.true() expect(taggingRepoFindForTaggableStub.calledOnce).to.be.true() expect(taggingRepoFindForTaggableStub.calledWith(id, type)).to.be.true() - expect(emRemoveStub.calledTwice).to.be.true() - expect(emRemoveStub.calledWith(tag)).to.be.true() - expect(emRemoveStub.calledWith(tagging)).to.be.true() + expect(emRemoveStub.callCount).to.eq(2) + expect(emRemoveStub.firstCall.calledWith(tag)).to.be.true() + expect(emRemoveStub.secondCall.calledWith(tagging)).to.be.true() }) }) }) diff --git a/packages/server/libs/shared/test/unit/facade/app-create.facade.spec.ts b/packages/server/libs/shared/test/unit/facade/app-create.facade.spec.ts index af931c5d5c..376443db97 100644 --- a/packages/server/libs/shared/test/unit/facade/app-create.facade.spec.ts +++ b/packages/server/libs/shared/test/unit/facade/app-create.facade.spec.ts @@ -14,13 +14,22 @@ import { AppSeries } from '@shared/domain/app-series/app-series.entity' import { AppSeriesRepository } from '@shared/domain/app-series/app-series.repository' import { AppSeriesCountService } from '@shared/domain/app-series/app-series-count.service' import { AppSeriesService } from '@shared/domain/app-series/service/app-series.service' +import { ComparisonRepository } from '@shared/domain/comparison/comparison.repository' import { EVENT_TYPES, Event } from '@shared/domain/event/event.entity' import { allowedInstanceTypes } from '@shared/domain/job/job.enum' +import { JobRepository } from '@shared/domain/job/job.repository' import { Organization } from '@shared/domain/org/organization.entity' import { Space } from '@shared/domain/space/space.entity' import { SPACE_TYPE } from '@shared/domain/space/space.enum' import { SpaceRepository } from '@shared/domain/space/space.repository' import { SPACE_MEMBERSHIP_ROLE, SPACE_MEMBERSHIP_SIDE } from '@shared/domain/space-membership/space-membership.enum' +import { Tag } from '@shared/domain/tag/tag.entity' +import { TagRepository } from '@shared/domain/tag/tag.repository' +import { AppSeriesTagging } from '@shared/domain/tagging/app-series-tagging.entity' +import { Tagging } from '@shared/domain/tagging/tagging.entity' +import { TaggingRepository } from '@shared/domain/tagging/tagging.repository' +import { TaggingService } from '@shared/domain/tagging/tagging.service' +import { TAGGABLE_TYPE } from '@shared/domain/tagging/tagging.types' import { User } from '@shared/domain/user/user.entity' import { UserRepository } from '@shared/domain/user/user.repository' import { UserContext } from '@shared/domain/user-context/model/user-context' @@ -69,8 +78,11 @@ describe('AppCreateFacade', () => { let nodeService: NodeService let appService: AppService let appSeriesService: AppSeriesService + let taggingService: TaggingService let appRepository: AppRepository let appSeriesRepository: AppSeriesRepository + let taggingRepository: TaggingRepository + let tagRepository: TagRepository let folderRepository: FolderRepository let nodeRepository: NodeRepository let spaceRepository: SpaceRepository @@ -91,6 +103,8 @@ describe('AppCreateFacade', () => { appRepository = em.getRepository(App) appSeriesRepository = em.getRepository(AppSeries) + taggingRepository = em.getRepository(Tagging) + tagRepository = em.getRepository(Tag) folderRepository = em.getRepository(Folder) nodeRepository = em.getRepository(Node) spaceRepository = em.getRepository(Space) @@ -112,7 +126,14 @@ describe('AppCreateFacade', () => { ;(nodeRepository as unknown as { user: UserContext }).user = userCtx ;(appRepository as unknown as { user: UserContext }).user = userCtx - nodeHelper = new NodeHelper(em, userCtx, folderRepository, nodeRepository) + nodeHelper = new NodeHelper( + em, + userCtx, + folderRepository, + nodeRepository, + {} as unknown as JobRepository, + {} as unknown as ComparisonRepository, + ) nodeService = new NodeService( em, @@ -131,6 +152,20 @@ describe('AppCreateFacade', () => { appService = new AppService(appRepository) appSeriesService = new AppSeriesService(userCtx, appSeriesRepository, {} as unknown as AppSeriesCountService) + taggingService = new TaggingService(em, taggingRepository, tagRepository) + + // Mock transactional to execute the callback directly using the same em (no forking) + stub(em, 'transactional').callsFake(async (cb) => { + await em.begin() + try { + const result = await (cb as (...args: unknown[]) => Promise)(em) + await em.commit() + return result + } catch (e) { + await em.rollback() + throw e + } + }) appletCreateStub.reset() appletCreateStub.throws() @@ -161,6 +196,22 @@ describe('AppCreateFacade', () => { appPublishStub.resolves() }) + afterEach(async () => { + // Ensure any pending transactions are rolled back so locks are released + try { + const connection = em.getConnection() + await connection.execute('ROLLBACK') + } catch { + // ignore if no transaction is active + } + // Restore transactional stub + const transactionalStub = em.transactional as ReturnType + if (transactionalStub.restore) { + transactionalStub.restore() + } + em.clear() + }) + const getDefaultApp = (): SaveAppDTO => { return { createAppSeries: true, @@ -350,6 +401,102 @@ describe('AppCreateFacade', () => { expect(loadedApp.internal.ordered_assets).to.contain.members([asset1.uid, asset2.uid]) }) + it('copies app series tags when creating a forked app', async () => { + const sourceAppSeries = create.appSeriesHelper.create(em, { user }, { name: 'source-app-series', scope: 'private' }) + await em.flush() + + const sourceApp = create.appHelper.createRegular( + em, + { user }, + { title: 'source app', scope: 'private', appSeriesId: sourceAppSeries.id }, + ) + await em.flush() + + const sourceTag = new Tag() + sourceTag.name = 'genomics' + em.persist(sourceTag) + await em.flush() + + const sourceTagging = new AppSeriesTagging() + sourceTagging.tagId = sourceTag.id + sourceTagging.taggableType = TAGGABLE_TYPE.APP_SERIES + sourceTagging.taggableId = sourceAppSeries.id + sourceTagging.taggerId = user.id + sourceTagging.taggerType = 'User' + sourceTagging.context = 'tags' + em.persist(sourceTagging) + await em.flush() + + const appCreateFacade = getInstance() + const appInput = getDefaultApp() + appInput.name = 'forked-app-with-tags' + appInput.forked_from = sourceApp.uid + + await appCreateFacade.create(appInput) + em.clear() + + const forkedAppSeries = await em.findOneOrFail( + AppSeries, + { name: appInput.name, scope: appInput.scope }, + { populate: ['taggings.tag'] }, + ) + + expect(forkedAppSeries.taggings.length).to.equal(1) + expect(forkedAppSeries.taggings[0].tag.name).to.equal(sourceTag.name) + }) + + it('rolls back copied tags when app creation fails after tag copying', async () => { + const sourceAppSeries = create.appSeriesHelper.create(em, { user }, { name: 'rollback-source', scope: 'private' }) + await em.flush() + + const sourceApp = create.appHelper.createRegular( + em, + { user }, + { title: 'rollback source app', scope: 'private', appSeriesId: sourceAppSeries.id }, + ) + await em.flush() + + const sourceTag = new Tag() + sourceTag.name = 'rollback-tag' + em.persist(sourceTag) + await em.flush() + + const sourceTagging = new AppSeriesTagging() + sourceTagging.tagId = sourceTag.id + sourceTagging.taggableType = TAGGABLE_TYPE.APP_SERIES + sourceTagging.taggableId = sourceAppSeries.id + sourceTagging.taggerId = user.id + sourceTagging.taggerType = 'User' + sourceTagging.context = 'tags' + em.persist(sourceTagging) + await em.flush() + + const appCreateFacade = getInstance() + // Sabotage: fail after tag copying to verify tx rollback semantics. + const createAppEventStub = stub(appCreateFacade as unknown as { createAppEvent: () => Promise }, 'createAppEvent') + createAppEventStub.rejects(new Error('Simulated event creation failure')) + + const appInput = getDefaultApp() + appInput.name = 'forked-app-rollback-test' + appInput.forked_from = sourceApp.uid + + await expect(appCreateFacade.create(appInput)).to.be.rejectedWith(Error) + + createAppEventStub.restore() + em.clear() + + // AppSeries and transactional app/tagging writes must all be rolled back. + const forkedAppSeries = await em.findOne(AppSeries, { name: appInput.name }) + expect(forkedAppSeries).to.be.null() + + // Verify no orphaned taggings were left behind + const allTaggings = await em.find(Tagging, { taggerId: user.id }) + const orphanedTaggings = allTaggings.filter( + t => t.taggableType === TAGGABLE_TYPE.APP_SERIES && t.taggableId !== sourceAppSeries.id, + ) + expect(orphanedTaggings).to.have.length(0) + }) + it('new revision of an app', async () => { const appCreateFacade = getInstance() @@ -687,11 +834,11 @@ describe('AppCreateFacade', () => { label, optional, default: defaultValue, - choices, + choices: choices as AppInputSpecItem['choices'], } } function getInstance(userContext: UserContext = userCtx): AppCreateFacade { - return new AppCreateFacade(em, userContext, platformClient, nodeService, appService, appSeriesService) + return new AppCreateFacade(em, userContext, platformClient, nodeService, appService, appSeriesService, taggingService) } }) From 76204506a02f487176d880854286963fc5029769 Mon Sep 17 00:00:00 2001 From: John Varghese Date: Wed, 10 Jun 2026 09:13:39 -0700 Subject: [PATCH 16/16] PFDA-6991 Update ReadMe on pFDA with Security Language from HHS (#3999) Co-authored-by: rrayavara --- SECURITY.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000000..be417abbc3 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,39 @@ +# Security Policy + +## Reporting Security Vulnerabilities + +The U.S. Food and Drug Administration (FDA) takes security vulnerabilities seriously. If you believe you have found a security vulnerability in this repository, please report it to us through coordinated disclosure. + +**Please do NOT report security vulnerabilities through public GitHub issues, discussions, or pull requests.** + +--- + +## How to Report + +FDA follows the HHS Vulnerability Disclosure Policy. Submit your report through the official HHS reporting portal: + +- **HHS Vulnerability Disclosure Policy:** [https://www.hhs.gov/vulnerability-disclosure-policy/index.html] +- **Submit a Report:** [https://hhs.responsibledisclosure.com] + +### Contact + +For general security questions or concerns about FDA systems, contact: +- **Repository Maintainer:** precisionfda@fda.hhs.gov + +--- +## Security Best Practices for Contributors + +When contributing to this repository: + +- Follow the principle of least privilege +- Validate and sanitize all inputs +- Use parameterized queries for database access +- Keep dependencies up to date +- Never commit secrets, API keys, or credentials +- Review security advisories for dependencies + +--- + +**Disclaimer:** This repository contains code developed for research, regulatory science, or public health purposes. The code is provided "as-is" without warranty. Use in production systems should follow your organization's security assessment processes. + +**Last Updated:** June 09, 2026