Added events feature + rewrote router.go api/v1
This commit is contained in:
@ -2,10 +2,13 @@ package v1
|
||||
|
||||
import (
|
||||
"git.cesium.pw/niku/virteen/internal/auth"
|
||||
"git.cesium.pw/niku/virteen/internal/events"
|
||||
eventServices "git.cesium.pw/niku/virteen/internal/events/services"
|
||||
"git.cesium.pw/niku/virteen/internal/middleware"
|
||||
"git.cesium.pw/niku/virteen/internal/podman"
|
||||
"git.cesium.pw/niku/virteen/internal/podman/models"
|
||||
"git.cesium.pw/niku/virteen/internal/podman/services"
|
||||
podmanModels "git.cesium.pw/niku/virteen/internal/podman/models"
|
||||
podmanServices "git.cesium.pw/niku/virteen/internal/podman/services"
|
||||
"github.com/gofiber/contrib/websocket"
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/monitor"
|
||||
"github.com/pkg/errors"
|
||||
@ -14,30 +17,35 @@ import (
|
||||
func ConfigureRoutes(router fiber.Router) error {
|
||||
v1 := router.Group("/v1")
|
||||
|
||||
ac := auth.NewPamAuthController()
|
||||
ag := v1.Group("/auth")
|
||||
ag.Post("/token", ac.GetToken)
|
||||
authController := auth.NewPamAuthController()
|
||||
authGroup := v1.Group("/auth")
|
||||
authGroup.Post("/token", authController.GetToken)
|
||||
|
||||
v1.Get("/ping", Ping)
|
||||
v1.Get("/metrics", monitor.New())
|
||||
|
||||
v1.Use(middleware.Protected())
|
||||
|
||||
var cs models.PodmanService
|
||||
cs, err := services.NewPodmanContainerService()
|
||||
eventsService := eventServices.NewEventsService()
|
||||
eventsController := events.NewEventsController(eventsService)
|
||||
eventsGroup := v1.Group("/events")
|
||||
eventsGroup.Get("/ws", middleware.UpgradeSocket, websocket.New(eventsController.PollEvents))
|
||||
|
||||
var cs podmanModels.PodmanService
|
||||
cs, err := podmanServices.NewPodmanContainerService()
|
||||
if err != nil {
|
||||
panic(errors.Wrapf(err, "failed to build podman container service"))
|
||||
}
|
||||
|
||||
cc := podman.NewPodmanController(&cs)
|
||||
containerController := podman.NewPodmanController(&cs)
|
||||
|
||||
cg := v1.Group("/containers")
|
||||
cg.Get("/", cc.ListContainers)
|
||||
cg.Post("/", cc.CreateContainer)
|
||||
containersGroup := v1.Group("/containers")
|
||||
containersGroup.Get("/", containerController.ListContainers)
|
||||
containersGroup.Post("/", containerController.CreateContainer)
|
||||
|
||||
ccg := cg.Group("/:name")
|
||||
ccg.Put("/status", cc.UpdateContainerStatus)
|
||||
ccg.Delete("/", cc.DeleteContainer)
|
||||
containerGroup := containersGroup.Group("/:name")
|
||||
containerGroup.Put("/status", containerController.UpdateContainerStatus)
|
||||
containerGroup.Delete("/", containerController.DeleteContainer)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
26
internal/events/events_controller.go
Normal file
26
internal/events/events_controller.go
Normal file
@ -0,0 +1,26 @@
|
||||
package events
|
||||
|
||||
import (
|
||||
"git.cesium.pw/niku/virteen/internal/events/services"
|
||||
"github.com/gofiber/contrib/websocket"
|
||||
)
|
||||
|
||||
type EventsController struct {
|
||||
events *services.EventsService
|
||||
}
|
||||
|
||||
func NewEventsController(events *services.EventsService) *EventsController {
|
||||
return &EventsController{events}
|
||||
}
|
||||
|
||||
func (ec *EventsController) PollEvents(ws *websocket.Conn) {
|
||||
(*ec.events).AddConnection(ws)
|
||||
defer (*ec.events).RemoveConnection(ws)
|
||||
|
||||
for {
|
||||
_, _, err := ws.ReadMessage()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
27
internal/events/services/events_service.go
Normal file
27
internal/events/services/events_service.go
Normal file
@ -0,0 +1,27 @@
|
||||
package services
|
||||
|
||||
import "github.com/gofiber/contrib/websocket"
|
||||
|
||||
type EventsService struct {
|
||||
clients map[*websocket.Conn]interface{}
|
||||
}
|
||||
|
||||
func NewEventsService() *EventsService {
|
||||
return &EventsService{
|
||||
clients: make(map[*websocket.Conn]interface{}),
|
||||
}
|
||||
}
|
||||
|
||||
func (es *EventsService) AddConnection(ws *websocket.Conn) {
|
||||
es.clients[ws] = nil
|
||||
}
|
||||
|
||||
func (es *EventsService) RemoveConnection(ws *websocket.Conn) {
|
||||
delete(es.clients, ws)
|
||||
}
|
||||
|
||||
func (es *EventsService) Broadcast(msg interface{}) {
|
||||
for connection := range es.clients {
|
||||
go connection.WriteJSON(msg)
|
||||
}
|
||||
}
|
14
internal/middleware/websocket.go
Normal file
14
internal/middleware/websocket.go
Normal file
@ -0,0 +1,14 @@
|
||||
package middleware
|
||||
|
||||
import (
|
||||
"github.com/gofiber/contrib/websocket"
|
||||
"github.com/gofiber/fiber/v2"
|
||||
)
|
||||
|
||||
func UpgradeSocket(ctx *fiber.Ctx) error {
|
||||
if websocket.IsWebSocketUpgrade(ctx) {
|
||||
ctx.Locals("allowed", true)
|
||||
return ctx.Next()
|
||||
}
|
||||
return fiber.ErrUpgradeRequired
|
||||
}
|
Reference in New Issue
Block a user