diff --git a/resources/js/components/NavigationComponent.vue b/resources/js/components/NavigationComponent.vue
index bc28eb9..0762d3e 100644
--- a/resources/js/components/NavigationComponent.vue
+++ b/resources/js/components/NavigationComponent.vue
@@ -3,19 +3,22 @@ import { ref, provide } from "vue";
import NavDesktop from "./NavDesktop.vue";
import NavMobile from "./NavMobile.vue";
import logo from "../../images/logo.png";
+import axios from "axios";
const isOpen = ref(false);
const isMobileMenuOpen = ref(false);
const openDropdownIndex = ref(null);
const items = [
- { label: "Manajemen Produk", subItems: [
- { label: "Brankas", route: "/brankas" },
- { label: "Nampan", route: "/nampan" },
- { label: "Produk", route: "/produk" },
- { label: "Kategori", route: "/kategori" },
- { label: "Sales", route: "/sales" },
- ] },
+ {
+ label: "Manajemen Produk", subItems: [
+ { label: "Brankas", route: "/brankas" },
+ { label: "Nampan", route: "/nampan" },
+ { label: "Produk", route: "/produk" },
+ { label: "Kategori", route: "/kategori" },
+ { label: "Sales", route: "/sales" },
+ ]
+ },
{ label: "Kasir", route: "/kasir" },
{ label: "Laporan", route: "/laporan" },
{ label: "Akun", route: "/akun" },
@@ -41,8 +44,21 @@ const closeMobileMenu = () => {
openDropdownIndex.value = null;
};
-const logout = () => {
- console.log("Logout clicked");
+const logout = async () => {
+ try {
+ await axios.post('/api/logout', {
+ headers: {
+ Authorization: `Bearer ${localStorage.getItem("token")}`,
+ },
+ });
+ window.location.href = '/';
+ } catch (error) {
+ if (error.response && error.response.status === 401) {
+ window.location.href = '/';
+ } else {
+ console.error("Logout failed:", error);
+ }
+ }
closeMobileMenu();
};
@@ -64,15 +80,12 @@ provide('navigationData', {
diff --git a/resources/js/middlewares/auth.js b/resources/js/middlewares/auth.js
new file mode 100644
index 0000000..b426a0b
--- /dev/null
+++ b/resources/js/middlewares/auth.js
@@ -0,0 +1,9 @@
+export default function auth(to, from, next) {
+ const token = localStorage.getItem("token")
+
+ if (!token) {
+ next({ name: "Login" })
+ } else {
+ next()
+ }
+}
diff --git a/resources/js/middlewares/guest.js b/resources/js/middlewares/guest.js
new file mode 100644
index 0000000..7ced92c
--- /dev/null
+++ b/resources/js/middlewares/guest.js
@@ -0,0 +1,8 @@
+export default function guest(to, from, next) {
+ const token = localStorage.getItem("token")
+ if (token) {
+ next({ name: "Brankas" })
+ } else {
+ next()
+ }
+}
\ No newline at end of file
diff --git a/resources/js/middlewares/owner.js b/resources/js/middlewares/owner.js
new file mode 100644
index 0000000..6d62018
--- /dev/null
+++ b/resources/js/middlewares/owner.js
@@ -0,0 +1,8 @@
+export default function owner(to, from, next) {
+ const role = localStorage.getItem("role")
+ if (role !== "owner") {
+ next({ name: "Kasir" })
+ } else {
+ next()
+ }
+}
\ No newline at end of file
diff --git a/resources/js/router/index.js b/resources/js/router/index.js
index c9bb84d..42e3e54 100644
--- a/resources/js/router/index.js
+++ b/resources/js/router/index.js
@@ -1,84 +1,124 @@
-import { createRouter, createWebHistory } from 'vue-router'
-import Home from '../pages/Home.vue'
-import Produk from '../pages/Produk.vue'
-import Brankas from '../pages/Brankas.vue'
-import Tray from '../pages/Tray.vue'
-import Kasir from '../pages/Kasir.vue'
-import InputProduk from '../pages/InputProduk.vue'
-import Kategori from '../pages/Kategori.vue'
-import Sales from '../pages/Sales.vue'
-import EditProduk from '../pages/EditProduk.vue'
-import Laporan from '../pages/Laporan.vue'
+import { createRouter, createWebHistory } from "vue-router";
-import Login from '../pages/Login.vue'
-
-import Akun from '../pages/Akun.vue'
+import Produk from "../pages/Produk.vue";
+import Brankas from "../pages/Brankas.vue";
+import Tray from "../pages/Tray.vue";
+import Kasir from "../pages/Kasir.vue";
+import InputProduk from "../pages/InputProduk.vue";
+import Kategori from "../pages/Kategori.vue";
+import Sales from "../pages/Sales.vue";
+import EditProduk from "../pages/EditProduk.vue";
+import Laporan from "../pages/Laporan.vue";
+import Login from "../pages/Login.vue";
+import Akun from "../pages/Akun.vue";
+import auth from "../middleware/auth";
+import guest from "../middleware/guest";
+import owner from "../middleware/owner";
+const middlewareMap = { auth, guest, owner };
const routes = [
- {
- path: '/',
- name: 'Login',
- component: Login
- },
- {
- path: '/produk',
- name: 'Produk',
- component: Produk
- },
- {
- path: '/produk/baru',
- name: 'ProdukBaru',
- component: InputProduk
- },
- {
- path: '/brankas',
- name: 'Brankas',
- component: Brankas
- },
- {
- path: '/nampan',
- name: 'Nampan',
- component: Tray
- },
- {
- path: '/kasir',
- name: 'Kasir',
- component: Kasir
- },
- {
- path: '/kategori',
- name: 'Kategori',
- component: Kategori
- },
- {
- path: '/sales',
- name: 'Sales',
- component: Sales
- },
- {
- path: '/akun',
- name: 'Akun',
- component: Akun
- },
- {
- path: '/produk/:id/edit', // :id = parameter dinamis
- name: 'EditProduk',
- component: EditProduk,
- props: true // biar id bisa langsung jadi props di komponen
- },
- {
- path: '/laporan',
- name: 'EditProduk',
- component: Laporan
- }
-]
-
+ {
+ path: "/",
+ name: "Login",
+ component: Login,
+ meta: { middleware: "guest" },
+ },
+ {
+ path: "/produk",
+ name: "Produk",
+ component: Produk,
+ meta: { middleware: "auth" },
+ },
+ {
+ path: "/produk/baru",
+ name: "ProdukBaru",
+ component: InputProduk,
+ meta: { middleware: ["auth", "owner"] },
+ },
+ {
+ path: "/produk/:id/edit",
+ name: "EditProduk",
+ component: EditProduk,
+ props: true,
+ meta: { middleware: ["auth", "owner"] },
+ },
+ {
+ path: "/brankas",
+ name: "Brankas",
+ component: Brankas,
+ meta: { middleware: "auth" },
+ },
+ {
+ path: "/nampan",
+ name: "Nampan",
+ component: Tray,
+ meta: { middleware: "auth" },
+ },
+ {
+ path: "/sales",
+ name: "Sales",
+ component: Sales,
+ meta: { middleware: "auth" },
+ },
+ {
+ path: "/kategori",
+ name: "Kategori",
+ component: Kategori,
+ meta: { middleware: "auth" },
+ },
+ {
+ path: "/kasir",
+ name: "Kasir",
+ component: Kasir,
+ meta: { middleware: "auth" },
+ },
+ {
+ path: "/laporan",
+ name: "Laporan",
+ component: Laporan,
+ meta: { middleware: ["auth", "owner"] },
+ },
+ {
+ path: "/akun",
+ name: "Akun",
+ component: Akun,
+ meta: { middleware: ["auth", "owner"] },
+ },
+];
const router = createRouter({
- history: createWebHistory(),
- routes
-})
+ history: createWebHistory(),
+ routes,
+});
-export default router
+router.beforeEach((to, from, next) => {
+ let middlewares = to.meta.middleware;
+ if (!middlewares) return next();
+
+ if (!Array.isArray(middlewares)) {
+ middlewares = [middlewares];
+ }
+
+ let index = 0;
+ const run = () => {
+ const name = middlewares[index];
+ const mw = middlewareMap[name];
+ if (!mw) return next();
+
+ mw(to, from, (redirect) => {
+ if (redirect) return next(redirect);
+ index++;
+ if (index < middlewares.length) {
+ run();
+ } else {
+ next();
+ }
+ });
+ };
+
+ run();
+});
+
+export default router;