diff --git a/auth-service/src/middleware/auth.js b/auth-service/src/middleware/auth.js
new file mode 100644
index 0000000..f5a36ba
--- /dev/null
+++ b/auth-service/src/middleware/auth.js
@@ -0,0 +1,39 @@
+import jwt from 'jsonwebtoken';
+import { User } from '../models/index.js';
+
+function getJwtSecret(payload) {
+ const base = process.env.JWT_SECRET || 'secret';
+ if (payload && payload.rememberMe) {
+ return base;
+ }
+ const hour = new Date().toISOString().slice(0, 13); // YYYY-MM-DDTHH
+ return base + ':' + hour;
+}
+
+export default async function authMiddleware(req, res, next) {
+ const authHeader = req.headers['authorization'];
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
+ return res.status(401).json({ error: 'No token provided' });
+ }
+
+ const token = authHeader.split(' ')[1];
+ try {
+ // Сначала декодируем без проверки, чтобы узнать rememberMe
+ let payload = null;
+ try {
+ payload = jwt.decode(token);
+ } catch {}
+
+ const secret = getJwtSecret(payload);
+ payload = jwt.verify(token, secret);
+
+ // Найти пользователя по id
+ const user = await User.findByPk(payload.id);
+ if (!user) return res.status(401).json({ error: 'User not found' });
+
+ req.user = { id: user.id, email: user.email, role_id: user.role_id };
+ next();
+ } catch (err) {
+ return res.status(401).json({ error: 'Invalid token', details: err.message });
+ }
+}
\ No newline at end of file
diff --git a/auth-service/src/routes/role.js b/auth-service/src/routes/role.js
index 680998e..081bd87 100644
--- a/auth-service/src/routes/role.js
+++ b/auth-service/src/routes/role.js
@@ -1,12 +1,13 @@
import { Router } from 'express';
import roleController from '../controllers/roleController.js';
+import authMiddleware from '../middleware/auth.js';
const router = Router();
-router.post('/', roleController.create);
-router.get('/', roleController.getAll);
-router.get('/:id', roleController.getById);
-router.put('/:id', roleController.update);
-router.delete('/:id', roleController.delete);
+router.post('/', authMiddleware, roleController.create);
+router.get('/', authMiddleware, roleController.getAll);
+router.get('/:id', authMiddleware, roleController.getById);
+router.put('/:id', authMiddleware, roleController.update);
+router.delete('/:id', authMiddleware, roleController.delete);
export default router;
\ No newline at end of file
diff --git a/auth-service/src/routes/user.js b/auth-service/src/routes/user.js
index 7ab8fd0..97824ff 100644
--- a/auth-service/src/routes/user.js
+++ b/auth-service/src/routes/user.js
@@ -1,13 +1,14 @@
import { Router } from 'express';
import userController from '../controllers/userController.js';
+import authMiddleware from '../middleware/auth.js';
const router = Router();
-router.post('/', userController.create);
-router.get('/', userController.getAll);
-router.get('/:id', userController.getById);
-router.put('/:id', userController.update);
-router.delete('/:id', userController.delete);
+router.post('/', authMiddleware, userController.create);
+router.get('/', authMiddleware, userController.getAll);
+router.get('/:id', authMiddleware, userController.getById);
+router.put('/:id', authMiddleware, userController.update);
+router.delete('/:id', authMiddleware, userController.delete);
router.post('/login', userController.login);
export default router;
\ No newline at end of file
diff --git a/frontend/src/components/SideMenu.js b/frontend/src/components/SideMenu.js
index 95fb4be..74f10ed 100644
--- a/frontend/src/components/SideMenu.js
+++ b/frontend/src/components/SideMenu.js
@@ -18,7 +18,6 @@ const SideMenu = ({ active, onSelect }) => {
Администрирование
- onSelect('users')}>Управление пользователями
- - onSelect('roles')}>Управление ролями
diff --git a/frontend/src/modals/CreateUserModal.js b/frontend/src/modals/CreateUserModal.js
index c5ae34d..e769872 100644
--- a/frontend/src/modals/CreateUserModal.js
+++ b/frontend/src/modals/CreateUserModal.js
@@ -15,10 +15,19 @@ export default function CreateUserModal({ isOpen, onClose, user, roles, loading,
diff --git a/frontend/src/pages/Dashboard.js b/frontend/src/pages/Dashboard.js
index 7473564..5009d90 100644
--- a/frontend/src/pages/Dashboard.js
+++ b/frontend/src/pages/Dashboard.js
@@ -3,7 +3,6 @@ import SideMenu from '../components/SideMenu';
import Header from '../components/Header';
import { useUser } from '../context/UserContext';
import UsersPage from './UsersPage';
-import RolesPage from './RolesPage';
import SmtpServersPage from './SmtpServersPage';
import EmailTemplatesPage from './EmailTemplatesPage';
import UnsubscribedPage from './UnsubscribedPage';
@@ -23,7 +22,6 @@ const Dashboard = () => {
function renderPage() {
switch (active) {
case 'users': return
;
- case 'roles': return
;
case 'smtp': return
;
case 'template': return
;
case 'unsubscribed': return
;
diff --git a/frontend/src/pages/UsersPage.js b/frontend/src/pages/UsersPage.js
index d1eadae..77e98ec 100644
--- a/frontend/src/pages/UsersPage.js
+++ b/frontend/src/pages/UsersPage.js
@@ -62,12 +62,18 @@ function UsersPage() {
headers: token ? { Authorization: `Bearer ${token}` } : {}
});
const data = await res.json();
- if (res.ok && Array.isArray(data)) {
- setRoles(data);
+ console.log('Roles API response:', data); // Отладочная информация
+ if (res.ok) {
+ // API всегда возвращает объект с rows и count
+ const rolesData = data.rows || [];
+ console.log('Setting roles:', rolesData); // Отладочная информация
+ setRoles(rolesData);
} else {
+ console.error('Roles API error:', data); // Отладочная информация
setRoles([]);
}
- } catch {
+ } catch (error) {
+ console.error('Roles fetch error:', error); // Отладочная информация
setRoles([]);
}
};
@@ -128,6 +134,11 @@ function UsersPage() {
};
const handleCreate = () => {
+ // Убеждаемся, что у нас есть роли перед созданием пользователя
+ if (roles.length === 0) {
+ alert('Загрузка ролей... Пожалуйста, подождите.');
+ return;
+ }
setCreateUser({ email: '', name: '', role_id: roles[0]?.id || 1, password: '' });
};
@@ -232,6 +243,16 @@ function UsersPage() {
onSave={handleCreateSave}
/>
)}
+ {/* Отладочная информация */}
+ {process.env.NODE_ENV === 'development' && (
+
+ Debug Info:
+ Roles count: {roles.length}
+ Roles: {JSON.stringify(roles.slice(0, 3))}
+ Edit user: {editUser ? JSON.stringify(editUser) : 'null'}
+ Create user: {createUser ? JSON.stringify(createUser) : 'null'}
+
+ )}
);
}