diff --git a/package-lock.json b/package-lock.json index 7acad14..412b0ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,6 +7,7 @@ "": { "version": "0.0.0", "dependencies": { + "idb-keyval": "^5.0.4", "vue": "^3.0.5", "vue-router": "^4.0.5" }, @@ -997,6 +998,11 @@ "postcss": "^8.1.0" } }, + "node_modules/idb-keyval": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-5.0.4.tgz", + "integrity": "sha512-qS0kplHuadZujoE90ze0NUkhW0/Fbfib7d+mYNMXNEn45NSh2NWY3fBewoX4GZUsKkGHBgc8JiAwMx0zrfL3LQ==" + }, "node_modules/indexes-of": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", @@ -2945,6 +2951,11 @@ "dev": true, "requires": {} }, + "idb-keyval": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-5.0.4.tgz", + "integrity": "sha512-qS0kplHuadZujoE90ze0NUkhW0/Fbfib7d+mYNMXNEn45NSh2NWY3fBewoX4GZUsKkGHBgc8JiAwMx0zrfL3LQ==" + }, "indexes-of": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", diff --git a/package.json b/package.json index 26c0e2a..6fd85fc 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "format": "npx prettier --write ." }, "dependencies": { + "idb-keyval": "^5.0.4", "vue": "^3.0.5", "vue-router": "^4.0.5" }, diff --git a/src/api/index.ts b/src/api/index.ts new file mode 100644 index 0000000..45fbe74 --- /dev/null +++ b/src/api/index.ts @@ -0,0 +1,52 @@ +import { LoginResponse, token } from "./types"; +import { get, set } from "idb-keyval"; +import { unref } from "vue"; + +const url = "http://192.168.178.5:8080/api"; +let token: token; +let ready = false; + +export async function init() { + if (ready) return; + + await get("token").then((val: token) => { + if (val !== undefined) { + token = val; + } + }); + ready = true; +} + +export async function isLoggedIn(): Promise { + await init(); + return token !== undefined && token.expiration > Date.now(); +} + +export async function login(user: string, password: string): Promise { + await init(); + let response = await fetch(`${url}/auth`, { + method: "POST", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + }, + body: JSON.stringify({ username: user, password: password }), + }); + const login: LoginResponse = await response.json(); + + if (response.ok) { + if (login.success) { + token = { + jwt: login.token, + expiration: Date.parse(login.expiration), + }; + set("token", token).catch((error) => console.error(error)); + return true; + } else { + return Promise.reject(new Error(login.message)); + } + } else { + const error = new Error(login.message); + return Promise.reject(error); + } +} diff --git a/src/api/types.ts b/src/api/types.ts new file mode 100644 index 0000000..9fc9390 --- /dev/null +++ b/src/api/types.ts @@ -0,0 +1,11 @@ +export interface token { + jwt: string; + expiration: number; +} + +export interface LoginResponse { + expiration: string; + message: string; + success: boolean; + token: string; +}