diff --git a/src/components/Header.vue b/src/components/Header.vue
index aa14a46..362e194 100644
--- a/src/components/Header.vue
+++ b/src/components/Header.vue
@@ -10,7 +10,7 @@
-
diff --git a/src/router/index.js b/src/router/index.js
index 6d40897..deed596 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -1,7 +1,7 @@
import { createRouter, createWebHistory, } from "vue-router";
import AuthContainer from '@/views/AuthContainer.vue';
import MainContainer from '@/views/MainContainer.vue';
-import Login from '@/views/Login/index.vue';
+import Login from '@/views/Login/Login.vue';
import Files from '@/views/Files/index.vue';
import Upload from '@/views/Upload/index.vue';
import Map from '@/views/Discover/Map/index.vue';
diff --git a/src/stores/acctMgmt.js b/src/stores/acctMgmt.js
index fc64828..099eff1 100644
--- a/src/stores/acctMgmt.js
+++ b/src/stores/acctMgmt.js
@@ -147,6 +147,42 @@ export default defineStore('acctMgmtStore', {
return false;
};
},
+ /** Add a role to the user in database.
+ * @param {string} usernameToEdit
+ * @param {string} roleCode
+ */
+ async addRoleToUser(usernameToEdit, roleCode) {
+ const apiAddRole = `/api/users/${usernameToEdit}/roles/${roleCode}`;
+
+ try{
+ const response = await this.$axios.put(apiAddRole);
+ if(response.status === 200) {
+ return true;
+ }
+ }
+ catch(error) {
+ apiError(error, 'Failed to add role to the account.');
+ return false;
+ };
+ },
+ /** Delete a role from the user in database.
+ * @param {string} usernameToEdit
+ * @param {string} roleCode
+ */
+ async deleteRoleToUser(usernameToEdit, roleCode) {
+ const apiDeleteRole = `/api/users/${usernameToEdit}/roles/${roleCode}`;
+
+ try{
+ const response = await this.$axios.delete(apiDeleteRole);
+ if(response.status === 200) {
+ return true;
+ }
+ }
+ catch(error) {
+ apiError(error, 'Failed to delete a role frome the account.');
+ return false;
+ };
+ },
/**
* Get user detail by unique username.
* @param {string} uniqueUsername
diff --git a/src/stores/login.js b/src/stores/login.js
index 674c635..a60f201 100644
--- a/src/stores/login.js
+++ b/src/stores/login.js
@@ -1,7 +1,7 @@
import { defineStore } from "pinia";
import axios from 'axios';
import apiError from '@/module/apiError.js';
-import { deleteCookie, setCookie } from "../utils/cookieUtil";
+import { deleteCookie, setCookie, getCookie } from "../utils/cookieUtil";
export default defineStore('loginStore', {
// data, methods, computed
@@ -11,13 +11,13 @@ export default defineStore('loginStore', {
grant_type: 'password', // password | refresh_token
username: '',
password: '',
- refresh_token: ''
+ refresh_token: undefined,
},
isInvalid: false,
userData: {},
isLoggedIn: false,
rememberedReturnToUrl: "",
- // expired: new Date().setMonth(6), // 設定 Refresh Token 的到期日為半年後
+ expired: new Date().setMonth(6), // 設定 Refresh Token 的到期日為半年後
}),
actions: {
/**
@@ -35,10 +35,10 @@ export default defineStore('loginStore', {
try {
const response = await axios.post(api, this.auth, config);
const accessToken = response.data.access_token;
- const refreshToken = response.data.refresh_token;
+ const refresh_token = response.data.refresh_token;
// 將 token 儲存在 cookie
document.cookie = `luciaToken=${accessToken}`;
- // document.cookie = `luciaRefreshToken=${refreshToken};expires=${new Date(this.expired)};`;
+ document.cookie = `luciaRefreshToken=${refresh_token};expires=${new Date(this.expired)};`;
this.isLoggedIn = true;
setCookie("isLuciaLoggedIn", "true");
@@ -57,27 +57,31 @@ export default defineStore('loginStore', {
};
},
/**
- * Refresh Token (暫時沒做)
+ * Refresh Token
*/
- async refreshTokenLogin() {
+ async refreshToken() {
+ console.log('TODO:TODO:', this.auth);
const api = '/api/oauth/token';
- const refreshToken = document.cookie.replace(/(?:(?:^|.*;\s*)luciaRefreshToken\s*\=\s*([^;]*).*$)|^.*$/, "$1");
this.auth.grant_type = 'refresh_token';
- this.auth.refresh_token = refreshToken;
+ this.auth.refresh_token = getCookie("luciaRefreshToken");
- // try {
- // const response = await axios.post(api, this.auth, config);
- // const newAccessToken = response.data.access_token;
- // const newRefreshToken = response.data.refresh_token;
-
- // document.cookie = `luciaToken=${newAccessToken}`;
- // document.cookie = `luciaRefreshToken=${newRefreshToken};expires=${this.expired}`;
-
- // defaults.headers.common['Authorization'] = `Bearer ${newAccessToken}`;
- // } catch(error) {
- // this.$router.push('/login');
- // }
+ try {
+ const response = await axios.post(api, this.auth, config);
+ console.log('response', response);
+ if(response.status === 200) {
+ const newAccessToken = response.data.access_token;
+ const newRefreshToken = response.data.refresh_token;
+
+ document.cookie = `luciaToken=${newAccessToken}`;
+ document.cookie = `luciaRefreshToken=${newRefreshToken};expires=${this.expired}`;
+
+ defaults.headers.common['Authorization'] = `Bearer ${newAccessToken}`;
+ }
+ } catch(error) {
+ // 若refresh token 失敗則導向至登入頁面
+ this.$router.push('/login');
+ }
},
/**
* Logout, tooken expired
diff --git a/src/utils/cookieUtil.js b/src/utils/cookieUtil.js
index c13ca71..5be2e8b 100644
--- a/src/utils/cookieUtil.js
+++ b/src/utils/cookieUtil.js
@@ -1,29 +1,33 @@
export function getCookie(name) {
- const nameEQ = name + "=";
- const ca = document.cookie.split(';');
- for (let i = 0; i < ca.length; i++) {
- let c = ca[i];
+ const nameEqual = name + "=";
+ const cookieArr = document.cookie.split(';');
+ for (let i = 0; i < cookieArr.length; i++) {
+ let c = cookieArr[i];
while (c.charAt(0) === ' ') {
c = c.substring(1, c.length);
}
- if (c.indexOf(nameEQ) === 0) {
- return c.substring(nameEQ.length, c.length);
+ if (c.indexOf(nameEqual) === 0) {
+ return c.substring(nameEqual.length, c.length);
}
}
return null;
}
- export function setCookie(name, value, days=1) {
- let expires = "";
- if (days) {
- const date = new Date();
- date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
- expires = "; expires=" + date.toUTCString();
- }
- document.cookie = name + "=" + (value || "") + expires + "; path=/";
+export function setCookie(name, value, days=1) {
+ let expires = "";
+ if (days) {
+ const date = new Date();
+ date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
+ expires = "; expires=" + date.toUTCString();
}
+ document.cookie = name + "=" + (value || "") + expires + "; path=/";
+}
- export function deleteCookie(name, path = '/') {
- document.cookie = name + '=; Max-Age=-99999999; path=' + path;
- }
+export function setCookieWithoutExpiration(name, value) {
+ document.cookie = name + "=" + (value || "");
+}
+
+export function deleteCookie(name, path = '/') {
+ document.cookie = name + '=; Max-Age=-99999999; path=' + path;
+}
\ No newline at end of file
diff --git a/src/views/AccountManagement/AccountAdmin/AccountAdmin.vue b/src/views/AccountManagement/AccountAdmin/AccountAdmin.vue
index 8b7b5cf..9371c9d 100644
--- a/src/views/AccountManagement/AccountAdmin/AccountAdmin.vue
+++ b/src/views/AccountManagement/AccountAdmin/AccountAdmin.vue
@@ -42,10 +42,10 @@