modified: backend/server.js modified: frontend/src/components/AdminPanel.jsx modified: frontend/src/components/ManagerPanel.jsx
103 lines
2.7 KiB
JavaScript
103 lines
2.7 KiB
JavaScript
require("dotenv").config();
|
|
const express = require("express");
|
|
const cors = require("cors");
|
|
const { Sequelize } = require("sequelize");
|
|
|
|
const app = express();
|
|
const PORT = process.env.PORT || 5000;
|
|
|
|
// Middleware
|
|
app.use(cors());
|
|
app.use(express.json());
|
|
|
|
// Логирование всех запросов
|
|
app.use((req, res, next) => {
|
|
console.log(`${new Date().toISOString()} - ${req.method} ${req.path}`);
|
|
next();
|
|
});
|
|
|
|
// Database connection
|
|
const sequelize = new Sequelize(
|
|
process.env.DB_NAME,
|
|
process.env.DB_USER,
|
|
process.env.DB_PASSWORD,
|
|
{
|
|
host: process.env.DB_HOST,
|
|
port: process.env.DB_PORT,
|
|
dialect: "postgres",
|
|
}
|
|
);
|
|
|
|
// Test DB connection
|
|
sequelize
|
|
.authenticate()
|
|
.then(() => console.log("Database connected"))
|
|
.then(() => {
|
|
// Проверяем структуру таблицы TimeEntries
|
|
return sequelize.query(
|
|
`
|
|
SELECT column_name, data_type, is_nullable
|
|
FROM information_schema.columns
|
|
WHERE table_name = 'TimeEntries'
|
|
ORDER BY ordinal_position;
|
|
`,
|
|
{ type: sequelize.QueryTypes.SELECT }
|
|
);
|
|
})
|
|
.then((columns) => {
|
|
console.log("TimeEntries table columns:");
|
|
columns.forEach((col) => {
|
|
console.log(` ${col.column_name} (${col.data_type}) ${col.is_nullable}`);
|
|
});
|
|
})
|
|
.catch((err) => console.error("Database connection failed:", err));
|
|
|
|
// Import models
|
|
const db = require("./models");
|
|
const User = db.User;
|
|
const TimeEntry = db.TimeEntry;
|
|
|
|
// Sync database
|
|
sequelize
|
|
.sync({ force: false }) // Set to true for development to recreate tables
|
|
.then(() => {
|
|
console.log("Database synced");
|
|
// Create admin user if not exists
|
|
return User.findOrCreate({
|
|
where: { username: "Semen_Ilin" },
|
|
defaults: {
|
|
username: "Semen_Ilin",
|
|
password: "admin123", // In production, hash this
|
|
role: "admin",
|
|
},
|
|
});
|
|
})
|
|
.then(([user, created]) => {
|
|
if (created) {
|
|
console.log("Admin user created");
|
|
} else {
|
|
console.log("Admin user already exists");
|
|
}
|
|
|
|
// Note: Test entry creation removed to avoid migration issues
|
|
// Test entries will be created through the UI
|
|
console.log("Skipping test entry creation during migration");
|
|
return Promise.resolve();
|
|
});
|
|
|
|
// Routes
|
|
app.use("/api/auth", require("./routes/auth"));
|
|
app.use("/api/users", require("./routes/users"));
|
|
app.use("/api/time-entries", require("./routes/timeEntries"));
|
|
const { router: activityLogsRouter } = require("./routes/activityLogs");
|
|
app.use("/api/activity-logs", activityLogsRouter);
|
|
|
|
// Health check
|
|
app.get("/health", (req, res) => res.status(200).json({ status: "OK" }));
|
|
|
|
app.get("/", (req, res) => res.send("Time Tracking API"));
|
|
|
|
app.listen(PORT, () => {
|
|
console.log(`Server running on port ${PORT}`);
|
|
});
|