Source: backend/src/server.js

/**
 * Точка входу серверної частини застосунку.
 *
 * Цей модуль ініціалізує Express-сервер, підключає middleware,
 * реєструє API-маршрути, обробники помилок і запускає застосунок
 * після підготовки структури бази даних.
 *
 * Через цей файл проходить загальний потік backend-взаємодії:
 * від отримання HTTP-запиту до передачі його в маршрути,
 * middleware автентифікації та контролери.
 */
const swaggerUi = require('swagger-ui-express')
const swaggerSpec = require('./config/swagger')

const express = require('express')
const cors = require('cors')
require('dotenv').config()

const routes = require('./routes/index')
const createTables = require('./config/schema')
const seedExercises = require('./config/seed')

const app = express()

app.use(cors({
  origin: process.env.FRONTEND_URL,
  credentials: true
}))

app.use(express.json())

app.use('/api', routes)

app.use('/docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec))

app.get('/', (req, res) => {
  res.json({ message: 'HealthLog API працює!' })
})

app.use((req, res) => {
  res.status(404).json({ error: 'Маршрут не знайдено' })
})

app.use((err, req, res, _next) => {
  console.error(err.stack)
  res.status(500).json({ error: 'Внутрішня помилка сервера' })
})

const PORT = process.env.PORT || 5000

/**
 * Ініціалізує схему бази даних і запускає HTTP-сервер застосунку.
 *
 * Перед стартом сервера викликає createTables(), щоб переконатися,
 * що необхідні таблиці існують. У разі помилки запуск завершує процес
 * з кодом 1.
 * @returns {Promise<void>}
 */
const start = async () => {
  try {
    await createTables()
    await seedExercises()
    app.listen(PORT, () => {
      // eslint-disable-next-line no-console
      console.log(`Сервер запущено на порту ${PORT}`)
    })
  } catch (err) {
    console.error('Помилка запуску:', err)
    process.exit(1)
  }
}

start()