Fovway 765039c953 modified: backend/routes/users.js
modified:   backend/server.js
	modified:   frontend/src/components/AdminPanel.jsx
	modified:   frontend/src/components/ManagerPanel.jsx
2025-10-13 23:50:26 +07:00

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}`);
});