diff --git a/dbrepo-storage-service/init/Dockerfile b/dbrepo-storage-service/init/Dockerfile index 4f4f0c797434901d27311cadbbe250bb0e96c480..be95322ff4721d63a62dc4cf8e18c0f768db8eaa 100644 --- a/dbrepo-storage-service/init/Dockerfile +++ b/dbrepo-storage-service/init/Dockerfile @@ -8,6 +8,6 @@ USER 1001 WORKDIR /app -COPY --chown=1001 --chmod=0744 ./init.sh /app/init.sh +COPY --chown=1001 --chmod=0777 ./init.sh /app/init.sh ENTRYPOINT [ "bash", "-c", "/app/init.sh" ] diff --git a/dbrepo-ui/layouts/default.vue b/dbrepo-ui/layouts/default.vue index d59966925ee105b6adf13bd00cbc51131e64a4e4..b7baeb7043f333d6e9f6b53bfa6aec20228ef67c 100644 --- a/dbrepo-ui/layouts/default.vue +++ b/dbrepo-ui/layouts/default.vue @@ -243,7 +243,7 @@ export default { watch: { '$route.params': { handler (newObj, oldObj) { - if (!newObj.database_id) { + if (!newObj.database_id || import.meta.server) { return } /* load database and optional access */ diff --git a/dbrepo-ui/nuxt.config.ts b/dbrepo-ui/nuxt.config.ts index cc68f1bd909e30f56b9081c4b869ada488e38e86..b5758d06f5efdf5585e1ff1fc12695ac12c86592 100644 --- a/dbrepo-ui/nuxt.config.ts +++ b/dbrepo-ui/nuxt.config.ts @@ -4,24 +4,22 @@ import vuetify from 'vite-plugin-vuetify' const proxy: any = {} /* proxies the backend calls, >>NOT<< the frontend calls (clicking) */ -if (process.env.NODE_ENV === 'development') { - const api = 'http://localhost' - proxy['/api'] = api - proxy['/pid'] = { - target: api + '/api', - changeOrigin: true, - pathRewrite: { - '^/pid': '/pid' - } - } - process.env.NUXT_PUBLIC_API_SERVER = api -} +// if (process.env.NODE_ENV === 'development') { +// const api = 'http://localhost' +// proxy['/api'] = api +// proxy['/pid'] = { +// target: api + '/api', +// changeOrigin: true, +// pathRewrite: { +// '^/pid': '/pid' +// } +// } +// process.env.NUXT_PUBLIC_API_SERVER = api +// } /** * https://nuxt.com/docs/guide/concepts/rendering#hybrid-rendering */ -const routeRules = {} - export default defineNuxtConfig({ app: { head: { @@ -77,8 +75,8 @@ export default defineNuxtConfig({ } }, api: { - client: 'http://localhost', - server: 'http://gateway-service', + client: 'https://dbrepo.arisnet.ac.at', + server: 'https://dbrepo.arisnet.ac.at', }, upload: { client: 'http://localhost/api/upload/files', @@ -105,8 +103,6 @@ export default defineNuxtConfig({ } }, - routeRules, - devServer: { port: 3001 }, diff --git a/dbrepo-ui/pages/database/[database_id]/info.vue b/dbrepo-ui/pages/database/[database_id]/info.vue index 0cb01e8d4c481d088bd330d1865840841c0d84ee..eee94047bc3aaeb922f70f65faaabf3a28b1244d 100644 --- a/dbrepo-ui/pages/database/[database_id]/info.vue +++ b/dbrepo-ui/pages/database/[database_id]/info.vue @@ -169,6 +169,12 @@ <pre v-if="error">{{ error }}</pre> </template> +<script setup> +import { ref } from 'vue' + +const runtimeConfig = useRuntimeConfig() +const config = ref(runtimeConfig) +</script> <script> import DatabaseToolbar from '@/components/database/DatabaseToolbar.vue' import Summary from '@/components/identifier/Summary.vue' @@ -188,15 +194,15 @@ export default { JumboBox }, setup () { - const config = useRuntimeConfig() const userStore = useUserStore() const { database_id } = useRoute().params - const { error, data } = useFetch(`${config.public.api.server}/api/database/${database_id}`, { + const { error, data } = useFetch(`${this.config.public.api.server}/api/database/${database_id}`, { immediate: true, + method: 'GET', timeout: 90_000, headers: { Accept: 'application/json', - Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null + Authorization: userStore.getToken ? `Bearer ${this.userStore.getToken}` : null } }) if (data.value) { diff --git a/dbrepo-ui/pages/database/[database_id]/settings.vue b/dbrepo-ui/pages/database/[database_id]/settings.vue index 5e52a9081603653da7847b7029f077761219870a..984df4e635e0d010a451fcf2efb11019ffc74433 100644 --- a/dbrepo-ui/pages/database/[database_id]/settings.vue +++ b/dbrepo-ui/pages/database/[database_id]/settings.vue @@ -252,6 +252,7 @@ <script> import DatabaseToolbar from '@/components/database/DatabaseToolbar.vue' import EditAccess from '@/components/dialogs/EditAccess.vue' +import JumboBox from '@/components/JumboBox.vue' import { useUserStore } from '@/stores/user' import { useCacheStore } from '@/stores/cache' import { errorCodeKey } from '@/utils' @@ -259,7 +260,8 @@ import { errorCodeKey } from '@/utils' export default { components: { DatabaseToolbar, - EditAccess + EditAccess, + JumboBox }, setup () { const config = useRuntimeConfig() diff --git a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/data.vue b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/data.vue index 6d84d8a6d63049aa2c5e6ef07edf7771800a01df..10c1bc8ccfe9b236b80308c1355b23e2e3213a31 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/data.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/data.vue @@ -109,6 +109,12 @@ :text="$t(errorCodeKey(error).text, { resource: 'table' })" /> </template> +<script setup> +import { ref } from 'vue' + +const runtimeConfig = useRuntimeConfig() +const config = ref(runtimeConfig) +</script> <script> import TableHistory from '@/components/table/TableHistory.vue' import TimeDrift from '@/components/TimeDrift.vue' @@ -132,22 +138,17 @@ export default { JumboBox }, setup () { - const config = useRuntimeConfig() const userStore = useUserStore() const { database_id, table_id } = useRoute().params - const { error, data } = useFetch(`${config.public.api.server}/api/database/${database_id}/table/${table_id}`, { + const { error } = useFetch(`${this.config.public.api.server}/api/database/${database_id}/table/${table_id}`, { immediate: true, + method: 'HEAD', timeout: 90_000, headers: { Accept: 'application/json', Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null } }) - if (data.value) { - const identifierService = useIdentifierService() - useServerHead(identifierService.databaseToServerHead(data.value)) - useServerSeoMeta(identifierService.databaseToServerSeoMeta(data.value)) - } return { error } diff --git a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/import.vue b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/import.vue index 9da3e1c9fd9774ca61be0be90af9a7050d6fba3c..0e5185470080940abf12d202849e61071768ecf6 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/import.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/import.vue @@ -26,16 +26,46 @@ </v-card> <v-breadcrumbs :items="items" class="pa-0 mt-2" /> </div> + <JumboBox + v-if="error" + :title="$t(errorCodeKey(error).title, { resource: 'table' })" + :subtitle="$t(errorCodeKey(error).subtitle)" + :text="$t(errorCodeKey(error).text, { resource: 'table' })" /> </template> +<script setup> +import { ref } from 'vue' + +const runtimeConfig = useRuntimeConfig() +const config = ref(runtimeConfig) +</script> <script> import TableImport from '@/components/table/TableImport.vue' +import JumboBox from '@/components/JumboBox.vue' import { useUserStore } from '@/stores/user' import { useCacheStore } from '@/stores/cache' +import { errorCodeKey } from '@/utils' export default { components: { - TableImport + TableImport, + JumboBox + }, + setup () { + const userStore = useUserStore() + const { database_id, table_id } = useRoute().params + const { error } = useFetch(`${this.config.public.api.server}/api/database/${database_id}/table/${table_id}`, { + immediate: true, + method: 'HEAD', + timeout: 90_000, + headers: { + Accept: 'application/json', + Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null + } + }) + return { + error + } }, data () { return { @@ -95,6 +125,9 @@ export default { } return this.roles.includes('insert-table-data') } + }, + methods: { + errorCodeKey } } </script> diff --git a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/info.vue b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/info.vue index 93c16d67925ed584e0427a14f5fd53ede7c0826d..5171d1861a2b19330b7122ac4fab6c207d41c6f3 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/info.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/info.vue @@ -123,8 +123,15 @@ :text="$t(errorCodeKey(error).text, { resource: 'table' })" /> </template> +<script setup> +import { ref } from 'vue' + +const runtimeConfig = useRuntimeConfig() +const config = ref(runtimeConfig) +</script> <script> import TableToolbar from '@/components/table/TableToolbar.vue' +import JumboBox from '@/components/JumboBox.vue' import Select from '@/components/identifier/Select.vue' import Summary from '@/components/identifier/Summary.vue' import UserBadge from '@/components/user/UserBadge.vue' @@ -137,14 +144,15 @@ export default { Summary, Select, TableToolbar, - UserBadge + UserBadge, + JumboBox }, setup () { - const config = useRuntimeConfig() const userStore = useUserStore() const { database_id, table_id } = useRoute().params - const { error, data } = useFetch(`${config.public.api.server}/api/database/${database_id}/table/${table_id}`, { + const { error, data } = useFetch(`${this.config.public.api.server}/api/database/${database_id}/table/${table_id}`, { immediate: true, + method: 'GET', timeout: 90_000, headers: { Accept: 'application/json', diff --git a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/persist/[identifier_id]/index.vue b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/persist/[identifier_id]/index.vue index 076b46217d4f280e5ded0e1cb94ca8c6c4110881..d0b72a436e72ce3e59330d0ffd0ec3bc87bcfa29 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/persist/[identifier_id]/index.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/persist/[identifier_id]/index.vue @@ -1,18 +1,49 @@ <template> - <div v-if="canCreateIdentifier || canUpdateIdentifier"> + <div + v-if="canCreateIdentifier || canUpdateIdentifier"> <Persist type="table" :database="database" /> <v-breadcrumbs :items="items" class="pa-0 mt-2" /> </div> + <JumboBox + v-if="error" + :title="$t(errorCodeKey(error).title, { resource: 'identifier' })" + :subtitle="$t(errorCodeKey(error).subtitle)" + :text="$t(errorCodeKey(error).text, { resource: 'identifier' })" /> </template> +<script setup> +import { ref } from 'vue' + +const runtimeConfig = useRuntimeConfig() +const config = ref(runtimeConfig) +</script> <script> -import Persist from '~/components/identifier/Persist.vue' -import { useUserStore } from '~/stores/user.js' -import { useCacheStore } from '~/stores/cache.js' +import Persist from '@/components/identifier/Persist.vue' +import JumboBox from '@/components/JumboBox.vue' +import { useUserStore } from '@/stores/user' +import { useCacheStore } from '@/stores/cache' +import { errorCodeKey } from '@/utils' export default { components: { - Persist + Persist, + JumboBox + }, + setup () { + const userStore = useUserStore() + const { database_id, table_id } = useRoute().params + const { error } = useFetch(`${this.config.public.api.server}/api/database/${database_id}/table/${table_id}`, { + immediate: true, + method: 'HEAD', + timeout: 90_000, + headers: { + Accept: 'application/json', + Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null + } + }) + return { + error + } }, data () { return { @@ -73,6 +104,9 @@ export default { } return this.roles.includes('modify-identifier-metadata') } + }, + methods: { + errorCodeKey } } </script> diff --git a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/persist/index.vue b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/persist/index.vue index 8ab4f83a25293ee0d9338f87c0c35b378a123a6f..f807001353b72e3591facf67743ff678c8405c07 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/persist/index.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/persist/index.vue @@ -9,16 +9,46 @@ :items="items" class="pa-0 mt-2" /> </div> + <JumboBox + v-if="error" + :title="$t(errorCodeKey(error).title, { resource: 'identifier' })" + :subtitle="$t(errorCodeKey(error).subtitle)" + :text="$t(errorCodeKey(error).text, { resource: 'identifier' })" /> </template> +<script setup> +import { ref } from 'vue' + +const runtimeConfig = useRuntimeConfig() +const config = ref(runtimeConfig) +</script> <script> -import Persist from '~/components/identifier/Persist.vue' -import { useUserStore } from '~/stores/user.js' -import { useCacheStore } from '~/stores/cache.js' +import Persist from '@/components/identifier/Persist.vue' +import JumboBox from '@/components/JumboBox.vue' +import { useUserStore } from '@/stores/user' +import { useCacheStore } from '@/stores/cache' +import { errorCodeKey } from '@/utils' export default { components: { - Persist + Persist, + JumboBox + }, + setup () { + const userStore = useUserStore() + const { database_id, table_id } = useRoute().params + const { error, data } = useFetch(`${this.config.public.api.server}/api/database/${database_id}/table/${table_id}`, { + immediate: true, + method: 'HEAD', + timeout: 90_000, + headers: { + Accept: 'application/json', + Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null + } + }) + return { + error + } }, data () { return { @@ -72,8 +102,9 @@ export default { const userService = useUserService() return userService.hasReadAccess(this.access) } + }, + methods: { + errorCodeKey } } </script> -<style> -</style> diff --git a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/schema.vue b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/schema.vue index e0d4f9555fc780b7bfcad2275b71261861eb1b3e..320ebe3d7564e285c2ee86f872af42d1ab0ae1b7 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/schema.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/schema.vue @@ -125,33 +125,36 @@ :text="$t(errorCodeKey(error).text, { resource: 'table' })" /> </template> +<script setup> +import { ref } from 'vue' + +const runtimeConfig = useRuntimeConfig() +const config = ref(runtimeConfig) +</script> <script> import TableToolbar from '@/components/table/TableToolbar.vue' +import JumboBox from '@/components/JumboBox.vue' import { useUserStore } from '@/stores/user' import { useCacheStore } from '@/stores/cache' import { errorCodeKey } from '@/utils' export default { components: { - TableToolbar + TableToolbar, + JumboBox }, setup () { - const config = useRuntimeConfig() const userStore = useUserStore() const { database_id, table_id } = useRoute().params - const { error, data } = useFetch(`${config.public.api.server}/api/database/${database_id}/table/${table_id}`, { + const { error } = useFetch(`${this.config.public.api.server}/api/database/${database_id}/table/${table_id}`, { immediate: true, + method: 'HEAD', timeout: 90_000, headers: { Accept: 'application/json', Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null } }) - if (data.value) { - const identifierService = useIdentifierService() - useServerHead(identifierService.databaseToServerHead(data.value)) - useServerSeoMeta(identifierService.databaseToServerSeoMeta(data.value)) - } return { error } diff --git a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/settings.vue b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/settings.vue index 45a8a3a5f2d701801f9ca1fb6f6f7e2055a04e1e..f51851b220bc5a6b92f0963d4b06e87285cd3ced 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/settings.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/settings.vue @@ -112,22 +112,51 @@ :items="items" class="pa-0 mt-2" /> </div> + <JumboBox + v-if="error" + :title="$t(errorCodeKey(error).title, { resource: 'table' })" + :subtitle="$t(errorCodeKey(error).subtitle)" + :text="$t(errorCodeKey(error).text, { resource: 'table' })" /> </template> +<script setup> +import { ref } from 'vue' + +const runtimeConfig = useRuntimeConfig() +const config = ref(runtimeConfig) +</script> <script> -import { max } from '@/utils' +import JumboBox from '@/components/JumboBox.vue' import TableToolbar from '@/components/table/TableToolbar.vue' import { useUserStore } from '@/stores/user' import { useCacheStore } from '@/stores/cache' +import { errorCodeKey, max } from '@/utils' export default { components: { - TableToolbar + TableToolbar, + JumboBox + }, + setup () { + const userStore = useUserStore() + const { database_id, table_id } = useRoute().params + const { error } = useFetch(`${this.config.public.api.server}/api/database/${database_id}/table/${table_id}`, { + immediate: true, + method: 'HEAD', + timeout: 90_000, + headers: { + Accept: 'application/json', + Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null + } + }) + return { + error + } }, data () { return { tab: 0, - valid: null, + valid: false, loading: false, modify: { description: null, @@ -254,6 +283,7 @@ export default { }, methods: { max, + errorCodeKey, submit () { this.$refs.form.validate() }, diff --git a/dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue b/dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue index 21b17f4fb59fdde33d24ab2bedf7ca90bc21402b..2d1729d7cdb2802c8426aa613848b5a9d84d53ce 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue @@ -1,5 +1,6 @@ <template> - <div v-if="canInsertTableData"> + <div + v-if="canInsertTableData"> <v-toolbar flat> <v-btn class="mr-2" @@ -10,222 +11,255 @@ <v-toolbar-title :text="$t('pages.table.subpages.import.title')"/> </v-toolbar> - <v-card - variant="flat" - rounded="0"> - <v-card-text> - <v-row> - <v-col - md="8"> - <v-alert - border="start" - color="info"> - {{ $t('pages.table.subpages.import.dataset.text') }} - <NuxtLink - :href="`/database/${$route.params.database_id}/table/create/schema`"> - {{ $t('pages.table.subpages.import.schema.text') }} - </NuxtLink> - </v-alert> - </v-col> - </v-row> - </v-card-text> - <v-card-text> - <v-stepper - vertical - variant="flat"> - <v-stepper-header> - <v-stepper-item - :title="$t('pages.table.subpages.import.metadata.title')" - :complete="validStep1" - :value="1"/> - </v-stepper-header> - <v-stepper-window - direction="vertical"> - <v-form - ref="form" - v-model="validStep1" - :disabled="step > 4" - @submit.prevent="submit"> + <v-form + ref="form" + v-model="valid" + @submit.prevent="submit"> + <v-card + variant="flat" + rounded="0"> + <v-card-text> + <v-row> + <v-col + md="8"> + <v-alert + border="start" + color="info"> + {{ $t('pages.table.subpages.import.dataset.text') }} + <NuxtLink + :href="`/database/${$route.params.database_id}/table/create/schema`"> + {{ $t('pages.table.subpages.import.schema.text') }} + </NuxtLink> + </v-alert> + </v-col> + </v-row> + </v-card-text> + <v-card-text> + <v-stepper + vertical + variant="flat"> + <v-stepper-header> + <v-stepper-item + :title="$t('pages.table.subpages.import.metadata.title')" + :complete="validStep1" + :value="1"/> + </v-stepper-header> + <v-stepper-window + direction="vertical"> + <v-form + ref="form" + v-model="validStep1" + :disabled="step > 4" + @submit.prevent="submit"> + <v-container> + <v-row + dense> + <v-col md="4"> + <v-text-field + v-model="tableCreate.name" + :rules="[ + v => notEmpty(v) || $t('validation.required'), + v => generatedTableName.length <= 64 || ($t('validation.max-length') + 64), + ]" + required + clearable + :error-messages="!validTableName ? [$t('validation.table.exists')] : []" + persistent-hint + :variant="inputVariant" + :hint="$t('pages.table.subpages.import.name.hint')" + :label="$t('pages.table.subpages.import.name.label')"/> + </v-col> + <v-col md="4"> + <v-text-field + v-model="generatedTableName" + :rules="[ + v => notEmpty(v) || $t('validation.required'), + v => generatedTableName.length <= 64 || ($t('validation.max-length') + 64), + ]" + disabled + clearable + counter="64" + persistent-counter + persistent-hint + :variant="inputVariant" + :hint="$t('pages.table.subpages.import.generated.hint')" + :label="$t('pages.table.subpages.import.generated.label')"/> + </v-col> + </v-row> + <v-row + dense> + <v-col md="8"> + <v-textarea + v-model="tableCreate.description" + rows="2" + :rules="[ + v => (!!v || v.length <= 180) || ($t('validation.max-length') + 180), + ]" + clearable + counter="180" + persistent-counter + persistent-hint + :variant="inputVariant" + :hint="$t('pages.table.subpages.import.description.hint')" + :label="$t('pages.table.subpages.import.description.label')"/> + </v-col> + </v-row> + <v-row + dense> + <v-col + md="4"> + <v-select + v-model="tableCreate.is_public" + name="public" + :label="$t('pages.database.resource.data.label')" + :hint="$t('pages.database.resource.data.hint', { resource: 'table' })" + persistent-hint + :variant="inputVariant" + :items="dataOptions" + item-title="title" + item-value="value" + :rules="[v => v !== null || $t('validation.required')]" + required> + </v-select> + </v-col> + <v-col + md="4"> + <v-select + v-model="tableCreate.is_schema_public" + name="schema-public" + :label="$t('pages.database.resource.schema.label')" + :hint="$t('pages.database.resource.schema.hint', { resource: 'table', schema: 'columns' })" + persistent-hint + :variant="inputVariant" + :items="schemaOptions" + item-title="title" + item-value="value" + :rules="[v => v !== null || $t('validation.required')]" + required> + </v-select> + </v-col> + </v-row> + </v-container> + </v-form> + </v-stepper-window> + <TableImport + :create="true" + :disabled="!validStep1 || step > 4" + :table="table" + @analyse="onAnalyse"/> + <v-stepper-header> + <v-stepper-item + :title="$t('pages.table.subpages.import.preview.title')" + :complete="validStep4" + :value="4"/> + </v-stepper-header> + <v-stepper-window + direction="vertical"> + <v-container + v-if="step >= 4"> + <TableSchema + ref="schema" + :back="false" + :disabled="step > 4" + :loading="loading" + :submit-text="$t('navigation.continue')" + :columns="tableCreate.columns" + @close="createEmptyTableAndImport"/> + </v-container> + </v-stepper-window> + <v-stepper-header> + <v-stepper-item + :title="$t('pages.table.subpages.import.summary.title')" + :value="5"/> + </v-stepper-header> + <v-stepper-window + v-if="step >= 5" + direction="vertical"> <v-container> - <v-row - dense> - <v-col md="4"> - <v-text-field - v-model="tableCreate.name" - :rules="[ - v => notEmpty(v) || $t('validation.required'), - v => generatedTableName.length <= 64 || ($t('validation.max-length') + 64), - ]" - required - clearable - :error-messages="!validTableName ? [$t('validation.table.exists')] : []" - persistent-hint - :variant="inputVariant" - :hint="$t('pages.table.subpages.import.name.hint')" - :label="$t('pages.table.subpages.import.name.label')"/> - </v-col> - <v-col md="4"> - <v-text-field - v-model="generatedTableName" - :rules="[ - v => notEmpty(v) || $t('validation.required'), - v => generatedTableName.length <= 64 || ($t('validation.max-length') + 64), - ]" - disabled - clearable - counter="64" - persistent-counter - persistent-hint - :variant="inputVariant" - :hint="$t('pages.table.subpages.import.generated.hint')" - :label="$t('pages.table.subpages.import.generated.label')"/> - </v-col> - </v-row> - <v-row - dense> - <v-col md="8"> - <v-textarea - v-model="tableCreate.description" - rows="2" - :rules="[ - v => (!!v || v.length <= 180) || ($t('validation.max-length') + 180), - ]" - clearable - counter="180" - persistent-counter - persistent-hint - :variant="inputVariant" - :hint="$t('pages.table.subpages.import.description.hint')" - :label="$t('pages.table.subpages.import.description.label')"/> - </v-col> - </v-row> - <v-row - dense> + <v-row dense> <v-col - md="4"> - <v-select - v-model="tableCreate.is_public" - name="public" - :label="$t('pages.database.resource.data.label')" - :hint="$t('pages.database.resource.data.hint', { resource: 'table' })" - persistent-hint - :variant="inputVariant" - :items="dataOptions" - item-title="title" - item-value="value" - :rules="[v => v !== null || $t('validation.required')]" - required> - </v-select> + md="8"> + <v-alert + border="start" + color="success"> + {{ $t('pages.table.subpages.create.summary.text') }} + <strong> + {{ table.internal_name }} + </strong> + </v-alert> </v-col> - <v-col - md="4"> - <v-select - v-model="tableCreate.is_schema_public" - name="schema-public" - :label="$t('pages.database.resource.schema.label')" - :hint="$t('pages.database.resource.schema.hint', { resource: 'table', schema: 'columns' })" - persistent-hint - :variant="inputVariant" - :items="schemaOptions" - item-title="title" - item-value="value" - :rules="[v => v !== null || $t('validation.required')]" - required> - </v-select> + </v-row> + <v-row> + <v-col> + <v-btn + class="mb-1 mr-2" + color="tertiary" + size="small" + variant="flat" + :loading="loadingImport" + :text="$t('navigation.import')" + @click="onImport"/> + <v-btn + class="mb-1" + color="secondary" + size="small" + variant="flat" + :loading="loadingContinue" + :text="$t('navigation.view')" + @click="onContinue"/> </v-col> </v-row> </v-container> - </v-form> - </v-stepper-window> - <TableImport - :create="true" - :disabled="!validStep1 || step > 4" - :table="table" - @analyse="onAnalyse"/> - <v-stepper-header> - <v-stepper-item - :title="$t('pages.table.subpages.import.preview.title')" - :complete="validStep4" - :value="4"/> - </v-stepper-header> - <v-stepper-window - direction="vertical"> - <v-container - v-if="step >= 4"> - <TableSchema - ref="schema" - :back="false" - :disabled="step > 4" - :loading="loading" - :submit-text="$t('navigation.continue')" - :columns="tableCreate.columns" - @close="createEmptyTableAndImport"/> - </v-container> - </v-stepper-window> - <v-stepper-header> - <v-stepper-item - :title="$t('pages.table.subpages.import.summary.title')" - :value="5"/> - </v-stepper-header> - <v-stepper-window - v-if="step >= 5" - direction="vertical"> - <v-container> - <v-row dense> - <v-col - md="8"> - <v-alert - border="start" - color="success"> - {{ $t('pages.table.subpages.create.summary.text') }} - <strong> - {{ table.internal_name }} - </strong> - </v-alert> - </v-col> - </v-row> - <v-row> - <v-col> - <v-btn - class="mb-1 mr-2" - color="tertiary" - size="small" - variant="flat" - :loading="loadingImport" - :text="$t('navigation.import')" - @click="onImport"/> - <v-btn - class="mb-1" - color="secondary" - size="small" - variant="flat" - :loading="loadingContinue" - :text="$t('navigation.view')" - @click="onContinue"/> - </v-col> - </v-row> - </v-container> - </v-stepper-window> - </v-stepper> - </v-card-text> - </v-card> + </v-stepper-window> + </v-stepper> + </v-card-text> + </v-card> + </v-form> <v-breadcrumbs :items="items" class="pa-0 mt-2"/> </div> + <JumboBox + v-if="error" + :title="$t(errorCodeKey(error).title, { resource: 'table' })" + :subtitle="$t(errorCodeKey(error).subtitle)" + :text="$t(errorCodeKey(error).text, { resource: 'table' })" /> </template> +<script setup> +import { ref } from 'vue' + +const runtimeConfig = useRuntimeConfig() +const config = ref(runtimeConfig) +</script> <script> import TableSchema from '@/components/table/TableSchema.vue' -import {notEmpty} from '@/utils' -import {useUserStore} from '@/stores/user' -import {useCacheStore} from '@/stores/cache' +import { notEmpty, errorCodeKey } from '@/utils' +import { useUserStore } from '@/stores/user' +import { useCacheStore } from '@/stores/cache' export default { components: { TableSchema }, + setup () { + const userStore = useUserStore() + const { database_id } = useRoute().params + const { error } = useFetch(`${this.config.public.api.server}/api/database/${database_id}`, { + immediate: true, + method: 'HEAD', + timeout: 90_000, + headers: { + Accept: 'application/json', + Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null + } + }) + return { + error + } + }, data() { return { step: 1, + valid: false, validStep1: false, validStep2: false, validStep3: false, @@ -358,6 +392,7 @@ export default { }, methods: { notEmpty, + errorCodeKey, submit() { this.$refs.form.validate() }, diff --git a/dbrepo-ui/pages/database/[database_id]/table/create/schema.vue b/dbrepo-ui/pages/database/[database_id]/table/create/schema.vue index 6b62ba7a2739f40c9c4145f7bcff547a9b09fef4..946b084ba87a1440abfe7fc58b592d9067733688 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/create/schema.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/create/schema.vue @@ -1,5 +1,6 @@ <template> - <div v-if="canCreateTable"> + <div + v-if="canCreateTable"> <v-toolbar flat> <v-btn @@ -182,17 +183,30 @@ </v-card> <v-breadcrumbs :items="items" class="pa-0 mt-2" /> </div> + <JumboBox + v-if="error" + :title="$t(errorCodeKey(error).title, { resource: 'table' })" + :subtitle="$t(errorCodeKey(error).subtitle)" + :text="$t(errorCodeKey(error).text, { resource: 'table' })" /> </template> +<script setup> +import { ref } from 'vue' + +const runtimeConfig = useRuntimeConfig() +const config = ref(runtimeConfig) +</script> <script> import TableSchema from '@/components/table/TableSchema.vue' -import { notEmpty } from '@/utils' +import JumboBox from '@/components/JumboBox.vue' +import { notEmpty, errorCodeKey } from '@/utils' import { useUserStore } from '@/stores/user' import { useCacheStore } from '@/stores/cache' export default { components: { - TableSchema + TableSchema, + JumboBox }, data () { return { @@ -306,6 +320,7 @@ export default { }, methods: { notEmpty, + errorCodeKey, submit () { this.$refs.form.validate() }, diff --git a/dbrepo-ui/pages/database/[database_id]/table/index.vue b/dbrepo-ui/pages/database/[database_id]/table/index.vue index 9616074fddd6fa61e7033ad8de5dd9fd387e5691..6511f963c6dcdeb50f67f7ee5b96f7e620f6a1a3 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/index.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/index.vue @@ -17,6 +17,12 @@ :text="$t(errorCodeKey(error).text, { resource: 'table' })" /> </template> +<script setup> +import { ref } from 'vue' + +const runtimeConfig = useRuntimeConfig() +const config = ref(runtimeConfig) +</script> <script> import TableList from '@/components/table/TableList.vue' import DatabaseToolbar from '@/components/database/DatabaseToolbar.vue' @@ -30,10 +36,9 @@ export default { DatabaseToolbar }, setup () { - const config = useRuntimeConfig() const userStore = useUserStore() const { database_id } = useRoute().params - const { error } = useFetch(`${config.public.api.server}/api/database/${database_id}`, { + const { error } = useFetch(`${this.config.public.api.server}/api/database/${database_id}`, { immediate: true, method: 'HEAD', timeout: 90_000, diff --git a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/data.vue b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/data.vue index 20ee33ea61a1dce58e74c0592a36fc46906af1fc..3f0ebc184451afac8b513dd594ab3526b854cdff 100644 --- a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/data.vue +++ b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/data.vue @@ -32,16 +32,47 @@ </v-card> <v-breadcrumbs :items="items" class="pa-0 mt-2" /> </div> + <JumboBox + v-if="error" + :title="$t(errorCodeKey(error).title, { resource: 'view' })" + :subtitle="$t(errorCodeKey(error).subtitle)" + :text="$t(errorCodeKey(error).text, { resource: 'view' })" /> </template> +<script setup> +import { ref } from 'vue' + +const runtimeConfig = useRuntimeConfig() +const config = ref(runtimeConfig) +</script> <script> import TimeDrift from '@/components/TimeDrift.vue' +import JumboBox from '@/components/JumboBox.vue' import QueryResults from '@/components/subset/Results.vue' +import { useUserStore } from '@/stores/user' +import { errorCodeKey } from '@/utils' export default { components: { QueryResults, - TimeDrift + TimeDrift, + JumboBox + }, + setup () { + const userStore = useUserStore() + const { database_id, view_id } = useRoute().params + const { error } = useFetch(`${this.config.public.api.server}/api/database/${database_id}/view/${view_id}`, { + immediate: true, + method: 'HEAD', + timeout: 90_000, + headers: { + Accept: 'application/json', + Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null + } + }) + return { + error + } }, data () { return { @@ -112,6 +143,7 @@ export default { this.reload() }, methods: { + errorCodeKey, reload () { this.$refs.queryResults.reExecute(Number(this.$route.params.view_id)) this.$refs.queryResults.reExecuteCount(Number(this.$route.params.view_id)) diff --git a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/info.vue b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/info.vue index 5fc351216dbf90ec71843bc65c11889a4c883f9c..61bdb4c3796df94cbdf40245dc3fa887ebe67cad 100644 --- a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/info.vue +++ b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/info.vue @@ -1,5 +1,6 @@ <template> - <div> + <div + v-if="canViewView"> <ViewToolbar /> <v-window v-model="tab"> @@ -56,14 +57,26 @@ </v-window> <v-breadcrumbs :items="items" class="pa-0 mt-2" /> </div> + <JumboBox + v-if="error" + :title="$t(errorCodeKey(error).title, { resource: 'view' })" + :subtitle="$t(errorCodeKey(error).subtitle)" + :text="$t(errorCodeKey(error).text, { resource: 'view' })" /> </template> +<script setup> +import { ref } from 'vue' + +const runtimeConfig = useRuntimeConfig() +const config = ref(runtimeConfig) +</script> <script> import ViewToolbar from '@/components/view/ViewToolbar.vue' import Summary from '@/components/identifier/Summary.vue' import Select from '@/components/identifier/Select.vue' import UserBadge from '@/components/user/UserBadge.vue' -import { formatTimestampUTCLabel } from '@/utils' +import JumboBox from '@/components/JumboBox.vue' +import { formatTimestampUTCLabel, errorCodeKey } from '@/utils' import { useUserStore } from '@/stores/user' import { useCacheStore } from '@/stores/cache' @@ -72,14 +85,15 @@ export default { Select, Summary, ViewToolbar, - UserBadge + UserBadge, + JumboBox }, setup () { - const config = useRuntimeConfig() const userStore = useUserStore() const { database_id, view_id } = useRoute().params - const { error, data } = useFetch(`${config.public.api.server}/api/database/${database_id}/view/${view_id}`, { + const { error, data } = useFetch(`${this.config.public.api.server}/api/database/${database_id}/view/${view_id}`, { immediate: true, + method: 'GET', timeout: 90_000, headers: { Accept: 'application/json', @@ -144,6 +158,12 @@ export default { view () { return this.cacheStore.getView }, + hasReadAccess () { + if (!this.access) { + return false + } + return this.access.type === 'read' || this.access.type === 'write_all' || this.access.type === 'write_own' + }, identifiers () { if (!this.view) { return [] @@ -186,9 +206,22 @@ export default { } const userService = useUserService() return userService.userToFullName(this.view.creator) + }, + canViewView () { + if (!this.view) { + return false + } + if (this.view.is_public) { + return true + } + if (!this.user) { + return false + } + return this.hasReadAccess || this.view.owner.id === this.user.id || this.database.owner.id === this.user.id } }, methods: { + errorCodeKey, formatUTC (timestamp) { return formatTimestampUTCLabel(timestamp) } diff --git a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/persist/[identifier_id]/index.vue b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/persist/[identifier_id]/index.vue index 772910ec0953281912a615bc397790b96fd113e9..11b0f60c00bd0e19e9a89d2acaf3d5bae78da3a2 100644 --- a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/persist/[identifier_id]/index.vue +++ b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/persist/[identifier_id]/index.vue @@ -1,18 +1,51 @@ <template> - <div v-if="canCreateIdentifier || canUpdateIdentifier"> - <Persist type="view" :database="database" /> + <div + v-if="canCreateIdentifier || canUpdateIdentifier"> + <Persist + type="view" + :database="database" /> <v-breadcrumbs :items="items" class="pa-0 mt-2" /> </div> + <JumboBox + v-if="error" + :title="$t(errorCodeKey(error).title, { resource: 'view' })" + :subtitle="$t(errorCodeKey(error).subtitle)" + :text="$t(errorCodeKey(error).text, { resource: 'view' })" /> </template> +<script setup> +import { ref } from 'vue' + +const runtimeConfig = useRuntimeConfig() +const config = ref(runtimeConfig) +</script> <script> -import Persist from '~/components/identifier/Persist.vue' -import { useUserStore } from '~/stores/user.js' -import { useCacheStore } from '~/stores/cache.js' +import Persist from '@/components/identifier/Persist.vue' +import JumboBox from '@/components/JumboBox.vue' +import { useUserStore } from '@/stores/user' +import { useCacheStore } from '@/stores/cache' +import { errorCodeKey } from '@/utils' export default { components: { - Persist + Persist, + JumboBox + }, + setup () { + const userStore = useUserStore() + const { database_id, view_id } = useRoute().params + const { error } = useFetch(`${this.config.public.api.server}/api/database/${database_id}/view/${view_id}`, { + immediate: true, + method: 'HEAD', + timeout: 90_000, + headers: { + Accept: 'application/json', + Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null + } + }) + return { + error + } }, data () { return { @@ -73,6 +106,9 @@ export default { } return this.roles.includes('modify-identifier-metadata') } + }, + methods: { + errorCodeKey } } </script> diff --git a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/persist/index.vue b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/persist/index.vue index a0c91a1a4e04802b699c83c1d6b5de9794997efe..3a2f0f793fe85ccbbd1473b3c513b5060449327a 100644 --- a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/persist/index.vue +++ b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/persist/index.vue @@ -1,18 +1,52 @@ <template> - <div v-if="canPersistView"> - <Persist type="view" :database="database" :view="view" /> + <div + v-if="canPersistView"> + <Persist + type="view" + :database="database" + :view="view" /> <v-breadcrumbs :items="items" class="pa-0 mt-2" /> </div> + <JumboBox + v-if="error" + :title="$t(errorCodeKey(error).title, { resource: 'view' })" + :subtitle="$t(errorCodeKey(error).subtitle)" + :text="$t(errorCodeKey(error).text, { resource: 'view' })" /> </template> +<script setup> +import { ref } from 'vue' + +const runtimeConfig = useRuntimeConfig() +const config = ref(runtimeConfig) +</script> <script> -import Persist from '~/components/identifier/Persist.vue' -import { useUserStore } from '~/stores/user.js' -import { useCacheStore } from '~/stores/cache.js' +import Persist from '@/components/identifier/Persist.vue' +import JumboBox from '@/components/JumboBox.vue' +import { useUserStore } from '@/stores/user' +import { useCacheStore } from '@/stores/cache' +import { errorCodeKey } from '@/utils' export default { components: { - Persist + Persist, + JumboBox + }, + setup () { + const userStore = useUserStore() + const { database_id, view_id } = useRoute().params + const { error } = useFetch(`${this.config.public.api.server}/api/database/${database_id}/view/${view_id}`, { + immediate: true, + method: 'HEAD', + timeout: 90_000, + headers: { + Accept: 'application/json', + Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null + } + }) + return { + error + } }, data () { return { @@ -68,8 +102,9 @@ export default { const userService = useUserService() return userService.hasReadAccess(this.access) } + }, + methods: { + errorCodeKey } } </script> -<style> -</style> diff --git a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/schema.vue b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/schema.vue index e126e19d9050c23b4299f9799b2895490813f33f..e8a8435d88f18b741705d34430a8c3a365925ec0 100644 --- a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/schema.vue +++ b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/schema.vue @@ -49,16 +49,46 @@ :items="items" class="pa-0 mt-2" /> </div> + <JumboBox + v-if="error" + :title="$t(errorCodeKey(error).title, { resource: 'view' })" + :subtitle="$t(errorCodeKey(error).subtitle)" + :text="$t(errorCodeKey(error).text, { resource: 'view' })" /> </template> +<script setup> +import { ref } from 'vue' + +const runtimeConfig = useRuntimeConfig() +const config = ref(runtimeConfig) +</script> <script> import TableToolbar from '@/components/table/TableToolbar.vue' +import JumboBox from '@/components/JumboBox.vue' import { useUserStore } from '@/stores/user' import { useCacheStore } from '@/stores/cache' +import { errorCodeKey } from '@/utils' export default { components: { - TableToolbar + TableToolbar, + JumboBox + }, + setup () { + const userStore = useUserStore() + const { database_id, view_id } = useRoute().params + const { error } = useFetch(`${this.config.public.api.server}/api/database/${database_id}/view/${view_id}`, { + immediate: true, + method: 'HEAD', + timeout: 90_000, + headers: { + Accept: 'application/json', + Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null + } + }) + return { + error + } }, data () { return { @@ -143,6 +173,7 @@ export default { } }, methods: { + errorCodeKey, extra (column) { if (column.type === 'float') { return `precision=${column.size}` diff --git a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/settings.vue b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/settings.vue index f9c905ffd4de036c8ccd1157d14bcda1504a10a0..8a65a34f274081cf289099354edc142392492ae2 100644 --- a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/settings.vue +++ b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/settings.vue @@ -88,20 +88,50 @@ :items="items" class="pa-0 mt-2" /> </div> + <JumboBox + v-if="error" + :title="$t(errorCodeKey(error).title, { resource: 'view' })" + :subtitle="$t(errorCodeKey(error).subtitle)" + :text="$t(errorCodeKey(error).text, { resource: 'view' })" /> </template> +<script setup> +import { ref } from 'vue' + +const runtimeConfig = useRuntimeConfig() +const config = ref(runtimeConfig) +</script> <script> import ViewToolbar from '@/components/view/ViewToolbar.vue' +import JumboBox from '@/components/JumboBox.vue' import { useUserStore } from '@/stores/user' import { useCacheStore } from '@/stores/cache' +import { errorCodeKey } from '@/utils' export default { components: { - ViewToolbar + ViewToolbar, + JumboBox + }, + setup () { + const userStore = useUserStore() + const { database_id } = useRoute().params + const { error } = useFetch(`${this.config.public.api.server}/api/database/${database_id}`, { + immediate: true, + method: 'HEAD', + timeout: 90_000, + headers: { + Accept: 'application/json', + Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null + } + }) + return { + error + } }, data () { return { - valid: null, + valid: false, loading: false, modify: { is_public: null, @@ -222,6 +252,7 @@ export default { this.modify.description = this.view.description }, methods: { + errorCodeKey, submit () { this.$refs.form.validate() }, diff --git a/dbrepo-ui/pages/database/[database_id]/view/create.vue b/dbrepo-ui/pages/database/[database_id]/view/create.vue index 839b79e243d4ceb7903e8a81ee9da0306d29697a..d1202980ecb542ee89a940da11d3fa159f28b106 100644 --- a/dbrepo-ui/pages/database/[database_id]/view/create.vue +++ b/dbrepo-ui/pages/database/[database_id]/view/create.vue @@ -1,16 +1,48 @@ <template> - <div v-if="canCreateView"> + <div + v-if="canCreateView"> <Builder mode="view" /> <v-breadcrumbs :items="items" class="pa-0 mt-2" /> </div> + <JumboBox + v-if="error" + :title="$t(errorCodeKey(error).title, { resource: 'view' })" + :subtitle="$t(errorCodeKey(error).subtitle)" + :text="$t(errorCodeKey(error).text, { resource: 'view' })" /> </template> +<script setup> +import { ref } from 'vue' + +const runtimeConfig = useRuntimeConfig() +const config = ref(runtimeConfig) +</script> <script> import Builder from '@/components/subset/Builder.vue' +import JumboBox from '@/components/JumboBox.vue' +import { useUserStore } from '@/stores/user' +import { errorCodeKey } from '@/utils' export default { components: { - Builder + Builder, + JumboBox + }, + setup () { + const userStore = useUserStore() + const { database_id } = useRoute().params + const { error } = useFetch(`${this.config.public.api.server}/api/database/${database_id}`, { + immediate: true, + method: 'HEAD', + timeout: 90_000, + headers: { + Accept: 'application/json', + Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null + } + }) + return { + error + } }, data () { return { @@ -49,6 +81,9 @@ export default { } return this.roles.includes('create-database-view') } + }, + methods: { + errorCodeKey } } </script> diff --git a/dbrepo-ui/pages/database/[database_id]/view/index.vue b/dbrepo-ui/pages/database/[database_id]/view/index.vue index 5d8cee483626d54afb8dbb082d489313a30f3aad..ab244bbe8a11453d2fc8bdb61de5e9773d4af80b 100644 --- a/dbrepo-ui/pages/database/[database_id]/view/index.vue +++ b/dbrepo-ui/pages/database/[database_id]/view/index.vue @@ -17,22 +17,31 @@ :text="$t(errorCodeKey(error).text, { resource: 'view' })" /> </template> +<script setup> +import { ref } from 'vue' + +const runtimeConfig = useRuntimeConfig() +const config = ref(runtimeConfig) +</script> <script> import DatabaseToolbar from '@/components/database/DatabaseToolbar.vue' +import JumboBox from '@/components/JumboBox.vue' import ViewList from '@/components/view/ViewList.vue' import { useCacheStore } from '@/stores/cache' +import { errorCodeKey } from '@/utils' export default { name: 'Views', components: { ViewList, - DatabaseToolbar + DatabaseToolbar, + JumboBox }, setup () { const config = useRuntimeConfig() const userStore = useUserStore() const { database_id } = useRoute().params - const { error } = useFetch(`${config.public.api.server}/api/database/${database_id}`, { + const { error } = useFetch(`${this.config.public.api.server}/api/database/${database_id}`, { immediate: true, method: 'HEAD', timeout: 90_000, diff --git a/helm/dbrepo/Chart.lock b/helm/dbrepo/Chart.lock index f452f870386be707d92e9f19498b4c24f004e6c1..0ae700f9d6f0a4674036ae4fb26c4aafc6ee1a5f 100644 --- a/helm/dbrepo/Chart.lock +++ b/helm/dbrepo/Chart.lock @@ -6,25 +6,25 @@ dependencies: repository: https://charts.bitnami.com/bitnami version: 21.6.1 - name: mariadb-galera - repository: https://charts.bitnami.com/bitnami + repository: oci://registry-1.docker.io/bitnamicharts version: 13.2.7 - name: mariadb-galera - repository: https://charts.bitnami.com/bitnami + repository: oci://registry-1.docker.io/bitnamicharts version: 13.2.7 - name: rabbitmq - repository: https://charts.bitnami.com/bitnami + repository: oci://registry-1.docker.io/bitnamicharts version: 14.0.0 - name: seaweedfs repository: file://../seaweedfs version: 4.2.1 - name: grafana - repository: https://charts.bitnami.com/bitnami + repository: oci://registry-1.docker.io/bitnamicharts version: 11.4.2 - name: prometheus - repository: https://charts.bitnami.com/bitnami + repository: oci://registry-1.docker.io/bitnamicharts version: 1.3.22 - name: nginx - repository: https://charts.bitnami.com/bitnami + repository: oci://registry-1.docker.io/bitnamicharts version: 18.3.1 -digest: sha256:414c043a3751945d7bd5b02fa00ee0464bee7f08efb469e00a5f059cdbff03b5 -generated: "2025-01-01T15:06:18.720941571+01:00" +digest: sha256:f244730fab10d52050634ce3286413d378b92e4dc97b0ad2951295c0d2971146 +generated: "2025-01-14T16:48:00.637443736+01:00" diff --git a/helm/dbrepo/Chart.yaml b/helm/dbrepo/Chart.yaml index 22d1865df5866213c931df8b2b522af33137c1e6..d2ff855534c9bbea91e408d2fee96a566994647d 100644 --- a/helm/dbrepo/Chart.yaml +++ b/helm/dbrepo/Chart.yaml @@ -30,17 +30,17 @@ dependencies: - name: mariadb-galera alias: datadb version: 13.2.7 - repository: https://charts.bitnami.com/bitnami + repository: oci://registry-1.docker.io/bitnamicharts condition: datadb.enabled - name: mariadb-galera alias: metadatadb version: 13.2.7 - repository: https://charts.bitnami.com/bitnami + repository: oci://registry-1.docker.io/bitnamicharts condition: metadatadb.enabled - name: rabbitmq alias: brokerservice version: 14.0.0 - repository: https://charts.bitnami.com/bitnami + repository: oci://registry-1.docker.io/bitnamicharts condition: brokerservice.enabled - name: seaweedfs alias: storageservice @@ -50,15 +50,15 @@ dependencies: - name: grafana alias: dashboardservice version: 11.4.2 - repository: https://charts.bitnami.com/bitnami + repository: oci://registry-1.docker.io/bitnamicharts condition: dashboardservice.enabled - name: prometheus alias: metricdb version: 1.3.22 - repository: https://charts.bitnami.com/bitnami + repository: oci://registry-1.docker.io/bitnamicharts condition: metricdb.enabled - name: nginx alias: gatewayservice version: 18.3.1 - repository: https://charts.bitnami.com/bitnami + repository: oci://registry-1.docker.io/bitnamicharts condition: gatewayservice.enabled \ No newline at end of file diff --git a/helm/dbrepo/charts/mariadb-galera-13.2.7.tgz b/helm/dbrepo/charts/mariadb-galera-13.2.7.tgz index 377afe25d2435c5788c26592b39797aa1378e966..92bfce78d9c52d62ca9d7e4816c51dccece8af2b 100644 Binary files a/helm/dbrepo/charts/mariadb-galera-13.2.7.tgz and b/helm/dbrepo/charts/mariadb-galera-13.2.7.tgz differ diff --git a/helm/dbrepo/charts/prometheus-1.3.22.tgz b/helm/dbrepo/charts/prometheus-1.3.22.tgz index 3d81a5e625af76257c1a7bc032e889005bc66607..5c26eda5dfb6ec24a8e3cf1b22e1b3aee10d838e 100644 Binary files a/helm/dbrepo/charts/prometheus-1.3.22.tgz and b/helm/dbrepo/charts/prometheus-1.3.22.tgz differ diff --git a/helm/dbrepo/charts/rabbitmq-14.0.0.tgz b/helm/dbrepo/charts/rabbitmq-14.0.0.tgz index 39ea3aaef2a94fe507a08242bbfe37209eb9fa53..e858784faeff04c04a34ebad05885197f565c1e0 100644 Binary files a/helm/dbrepo/charts/rabbitmq-14.0.0.tgz and b/helm/dbrepo/charts/rabbitmq-14.0.0.tgz differ diff --git a/helm/dbrepo/charts/seaweedfs-4.2.1.tgz b/helm/dbrepo/charts/seaweedfs-4.2.1.tgz index ae1b3048a25888df8dade2d0d3b86cd6404dcc0d..fece394e7c53ae6f207c913485155b278314ad1c 100644 Binary files a/helm/dbrepo/charts/seaweedfs-4.2.1.tgz and b/helm/dbrepo/charts/seaweedfs-4.2.1.tgz differ diff --git a/helm/dbrepo/files/01-setup-schema.sql b/helm/dbrepo/files/01-setup-schema.sql index 0a43ef604460e8deb4e4fee4f457c0ca833fc6a2..c9ce89d1be71f4791c5e55dbb7c24f46e979355a 100644 --- a/helm/dbrepo/files/01-setup-schema.sql +++ b/helm/dbrepo/files/01-setup-schema.sql @@ -9,6 +9,7 @@ CREATE TABLE IF NOT EXISTS `mdb_users` email character varying(255) NOT NULL, orcid character varying(255), affiliation character varying(255), + is_internal BOOLEAN NOT NULL DEFAULT FALSE, mariadb_password character varying(255) NOT NULL, theme character varying(255) NOT NULL default ('light'), language character varying(3) NOT NULL default ('en'), @@ -95,7 +96,6 @@ CREATE TABLE IF NOT EXISTS `mdb_databases` PRIMARY KEY (id), FOREIGN KEY (cid) REFERENCES mdb_containers (id), FOREIGN KEY (owned_by) REFERENCES mdb_users (id), - FOREIGN KEY (owned_by) REFERENCES mdb_users (id), FOREIGN KEY (contact_person) REFERENCES mdb_users (id) ) WITH SYSTEM VERSIONING; @@ -135,7 +135,6 @@ CREATE TABLE IF NOT EXISTS `mdb_tables` PRIMARY KEY (ID), UNIQUE (tDBID, internal_name), FOREIGN KEY (tDBID) REFERENCES mdb_databases (id), - FOREIGN KEY (owned_by) REFERENCES mdb_users (id), FOREIGN KEY (owned_by) REFERENCES mdb_users (id) ) WITH SYSTEM VERSIONING; diff --git a/helm/dbrepo/templates/auth-configmap.yaml b/helm/dbrepo/templates/auth-configmap.yaml index 9a237767cce39c2b3ad2cdb9c307f858ae158224..83530ee108bd0c444dbf04d071454f6c3d04aab1 100644 --- a/helm/dbrepo/templates/auth-configmap.yaml +++ b/helm/dbrepo/templates/auth-configmap.yaml @@ -83,7 +83,7 @@ data: "description" : "${default-system-roles}", "composite" : true, "composites" : { - "realm" : [ "delete-database-view", "update-semantic-unit", "export-query-data", "check-foreign-database-access", "default-data-steward-roles", "execute-query", "default-user-handling", "delete-table-data", "find-query", "list-database-views", "persist-query", "update-search-index", "delete-database-access", "view-table-history", "create-ontology", "update-ontology", "modify-user-theme", "default-system-roles", "create-semantic-concept", "default-container-handling", "create-container", "create-table", "default-broker-handling", "default-maintenance-handling", "execute-semantic-query", "uma_authorization", "table-semantic-analyse", "list-containers", "check-database-access", "escalated-query-handling", "delete-identifier", "modify-database-owner", "list-tables", "export-table-data", "create-database-access", "delete-container", "re-execute-query", "create-semantic-unit", "escalated-identifier-handling", "system", "update-table-statistic", "escalated-semantics-handling", "default-database-handling", "delete-ontology", "find-database", "find-database-view", "update-semantic-concept", "find-user", "import-database-data", "publish-identifier", "default-roles-dbrepo", "find-foreign-user", "create-database", "create-maintenance-message", "find-maintenance-message", "escalated-container-handling", "default-researcher-roles", "default-identifier-handling", "escalated-user-handling", "modify-user-information", "create-database-view", "update-maintenance-message", "delete-foreign-table", "offline_access", "modify-foreign-table-column-semantics", "delete-maintenance-message", "find-container", "insert-table-data", "modify-identifier-metadata", "modify-database-image", "escalated-broker-handling", "modify-table-column-semantics", "escalated-database-handling", "default-semantics-handling", "update-database-access", "default-query-handling", "find-table", "list-queries", "default-developer-roles", "create-identifier", "escalated-table-handling", "find-identifier", "view-database-view-data", "view-table-data", "list-licenses", "default-table-handling", "list-identifiers", "create-foreign-identifier", "list-databases", "list-ontologies", "modify-database-visibility", "list-maintenance-messages", "delete-table" ] + "realm" : [ "delete-database-view", "update-semantic-unit", "export-query-data", "check-foreign-database-access", "default-data-steward-roles", "execute-query", "default-user-handling", "delete-table-data", "find-query", "list-database-views", "persist-query", "update-search-index", "delete-database-access", "view-table-history", "create-ontology", "update-ontology", "modify-user-theme", "default-system-roles", "create-semantic-concept", "default-container-handling", "create-container", "create-table", "default-broker-handling", "default-maintenance-handling", "execute-semantic-query", "uma_authorization", "table-semantic-analyse", "list-containers", "check-database-access", "escalated-query-handling", "delete-identifier", "modify-database-owner", "list-tables", "export-table-data", "create-database-access", "delete-container", "re-execute-query", "create-semantic-unit", "escalated-identifier-handling", "system", "update-table-statistic", "escalated-semantics-handling", "default-database-handling", "delete-ontology", "find-database", "find-database-view", "update-semantic-concept", "find-user", "import-database-data", "publish-identifier", "default-roles-dbrepo", "find-foreign-user", "create-database", "create-maintenance-message", "find-maintenance-message", "escalated-container-handling", "default-researcher-roles", "default-identifier-handling", "escalated-user-handling", "modify-user-information", "create-database-view", "update-maintenance-message", "delete-foreign-table", "offline_access", "modify-foreign-table-column-semantics", "delete-maintenance-message", "find-container", "insert-table-data", "modify-identifier-metadata", "modify-database-image", "escalated-broker-handling", "modify-table-column-semantics", "escalated-database-handling", "default-semantics-handling", "update-database-access", "default-query-handling", "find-table", "list-queries", "default-developer-roles", "create-identifier", "escalated-table-handling", "find-identifier", "view-table-data", "list-licenses", "default-table-handling", "list-identifiers", "create-foreign-identifier", "list-databases", "list-ontologies", "modify-database-visibility", "list-maintenance-messages", "delete-table" ] }, "clientRole" : false, "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", @@ -156,19 +156,11 @@ data: "description" : "${default-table-handling}", "composite" : true, "composites" : { - "realm" : [ "modify-table-column-semantics", "list-tables", "update-table-statistic", "find-table", "create-table", "delete-table" ] + "realm" : [ "modify-table-column-semantics", "list-tables", "update-table-statistic", "find-table", "create-table", "delete-table", "update-table" ] }, "clientRole" : false, "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", "attributes" : { } - }, { - "id" : "b0d66d3d-59b4-4aae-aa66-e3d5a49f28e3", - "name" : "view-database-view-data", - "description" : "${view-database-view-data}", - "composite" : false, - "clientRole" : false, - "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", - "attributes" : { } }, { "id" : "f5ea431a-9b2c-4195-bcb4-9511f38e4b44", "name" : "create-database-view", @@ -229,7 +221,7 @@ data: "description" : "${default-researcher-roles}", "composite" : true, "composites" : { - "realm" : [ "default-table-handling", "default-semantics-handling", "default-container-handling", "default-query-handling", "default-user-handling", "default-database-handling", "default-broker-handling", "default-identifier-handling" ] + "realm" : [ "default-table-handling", "default-semantics-handling", "default-container-handling", "default-query-handling", "default-user-handling", "default-database-handling", "default-broker-handling", "default-identifier-handling", "default-view-handling" ] }, "clientRole" : false, "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", @@ -274,6 +266,14 @@ data: "clientRole" : false, "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", "attributes" : { } + }, { + "id" : "22449528-00c9-4e86-9400-4b8ae6fd8f4d", + "name" : "modify-view-visibility", + "description" : "${modify-view-visibility}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } }, { "id" : "c12c1f4e-186f-4153-a795-26e79fb623d6", "name" : "create-ontology", @@ -306,6 +306,17 @@ data: "clientRole" : false, "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", "attributes" : { } + }, { + "id" : "d75e7938-9d5e-4cb3-8c57-18a446867d3a", + "name" : "default-view-handling", + "description" : "${default-view-handling}", + "composite" : true, + "composites" : { + "realm" : [ "delete-database-view", "update-database-view", "create-database-view", "modify-view-visibility", "find-database-view", "list-database-views" ] + }, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } }, { "id" : "535f1484-4514-4d24-8d97-e3f6c11a426b", "name" : "create-container", @@ -400,13 +411,21 @@ data: "clientRole" : false, "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", "attributes" : { } + }, { + "id" : "6ae766b0-b8b4-4067-a95d-c8576bc4ac77", + "name" : "update-table", + "description" : "${update-table}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } }, { "id" : "64c16bfb-2015-48ad-a23f-637ff24419cb", "name" : "default-query-handling", "description" : "${default-query-handling}", "composite" : true, "composites" : { - "realm" : [ "delete-database-view", "export-query-data", "execute-query", "delete-table-data", "export-table-data", "list-queries", "find-query", "list-database-views", "persist-query", "view-database-view-data", "view-table-data", "re-execute-query", "view-table-history", "create-database-view", "find-database-view", "insert-table-data" ] + "realm" : [ "delete-database-view", "export-query-data", "execute-query", "delete-table-data", "export-table-data", "list-queries", "find-query", "list-database-views", "persist-query", "view-table-data", "re-execute-query", "view-table-history", "create-database-view", "find-database-view", "insert-table-data" ] }, "clientRole" : false, "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", @@ -427,6 +446,14 @@ data: "clientRole" : false, "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", "attributes" : { } + }, { + "id" : "df20b7d1-8d30-4a99-80eb-e8195fab0e76", + "name" : "update-database-view", + "description" : "${update-database-view}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } }, { "id" : "88f82262-be80-4d18-9fb4-5529da031f33", "name" : "system", @@ -1221,12 +1248,13 @@ data: "frontchannelLogout" : false, "protocol" : "openid-connect", "attributes" : { + "realm_client" : "false", "post.logout.redirect.uris" : "+" }, "authenticationFlowBindingOverrides" : { }, "fullScopeAllowed" : false, "nodeReRegistrationTimeout" : 0, - "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "email" ], + "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "basic", "email" ], "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] }, { "id" : "d3c4a04e-39ce-4549-a34a-11e25774cd96", @@ -1251,6 +1279,7 @@ data: "frontchannelLogout" : false, "protocol" : "openid-connect", "attributes" : { + "realm_client" : "false", "post.logout.redirect.uris" : "+", "pkce.code.challenge.method" : "S256" }, @@ -1265,7 +1294,7 @@ data: "consentRequired" : false, "config" : { } } ], - "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "email" ], + "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "basic", "email" ], "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] }, { "id" : "81ef0f59-a5ca-4be4-a1d1-0c32edf1cfd6", @@ -1288,12 +1317,14 @@ data: "frontchannelLogout" : false, "protocol" : "openid-connect", "attributes" : { + "realm_client" : "false", + "client.use.lightweight.access.token.enabled" : "true", "post.logout.redirect.uris" : "+" }, "authenticationFlowBindingOverrides" : { }, - "fullScopeAllowed" : false, + "fullScopeAllowed" : true, "nodeReRegistrationTimeout" : 0, - "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "email" ], + "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "basic", "email" ], "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] }, { "id" : "88694c91-753d-4c44-9740-ec9ac06bba45", @@ -1316,6 +1347,7 @@ data: "frontchannelLogout" : false, "protocol" : "openid-connect", "attributes" : { + "realm_client" : "true", "post.logout.redirect.uris" : "+" }, "authenticationFlowBindingOverrides" : { }, @@ -1349,6 +1381,7 @@ data: "frontchannelLogout" : true, "protocol" : "openid-connect", "attributes" : { + "realm_client" : "false", "oidc.ciba.grant.enabled" : "false", "client.secret.creation.time" : "1680085365", "backchannel.logout.session.required" : "true", @@ -1379,11 +1412,11 @@ data: "protocolMapper" : "oidc-hardcoded-claim-mapper", "consentRequired" : false, "config" : { - "claim.value" : "dbrepo", - "userinfo.token.claim" : "true", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "aud", + "claim.value" : "dbrepo", + "userinfo.token.claim" : "true", "access.tokenResponse.claim" : "false" } }, { @@ -1402,7 +1435,7 @@ data: "claim.name" : "uid" } } ], - "defaultClientScopes" : [ "roles", "attributes" ], + "defaultClientScopes" : [ "roles", "attributes", "basic" ], "optionalClientScopes" : [ "rabbitmq.read:*/*", "web-origins", "acr", "rabbitmq.write:*/*", "address", "phone", "offline_access", "profile", "microprofile-jwt", "email", "rabbitmq.configure:*/*" ] }, { "id" : "25741f6b-4867-4138-8238-6345c6ba8702", @@ -1430,6 +1463,7 @@ data: "frontchannelLogout" : true, "protocol" : "openid-connect", "attributes" : { + "realm_client" : "false", "oidc.ciba.grant.enabled" : "false", "client.secret.creation.time" : "1680000860", "backchannel.logout.session.required" : "true", @@ -1447,12 +1481,12 @@ data: "protocolMapper" : "oidc-usermodel-property-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "false", "user.attribute" : "username", "id.token.claim" : "false", "access.token.claim" : "true", "claim.name" : "client_id", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "false" } }, { "id" : "f1afc22d-f595-403b-ba2e-6ab19d98205e", @@ -1461,15 +1495,15 @@ data: "protocolMapper" : "oidc-hardcoded-claim-mapper", "consentRequired" : false, "config" : { - "claim.value" : "rabbitmq", - "userinfo.token.claim" : "false", "id.token.claim" : "false", "access.token.claim" : "true", "claim.name" : "aud", + "claim.value" : "rabbitmq", + "userinfo.token.claim" : "false", "access.tokenResponse.claim" : "false" } } ], - "defaultClientScopes" : [ "web-origins", "acr", "rabbitmq.tag:management" ], + "defaultClientScopes" : [ "web-origins", "acr", "rabbitmq.tag:management", "basic" ], "optionalClientScopes" : [ "rabbitmq.read:*/*", "rabbitmq.write:*/*", "address", "phone", "offline_access", "profile", "roles", "microprofile-jwt", "email", "rabbitmq.configure:*/*" ] }, { "id" : "cfffd5d0-aa19-4057-8ca0-f2c51ca0e930", @@ -1492,6 +1526,7 @@ data: "frontchannelLogout" : false, "protocol" : "openid-connect", "attributes" : { + "realm_client" : "true", "post.logout.redirect.uris" : "+" }, "authenticationFlowBindingOverrides" : { }, @@ -1522,11 +1557,13 @@ data: "frontchannelLogout" : false, "protocol" : "openid-connect", "attributes" : { + "realm_client" : "false", + "client.use.lightweight.access.token.enabled" : "true", "post.logout.redirect.uris" : "+", "pkce.code.challenge.method" : "S256" }, "authenticationFlowBindingOverrides" : { }, - "fullScopeAllowed" : false, + "fullScopeAllowed" : true, "nodeReRegistrationTimeout" : 0, "protocolMappers" : [ { "id" : "c4d54410-3f22-4259-9571-94da2c43b752", @@ -1535,15 +1572,15 @@ data: "protocolMapper" : "oidc-usermodel-attribute-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "locale", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "locale", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } } ], - "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "email" ], + "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "basic", "email" ], "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] } ], "clientScopes" : [ { @@ -1564,8 +1601,8 @@ data: "protocol" : "openid-connect", "attributes" : { "include.in.token.scope" : "true", - "display.on.consent.screen" : "true", - "consent.screen.text" : "${emailScopeConsentText}" + "consent.screen.text" : "${emailScopeConsentText}", + "display.on.consent.screen" : "true" }, "protocolMappers" : [ { "id" : "782819fe-ba5d-4ddb-9f95-cabb69d79c8d", @@ -1574,12 +1611,12 @@ data: "protocolMapper" : "oidc-usermodel-property-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "emailVerified", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "email_verified", - "jsonType.label" : "boolean" + "jsonType.label" : "boolean", + "userinfo.token.claim" : "true" } }, { "id" : "ca613fc8-bbf2-4240-8b33-a1874f1559f3", @@ -1588,12 +1625,12 @@ data: "protocolMapper" : "oidc-usermodel-property-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "email", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "email", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } } ] }, { @@ -1603,8 +1640,8 @@ data: "protocol" : "openid-connect", "attributes" : { "include.in.token.scope" : "true", - "display.on.consent.screen" : "true", - "consent.screen.text" : "${profileScopeConsentText}" + "consent.screen.text" : "${profileScopeConsentText}", + "display.on.consent.screen" : "true" }, "protocolMappers" : [ { "id" : "84f0487a-1d7d-470c-9b8e-5835294ae235", @@ -1613,12 +1650,12 @@ data: "protocolMapper" : "oidc-usermodel-property-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "username", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "preferred_username", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } }, { "id" : "bbdcdb36-3ec0-443d-b1af-9993d40f0567", @@ -1627,12 +1664,12 @@ data: "protocolMapper" : "oidc-usermodel-attribute-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "gender", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "gender", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } }, { "id" : "9faa870b-5491-4ce9-b27d-c9ce07d6a95e", @@ -1641,12 +1678,12 @@ data: "protocolMapper" : "oidc-usermodel-attribute-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "birthdate", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "birthdate", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } }, { "id" : "f0e3c012-9523-4076-83ae-e466e2d08220", @@ -1666,12 +1703,12 @@ data: "protocolMapper" : "oidc-usermodel-attribute-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "profile", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "profile", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } }, { "id" : "18cfbf4b-0a8e-45c7-a832-c0f72c92f3f3", @@ -1680,12 +1717,12 @@ data: "protocolMapper" : "oidc-usermodel-attribute-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "updatedAt", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "updated_at", - "jsonType.label" : "long" + "jsonType.label" : "long", + "userinfo.token.claim" : "true" } }, { "id" : "841ea785-26ab-429a-a420-09ce3948924d", @@ -1694,12 +1731,12 @@ data: "protocolMapper" : "oidc-usermodel-property-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "lastName", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "family_name", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } }, { "id" : "bfba13ff-f952-4e89-bbb1-a693fdebfae8", @@ -1708,12 +1745,12 @@ data: "protocolMapper" : "oidc-usermodel-attribute-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "website", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "website", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } }, { "id" : "475f071d-5149-4379-b928-76482f5f519c", @@ -1722,12 +1759,12 @@ data: "protocolMapper" : "oidc-usermodel-attribute-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "zoneinfo", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "zoneinfo", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } }, { "id" : "b8bebfed-b5e9-4604-a0ee-9817f7d439ac", @@ -1736,12 +1773,12 @@ data: "protocolMapper" : "oidc-usermodel-attribute-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "middleName", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "middle_name", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } }, { "id" : "445232c8-6830-476c-a6f1-8bbef167595a", @@ -1750,12 +1787,12 @@ data: "protocolMapper" : "oidc-usermodel-attribute-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "picture", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "picture", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } }, { "id" : "65f2e474-6ede-4872-86e4-e49504dd0f2a", @@ -1764,12 +1801,12 @@ data: "protocolMapper" : "oidc-usermodel-attribute-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "locale", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "locale", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } }, { "id" : "16cd5a27-ccf3-453c-ae1e-8621813ab73c", @@ -1778,12 +1815,12 @@ data: "protocolMapper" : "oidc-usermodel-property-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "firstName", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "given_name", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } }, { "id" : "f9efedfc-3388-457c-b10a-1dff4525ff9b", @@ -1792,12 +1829,12 @@ data: "protocolMapper" : "oidc-usermodel-attribute-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "nickname", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "nickname", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } } ] }, { @@ -1831,12 +1868,12 @@ data: "protocolMapper" : "oidc-usermodel-property-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "username", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "upn", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } } ] }, { @@ -1878,8 +1915,8 @@ data: "protocol" : "openid-connect", "attributes" : { "include.in.token.scope" : "true", - "display.on.consent.screen" : "true", - "consent.screen.text" : "${phoneScopeConsentText}" + "consent.screen.text" : "${phoneScopeConsentText}", + "display.on.consent.screen" : "true" }, "protocolMappers" : [ { "id" : "dae802fb-9138-408a-b80e-a40eb0f56814", @@ -1888,12 +1925,12 @@ data: "protocolMapper" : "oidc-usermodel-attribute-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "phoneNumber", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "phone_number", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } }, { "id" : "feb06a8d-b0eb-4911-8464-368d93f566fa", @@ -1902,12 +1939,12 @@ data: "protocolMapper" : "oidc-usermodel-attribute-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "phoneNumberVerified", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "phone_number_verified", - "jsonType.label" : "boolean" + "jsonType.label" : "boolean", + "userinfo.token.claim" : "true" } } ] }, { @@ -1917,8 +1954,8 @@ data: "protocol" : "openid-connect", "attributes" : { "include.in.token.scope" : "false", - "display.on.consent.screen" : "false", - "consent.screen.text" : "" + "consent.screen.text" : "", + "display.on.consent.screen" : "false" }, "protocolMappers" : [ { "id" : "c6411e3b-6478-453d-b530-5fe175a4d786", @@ -2014,8 +2051,8 @@ data: "protocol" : "openid-connect", "attributes" : { "include.in.token.scope" : "true", - "display.on.consent.screen" : "true", - "consent.screen.text" : "${addressScopeConsentText}" + "consent.screen.text" : "${addressScopeConsentText}", + "display.on.consent.screen" : "true" }, "protocolMappers" : [ { "id" : "8d4ffe4d-1d01-4ca1-8ff4-44eacca61b30", @@ -2046,6 +2083,41 @@ data: "gui.order" : "", "consent.screen.text" : "" } + }, { + "id" : "ba11267a-478b-4b32-872f-4eb2d125d116", + "name" : "basic", + "description" : "OpenID Connect scope for add all basic claims to the token", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "false", + "display.on.consent.screen" : "false" + }, + "protocolMappers" : [ { + "id" : "1445e14f-49b0-4666-8ddc-691493c24ad9", + "name" : "sub", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-sub-mapper", + "consentRequired" : false, + "config" : { + "introspection.token.claim" : "true", + "access.token.claim" : "true" + } + }, { + "id" : "846f1ef0-2b86-4e07-9d25-691d25af5fce", + "name" : "auth_time", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usersessionmodel-note-mapper", + "consentRequired" : false, + "config" : { + "user.session.note" : "AUTH_TIME", + "introspection.token.claim" : "true", + "userinfo.token.claim" : "true", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "auth_time", + "jsonType.label" : "long" + } + } ] }, { "id" : "37f61543-dad7-4a82-8e10-77acdd1eefdc", "name" : "roles", @@ -2053,8 +2125,8 @@ data: "protocol" : "openid-connect", "attributes" : { "include.in.token.scope" : "false", - "display.on.consent.screen" : "true", - "consent.screen.text" : "${rolesScopeConsentText}" + "consent.screen.text" : "${rolesScopeConsentText}", + "display.on.consent.screen" : "true" }, "protocolMappers" : [ { "id" : "3b6b6914-8ad1-4a71-88ec-444f754aaacb", @@ -2091,7 +2163,7 @@ data: } } ] } ], - "defaultDefaultClientScopes" : [ "rabbitmq.tag:administrator", "rabbitmq.tag:management" ], + "defaultDefaultClientScopes" : [ "rabbitmq.tag:administrator", "rabbitmq.tag:management", "basic" ], "defaultOptionalClientScopes" : [ "rabbitmq.write:*/*", "offline_access", "rabbitmq.configure:*/*", "roles", "role_list", "address", "phone", "acr", "microprofile-jwt", "email", "attributes", "profile", "rabbitmq.read:*/*", "web-origins" ], "browserSecurityHeaders" : { "contentSecurityPolicyReportOnly" : "", @@ -2153,7 +2225,7 @@ data: "subType" : "anonymous", "subComponents" : { }, "config" : { - "allowed-protocol-mapper-types" : [ "saml-user-attribute-mapper", "oidc-full-name-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-address-mapper", "saml-user-property-mapper", "oidc-usermodel-property-mapper", "oidc-usermodel-attribute-mapper", "saml-role-list-mapper" ] + "allowed-protocol-mapper-types" : [ "oidc-full-name-mapper", "saml-role-list-mapper", "saml-user-property-mapper", "oidc-address-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-usermodel-property-mapper", "saml-user-attribute-mapper", "oidc-usermodel-attribute-mapper" ] } }, { "id" : "1849e52a-b8c9-44a8-af3d-ee19376a1ed1", @@ -2179,7 +2251,15 @@ data: "subType" : "authenticated", "subComponents" : { }, "config" : { - "allowed-protocol-mapper-types" : [ "saml-role-list-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-full-name-mapper", "oidc-usermodel-property-mapper", "oidc-usermodel-attribute-mapper", "saml-user-property-mapper", "saml-user-attribute-mapper", "oidc-address-mapper" ] + "allowed-protocol-mapper-types" : [ "saml-user-property-mapper", "oidc-full-name-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-usermodel-property-mapper", "oidc-address-mapper", "saml-role-list-mapper", "oidc-usermodel-attribute-mapper", "saml-user-attribute-mapper" ] + } + } ], + "org.keycloak.userprofile.UserProfileProvider" : [ { + "id" : "a407a1d6-a7f6-4a72-ba3a-149de03d5a43", + "providerId" : "declarative-user-profile", + "subComponents" : { }, + "config" : { + "kc.user.profile.config" : [ "{\"attributes\":[{\"name\":\"username\",\"displayName\":\"${username}\",\"validations\":{\"length\":{\"min\":3,\"max\":255},\"username-prohibited-characters\":{},\"up-username-not-idn-homograph\":{}},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false},{\"name\":\"email\",\"displayName\":\"${email}\",\"validations\":{\"email\":{},\"length\":{\"max\":255}},\"required\":{\"roles\":[\"user\"]},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false},{\"name\":\"firstName\",\"displayName\":\"${firstName}\",\"validations\":{\"length\":{\"max\":255},\"person-name-prohibited-characters\":{}},\"required\":{\"roles\":[\"user\"]},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false},{\"name\":\"lastName\",\"displayName\":\"${lastName}\",\"validations\":{\"length\":{\"max\":255},\"person-name-prohibited-characters\":{}},\"required\":{\"roles\":[\"user\"]},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false}],\"groups\":[{\"name\":\"user-metadata\",\"displayHeader\":\"User metadata\",\"displayDescription\":\"Attributes, which refer to user metadata\"}],\"unmanagedAttributePolicy\":\"ENABLED\"}" ] } } ], "org.keycloak.storage.UserStorageProvider" : [ { @@ -2241,19 +2321,19 @@ data: "providerId" : "group-ldap-mapper", "subComponents" : { }, "config" : { + "mode" : [ "LDAP_ONLY" ], "membership.attribute.type" : [ "DN" ], + "user.roles.retrieve.strategy" : [ "LOAD_GROUPS_BY_MEMBER_ATTRIBUTE" ], "group.name.ldap.attribute" : [ "cn" ], "preserve.group.inheritance" : [ "false" ], - "membership.user.ldap.attribute" : [ "uid" ], - "groups.dn" : [ "ou=users,dc=dbrepo,dc=at" ], - "mode" : [ "LDAP_ONLY" ], - "user.roles.retrieve.strategy" : [ "LOAD_GROUPS_BY_MEMBER_ATTRIBUTE" ], "ignore.missing.groups" : [ "false" ], "membership.ldap.attribute" : [ "member" ], + "membership.user.ldap.attribute" : [ "uid" ], "memberof.ldap.attribute" : [ "memberOf" ], + "groups.dn" : [ "ou=users,dc=dbrepo,dc=at" ], "group.object.classes" : [ "groupOfNames" ], - "groups.path" : [ "/" ], - "drop.non.existing.groups.during.sync" : [ "false" ] + "drop.non.existing.groups.during.sync" : [ "false" ], + "groups.path" : [ "/" ] } }, { "id" : "b6ff3285-35af-4e86-8bb4-d94b8e0d70bb", @@ -2263,8 +2343,8 @@ data: "config" : { "ldap.attribute" : [ "modifyTimestamp" ], "is.mandatory.in.ldap" : [ "false" ], - "read.only" : [ "true" ], "always.read.value.from.ldap" : [ "true" ], + "read.only" : [ "true" ], "user.model.attribute" : [ "modifyTimestamp" ] } }, { @@ -2277,15 +2357,15 @@ data: "is.mandatory.in.ldap" : [ "true" ], "attribute.force.default" : [ "false" ], "is.binary.attribute" : [ "false" ], - "read.only" : [ "false" ], "always.read.value.from.ldap" : [ "false" ], + "read.only" : [ "false" ], "user.model.attribute" : [ "username" ] } } ] }, "config" : { - "fullSyncPeriod" : [ "-1" ], "pagination" : [ "false" ], + "fullSyncPeriod" : [ "-1" ], "startTls" : [ "false" ], "usersDn" : [ "ou=users,{{ .Values.identityservice.global.ldapDomain }}" ], "connectionPooling" : [ "true" ], @@ -2313,14 +2393,6 @@ data: "validatePasswordPolicy" : [ "false" ] } } ], - "org.keycloak.userprofile.UserProfileProvider" : [ { - "id" : "a407a1d6-a7f6-4a72-ba3a-149de03d5a43", - "providerId" : "declarative-user-profile", - "subComponents" : { }, - "config" : { - "kc.user.profile.config" : [ "{\"attributes\":[{\"name\":\"username\",\"displayName\":\"${username}\",\"validations\":{\"length\":{\"min\":3,\"max\":255},\"username-prohibited-characters\":{},\"up-username-not-idn-homograph\":{}},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false},{\"name\":\"email\",\"displayName\":\"${email}\",\"validations\":{\"email\":{},\"length\":{\"max\":255}},\"required\":{\"roles\":[\"user\"]},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false},{\"name\":\"firstName\",\"displayName\":\"${firstName}\",\"validations\":{\"length\":{\"max\":255},\"person-name-prohibited-characters\":{}},\"required\":{\"roles\":[\"user\"]},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false},{\"name\":\"lastName\",\"displayName\":\"${lastName}\",\"validations\":{\"length\":{\"max\":255},\"person-name-prohibited-characters\":{}},\"required\":{\"roles\":[\"user\"]},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false}],\"groups\":[{\"name\":\"user-metadata\",\"displayHeader\":\"User metadata\",\"displayDescription\":\"Attributes, which refer to user metadata\"}],\"unmanagedAttributePolicy\":\"ENABLED\"}" ] - } - } ], "org.keycloak.keys.KeyProvider" : [ { "id" : "2f53ccf3-37b0-4d34-83e7-ed497499ee51", "name" : "rsa-enc-generated", @@ -2935,7 +3007,7 @@ data: "clientSessionMaxLifespan" : "0", "shortVerificationUri" : "" }, - "keycloakVersion" : "24.0.5", + "keycloakVersion" : "26.0.0", "userManagedAccessAllowed" : false, "clientProfiles" : { "profiles" : [ ] @@ -2944,4 +3016,4 @@ data: "policies" : [ ] } } -{{- end }} +{{- end }} \ No newline at end of file diff --git a/helm/dbrepo/values.yaml b/helm/dbrepo/values.yaml index dfdda4e566981cf2777d2c6682f59598bc324606..84a4375a615f216a5da121d0f0c27589698fa926 100644 --- a/helm/dbrepo/values.yaml +++ b/helm/dbrepo/values.yaml @@ -735,7 +735,7 @@ storageservice: init: image: ## @skip storageservice.init.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.6.1 + name: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.6.1rc0 s3: ## @param storageservice.init.s3.endpoint The S3-capable endpoint the microservice connects to. endpoint: http://storage-service-s3:8333 @@ -844,7 +844,7 @@ ui: enabled: true image: ## @skip ui.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/ui:1.6.1 + name: registry.datalab.tuwien.ac.at/dbrepo/ui:1.6.1rc1 ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param ui.podSecurityContext.enabled Enable pods' Security Context diff --git a/helm/seaweedfs/Chart.lock b/helm/seaweedfs/Chart.lock index 4486b86cbbe7335389e547f4f0e74c7e0d6d6fd0..1195241a0686ef99b5cde492d2191b3417193279 100644 --- a/helm/seaweedfs/Chart.lock +++ b/helm/seaweedfs/Chart.lock @@ -4,9 +4,9 @@ dependencies: version: 20.2.1 - name: postgresql repository: oci://registry-1.docker.io/bitnamicharts - version: 16.3.5 + version: 16.4.2 - name: common repository: oci://registry-1.docker.io/bitnamicharts version: 2.29.0 -digest: sha256:a536e19612db24ddcd6f55031b2a2bfcb10d5c328edac09876a106dc471482fc -generated: "2025-01-08T08:47:53.829182441+01:00" +digest: sha256:b9f5516ae118fdca61c19cfe79cee8bd77ad96978dd8c06ad003646d5691aca5 +generated: "2025-01-14T10:19:53.265063382+01:00" diff --git a/helm/seaweedfs/charts/mariadb-20.2.1.tgz b/helm/seaweedfs/charts/mariadb-20.2.1.tgz index 2f55cc750ba3907eebca3545636e8f9c8afd19d2..9bba8eed49e866977396c0076b1a9c5946ec88b1 100644 Binary files a/helm/seaweedfs/charts/mariadb-20.2.1.tgz and b/helm/seaweedfs/charts/mariadb-20.2.1.tgz differ diff --git a/helm/seaweedfs/charts/postgresql-16.3.5.tgz b/helm/seaweedfs/charts/postgresql-16.3.5.tgz deleted file mode 100644 index d3ea1aacaeb921586dfeec85031a629bc95f6730..0000000000000000000000000000000000000000 Binary files a/helm/seaweedfs/charts/postgresql-16.3.5.tgz and /dev/null differ diff --git a/helm/seaweedfs/charts/postgresql-16.4.2.tgz b/helm/seaweedfs/charts/postgresql-16.4.2.tgz new file mode 100644 index 0000000000000000000000000000000000000000..aaa8899b4dad449edbaa98aefefbce4fa4de756d Binary files /dev/null and b/helm/seaweedfs/charts/postgresql-16.4.2.tgz differ diff --git a/make/rel.mk b/make/rel.mk index 6a24d75a90a3abe6a887262b285262135c1688ce..0c4b2bb193f3618e3098d13fd283882701e29a20 100644 --- a/make/rel.mk +++ b/make/rel.mk @@ -6,6 +6,7 @@ tag-images: build-images ## Tag the docker images. docker tag dbrepo-dashboard-service:latest "${REPOSITORY_URL}/dashboard-service:${APP_VERSION}" docker tag dbrepo-ui:latest "${REPOSITORY_URL}/ui:${APP_VERSION}" docker tag dbrepo-data-service:latest "${REPOSITORY_URL}/data-service:${APP_VERSION}" + docker tag dbrepo-auth-service-init:latest "${REPOSITORY_URL}/auth-service-init:${APP_VERSION}" docker tag dbrepo-metadata-service:latest "${REPOSITORY_URL}/metadata-service:${APP_VERSION}" docker tag dbrepo-search-db:latest "${REPOSITORY_URL}/search-db:${APP_VERSION}" docker tag dbrepo-search-service:latest "${REPOSITORY_URL}/search-service:${APP_VERSION}" @@ -18,6 +19,7 @@ release-images: tag-images ## Release the docker images. docker push "${REPOSITORY_URL}/dashboard-service:${APP_VERSION}" docker push "${REPOSITORY_URL}/ui:${APP_VERSION}" docker push "${REPOSITORY_URL}/data-service:${APP_VERSION}" + docker push "${REPOSITORY_URL}/auth-service-init:${APP_VERSION}" docker push "${REPOSITORY_URL}/search-db:${APP_VERSION}" docker push "${REPOSITORY_URL}/metadata-service:${APP_VERSION}" docker push "${REPOSITORY_URL}/search-service:${APP_VERSION}"