File size: 3,060 Bytes
2196bfe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package controllers

import (
	"net/http"
	"uptime/backend/database"
	"uptime/backend/models"
	"uptime/backend/services"

	"github.com/gin-gonic/gin"
)

// CreateMonitor creates a new monitor
func CreateMonitor(c *gin.Context) {
	var monitor models.Monitor
	if err := c.ShouldBindJSON(&monitor); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	database.DB.Create(&monitor)
	c.JSON(http.StatusOK, monitor)
}

// GetMonitors retrieves all monitors
func GetMonitors(c *gin.Context) {
	var monitors []models.Monitor
	database.DB.Find(&monitors)

	type MonitorWithLatency struct {
		models.Monitor
		Latency uint `json:"latency"`
	}

	var monitorsWithLatency []MonitorWithLatency

	for _, m := range monitors {
		var latency models.Latency
		database.DB.Where("monitor_id = ?", m.ID).Order("created_at desc").First(&latency)
		monitorsWithLatency = append(monitorsWithLatency, MonitorWithLatency{
			Monitor: m,
			Latency: latency.Latency,
		})
	}

	c.JSON(http.StatusOK, monitorsWithLatency)
}

// GetMonitor retrieves a single monitor by ID
func GetMonitor(c *gin.Context) {
	id := c.Params.ByName("id")
	var monitor models.Monitor
	if err := database.DB.First(&monitor, id).Error; err != nil {
		c.JSON(http.StatusNotFound, gin.H{"error": "Monitor not found"})
		return
	}

	var latencies []models.Latency
	database.DB.Where("monitor_id = ?", monitor.ID).Order("created_at desc").Limit(100).Find(&latencies)

	c.JSON(http.StatusOK, gin.H{
		"monitor":   monitor,
		"latencies": latencies,
	})
}

// UpdateMonitor updates an existing monitor
func UpdateMonitor(c *gin.Context) {
	id := c.Params.ByName("id")
	var monitor models.Monitor
	if err := database.DB.First(&monitor, id).Error; err != nil {
		c.JSON(http.StatusNotFound, gin.H{"error": "Monitor not found"})
		return
	}

	if err := c.ShouldBindJSON(&monitor); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	database.DB.Save(&monitor)
	c.JSON(http.StatusOK, monitor)
}

// DeleteMonitor deletes a monitor
func DeleteMonitor(c *gin.Context) {
	id := c.Params.ByName("id")
	var monitor models.Monitor
	if err := database.DB.First(&monitor, id).Error; err != nil {
		c.JSON(http.StatusNotFound, gin.H{"error": "Monitor not found"})
		return
	}
	database.DB.Unscoped().Delete(&monitor)
	services.DeletedMonitorIDs <- monitor.ID
	c.JSON(http.StatusOK, gin.H{"message": "Monitor deleted successfully"})
}

// ManualCheck triggers a manual check for a specific monitor
func ManualCheck(c *gin.Context) {
	id := c.Params.ByName("id")
	var monitor models.Monitor
	if err := database.DB.First(&monitor, id).Error; err != nil {
		c.JSON(http.StatusNotFound, gin.H{"error": "Monitor not found"})
		return
	}

	// TODO: Trigger manual check - for now just update status to pending
	monitor.Status = "pending"
	database.DB.Save(&monitor)
	
	c.JSON(http.StatusOK, gin.H{"message": "Manual check triggered", "monitor": monitor})
}