156 lines
4.3 KiB
JavaScript

const express = require("express");
const { TimeEntry, User } = require("../models");
const { logActivity } = require("./activityLogs");
const {
authenticate,
authorizeAdmin,
authorizeManager,
} = require("../middleware/auth");
const router = express.Router();
// Get time entries for current user
router.get("/", authenticate, async (req, res) => {
try {
const entries = await TimeEntry.findAll({
where: { userId: req.user.id },
order: [["date", "DESC"]],
});
res.json(entries);
} catch (error) {
res.status(500).json({ message: "Server error" });
}
});
// Get all time entries (admin and manager)
router.get("/all", authenticate, authorizeManager, async (req, res) => {
try {
const entries = await TimeEntry.findAll({
include: [{ model: User, attributes: ["username"] }],
order: [["date", "DESC"]],
});
// Log the export action
await logActivity(
req.user.id,
"Экспорт общей таблицы",
`Просмотрена общая таблица записей времени`
);
res.json(entries);
} catch (error) {
res.status(500).json({ message: "Server error" });
}
});
// Get time entries for specific user (admin and manager)
router.get(
"/user/:userId",
authenticate,
authorizeManager,
async (req, res) => {
try {
const { userId } = req.params;
console.log("Fetching entries for userId:", userId);
const entries = await TimeEntry.findAll({
where: { userId },
order: [["date", "DESC"]],
});
console.log("Found entries:", entries);
// Get username for logging
const user = await User.findByPk(userId);
const username = user ? user.username : "Unknown";
// Log the export action for specific user
await logActivity(
req.user.id,
"Экспорт таблицы пользователя",
`Просмотрена таблица записей времени для пользователя: ${username}`
);
res.json(entries);
} catch (error) {
console.error("Error fetching user entries:", error);
res.status(500).json({ message: "Server error" });
}
}
);
// Create time entry
router.post("/", authenticate, async (req, res) => {
try {
const { date, reason, hours } = req.body;
const entry = await TimeEntry.create({
userId: req.user.id,
date,
reason,
hours: parseFloat(hours),
});
res.status(201).json(entry);
} catch (error) {
res.status(500).json({ message: "Server error" });
}
});
// Update time entry (own or admin)
router.put("/:id", authenticate, async (req, res) => {
try {
const { date, reason, hours } = req.body;
const entry = await TimeEntry.findByPk(req.params.id);
if (!entry) {
return res.status(404).json({ message: "Entry not found" });
}
if (entry.userId !== req.user.id && req.user.role !== "admin") {
return res.status(403).json({ message: "Access denied" });
}
await entry.update({
date,
reason,
hours: parseFloat(hours),
});
res.json(entry);
} catch (error) {
res.status(500).json({ message: "Server error" });
}
});
// Delete all time entries for current user
router.delete("/delete-all", authenticate, async (req, res) => {
try {
const deletedCount = await TimeEntry.destroy({
where: { userId: req.user.id },
});
// Log the delete all action
await logActivity(
req.user.id,
"Удаление всех записей",
`Удалены все записи времени (${deletedCount} записей)`
);
res.json({ message: "All entries deleted", deletedCount });
} catch (error) {
res.status(500).json({ message: "Server error" });
}
});
// Delete time entry (own or admin)
router.delete("/:id", authenticate, async (req, res) => {
try {
const entry = await TimeEntry.findByPk(req.params.id);
if (!entry) {
return res.status(404).json({ message: "Entry not found" });
}
if (entry.userId !== req.user.id && req.user.role !== "admin") {
return res.status(403).json({ message: "Access denied" });
}
await entry.destroy();
res.json({ message: "Entry deleted" });
} catch (error) {
res.status(500).json({ message: "Server error" });
}
});
module.exports = router;