From 0c4c35ce1d3e41bfb80e5d1c44c8b15edc861124 Mon Sep 17 00:00:00 2001
From: Martin Weise <martin.weise@tuwien.ac.at>
Date: Wed, 5 Feb 2025 17:35:24 +0100
Subject: [PATCH] Fixed the view create bug

Signed-off-by: Martin Weise <martin.weise@tuwien.ac.at>
---
 .../target/create-event-listener.jar          | Bin 10140 -> 10139 bytes
 dbrepo-ui/components/TimeDrift.vue            |  44 ------------------
 dbrepo-ui/components/subset/Builder.vue       |  31 +++++++-----
 dbrepo-ui/components/subset/Results.vue       |  17 -------
 dbrepo-ui/composables/database-service.ts     |  21 ---------
 dbrepo-ui/composables/query-service.ts        |   6 +--
 dbrepo-ui/nuxt.config.ts                      |   6 +++
 .../[database_id]/view/[view_id]/data.vue     |   5 +-
 8 files changed, 29 insertions(+), 101 deletions(-)
 delete mode 100644 dbrepo-ui/components/TimeDrift.vue

diff --git a/dbrepo-auth-service/listeners/target/create-event-listener.jar b/dbrepo-auth-service/listeners/target/create-event-listener.jar
index 76b1ad02357c308cc312c99ea8bf0e3c3b2e8b62..26cb91c37666c966f6382d35feaaf9f5da5c7f8c 100644
GIT binary patch
delta 970
zcmbQ^Kigk8z?+#xgn@yBgP|bYHA*%wO}c2Juwwn`yu%6td!j$te_(c)Y*F?oda~TD
z75tjDcdl>93&@c<cq{YYz9X5jrmJqrHMGi>wMD)=FiXhxqj<?Z6SH*XLP2-$c83)|
zA5GY7{o=wV@8xF8oR6z1St^OGU1<{kQn&ujLaytZEUes?nQ&=@Jo0bTIx|yG=A9Iu
zZtf2E>yoX{>rXUR-<fXbA9Z)foV8-T-`7}dFwH9C6>&HJy6%va?%%WJY=7M}mf1h~
zfAZ&^eP?gBWjrs|{Qi5d!BX)n?|7pay%;=`z1io*tX@(2;;HAnp2Z0zQqx3B3_ipr
zCLZ8xpD)XK&90*Ejl;PG*D^1?f4`9L{9e;-wXeT3+lel0ubK0)p8w6_RX;av6chbg
zx&GCks{!^)cs?)FZOO{od9-<z)D6By4$qap_8-{DJ?rq{%2b<$uH{;Lj-8v6VVd$%
z<n)?3=Z-Dj*=FK6M}6|iJu{{X^KQ=RIq9Qbu<QGqRr=5CE-Rc=JY`kU@y^>@Uxnk>
z1)-jv#pR%g;9_9lU;stL<V}n!O!?uHZ!qdH6@*XbV3G$>noMdSDv(JVMAb2wf~c)b
z-XN7s%;!MVCFUNcg7D1=EOVJa^nbQb93c8L|1?36;%>#+AWB1N3MV|eCm&U^WGV=s
zq%6a@WU{QXgnWLuYZL<#5Q4J>7~VRbo*bgAXbjQ~7iM5!V1{!*YJM{^FeH}f2Y53w
zi7>-FHF<@yjEoEuSf-@3JTo;9UBLro873E|$%#zDJSZAvRb&_oCpW6dXrr2l>P&qU
zC#;y<sA2~Sk%KBSj9(|;Q!xko%jY-CDm?}U1|0?l1}C@%28Jb#M<<)81}cF3_5V}z
zZhs~QhHI=03`Qtwf>|aPu$WA~smcRZ7%=hHj{_VG41EF&3}Pq>Ke0{bXP1~PtHuKg
zZf!Lgrf2+<3s}@A7pNI9&Y8SW%@rj6LQRILPH}P{ll0^VOk$JIDDpu)h{%w_9wFzF
Z85kHgGB7X*qgWw5xj<cwZM_mm5CHh2L9PG*

delta 1017
zcmbR3KgVA<z?+#xgn@yBgW-m;YZM1_=Z4~m!ix0=gPIKl_8K3yf5JYgL1FEk9NUcL
zuY9)No4(<Ok7CKB)?53{mv$u|59IeWyE(m9KfjpYE&N5t{spDGOf9=zMc9hF9U?y6
zR80SVVR7R1u-uaVX{t)LN@;V~dGFKM{wK5jRQ&9ggNB!;hB@pLs=pSJeD2htN9&$m
zxY%aBWp7wTU%kvu{kBWbJ%hKIrFTcZmeJ<RX;t0L%GJC(Ej+oo?cX!&<~n7O>Gn_l
zpWGRzTf9y2*3Otyf9v#1p0boy_qsI*IRwo<)uen|^OcTO<s|jP2c+lzOl7p~sWFep
zFnIhh-F?s2{yur@3C0<xbY#ErU-<D{Z|lo@ZGSt?x4c)}KjT9^|C`BKKlYfiiSkx1
zpY<p7vcZxspO<O3WJ&Kl+Po_IMqlFx&y{Wa4{ZEC>+j*pwXzExtF`tVikqKdxb_s+
zri@ufJf)6C3aWaV?Cn~-#-Wt+vc+6A;i)dmtFxo)Ex*rZ^Arm-yXU+mK8j5-?n1j*
zeu~5%W>8FUF)(m2Fx)Vnyn#`b>ALac>x_C#H;gB<Gs%M}4JI`Z6~LqoqH38;LDUu|
zZ;(nx=5rwGB6APZ4dc!6EOVJa^gp&w93c7=|1?36;x5J6AWB_n3MV|eCm&I=1PT6E
zl3`prSw>kx;kvPF6ax|vg0lq}-a4LPocxekWO9ZwPd3O5xEuom12dchQuv3Ffg!O(
zKfs%jNrV~ZGgOngP&CLgfi;wrmS?8sq3N4^Us;CHb@Cr&IgndrRAd;7CO4?aXyY?o
zAI0>QlN(g*Kw)%1MTY4c(_}$rt;rm!JYe7Y{AO9D$H2g#!@$7c1lPsDu%z)A^W=xj
zE|V)%c@#jt{r{<Xw?7jD!!=e01|t-OAuN;gSxhG1fGP}_c<aXj4hDuk0R{#!6osGJ
zCiAgNOqNmO0r^BrO@`??|KxlY^~w2a28?qjFHmy@+q8S#gCvksK-d<=fO^Hr3)M^~
mpI799`W}&gg*`&fB{MKEY-C_y5Ju4?GdW*fjctPxNDu(oN==ji

diff --git a/dbrepo-ui/components/TimeDrift.vue b/dbrepo-ui/components/TimeDrift.vue
deleted file mode 100644
index 2f2555f9f8..0000000000
--- a/dbrepo-ui/components/TimeDrift.vue
+++ /dev/null
@@ -1,44 +0,0 @@
-<template>
-  <v-alert
-    v-cloak
-    v-if="timestamp && offSeconds > 3"
-    class="banner"
-    border="start"
-    type="warning">
-    {{ $t('error.data.drift') + ' ' + offSeconds + 's' }}
-  </v-alert>
-</template>
-
-<script>
-import { formatTimestamp, timestampsToHumanDifference } from '@/utils'
-
-export default {
-  data () {
-    return {
-      timestamp: null
-    }
-  },
-  computed: {
-    drift () {
-      return this.timestampsToHumanDifference(Date.now(), this.timestamp)
-    },
-    offSeconds () {
-      if (!this.timestamp) {
-        return null
-      }
-      return (Date.now().valueOf() - Date.parse(this.timestamp)) / 1000
-    }
-  },
-  mounted() {
-    const databaseService = useDatabaseService()
-    databaseService.getServerTime()
-      .then((timestamp) => {
-        this.timestamp = timestamp
-      })
-  },
-  methods: {
-    formatTimestamp,
-    timestampsToHumanDifference
-  }
-}
-</script>
diff --git a/dbrepo-ui/components/subset/Builder.vue b/dbrepo-ui/components/subset/Builder.vue
index f19c595aad..f670700f2f 100644
--- a/dbrepo-ui/components/subset/Builder.vue
+++ b/dbrepo-ui/components/subset/Builder.vue
@@ -31,14 +31,12 @@
           :text="$t('pages.subset.subpages.create.expert.text')" />
       </v-tabs>
     </v-toolbar>
-    <TimeDrift />
     <v-card
       rounded="0"
       variant="flat">
       <v-card-text>
         <v-form
           ref="form"
-          v-model="valid"
           @submit.prevent>
           <v-row
             v-if="isView"
@@ -304,7 +302,6 @@
 </template>
 
 <script>
-import TimeDrift from '@/components/TimeDrift.vue'
 import Raw from '@/components/subset/Raw.vue'
 import Results from '@/components/subset/Results.vue'
 import { useCacheStore } from '@/stores/cache.js'
@@ -314,7 +311,6 @@ export default {
   components: {
     Raw,
     Results,
-    TimeDrift
   },
   props: {
     mode: {
@@ -468,7 +464,7 @@ export default {
       if (!this.table) {
         return
       }
-      this.fetchTableColumns(this.table.id)
+      this.fetchTableColumns(this.table?.id)
     }
   },
   mounted () {
@@ -545,13 +541,24 @@ export default {
       this.view.query = this.sql
       const viewService = useViewService()
       viewService.create(this.$route.params.database_id, this.view)
-        .then(async (view) => {
-          this.resultId = view.id
-          this.cacheStore.reloadDatabase()
-          const toast = useToastInstance()
-          toast.success(this.$t('success.view.create'))
-          await this.$router.push(`/database/${this.$route.params.database_id}/view/${view.id}/data`)
-          this.loadingQuery = false
+        .then((simpleView) => {
+          this.resultId = simpleView.id
+          viewService.findOne(this.$route.params.database_id, simpleView.id)
+            .then(async (view) => {
+              this.cacheStore.setView(view)
+              const toast = useToastInstance()
+              toast.success(this.$t('success.view.create'))
+              await this.$router.push(`/database/${this.$route.params.database_id}/view/${view.id}/data`)
+              this.loadingQuery = false
+            })
+            .catch(({code}) => {
+              this.loadingQuery = false
+              const toast = useToastInstance()
+              if (typeof code !== 'string') {
+                return
+              }
+              toast.error(this.$t(code))
+            })
         })
         .catch(({code}) => {
           this.loadingQuery = false
diff --git a/dbrepo-ui/components/subset/Results.vue b/dbrepo-ui/components/subset/Results.vue
index 3948667518..661c7d1a3d 100644
--- a/dbrepo-ui/components/subset/Results.vue
+++ b/dbrepo-ui/components/subset/Results.vue
@@ -80,23 +80,6 @@ export default {
     }
   },
   methods: {
-    executeFirstTime (parent, sql, timestamp) {
-      this.loading++
-      const payload = {
-        statement: sql,
-        timestamp
-      }
-      const queryService = useQueryService()
-      queryService.execute(this.$route.params.database_id, payload, this.options.page - 1, this.options.itemsPerPage)
-        .then((result) => {
-          this.mapResults(result)
-          parent.resultId = result.id
-          this.id = result.id
-        })
-        .finally(() => {
-          this.loading--
-        })
-    },
     reExecute (id) {
       if (id === null) {
         return
diff --git a/dbrepo-ui/composables/database-service.ts b/dbrepo-ui/composables/database-service.ts
index 7956f7b4df..f318e07305 100644
--- a/dbrepo-ui/composables/database-service.ts
+++ b/dbrepo-ui/composables/database-service.ts
@@ -66,23 +66,6 @@ export const useDatabaseService = (): any => {
     });
   }
 
-  async function getServerTime(): Promise<Date> {
-    const axios = useAxiosInstance();
-    console.debug('find server time');
-    return new Promise<Date>((resolve, reject) => {
-      axios.head<Date>('/api/database')
-        .then((response) => {
-          const date: Date = new Date(response.headers['Date'])
-          console.info(`Found ${date} server time`);
-          resolve(date);
-        })
-        .catch((error) => {
-          console.error('Failed to find server time', error);
-          reject(axiosErrorToApiError(error));
-        });
-    });
-  }
-
   async function findOne(id: number, rawError: boolean = false): Promise<DatabaseDto | null> {
     const axios = useAxiosInstance();
     console.debug('find database with id', id);
@@ -239,16 +222,12 @@ export const useDatabaseService = (): any => {
     refreshTablesMetadata,
     refreshViewsMetadata,
     findOne,
-    findPreviewImage,
-    findCount,
-    getServerTime,
     updateVisibility,
     updateImage,
     updateOwner,
     create,
     databaseToOwner,
     databaseToContact,
-    databaseToJsonLd,
     isOwner
   }
 }
diff --git a/dbrepo-ui/composables/query-service.ts b/dbrepo-ui/composables/query-service.ts
index 119915de27..e314993ecd 100644
--- a/dbrepo-ui/composables/query-service.ts
+++ b/dbrepo-ui/composables/query-service.ts
@@ -161,12 +161,12 @@ export const useQueryService = (): any => {
           }
         }
         sql += ` \`${clause.params[0]}\` ${clause.params[1]} `
-        const filteredType = types.filter(t => t.value === filteredColumn[0].column_type)
+        const filteredType = types.filter(t => t.value === filteredColumn[0].type)
         if (filteredType.length === 0) {
           return {
             error: true,
             reason: 'exists',
-            column: filteredColumn[0].column_type,
+            column: filteredColumn[0].type,
             raw: null,
             formatted: null
           }
@@ -175,7 +175,7 @@ export const useQueryService = (): any => {
           return {
             error: true,
             reason: 'build',
-            column: filteredColumn[0].column_type,
+            column: filteredColumn[0].type,
             raw: null,
             formatted: null
           }
diff --git a/dbrepo-ui/nuxt.config.ts b/dbrepo-ui/nuxt.config.ts
index 31e20b310d..b3da7bd98c 100644
--- a/dbrepo-ui/nuxt.config.ts
+++ b/dbrepo-ui/nuxt.config.ts
@@ -16,6 +16,12 @@ if (process.env.NODE_ENV === 'development') {
   }
   process.env.VERSION = 'bun-dev'
   process.env.NUXT_PUBLIC_API_SERVER = api
+  process.env.NUXT_OIDC_PROVIDERS_KEYCLOAK_AUTHORIZATION_URL = api + '/realms/dbrepo/protocol/openid-connect/auth'
+  process.env.NUXT_OIDC_PROVIDERS_KEYCLOAK_LOGOUT_REDIRECT_URI = api + ':3001'
+  process.env.NUXT_OIDC_PROVIDERS_KEYCLOAK_LOGOUT_URL = api + '/realms/dbrepo/protocol/openid-connect/logout'
+  process.env.NUXT_OIDC_PROVIDERS_KEYCLOAK_REDIRECT_URI = api + ':3001/auth/keycloak/callback'
+  process.env.NUXT_OIDC_PROVIDERS_KEYCLOAK_TOKEN_URL = api + '/realms/dbrepo/protocol/openid-connect/token'
+  process.env.NUXT_OIDC_PROVIDERS_KEYCLOAK_USER_INFO_URL = api + '/realms/dbrepo/protocol/openid-connect/userinfo'
 }
 
 /**
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 2b0936cba5..f732661f36 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
@@ -22,7 +22,6 @@
         :loading="loadingData"
         @click="reload" />
     </v-toolbar>
-    <TimeDrift />
     <v-card tile>
       <QueryResults
         id="query-results"
@@ -35,13 +34,11 @@
 </template>
 
 <script>
-import TimeDrift from '@/components/TimeDrift.vue'
 import QueryResults from '@/components/subset/Results.vue'
 
 export default {
   components: {
-    QueryResults,
-    TimeDrift
+    QueryResults
   },
   data () {
     return {
-- 
GitLab