diff --git a/api/core/endpoints.py b/api/core/endpoints.py index 08cedbbeda672f5f14e16d70ae1718b4d9df73a2..5768e1045629cbc49c27845f6623d7c577f0b884 100644 --- a/api/core/endpoints.py +++ b/api/core/endpoints.py @@ -90,3 +90,7 @@ class Endpoints: from endpoints.exports.observations.routes import export_observations_endpoint app.register_blueprint(export_observations_endpoint) + + # VERSION + from endpoints.version.routes import version_endpoint + app.register_blueprint(version_endpoint) diff --git a/api/endpoints/version/routes.py b/api/endpoints/version/routes.py new file mode 100644 index 0000000000000000000000000000000000000000..7bc93f62997b76a2fa6fba5ddbf11ff3fb8feba3 --- /dev/null +++ b/api/endpoints/version/routes.py @@ -0,0 +1,17 @@ +from flask import jsonify, Blueprint, request +from flask_jwt_extended import create_access_token +import requests + +version_endpoint = Blueprint('version', __name__) +current_version = "3.0.8" + + +@version_endpoint.route('/api/version', methods=['GET']) +def version(): + try: + response = requests.get("https://git.nilu.no/api/v4/projects/983/repository/tags") + response.raise_for_status() + j = response.json() + return {"current": current_version, "latest": j[0]["name"].replace("v.", "")} + except Exception as err: + return {"current": current_version, "latest": current_version} diff --git a/api/requirements.txt b/api/requirements.txt index 787990713e7db6b3810d213768c63e3ed5f2eef7..91b02277ed9acde72d22077b671adb448f526e9b 100644 --- a/api/requirements.txt +++ b/api/requirements.txt @@ -13,3 +13,4 @@ python-dotenv==0.21.0 python-simplexml==0.1.5 pandas==1.5.2 pytz==2022.6 +requests==2.31.0 diff --git a/client/src/components/MenuBar.vue b/client/src/components/MenuBar.vue index 64faf4cafbee93f28e190cf3c4462a13104c6f9c..f2a2fd17580a010cde166ed37efbad486c5d89b8 100644 --- a/client/src/components/MenuBar.vue +++ b/client/src/components/MenuBar.vue @@ -2,11 +2,13 @@ import { useRouter } from "vue-router"; import Auth from "../helpers/auth"; import IconLogout from "~icons/ic/outline-logout"; -import { version } from "../helpers/utils"; +import IconNewVersion from "~icons/material-symbols/download-for-offline-rounded"; import jwt_decode from "jwt-decode"; +import Version from "../helpers/version"; const router = useRouter(); const modules = ref([]); +const version = ref(""); const props = defineProps({ show: Boolean @@ -17,8 +19,9 @@ watch( () => (modules.value = getmodules()) ); -onMounted(() => { +onMounted(async () => { modules.value = getmodules(); + version.value = await Version.get(); }); const getmodules = () => { @@ -91,8 +94,6 @@ const signout = async () => { Auth.signout(); router.push({ name: "Login" }); }; - -const cmp_version = computed(() => version); </script> <template> @@ -106,7 +107,10 @@ const cmp_version = computed(() => version); </div> </div> <div class=""> - <div class="px-1 text-xs font-bold border-b">v.{{ cmp_version }}</div> + <div class="flex px-1 text-xs font-bold border-b gap-1"> + <icon-new-version class="self-center text-nord11 hover:text-nord12" v-if="!version.isLatest" /> + <div class="self-center">v.{{ version.current }}</div> + </div> <div class="flex py-2 px-2 hover:cursor-pointer hover:bg-nord8/20 hover:text-nord10" @click="signout"> <icon-logout class="self-center" /> <div class="self-center ml-1">Sign out</div> diff --git a/client/src/helpers/interceptor.js b/client/src/helpers/interceptor.js index 0c0bae290010481a54ad7c79724dd4abd470f204..8562ef9464b651c084655c2ece22d3b9df8cc91d 100644 --- a/client/src/helpers/interceptor.js +++ b/client/src/helpers/interceptor.js @@ -21,8 +21,9 @@ const Interceptor = { }, (error) => { if (401 === error.response.status) { - Auth.signout(); - window.location.href = "/login"; + console.log("iiik", error); + // Auth.signout(); + // window.location.href = "/login"; } else if (403 === error.response.status) { window.location.href = "/forbidden"; } else if (404 === error.response.status && !error.response.request.responseURL.toLowerCase().includes("api")) { diff --git a/client/src/helpers/utils.js b/client/src/helpers/utils.js index 31de5d4ca2b43c684834a441e85c1d074b528140..653e5f108b4a6c8bc62ff6e64b32c71596cf24d4 100644 --- a/client/src/helpers/utils.js +++ b/client/src/helpers/utils.js @@ -105,5 +105,3 @@ export const filterList = (q, list, exclude_list) => { return showValues; }); }; - -export const version = "3.0.8"; diff --git a/client/src/helpers/version.js b/client/src/helpers/version.js new file mode 100644 index 0000000000000000000000000000000000000000..2d68d98a26e51959ad105334f50fd5509f480c3f --- /dev/null +++ b/client/src/helpers/version.js @@ -0,0 +1,29 @@ +import { Get } from "./request"; + +const Version = { + compare(v1, v2) { + if (typeof v1 !== "string") return false; + if (typeof v2 !== "string") return false; + v1 = v1.split("."); + v2 = v2.split("."); + const k = Math.min(v1.length, v2.length); + for (let i = 0; i < k; ++i) { + v1[i] = parseInt(v1[i], 10); + v2[i] = parseInt(v2[i], 10); + if (v1[i] > v2[i]) return 1; + if (v1[i] < v2[i]) return -1; + } + return v1.length == v2.length ? 0 : v1.length < v2.length ? -1 : 1; + }, + async get() { + try { + var result = await Get("api/version"); + var compared = Version.compare(result.latest, result.current); + return { current: result.current, isLatest: compared != 1 }; + } catch (error) { + return { current: result.current, isLatest: true }; + } + } +}; + +export default Version;