mirror of
https://github.com/StarFleetCPTN/GoMFT.git
synced 2026-09-20 05:20:53 +02:00
107 lines
3.2 KiB
Go
107 lines
3.2 KiB
Go
package handlers
|
|
|
|
import (
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/starfleetcptn/gomft/components"
|
|
"github.com/starfleetcptn/gomft/internal/db"
|
|
)
|
|
|
|
// HandleDashboard handles the GET /dashboard route
|
|
func (h *Handlers) HandleDashboard(c *gin.Context) {
|
|
|
|
// Get recent job history
|
|
var recentHistory []db.JobHistory
|
|
h.DB.Order("start_time DESC").Limit(5).Find(&recentHistory)
|
|
|
|
// Get job statistics
|
|
var totalJobs int64
|
|
h.DB.Model(&db.JobHistory{}).Where("job_histories.status = 'running' AND job_histories.end_time IS NULL").Count(&totalJobs)
|
|
|
|
var completedJobs int64
|
|
h.DB.Model(&db.JobHistory{}).Where("status = ?", "completed").Count(&completedJobs)
|
|
|
|
var failedJobs int64
|
|
h.DB.Model(&db.JobHistory{}).Where("status = ?", "failed").Count(&failedJobs)
|
|
|
|
data := components.DashboardData{
|
|
RecentJobs: recentHistory,
|
|
ActiveTransfers: int(totalJobs),
|
|
CompletedToday: int(completedJobs),
|
|
FailedTransfers: int(failedJobs),
|
|
}
|
|
|
|
components.Dashboard(components.CreateTemplateContext(c), data).Render(c, c.Writer)
|
|
}
|
|
|
|
// HandleDashboardStats handles the dashboard stats API request
|
|
func (h *Handlers) HandleDashboardStats(c *gin.Context) {
|
|
userID := c.GetUint("userID")
|
|
|
|
// Get job statistics
|
|
var activeJobCount int64
|
|
var completedJobCount int64
|
|
var failedJobCount int64
|
|
|
|
h.DB.Model(&db.Job{}).Where("created_by = ? AND status = ?", userID, "running").Count(&activeJobCount)
|
|
h.DB.Model(&db.Job{}).Where("created_by = ? AND status = ?", userID, "completed").Count(&completedJobCount)
|
|
h.DB.Model(&db.Job{}).Where("created_by = ? AND status = ?", userID, "failed").Count(&failedJobCount)
|
|
|
|
// Get transfer statistics for the last 7 days
|
|
var dailyStats []struct {
|
|
Date string `json:"date"`
|
|
Completed int64 `json:"completed"`
|
|
Failed int64 `json:"failed"`
|
|
}
|
|
|
|
for i := 6; i >= 0; i-- {
|
|
date := time.Now().AddDate(0, 0, -i)
|
|
startOfDay := time.Date(date.Year(), date.Month(), date.Day(), 0, 0, 0, 0, time.Local)
|
|
endOfDay := time.Date(date.Year(), date.Month(), date.Day(), 23, 59, 59, 999999999, time.Local)
|
|
|
|
var completed int64
|
|
var failed int64
|
|
|
|
h.DB.Model(&db.Job{}).
|
|
Where("created_by = ? AND status = ? AND last_run BETWEEN ? AND ?", userID, "completed", startOfDay, endOfDay).
|
|
Count(&completed)
|
|
|
|
h.DB.Model(&db.Job{}).
|
|
Where("created_by = ? AND status = ? AND last_run BETWEEN ? AND ?", userID, "failed", startOfDay, endOfDay).
|
|
Count(&failed)
|
|
|
|
dailyStats = append(dailyStats, struct {
|
|
Date string `json:"date"`
|
|
Completed int64 `json:"completed"`
|
|
Failed int64 `json:"failed"`
|
|
}{
|
|
Date: startOfDay.Format("2006-01-02"),
|
|
Completed: completed,
|
|
Failed: failed,
|
|
})
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
"activeJobs": activeJobCount,
|
|
"completedJobs": completedJobCount,
|
|
"failedJobs": failedJobCount,
|
|
"dailyStats": dailyStats,
|
|
"uptime": time.Since(h.StartTime).String(),
|
|
"uptimeSeconds": int64(time.Since(h.StartTime).Seconds()),
|
|
})
|
|
}
|
|
|
|
// HandleRecentJobs handles the recent jobs API request
|
|
func (h *Handlers) HandleRecentJobs(c *gin.Context) {
|
|
userID := c.GetUint("userID")
|
|
|
|
var recentJobs []db.Job
|
|
h.DB.Where("created_by = ?", userID).Order("created_at DESC").Limit(5).Find(&recentJobs)
|
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
"recentJobs": recentJobs,
|
|
})
|
|
}
|