This repository was archived by the owner on May 9, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.js
More file actions
126 lines (97 loc) · 4.57 KB
/
Copy pathserver.js
File metadata and controls
126 lines (97 loc) · 4.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
const express = require("express");
// Імпортуємо наші дані
const { users, documents, employees } = require("./data");
const app = express();
const PORT = 3000;
// --- MIDDLEWARE ---
const authMiddleware = (req, res, next) => {
// Отримуємо дані для входу з заголовків запиту
const login = req.headers["x-login"];
const password = req.headers["x-password"];
// Шукаємо користувача у нашій "базі даних"
const user = users.find((u) => u.login === login && u.password === password);
// Якщо користувача не знайдено, або дані невірні
if (!user) {
// Відповідаємо статусом 401 Unauthorized і припиняємо обробку
return res.status(401).json({
message:
"Authentication failed. Please provide valid credentials in headers X-Login and X-Password.",
});
}
// Якщо користувач знайдений, додаємо його дані до об'єкта запиту
// Це дозволить наступним обробникам знати, хто надіслав запит
req.user = user;
// Передаємо управління наступному middleware або основному обробнику маршруту
next();
};
const adminOnlyMiddleware = (req, res, next) => {
// Перевіряємо, чи існує об'єкт user і яка в нього роль
// req.user був доданий на попередньому етапі в authMiddleware
if (!req.user || req.user.role !== "admin") {
// Якщо роль не 'admin', відповідаємо статусом 403 Forbidden
return res
.status(403)
.json({ message: "Access denied. Admin role required." });
}
// Якщо перевірка пройдена, передаємо управління далі
next();
};
const loggingMiddleware = (req, res, next) => {
// Отримуємо поточний час, HTTP метод та URL запиту
const timestamp = new Date().toISOString();
const method = req.method;
const url = req.url;
// Виводимо інформацію в консоль
console.log(`[${timestamp}] ${method} ${url}`);
// ВАЖЛИВО: передаємо управління наступному middleware
// Якщо не викликати next(), обробка запиту "зависне" на цьому місці
next();
};
// Middleware для автоматичного парсингу JSON-тіла запиту
// Це необхідно для роботи POST-запитів
app.use(express.json());
// Глобально застосовуємо middleware для логування
// Цей рядок має бути ПЕРЕД усіма маршрутами
app.use(loggingMiddleware);
// --- МАРШРУТИ ДЛЯ РЕСУРСІВ ---
// Всі запити до /documents вимагають лише аутентифікації
app.get("/documents", authMiddleware, (req, res) => {
res.status(200).json(documents);
});
app.post("/documents", authMiddleware, (req, res) => {
const { title, content } = req.body;
// Перевірка, чи передані всі необхідні поля
if (!title || !content) {
return res.status(400).json({
message: 'Bad Request. Fields "title" and "content" are required.',
});
}
const newDocument = {
id: Date.now(),
title,
content,
};
documents.push(newDocument);
res.status(201).json(newDocument);
});
app.delete("/documents/:id", authMiddleware, (req, res) => {
// Отримуємо id з параметрів маршруту
const documentId = parseInt(req.params.id);
const documentIndex = documents.findIndex((doc) => doc.id === documentId);
// Якщо документ з таким id не знайдено
if (documentIndex === -1) {
return res.status(404).json({ message: "Document not found" });
}
// Видаляємо документ з масиву
documents.splice(documentIndex, 1);
// Відповідаємо статусом 204 No Content, тіло відповіді буде порожнім
res.status(204).send();
});
// Запити до /employees вимагають і аутентифікації, і прав адміністратора
app.get("/employees", authMiddleware, adminOnlyMiddleware, (req, res) => {
res.status(200).json(employees);
});
// --- КІНЕЦЬ МАРШРУТІВ ---
app.listen(PORT, () => {
console.log(`Server is running on http://localhost:${PORT}`);
});