//API const API_BASE_URL = "http://localhost:3001/api"; //Login async function loginUser(username, password) { try { const response = await fetch(`${API_BASE_URL}/auth/login`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ username, password }), }); const data = await response.json(); if (response.ok) { return { success: true, ...data }; } else { return { success: false, error: data.error || (data.errors && data.errors[0]?.msg) || "Ошибка авторизации", }; } } catch (err) { return { success: false, error: "Нет соединения с сервером" }; } } document.getElementById("loginForm").addEventListener("submit", async (e) => { e.preventDefault(); const username = document.getElementById("username").value; const password = document.getElementById("password").value; // Call backend login const result = await loginUser(username, password); if (result.success) { // Save user/token in JS (or localStorage) currentUser = result.user; localStorage.setItem("token", result.token); document.getElementById("loginScreen").classList.add("hidden"); if (result.user.role === "admin") { showAdminInterface(); } else { showUserInterface(); } showNotification("Успешная авторизация!"); } else { const errorDiv = document.getElementById("loginError"); errorDiv.textContent = result.error; errorDiv.classList.remove("hidden"); } }); document.addEventListener("DOMContentLoaded", async () => { const token = localStorage.getItem("token"); if (token) { // Try to get user info from backend try { const response = await fetch(`${API_BASE_URL}/auth/me`, { headers: { Authorization: `Bearer ${token}`, }, }); if (response.ok) { const data = await response.json(); currentUser = data.user; document.getElementById("loginScreen").classList.add("hidden"); if (currentUser.role === "admin") { showAdminInterface(); } else { showUserInterface(); } } else { // Token invalid/expired localStorage.removeItem("token"); document.getElementById("loginScreen").classList.remove("hidden"); } } catch (err) { showNotification("Нет соединения с сервером", "error"); } } else { // No token, show login screen document.getElementById("loginScreen").classList.remove("hidden"); } }); function logout() { currentUser = null; localStorage.removeItem("token"); // Show login screen, hide other interfaces document.getElementById("loginScreen").classList.remove("hidden"); document.getElementById("userInterface").classList.add("hidden"); document.getElementById("adminInterface").classList.add("hidden"); document.getElementById("loginForm").reset(); document.getElementById("loginError").classList.add("hidden"); showNotification("Вы вышли из системы", "info"); } document.getElementById("logoutBtn").addEventListener("click", logout); document.getElementById("adminLogoutBtn").addEventListener("click", logout); //Users //GET all users (admin only) async function getAllUsers() { const token = localStorage.getItem("token"); try { const response = await fetch(`${API_BASE_URL}/users`, { method: "GET", headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json", }, }); const data = await response.json(); if (response.ok) { return { success: true, users: data.users }; } else { return { success: false, error: data.error || data.message || "Ошибка получения пользователей", }; } } catch (err) { return { success: false, error: "Нет соединения с сервером" }; } } let usersList = []; async function loadUsers() { const tbody = document.getElementById("usersTableBody"); tbody.innerHTML = ""; const result = await getAllUsers(); console.log("getAllUsers result:", result); if (!result.success) { showNotification(result.error, "error"); return; } const users = result.users; usersList = users; users.forEach((user) => { const userStores = user.stores .map((storeId) => { const store = database.stores.find((s) => s.id === storeId); return store ? store.name : "Нет доступа"; }) .join(", ") || "Нет доступа"; const row = document.createElement("tr"); row.className = "hover:bg-gray-50"; row.innerHTML = `