implemented backend

This commit is contained in:
2025-12-19 19:23:47 +03:00
commit ffae7a9f5c
4 changed files with 1144 additions and 0 deletions

257
backend/src/app.js Normal file
View File

@@ -0,0 +1,257 @@
import express from 'express';
import { json } from 'express';
// cors - middleware для разрешения кросс-доменных запросов
import cors from 'cors';
// Эти модули нужны для работы с путями файлов
import { fileURLToPath } from 'url';
import { dirname, join } from 'path';
// Получаем текущий путь к файлу (специально для модулей ES6)
const __filename = fileURLToPath(import.meta.url);
// Получаем директорию текущего файла
const __dirname = dirname(__filename);
// Создаем экземпляр приложения Express
const app = express();
// Подключаем middleware (промежуточное программное обеспечение)
// CORS разрешает запросы с других доменов
app.use(cors({
origin: 'http://localhost:8080', // разрешаем только с этого домена
methods: ['GET', 'POST', 'PUT', 'DELETE'], // разрешаем только эти методы
allowedHeaders: ['Content-Type'] // разрешаем только эти заголовки
}));
// JSON парсер позволяет обрабатывать JSON в теле запросов
app.use(json());
// Создаем массив для хранения заметок в памяти
// В реальном приложении здесь была бы база данных
let notes = [];
// Переменная для генерации уникальных ID
// Каждая новая заметка получит ID на 1 больше предыдущей
let noteIdCounter = 1;
// ==================== РАЗДЕЛ: РОУТЫ API (маршруты) ====================
// РОУТ 1: Получение всех заметок (READ)
// Метод: GET
// Адрес: /notes
app.get('/notes', function(request, response) {
/*
Эта функция обрабатывает запрос на получение всех заметок
request - объект запроса (содержит данные от клиента)
response - объект ответа (используем для отправки данных клиенту)
*/
console.log('Получен запрос на получение всех заметок');
// Отправляем клиенту все заметки в формате JSON
// status(200) - код 200 означает "Успешно"
response.status(200).json({
success: true, // флаг успешного выполнения
data: notes, // сами заметки
count: notes.length // количество заметок
});
});
// РОУТ 2: Получение одной заметки по ID (READ)
// Метод: GET
// Адрес: /notes/:id
// :id - это параметр маршрута (динамическая часть URL)
app.get('/notes/:id', function(request, response) {
/*
Эта функция ищет заметку по ID
request.params.id - получаем ID из URL
*/
console.log('Получен запрос на получение заметки с ID:', request.params.id);
// Преобразуем ID из строки в число
const noteId = parseInt(request.params.id);
// Ищем заметку в массиве по ID.
// В качестве аргумента notes.find() используем
// функцию function(note) {}, которая определяет,
// совпадает ли id некоторой заметки с id нашей
const foundNote = notes.find(function(note) {
return note.id === noteId;
});
// Если заметка не найдена
if (!foundNote) {
console.log('Заметка не найдена');
return response.status(404).json({
success: false,
message: 'Заметка с таким ID не найдена'
});
}
// Если заметка найдена - отправляем ее клиенту
response.status(200).json({
success: true,
data: foundNote
});
});
// РОУТ 3: Создание новой заметки (CREATE)
// Метод: POST
// Адрес: /notes
app.post('/notes', function(request, response) {
/*
Эта функция создает новую заметку
request.body - содержит данные, отправленные клиентом
*/
console.log('Получен запрос на создание заметки');
// Получаем данные из тела запроса
const title = request.body.title;
const text = request.body.text;
const author = request.body.author;
// Проверяем, все ли обязательные поля заполнены
if (!title || !text || !author) {
console.log('Ошибка: не все поля заполнены');
return response.status(400).json({
success: false,
message: 'Пожалуйста, заполните все поля: title, text, author'
});
}
// Создаем новую заметку
const newNote = {
id: noteIdCounter, // присваиваем уникальный ID
title: title, // заголовок из запроса
text: text, // текст заметки из запроса
author: author, // автор из запроса
createdAt: new Date(), // дата создания (текущее время)
updatedAt: new Date() // дата обновления (пока равна дате создания)
};
// Добавляем заметку в массив
notes.push(newNote);
// Увеличиваем счетчик ID для следующей заметки
noteIdCounter++;
console.log('Создана новая заметка с ID:', newNote.id);
// Отправляем ответ с созданной заметкой
// status(201) - код 201 означает "Создано"
response.status(201).json({
success: true,
message: 'Заметка успешно создана',
data: newNote
});
});
// РОУТ 4: Обновление существующей заметки (UPDATE)
// Метод: PUT
// Адрес: /notes/:id
app.put('/notes/:id', function(request, response) {
/*
Эта функция обновляет существующую заметку
request.params.id - ID заметки для обновления
request.body - новые данные для заметки
*/
console.log('Получен запрос на обновление заметки с ID:', request.params.id);
const noteId = parseInt(request.params.id);
// Ищем индекс заметки в массиве
const noteIndex = notes.findIndex(function(note) {
return note.id === noteId;
});
// Если заметка не найдена
if (noteIndex === -1) {
console.log('Заметка для обновления не найдена');
return response.status(404).json({
success: false,
message: 'Заметка с таким ID не найдена'
});
}
// Получаем данные из запроса
// Если какое-то поле не передано, используем старое значение
const updatedTitle = request.body.title || notes[noteIndex].title;
const updatedText = request.body.text || notes[noteIndex].text;
const updatedAuthor = request.body.author || notes[noteIndex].author;
// Обновляем заметку
notes[noteIndex] = {
...notes[noteIndex], // копируем все старые поля
title: updatedTitle, // обновляем заголовок
text: updatedText, // обновляем текст
author: updatedAuthor, // обновляем автора
updatedAt: new Date() // обновляем дату изменения
};
console.log('Заметка с ID', noteId, 'обновлена');
// Отправляем обновленную заметку
response.status(200).json({
success: true,
message: 'Заметка успешно обновлена',
data: notes[noteIndex]
});
});
// РОУТ 5: Удаление заметки (DELETE)
// Метод: DELETE
// Адрес: /notes/:id
app.delete('/notes/:id', function(request, response) {
/*
Эта функция удаляет заметку по ID
*/
console.log('Получен запрос на удаление заметки с ID:', request.params.id);
const noteId = parseInt(request.params.id);
// Ищем индекс заметки в массиве
const noteIndex = notes.findIndex(function(note) {
return note.id === noteId;
});
// Если заметка не найдена
if (noteIndex === -1) {
console.log('Заметка для удаления не найдена');
return response.status(404).json({
success: false,
message: 'Заметка с таким ID не найдена'
});
}
// Удаляем заметку из массива
// splice(index, 1) удаляет 1 элемент начиная с позиции index
const deletedNote = notes.splice(noteIndex, 1)[0];
console.log('Заметка с ID', noteId, 'удалена');
// Отправляем подтверждение удаления
response.status(200).json({
success: true,
message: 'Заметка успешно удалена',
data: deletedNote
});
});
// РОУТ 6: Корневой маршрут (для проверки работы сервера)
// Метод: GET
// Адрес: /
app.get('/', function(request, response) {
/*
Простой маршрут для проверки, что сервер работает
*/
response.json({
message: 'Добро пожаловать в API для заметок!',
endpoints: {
getAllNotes: 'GET /notes',
getOneNote: 'GET /notes/:id',
createNote: 'POST /notes',
updateNote: 'PUT /notes/:id',
deleteNote: 'DELETE /notes/:id'
},
instructions: 'Используйте Postman или curl для тестирования API'
});
});
// Экспортируем приложение для использования в server.js
export default app;

20
backend/src/server.js Normal file
View File

@@ -0,0 +1,20 @@
// Импортируем настроенное приложение Express из app.js
import app from './app.js';
// Определяем порт для сервера
// process.env.PORT - берет порт из переменных окружения (если есть)
// || 3000 - если переменной нет, используем порт 3000
const PORT = process.env.PORT || 3000;
// Запускаем сервер на указанном порту
app.listen(PORT, function() {
// Эта функция выполнится при успешном запуске сервера
console.log(`Backend server running on port ${PORT}`);
console.log(`Вы можете открыть в браузере: http://localhost:${PORT}`);
console.log('Для тестирования API используйте:');
console.log('1. GET http://localhost:3000/notes - получить все заметки');
console.log('2. GET http://localhost:3000/notes/1 - получить заметку с ID=1');
console.log('3. POST http://localhost:3000/notes - создать новую заметку');
console.log('4. PUT http://localhost:3000/notes/1 - обновить заметку с ID=1');
console.log('5. DELETE http://localhost:3000/notes/1 - удалить заметку с ID=1');
});