Files
acc-server-manager/local/controller/service_control.go
2025-07-29 20:50:44 +02:00

149 lines
5.6 KiB
Go

package controller
import (
"acc-server-manager/local/middleware"
"acc-server-manager/local/service"
"acc-server-manager/local/utl/common"
"acc-server-manager/local/utl/error_handler"
"github.com/gofiber/fiber/v2"
)
type ServiceControlController struct {
service *service.ServiceControlService
errorHandler *error_handler.ControllerErrorHandler
}
// NewServiceControlController
// Initializes ServiceControlController.
//
// Args:
// *services.ServiceControlService: Service control service
// *Fiber.RouterGroup: Fiber Router Group
// Returns:
// *ServiceControlController: Controller for service control interactions
func NewServiceControlController(as *service.ServiceControlService, routeGroups *common.RouteGroups, auth *middleware.AuthMiddleware) *ServiceControlController {
ac := &ServiceControlController{
service: as,
errorHandler: error_handler.NewControllerErrorHandler(),
}
serviceRoutes := routeGroups.Server.Group("/service")
serviceRoutes.Get("/:service", ac.getStatus)
serviceRoutes.Post("/start", ac.startServer)
serviceRoutes.Post("/stop", ac.stopServer)
serviceRoutes.Post("/restart", ac.restartServer)
return ac
}
// getStatus returns service status
//
// @Summary Get service status
// @Description Get the current status of a Windows service
// @Tags Service Control
// @Accept json
// @Produce json
// @Param service path string true "Service name"
// @Success 200 {object} object{status=string,state=string} "Service status information"
// @Failure 400 {object} error_handler.ErrorResponse "Invalid service name"
// @Failure 401 {object} error_handler.ErrorResponse "Unauthorized"
// @Failure 404 {object} error_handler.ErrorResponse "Service not found"
// @Failure 500 {object} error_handler.ErrorResponse "Internal server error"
// @Security BearerAuth
// @Router /v1/service-control/{service} [get]
func (ac *ServiceControlController) getStatus(c *fiber.Ctx) error {
id := c.Params("id")
c.Locals("serverId", id)
apiModel, err := ac.service.GetStatus(c)
if err != nil {
return ac.errorHandler.HandleServiceError(c, err)
}
return c.SendString(string(apiModel))
}
// startServer starts service
//
// @Summary Start a Windows service
// @Description Start a stopped Windows service for an ACC server
// @Tags Service Control
// @Accept json
// @Produce json
// @Param service body object{name=string} true "Service name to start"
// @Success 200 {object} object{message=string} "Service started successfully"
// @Failure 400 {object} error_handler.ErrorResponse "Invalid request body"
// @Failure 401 {object} error_handler.ErrorResponse "Unauthorized"
// @Failure 403 {object} error_handler.ErrorResponse "Insufficient permissions"
// @Failure 404 {object} error_handler.ErrorResponse "Service not found"
// @Failure 409 {object} error_handler.ErrorResponse "Service already running"
// @Failure 500 {object} error_handler.ErrorResponse "Internal server error"
// @Security BearerAuth
// @Router /v1/service-control/start [post]
func (ac *ServiceControlController) startServer(c *fiber.Ctx) error {
id := c.Params("id")
c.Locals("serverId", id)
apiModel, err := ac.service.ServiceControlStartServer(c)
if err != nil {
return ac.errorHandler.HandleServiceError(c, err)
}
return c.SendString(apiModel)
}
// stopServer stops service
//
// @Summary Stop a Windows service
// @Description Stop a running Windows service for an ACC server
// @Tags Service Control
// @Accept json
// @Produce json
// @Param service body object{name=string} true "Service name to stop"
// @Success 200 {object} object{message=string} "Service stopped successfully"
// @Failure 400 {object} error_handler.ErrorResponse "Invalid request body"
// @Failure 401 {object} error_handler.ErrorResponse "Unauthorized"
// @Failure 403 {object} error_handler.ErrorResponse "Insufficient permissions"
// @Failure 404 {object} error_handler.ErrorResponse "Service not found"
// @Failure 409 {object} error_handler.ErrorResponse "Service already stopped"
// @Failure 500 {object} error_handler.ErrorResponse "Internal server error"
// @Security BearerAuth
// @Router /v1/service-control/stop [post]
func (ac *ServiceControlController) stopServer(c *fiber.Ctx) error {
id := c.Params("id")
c.Locals("serverId", id)
apiModel, err := ac.service.ServiceControlStopServer(c)
if err != nil {
return ac.errorHandler.HandleServiceError(c, err)
}
return c.SendString(apiModel)
}
// restartServer restarts service
//
// @Summary Restart a Windows service
// @Description Stop and start a Windows service for an ACC server
// @Tags Service Control
// @Accept json
// @Produce json
// @Param service body object{name=string} true "Service name to restart"
// @Success 200 {object} object{message=string} "Service restarted successfully"
// @Failure 400 {object} error_handler.ErrorResponse "Invalid request body"
// @Failure 401 {object} error_handler.ErrorResponse "Unauthorized"
// @Failure 403 {object} error_handler.ErrorResponse "Insufficient permissions"
// @Failure 404 {object} error_handler.ErrorResponse "Service not found"
// @Failure 500 {object} error_handler.ErrorResponse "Internal server error"
// @Security BearerAuth
// @Router /v1/service-control/restart [post]
func (ac *ServiceControlController) restartServer(c *fiber.Ctx) error {
id := c.Params("id")
c.Locals("serverId", id)
apiModel, err := ac.service.ServiceControlRestartServer(c)
if err != nil {
return ac.errorHandler.HandleServiceError(c, err)
}
return c.SendString(apiModel)
}
type Service struct {
Name string `json:"name" xml:"name" form:"name"`
ServerId string `json:"serverId" xml:"serverId" form:"serverId"`
}