k4be 8 часов назад
Родитель
Сommit
3b836541ba
1 измененных файлов с 107 добавлено и 0 удалено
  1. 107 0
      gpx-vis-backend/src/routes/directories.js

+ 107 - 0
gpx-vis-backend/src/routes/directories.js

@@ -0,0 +1,107 @@
+const router = require('express').Router();
+const { requireAuth } = require('../middleware/auth');
+const { Directory, Track } = require('../models');
+const { Op } = require('sequelize');
+
+// Get all root directories for the current user
+router.get('/', requireAuth, async (req, res) => {
+  try {
+    const dirs = await Directory.findAll({
+      where: { userId: req.user.id, parentId: null },
+      order: [['updatedAt', 'DESC']],
+    });
+    res.json(dirs);
+  } catch (e) {
+    res.status(500).json({ error: 'Server error' });
+  }
+});
+
+// Get directory by id (with children and tracks)
+router.get('/:id', requireAuth, async (req, res) => {
+  try {
+    const dir = await Directory.findOne({
+      where: { id: req.params.id, userId: req.user.id },
+    });
+    if (!dir) return res.status(404).json({ error: 'Directory not found' });
+
+    const children = await Directory.findAll({
+      where: { parentId: dir.id, userId: req.user.id },
+      order: [['updatedAt', 'DESC']],
+    });
+    const tracks = await Track.findAll({
+      where: { directoryId: dir.id, userId: req.user.id },
+      order: [['trackDate', 'DESC'], ['uploadDate', 'DESC']],
+      attributes: ['id', 'name', 'originalFilename', 'uploadDate', 'trackDate', 'pointCount', 'totalDistance'],
+    });
+
+    res.json({ ...dir.toJSON(), children, tracks });
+  } catch (e) {
+    res.status(500).json({ error: 'Server error' });
+  }
+});
+
+// Create directory
+router.post('/', requireAuth, async (req, res) => {
+  try {
+    const { name, parentId } = req.body;
+    if (!name || name.trim().length === 0) return res.status(400).json({ error: 'Name required' });
+
+    if (parentId) {
+      const parent = await Directory.findOne({ where: { id: parentId, userId: req.user.id } });
+      if (!parent) return res.status(404).json({ error: 'Parent directory not found' });
+    }
+
+    const dir = await Directory.create({
+      userId: req.user.id,
+      name: name.trim(),
+      parentId: parentId || null,
+    });
+    res.status(201).json(dir);
+  } catch (e) {
+    res.status(500).json({ error: 'Server error' });
+  }
+});
+
+// Rename directory
+router.put('/:id', requireAuth, async (req, res) => {
+  try {
+    const dir = await Directory.findOne({ where: { id: req.params.id, userId: req.user.id } });
+    if (!dir) return res.status(404).json({ error: 'Directory not found' });
+    const { name } = req.body;
+    if (!name || name.trim().length === 0) return res.status(400).json({ error: 'Name required' });
+    await dir.update({ name: name.trim() });
+    res.json(dir);
+  } catch (e) {
+    res.status(500).json({ error: 'Server error' });
+  }
+});
+
+// Delete directory (recursive)
+router.delete('/:id', requireAuth, async (req, res) => {
+  try {
+    const dir = await Directory.findOne({ where: { id: req.params.id, userId: req.user.id } });
+    if (!dir) return res.status(404).json({ error: 'Directory not found' });
+
+    // Recursively collect all subdir IDs
+    async function collectIds(dirId) {
+      const children = await Directory.findAll({ where: { parentId: dirId, userId: req.user.id } });
+      let ids = [dirId];
+      for (const c of children) {
+        ids = ids.concat(await collectIds(c.id));
+      }
+      return ids;
+    }
+
+    const allIds = await collectIds(dir.id);
+    // Delete all tracks in these dirs
+    await Track.destroy({ where: { directoryId: { [Op.in]: allIds }, userId: req.user.id } });
+    // Delete dirs in reverse order (children first)
+    await Directory.destroy({ where: { id: { [Op.in]: allIds }, userId: req.user.id } });
+
+    res.json({ ok: true });
+  } catch (e) {
+    res.status(500).json({ error: 'Server error' });
+  }
+});
+
+module.exports = router;