213 Zeilen
6.2 KiB
JavaScript
213 Zeilen
6.2 KiB
JavaScript
/**
|
|
* TASKMATE - Applications Route
|
|
* ==============================
|
|
* API-Endpoints für Anwendungs-/Repository-Verwaltung
|
|
*/
|
|
|
|
const express = require('express');
|
|
const router = express.Router();
|
|
const { getDb } = require('../database');
|
|
const logger = require('../utils/logger');
|
|
const gitService = require('../services/gitService');
|
|
|
|
/**
|
|
* GET /api/applications/:projectId
|
|
* Anwendungs-Konfiguration für ein Projekt abrufen
|
|
*/
|
|
router.get('/:projectId', (req, res) => {
|
|
try {
|
|
const { projectId } = req.params;
|
|
const db = getDb();
|
|
|
|
const application = db.prepare(`
|
|
SELECT a.*, p.name as project_name
|
|
FROM applications a
|
|
JOIN projects p ON a.project_id = p.id
|
|
WHERE a.project_id = ?
|
|
`).get(projectId);
|
|
|
|
if (!application) {
|
|
return res.json({
|
|
configured: false,
|
|
projectId: parseInt(projectId)
|
|
});
|
|
}
|
|
|
|
// Prüfe ob das Repository existiert und erreichbar ist
|
|
const isRepo = gitService.isGitRepository(application.local_path);
|
|
const isAccessible = gitService.isPathAccessible(application.local_path);
|
|
|
|
res.json({
|
|
configured: true,
|
|
...application,
|
|
isRepository: isRepo,
|
|
isAccessible
|
|
});
|
|
} catch (error) {
|
|
logger.error('Fehler beim Abrufen der Anwendung:', error);
|
|
res.status(500).json({ error: 'Serverfehler' });
|
|
}
|
|
});
|
|
|
|
/**
|
|
* POST /api/applications
|
|
* Anwendung für ein Projekt erstellen oder aktualisieren
|
|
*/
|
|
router.post('/', (req, res) => {
|
|
try {
|
|
const { projectId, localPath, giteaRepoUrl, giteaRepoOwner, giteaRepoName, defaultBranch } = req.body;
|
|
const userId = req.user.id;
|
|
const db = getDb();
|
|
|
|
if (!projectId || !localPath) {
|
|
return res.status(400).json({ error: 'projectId und localPath sind erforderlich' });
|
|
}
|
|
|
|
// Prüfe ob der Pfad erreichbar ist
|
|
if (!gitService.isPathAccessible(localPath)) {
|
|
return res.status(400).json({
|
|
error: 'Pfad nicht erreichbar. Stelle sicher, dass das Laufwerk in Docker gemountet ist.',
|
|
hint: 'Gemountete Laufwerke: C:, D:, E:'
|
|
});
|
|
}
|
|
|
|
// Prüfe ob bereits eine Anwendung für dieses Projekt existiert
|
|
const existing = db.prepare('SELECT id FROM applications WHERE project_id = ?').get(projectId);
|
|
|
|
if (existing) {
|
|
// Update
|
|
db.prepare(`
|
|
UPDATE applications SET
|
|
local_path = ?,
|
|
gitea_repo_url = ?,
|
|
gitea_repo_owner = ?,
|
|
gitea_repo_name = ?,
|
|
default_branch = ?
|
|
WHERE project_id = ?
|
|
`).run(localPath, giteaRepoUrl || null, giteaRepoOwner || null, giteaRepoName || null, defaultBranch || 'main', projectId);
|
|
|
|
logger.info(`Anwendung aktualisiert für Projekt ${projectId}`);
|
|
} else {
|
|
// Insert
|
|
db.prepare(`
|
|
INSERT INTO applications (project_id, local_path, gitea_repo_url, gitea_repo_owner, gitea_repo_name, default_branch, created_by)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
`).run(projectId, localPath, giteaRepoUrl || null, giteaRepoOwner || null, giteaRepoName || null, defaultBranch || 'main', userId);
|
|
|
|
logger.info(`Anwendung erstellt für Projekt ${projectId}`);
|
|
}
|
|
|
|
// Anwendung zurückgeben
|
|
const application = db.prepare(`
|
|
SELECT a.*, p.name as project_name
|
|
FROM applications a
|
|
JOIN projects p ON a.project_id = p.id
|
|
WHERE a.project_id = ?
|
|
`).get(projectId);
|
|
|
|
res.json({
|
|
success: true,
|
|
application
|
|
});
|
|
} catch (error) {
|
|
logger.error('Fehler beim Speichern der Anwendung:', error);
|
|
res.status(500).json({ error: 'Serverfehler' });
|
|
}
|
|
});
|
|
|
|
/**
|
|
* DELETE /api/applications/:projectId
|
|
* Anwendungs-Konfiguration entfernen
|
|
*/
|
|
router.delete('/:projectId', (req, res) => {
|
|
try {
|
|
const { projectId } = req.params;
|
|
const db = getDb();
|
|
|
|
const result = db.prepare('DELETE FROM applications WHERE project_id = ?').run(projectId);
|
|
|
|
if (result.changes === 0) {
|
|
return res.status(404).json({ error: 'Keine Anwendung für dieses Projekt gefunden' });
|
|
}
|
|
|
|
logger.info(`Anwendung gelöscht für Projekt ${projectId}`);
|
|
res.json({ success: true });
|
|
} catch (error) {
|
|
logger.error('Fehler beim Löschen der Anwendung:', error);
|
|
res.status(500).json({ error: 'Serverfehler' });
|
|
}
|
|
});
|
|
|
|
/**
|
|
* GET /api/applications/user/base-path
|
|
* Basis-Pfad des aktuellen Benutzers abrufen
|
|
*/
|
|
router.get('/user/base-path', (req, res) => {
|
|
try {
|
|
const userId = req.user.id;
|
|
const db = getDb();
|
|
|
|
const user = db.prepare('SELECT repositories_base_path FROM users WHERE id = ?').get(userId);
|
|
|
|
res.json({
|
|
basePath: user?.repositories_base_path || null,
|
|
configured: !!user?.repositories_base_path
|
|
});
|
|
} catch (error) {
|
|
logger.error('Fehler beim Abrufen des Basis-Pfads:', error);
|
|
res.status(500).json({ error: 'Serverfehler' });
|
|
}
|
|
});
|
|
|
|
/**
|
|
* PUT /api/applications/user/base-path
|
|
* Basis-Pfad des aktuellen Benutzers setzen
|
|
*/
|
|
router.put('/user/base-path', (req, res) => {
|
|
try {
|
|
const { basePath } = req.body;
|
|
const userId = req.user.id;
|
|
const db = getDb();
|
|
|
|
if (!basePath) {
|
|
return res.status(400).json({ error: 'basePath ist erforderlich' });
|
|
}
|
|
|
|
// Prüfe ob der Pfad erreichbar ist
|
|
if (!gitService.isPathAccessible(basePath)) {
|
|
return res.status(400).json({
|
|
error: 'Pfad nicht erreichbar. Stelle sicher, dass das Laufwerk in Docker gemountet ist.',
|
|
hint: 'Gemountete Laufwerke: C:, D:, E:'
|
|
});
|
|
}
|
|
|
|
db.prepare('UPDATE users SET repositories_base_path = ? WHERE id = ?').run(basePath, userId);
|
|
|
|
logger.info(`Basis-Pfad gesetzt für Benutzer ${userId}: ${basePath}`);
|
|
res.json({ success: true, basePath });
|
|
} catch (error) {
|
|
logger.error('Fehler beim Setzen des Basis-Pfads:', error);
|
|
res.status(500).json({ error: 'Serverfehler' });
|
|
}
|
|
});
|
|
|
|
/**
|
|
* POST /api/applications/:projectId/sync
|
|
* Synchronisierungszeitpunkt aktualisieren
|
|
*/
|
|
router.post('/:projectId/sync', (req, res) => {
|
|
try {
|
|
const { projectId } = req.params;
|
|
const db = getDb();
|
|
|
|
db.prepare('UPDATE applications SET last_sync = CURRENT_TIMESTAMP WHERE project_id = ?').run(projectId);
|
|
|
|
res.json({ success: true });
|
|
} catch (error) {
|
|
logger.error('Fehler beim Aktualisieren der Synchronisierung:', error);
|
|
res.status(500).json({ error: 'Serverfehler' });
|
|
}
|
|
});
|
|
|
|
module.exports = router;
|