140 lines
4.5 KiB
Go
140 lines
4.5 KiB
Go
package handlers
|
|
|
|
import (
|
|
"database/sql"
|
|
"net/http"
|
|
"strconv"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"lan-manager/server/db"
|
|
"lan-manager/server/middleware"
|
|
"lan-manager/server/models"
|
|
)
|
|
|
|
type ServiceHandler struct{}
|
|
|
|
func NewServiceHandler() *ServiceHandler {
|
|
return &ServiceHandler{}
|
|
}
|
|
|
|
func (h *ServiceHandler) Create(c *gin.Context) {
|
|
machineID, err := strconv.ParseInt(c.Param("id"), 10, 64)
|
|
if err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "invalid machine_id"})
|
|
return
|
|
}
|
|
var s models.Service
|
|
if err := c.ShouldBindJSON(&s); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
s.MachineID = machineID
|
|
res, err := db.DB.Exec(`INSERT INTO services (machine_id, name, port, protocol, notes, target_machine_id, target_notes) VALUES (?, ?, ?, ?, ?, ?, ?)`,
|
|
s.MachineID, s.Name, s.Port, s.Protocol, s.Notes, s.TargetMachineID, s.TargetNotes)
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
id, _ := res.LastInsertId()
|
|
s.ID = id
|
|
middleware.LogOperation("create", "service", &s.ID, s.Name+" on machine "+strconv.FormatInt(machineID, 10), "", middleware.ToJSON(s), c.ClientIP(), middleware.CurrentUser(c))
|
|
c.JSON(http.StatusCreated, s)
|
|
}
|
|
|
|
func (h *ServiceHandler) Update(c *gin.Context) {
|
|
id, err := strconv.ParseInt(c.Param("id"), 10, 64)
|
|
if err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "invalid id"})
|
|
return
|
|
}
|
|
var s models.Service
|
|
if err := c.ShouldBindJSON(&s); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
var old models.Service
|
|
_ = db.DB.QueryRow(`SELECT id, machine_id, name, port, protocol, notes, target_machine_id, target_notes FROM services WHERE id = ?`, id).
|
|
Scan(&old.ID, &old.MachineID, &old.Name, &old.Port, &old.Protocol, &old.Notes, &old.TargetMachineID, &old.TargetNotes)
|
|
_, err = db.DB.Exec(`UPDATE services SET name=?, port=?, protocol=?, notes=?, target_machine_id=?, target_notes=? WHERE id=?`,
|
|
s.Name, s.Port, s.Protocol, s.Notes, s.TargetMachineID, s.TargetNotes, id)
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
s.ID = id
|
|
middleware.LogOperation("update", "service", &s.ID, s.Name, middleware.ToJSON(old), middleware.ToJSON(s), c.ClientIP(), middleware.CurrentUser(c))
|
|
c.JSON(http.StatusOK, s)
|
|
}
|
|
|
|
func (h *ServiceHandler) Delete(c *gin.Context) {
|
|
id, err := strconv.ParseInt(c.Param("id"), 10, 64)
|
|
if err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "invalid id"})
|
|
return
|
|
}
|
|
var name string
|
|
var machineID int64
|
|
_ = db.DB.QueryRow(`SELECT name, machine_id FROM services WHERE id = ?`, id).Scan(&name, &machineID)
|
|
_, err = db.DB.Exec(`DELETE FROM services WHERE id = ?`, id)
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
middleware.LogOperation("delete", "service", &id, name+" on machine "+strconv.FormatInt(machineID, 10), "", "", c.ClientIP(), middleware.CurrentUser(c))
|
|
c.JSON(http.StatusOK, gin.H{"message": "deleted"})
|
|
}
|
|
|
|
func (h *ServiceHandler) ListByMachine(c *gin.Context) {
|
|
machineID, err := strconv.ParseInt(c.Param("id"), 10, 64)
|
|
if err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "invalid machine_id"})
|
|
return
|
|
}
|
|
isAdmin := middleware.IsAdmin(c)
|
|
rows, err := db.DB.Query(`SELECT id, machine_id, name, port, protocol, notes, target_machine_id, target_notes FROM services WHERE machine_id = ?`, machineID)
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
defer rows.Close()
|
|
list := []models.Service{}
|
|
for rows.Next() {
|
|
var s models.Service
|
|
var tm sql.NullInt64
|
|
if err := rows.Scan(&s.ID, &s.MachineID, &s.Name, &s.Port, &s.Protocol, &s.Notes, &tm, &s.TargetNotes); err == nil {
|
|
if tm.Valid {
|
|
tmid := tm.Int64
|
|
s.TargetMachineID = &tmid
|
|
}
|
|
if !isAdmin {
|
|
s.Notes = ""
|
|
s.TargetNotes = ""
|
|
}
|
|
list = append(list, s)
|
|
}
|
|
}
|
|
c.JSON(http.StatusOK, list)
|
|
}
|
|
|
|
func (h *ServiceHandler) ListAll(c *gin.Context) {
|
|
rows, err := db.DB.Query(`SELECT id, machine_id, name, port, protocol, notes, target_machine_id, target_notes FROM services`)
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
defer rows.Close()
|
|
list := []models.Service{}
|
|
for rows.Next() {
|
|
var s models.Service
|
|
var tm sql.NullInt64
|
|
if err := rows.Scan(&s.ID, &s.MachineID, &s.Name, &s.Port, &s.Protocol, &s.Notes, &tm, &s.TargetNotes); err == nil {
|
|
if tm.Valid {
|
|
tmid := tm.Int64
|
|
s.TargetMachineID = &tmid
|
|
}
|
|
list = append(list, s)
|
|
}
|
|
}
|
|
c.JSON(http.StatusOK, list)
|
|
}
|