Gitea:
Push für Serveranwendung in Gitea implementiert
Dieser Commit ist enthalten in:
@ -11,6 +11,9 @@ const logger = require('../utils/logger');
|
||||
const gitService = require('../services/gitService');
|
||||
const giteaService = require('../services/giteaService');
|
||||
|
||||
// Fester Pfad für Server-Modus (TaskMate Source-Code)
|
||||
const SERVER_SOURCE_PATH = '/app/taskmate-source';
|
||||
|
||||
/**
|
||||
* Hilfsfunktion: Anwendung für Projekt abrufen
|
||||
*/
|
||||
@ -508,4 +511,250 @@ router.post('/rename-branch/:projectId', (req, res) => {
|
||||
}
|
||||
});
|
||||
|
||||
// ============================================
|
||||
// SERVER-MODUS ENDPOINTS
|
||||
// Für direkte Git-Operationen auf dem TaskMate Source-Code
|
||||
// ============================================
|
||||
|
||||
/**
|
||||
* GET /api/git/server/status
|
||||
* Git-Status für Server-Dateien abrufen
|
||||
*/
|
||||
router.get('/server/status', (req, res) => {
|
||||
try {
|
||||
// Prüfe ob der Pfad existiert und ein Git-Repo ist
|
||||
if (!gitService.isPathAccessible(SERVER_SOURCE_PATH)) {
|
||||
return res.status(500).json({
|
||||
success: false,
|
||||
error: 'Server-Verzeichnis nicht erreichbar'
|
||||
});
|
||||
}
|
||||
|
||||
if (!gitService.isGitRepository(SERVER_SOURCE_PATH)) {
|
||||
return res.status(500).json({
|
||||
success: false,
|
||||
error: 'Server-Verzeichnis ist kein Git-Repository'
|
||||
});
|
||||
}
|
||||
|
||||
const result = gitService.getStatus(SERVER_SOURCE_PATH);
|
||||
res.json(result);
|
||||
} catch (error) {
|
||||
logger.error('[Server-Git] Fehler beim Status:', error);
|
||||
res.status(500).json({ error: 'Serverfehler', details: error.message });
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* GET /api/git/server/branches
|
||||
* Branches für Server-Dateien abrufen
|
||||
*/
|
||||
router.get('/server/branches', (req, res) => {
|
||||
try {
|
||||
const result = gitService.getBranches(SERVER_SOURCE_PATH);
|
||||
res.json(result);
|
||||
} catch (error) {
|
||||
logger.error('[Server-Git] Fehler beim Abrufen der Branches:', error);
|
||||
res.status(500).json({ error: 'Serverfehler' });
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* GET /api/git/server/commits
|
||||
* Commit-Historie für Server-Dateien abrufen
|
||||
*/
|
||||
router.get('/server/commits', (req, res) => {
|
||||
try {
|
||||
const limit = parseInt(req.query.limit) || 20;
|
||||
const result = gitService.getCommitHistory(SERVER_SOURCE_PATH, limit);
|
||||
res.json(result);
|
||||
} catch (error) {
|
||||
logger.error('[Server-Git] Fehler beim Abrufen der Commits:', error);
|
||||
res.status(500).json({ error: 'Serverfehler' });
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* GET /api/git/server/remote
|
||||
* Remote-URL für Server-Dateien abrufen
|
||||
*/
|
||||
router.get('/server/remote', (req, res) => {
|
||||
try {
|
||||
const result = gitService.getRemoteUrl(SERVER_SOURCE_PATH);
|
||||
res.json(result);
|
||||
} catch (error) {
|
||||
logger.error('[Server-Git] Fehler beim Abrufen der Remote-URL:', error);
|
||||
res.status(500).json({ error: 'Serverfehler' });
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* POST /api/git/server/stage
|
||||
* Alle Änderungen für Server-Dateien stagen
|
||||
*/
|
||||
router.post('/server/stage', (req, res) => {
|
||||
try {
|
||||
const result = gitService.stageAll(SERVER_SOURCE_PATH);
|
||||
res.json(result);
|
||||
} catch (error) {
|
||||
logger.error('[Server-Git] Fehler beim Stagen:', error);
|
||||
res.status(500).json({ error: 'Serverfehler' });
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* POST /api/git/server/commit
|
||||
* Commit für Server-Dateien erstellen
|
||||
*/
|
||||
router.post('/server/commit', (req, res) => {
|
||||
try {
|
||||
const { message, stageAll } = req.body;
|
||||
|
||||
if (!message) {
|
||||
return res.status(400).json({ error: 'Commit-Nachricht ist erforderlich' });
|
||||
}
|
||||
|
||||
// Optional: Alle Änderungen stagen
|
||||
if (stageAll !== false) {
|
||||
const stageResult = gitService.stageAll(SERVER_SOURCE_PATH);
|
||||
if (!stageResult.success) {
|
||||
return res.json(stageResult);
|
||||
}
|
||||
}
|
||||
|
||||
// Autor aus eingeloggtem Benutzer
|
||||
const author = req.user ? {
|
||||
name: req.user.display_name || req.user.username,
|
||||
email: req.user.email || `${req.user.username.toLowerCase()}@taskmate.local`
|
||||
} : null;
|
||||
|
||||
const result = gitService.commit(SERVER_SOURCE_PATH, message, author);
|
||||
res.json(result);
|
||||
} catch (error) {
|
||||
logger.error('[Server-Git] Fehler beim Commit:', error);
|
||||
res.status(500).json({ error: 'Serverfehler' });
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* POST /api/git/server/push
|
||||
* Push für Server-Dateien ausführen
|
||||
*/
|
||||
router.post('/server/push', (req, res) => {
|
||||
try {
|
||||
const { branch, force } = req.body;
|
||||
|
||||
// Prüfe ob Remote existiert
|
||||
if (!gitService.hasRemote(SERVER_SOURCE_PATH)) {
|
||||
return res.json({
|
||||
success: false,
|
||||
error: 'Kein Remote konfiguriert'
|
||||
});
|
||||
}
|
||||
|
||||
let result;
|
||||
if (force) {
|
||||
// Force Push
|
||||
result = gitService.pushWithUpstream(SERVER_SOURCE_PATH, branch || null, 'origin', true);
|
||||
} else {
|
||||
// Normaler Push
|
||||
result = gitService.pushChanges(SERVER_SOURCE_PATH, { branch });
|
||||
|
||||
// Falls Push wegen fehlendem Upstream fehlschlägt, versuche mit -u
|
||||
if (!result.success && result.error && result.error.includes('no upstream')) {
|
||||
result = gitService.pushWithUpstream(SERVER_SOURCE_PATH, branch || null);
|
||||
}
|
||||
}
|
||||
|
||||
res.json(result);
|
||||
} catch (error) {
|
||||
logger.error('[Server-Git] Fehler beim Push:', error);
|
||||
res.status(500).json({ error: 'Serverfehler' });
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* POST /api/git/server/pull
|
||||
* Pull für Server-Dateien ausführen
|
||||
*/
|
||||
router.post('/server/pull', (req, res) => {
|
||||
try {
|
||||
const { branch } = req.body;
|
||||
|
||||
// Fetch zuerst
|
||||
gitService.fetchRemote(SERVER_SOURCE_PATH);
|
||||
|
||||
// Dann Pull
|
||||
const result = gitService.pullChanges(SERVER_SOURCE_PATH, { branch });
|
||||
res.json(result);
|
||||
} catch (error) {
|
||||
logger.error('[Server-Git] Fehler beim Pull:', error);
|
||||
res.status(500).json({ error: 'Serverfehler' });
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* POST /api/git/server/fetch
|
||||
* Fetch für Server-Dateien ausführen
|
||||
*/
|
||||
router.post('/server/fetch', (req, res) => {
|
||||
try {
|
||||
const result = gitService.fetchRemote(SERVER_SOURCE_PATH);
|
||||
res.json(result);
|
||||
} catch (error) {
|
||||
logger.error('[Server-Git] Fehler beim Fetch:', error);
|
||||
res.status(500).json({ error: 'Serverfehler' });
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* POST /api/git/server/checkout
|
||||
* Branch für Server-Dateien wechseln
|
||||
*/
|
||||
router.post('/server/checkout', (req, res) => {
|
||||
try {
|
||||
const { branch } = req.body;
|
||||
|
||||
if (!branch) {
|
||||
return res.status(400).json({ error: 'Branch ist erforderlich' });
|
||||
}
|
||||
|
||||
const result = gitService.checkoutBranch(SERVER_SOURCE_PATH, branch);
|
||||
res.json(result);
|
||||
} catch (error) {
|
||||
logger.error('[Server-Git] Fehler beim Branch-Wechsel:', error);
|
||||
res.status(500).json({ error: 'Serverfehler' });
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* GET /api/git/server/info
|
||||
* Grundlegende Infos über Server-Repository
|
||||
*/
|
||||
router.get('/server/info', (req, res) => {
|
||||
try {
|
||||
const isAccessible = gitService.isPathAccessible(SERVER_SOURCE_PATH);
|
||||
const isRepo = isAccessible ? gitService.isGitRepository(SERVER_SOURCE_PATH) : false;
|
||||
const hasRemote = isRepo ? gitService.hasRemote(SERVER_SOURCE_PATH) : false;
|
||||
|
||||
let remoteUrl = null;
|
||||
if (hasRemote) {
|
||||
const remoteResult = gitService.getRemoteUrl(SERVER_SOURCE_PATH);
|
||||
remoteUrl = remoteResult.url || null;
|
||||
}
|
||||
|
||||
res.json({
|
||||
path: SERVER_SOURCE_PATH,
|
||||
hostPath: '/home/claude-dev/TaskMate',
|
||||
accessible: isAccessible,
|
||||
isRepository: isRepo,
|
||||
hasRemote: hasRemote,
|
||||
remoteUrl: remoteUrl
|
||||
});
|
||||
} catch (error) {
|
||||
logger.error('[Server-Git] Fehler beim Info-Abruf:', error);
|
||||
res.status(500).json({ error: 'Serverfehler' });
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren