feat(loop): loop logları kalıcı hale getir

Loop loglarının dosya sistemine kaydedilmesi, okunması ve
arşivlenmesi için yeni storage modülü eklendi. Loglar artık
oturumlar arasında korunur. UI tarafında mobil menü iyileştirmeleri
ve log paneli güncellemeleri yapıldı.
This commit is contained in:
2026-01-04 11:37:46 +03:00
parent d9ed85ad0c
commit 76418d0bb1
11 changed files with 237 additions and 20 deletions

View File

@@ -5,11 +5,13 @@ import { LoopJob } from "../types";
import { nowIso } from "../utils/time";
import { appendAuditLog, logger } from "../utils/logger";
import { emitJobLog, emitJobMetrics } from "../realtime/emitter";
import { appendLoopLog, archiveLoopLogs } from "../storage/loopLogs";
import { config } from "../config";
const logJob = async (jobId: string, level: "INFO" | "WARN" | "ERROR", message: string, event?: string) => {
const createdAt = nowIso();
emitJobLog({ jobId, level, message, createdAt });
await appendLoopLog({ jobId, level, message, createdAt });
if (event) {
await appendAuditLog({ level, event: event as any, message });
}
@@ -78,6 +80,7 @@ export const stopLoopJob = async (jobId: string) => {
job.updatedAt = nowIso();
await writeDb(db);
await logJob(job.id, "WARN", "Loop job stopped by user");
await archiveLoopLogs(job.id, job.torrentHash);
return job;
};

View File

@@ -9,6 +9,7 @@ import { getArchiveStatus } from "../torrent/torrent.archive";
import { config } from "../config";
import { setArchiveStatus } from "../torrent/torrent.archive";
import { nowIso } from "../utils/time";
import { readLoopLogs } from "../storage/loopLogs";
const router = Router();
@@ -145,7 +146,9 @@ router.get("/job/:jobId", async (req, res) => {
});
router.get("/logs/:jobId", async (req, res) => {
res.json({ jobId: req.params.jobId, logs: [] });
const { jobId } = req.params;
const logs = await readLoopLogs(jobId);
res.json({ jobId, logs });
});
export default router;