add override functionallity

This commit is contained in:
Fran Jurmanović
2025-02-05 19:48:55 +01:00
parent 2c6f4494f4
commit 6fbc718a47
5 changed files with 82 additions and 49 deletions

View File

@@ -54,6 +54,16 @@ func (ac *ApiController) getFirst(c *fiber.Ctx) error {
// @Success 200 {array} string
// @Router /v1/api/{service} [get]
func (ac *ApiController) getStatus(c *fiber.Ctx) error {
serverId, err := c.ParamsInt("serverId")
if err != nil {
return c.Status(400).SendString(err.Error())
}
if serverId == 0 {
service := c.Params("service")
c.Locals("service", service)
} else {
c.Locals("serverId", serverId)
}
apiModel, err := ac.service.GetStatus(c)
if err != nil {
return c.Status(400).SendString(err.Error())
@@ -75,6 +85,7 @@ func (ac *ApiController) startServer(c *fiber.Ctx) error {
c.SendStatus(400)
}
c.Locals("service", model.Name)
c.Locals("serverId", model.ServerId)
apiModel, err := ac.service.ApiStartServer(c)
if err != nil {
return c.Status(400).SendString(err.Error())
@@ -96,6 +107,7 @@ func (ac *ApiController) stopServer(c *fiber.Ctx) error {
c.SendStatus(400)
}
c.Locals("service", model.Name)
c.Locals("serverId", model.ServerId)
apiModel, err := ac.service.ApiStopServer(c)
if err != nil {
return c.Status(400).SendString(err.Error())
@@ -117,6 +129,7 @@ func (ac *ApiController) restartServer(c *fiber.Ctx) error {
c.SendStatus(400)
}
c.Locals("service", model.Name)
c.Locals("serverId", model.ServerId)
apiModel, err := ac.service.ApiRestartServer(c)
if err != nil {
return c.Status(400).SendString(err.Error())
@@ -126,4 +139,5 @@ func (ac *ApiController) restartServer(c *fiber.Ctx) error {
type Service struct {
Name string `json:"name" xml:"name" form:"name"`
ServerId int `json:"serverId" xml:"serverId" form:"serverId"`
}

View File

@@ -9,6 +9,7 @@ import (
type ConfigController struct {
service *service.ConfigService
apiService *service.ApiService
}
// NewConfigController
@@ -19,9 +20,10 @@ type ConfigController struct {
// *Fiber.RouterGroup: Fiber Router Group
// Returns:
// *ConfigController: Controller for "Config" interactions
func NewConfigController(as *service.ConfigService, routeGroups *common.RouteGroups) *ConfigController {
func NewConfigController(as *service.ConfigService, routeGroups *common.RouteGroups, as2 *service.ApiService) *ConfigController {
ac := &ConfigController{
service: as,
apiService: as2,
}
routeGroups.Config.Put("/:file", ac.updateConfig)
@@ -42,6 +44,9 @@ func NewConfigController(as *service.ConfigService, routeGroups *common.RouteGro
// @Success 200 {array} string
// @Router /v1/server/{id}/config/{file} [put]
func (ac *ConfigController) updateConfig(c *fiber.Ctx) error {
restart := c.QueryBool("restart")
serverID, _ := c.ParamsInt("id")
c.Locals("serverId", serverID)
var config map[string]interface{}
if err := c.BodyParser(&config); err != nil {
@@ -52,6 +57,10 @@ func (ac *ConfigController) updateConfig(c *fiber.Ctx) error {
if err != nil {
return c.Status(400).SendString(err.Error())
}
if restart {
ac.apiService.RestartServer(c)
}
return c.JSON(ConfigModel)
}

View File

@@ -34,57 +34,54 @@ func (as ApiService) GetFirst(ctx *fiber.Ctx) *model.ApiModel {
}
func (as ApiService) GetStatus(ctx *fiber.Ctx) (string, error) {
service := ctx.Params("service")
return as.StatusServer(ctx, service)
return as.StatusServer(ctx)
}
func (as ApiService) ApiStartServer(ctx *fiber.Ctx) (string, error) {
service, ok := ctx.Locals("service").(string)
if !ok {
return "", errors.New("service name missing")
}
return as.StartServer(ctx, service)
return as.StartServer(ctx)
}
func (as ApiService) ApiStopServer(ctx *fiber.Ctx) (string, error) {
service, ok := ctx.Locals("service").(string)
if !ok {
return "", errors.New("service name missing")
}
return as.StopServer(ctx, service)
return as.StopServer(ctx)
}
func (as ApiService) ApiRestartServer(ctx *fiber.Ctx) (string, error) {
service, ok := ctx.Locals("service").(string)
if !ok {
return as.RestartServer(ctx)
}
func (as ApiService) StatusServer(ctx *fiber.Ctx) (string, error) {
return as.ManageService(ctx, "status")
}
func (as ApiService) StartServer(ctx *fiber.Ctx) (string, error) {
return as.ManageService(ctx, "start")
}
func (as ApiService) StopServer(ctx *fiber.Ctx) (string, error) {
return as.ManageService(ctx, "stop")
}
func (as ApiService) RestartServer(ctx *fiber.Ctx) (string, error) {
return as.ManageService(ctx, "restart")
}
func (as ApiService) ManageService(ctx *fiber.Ctx, action string) (string, error) {
var server *model.Server
serviceName, ok := ctx.Locals("service").(string)
if !ok || serviceName == "" {
serverId, ok2 := ctx.Locals("serverId").(int)
if !ok2 || serverId == 0 {
return "", errors.New("service name missing")
}
return as.RestartServer(ctx, service)
server = as.serverRepository.GetFirst(ctx.UserContext(), serverId)
} else {
server = as.serverRepository.GetFirstByServiceName(ctx.UserContext(), serviceName)
}
func (as ApiService) StatusServer(ctx *fiber.Ctx, serviceName string) (string, error) {
return as.ManageService(ctx, "status", serviceName)
}
func (as ApiService) StartServer(ctx *fiber.Ctx, serviceName string) (string, error) {
return as.ManageService(ctx, "start", serviceName)
}
func (as ApiService) StopServer(ctx *fiber.Ctx, serviceName string) (string, error) {
return as.ManageService(ctx, "stop", serviceName)
}
func (as ApiService) RestartServer(ctx *fiber.Ctx, serviceName string) (string, error) {
return as.ManageService(ctx, "restart", serviceName)
}
func (as ApiService) ManageService(ctx *fiber.Ctx, action string, serviceName string) (string, error) {
server := as.serverRepository.GetFirstByServiceName(ctx.UserContext(), serviceName)
if server == nil {
return "", fiber.NewError(404, "Server not found")
}
output, err := common.RunElevatedCommand(action, serviceName)
output, err := common.RunElevatedCommand(action, server.ServiceName)
if err != nil {
return "", err
}

View File

@@ -3,6 +3,7 @@ package service
import (
"acc-server-manager/local/model"
"acc-server-manager/local/repository"
"acc-server-manager/local/utl/common"
"bytes"
"encoding/json"
"errors"
@@ -37,9 +38,9 @@ func NewConfigService(repository *repository.ConfigRepository, serverRepository
// Returns:
// string: Application version
func (as ConfigService) UpdateConfig(ctx *fiber.Ctx, body *map[string]interface{}) (*model.Config, error) {
serverID, _ := ctx.ParamsInt("id")
serverID := ctx.Locals("serverId").(int)
configFile := ctx.Params("file")
merge := ctx.QueryBool("merge")
override := ctx.QueryBool("override")
server := as.serverRepository.GetFirst(ctx.UserContext(), serverID)
@@ -60,21 +61,21 @@ func (as ConfigService) UpdateConfig(ctx *fiber.Ctx, body *map[string]interface{
}
// Write new config
newData, err := json.MarshalIndent(&body, "", " ")
newData, err := json.Marshal(&body)
if err != nil {
return nil, err
}
if merge {
if !override {
newData, err = jsons.Merge(oldDataUTF8, newData)
if err != nil {
return nil, err
}
newData, err = json.MarshalIndent(newData, "", " ")
}
newData, err = common.IndentJson(newData)
if err != nil {
return nil, err
}
}
newDataUTF16, err := EncodeUTF16LEBOM(newData)
if err != nil {

View File

@@ -1,6 +1,8 @@
package common
import (
"bytes"
"encoding/json"
"fmt"
"log"
"net"
@@ -69,3 +71,13 @@ func RunElevatedCommand(command string, service string) (string, error) {
}
return string(output), nil
}
func IndentJson(body []byte) ([]byte, error) {
newBody := new([]byte)
unmarshaledBody := bytes.NewBuffer(*newBody)
err := json.Indent(unmarshaledBody, body, "", " ")
if err != nil {
return nil, err
}
return unmarshaledBody.Bytes(), nil
}