149 lines
5.6 KiB
Go
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"`
|
|
}
|