2025-10-12 00:40:02 +07:00

94 lines
2.2 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());
// 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"))
.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: "admin" },
defaults: {
username: "admin",
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");
}
// Create test time entry for admin
return TimeEntry.findOrCreate({
where: {
userId: user.id,
date: new Date("2025-10-10"),
reason: "Test entry",
},
defaults: {
userId: user.id,
date: new Date("2025-10-10"),
reason: "Test entry",
hours: 8.5,
},
});
})
.then(([entry, created]) => {
if (created) {
console.log("Test time entry created");
} else {
console.log("Test time entry already exists");
}
});
// Routes
app.use("/api/auth", require("./routes/auth"));
app.use("/api/users", require("./routes/users"));
app.use("/api/time-entries", require("./routes/timeEntries"));
// 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}`);
});