|
|
@@ -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;
|