Files
go_process_manager/internal/app/api/proc.go
2025-09-06 13:48:13 +08:00

150 lines
3.9 KiB
Go

package api
import (
"errors"
"time"
"github.com/google/uuid"
"github.com/lzh-1625/go_process_manager/internal/app/eum"
"github.com/lzh-1625/go_process_manager/internal/app/logic"
"github.com/lzh-1625/go_process_manager/internal/app/model"
"github.com/lzh-1625/go_process_manager/internal/app/repository"
"github.com/lzh-1625/go_process_manager/utils"
"github.com/gin-gonic/gin"
)
type procApi struct{}
var ProcApi = new(procApi)
func (p *procApi) CreateNewProcess(ctx *gin.Context, req model.Process) any {
index, err := repository.ProcessRepository.AddProcessConfig(req)
if err != nil {
return err
}
req.Uuid = index
proc, err := logic.ProcessCtlLogic.NewProcess(req)
if err != nil {
return err
}
logic.ProcessCtlLogic.AddProcess(req.Uuid, proc)
return gin.H{
"id": req.Uuid,
}
}
func (p *procApi) DeleteNewProcess(ctx *gin.Context, req struct {
Uuid int `form:"uuid" binding:"required"`
}) (err error) {
logic.ProcessCtlLogic.KillProcess(req.Uuid)
logic.ProcessCtlLogic.DeleteProcess(req.Uuid)
return repository.ProcessRepository.DeleteProcessConfig(req.Uuid)
}
func (p *procApi) KillProcess(ctx *gin.Context, req struct {
Uuid int `form:"uuid" binding:"required"`
}) (err error) {
if !hasOprPermission(ctx, req.Uuid, eum.OperationStop) {
return errors.New("not permission")
}
return logic.ProcessCtlLogic.KillProcess(req.Uuid)
}
func (p *procApi) StartProcess(ctx *gin.Context, req struct {
Uuid int `json:"uuid" binding:"required"`
}) (err error) {
if !hasOprPermission(ctx, req.Uuid, eum.OperationStart) {
return errors.New("not permission")
}
prod, err := logic.ProcessCtlLogic.GetProcess(req.Uuid)
if err != nil { // 进程不存在则创建
proConfig, err := repository.ProcessRepository.GetProcessConfigById(req.Uuid)
if err != nil {
return err
}
proc, err := logic.ProcessCtlLogic.RunNewProcess(proConfig)
if err != nil {
return err
}
logic.ProcessCtlLogic.AddProcess(req.Uuid, proc)
return nil
}
if prod.State.State == eum.ProcessStateStart || prod.State.State == eum.ProcessStateRunning {
return errors.New("process is currently running")
}
prod.ResetRestartTimes()
err = prod.Start()
return
}
func (p *procApi) StartAllProcess(ctx *gin.Context, _ any) (err error) {
if isAdmin(ctx) {
logic.ProcessCtlLogic.ProcessStartAll()
} else {
logic.ProcessCtlLogic.ProcesStartAllByUsername(getUserName(ctx))
}
return
}
func (p *procApi) KillAllProcess(ctx *gin.Context, _ any) (err error) {
if isAdmin(ctx) {
logic.ProcessCtlLogic.KillAllProcess()
} else {
logic.ProcessCtlLogic.KillAllProcessByUserName(getUserName(ctx))
}
return
}
func (p *procApi) GetProcessList(ctx *gin.Context, _ any) any {
if isAdmin(ctx) {
return logic.ProcessCtlLogic.GetProcessList()
} else {
return logic.ProcessCtlLogic.GetProcessListByUser(getUserName(ctx))
}
}
func (p *procApi) UpdateProcessConfig(ctx *gin.Context, req model.Process) (err error) {
logic.ProcessCtlLogic.UpdateProcessConfig(req)
err = repository.ProcessRepository.UpdateProcessConfig(req)
return
}
func (p *procApi) GetProcessConfig(ctx *gin.Context, req struct {
Uuid int `form:"uuid" binding:"required"`
}) any {
data, err := repository.ProcessRepository.GetProcessConfigById(req.Uuid)
if err != nil {
return err
}
return data
}
func (p *procApi) ProcessControl(ctx *gin.Context, req struct {
Uuid int `form:"uuid" binding:"required"`
}) (err error) {
user := getUserName(ctx)
proc, err := logic.ProcessCtlLogic.GetProcess(req.Uuid)
if err != nil {
return err
}
proc.ProcessControl(user)
return
}
func (p *procApi) ProcessCreateShare(ctx *gin.Context, req model.ProcessShare) any {
token := utils.UnwarpIgnore(uuid.NewRandom()).String()
if err := repository.WsShare.AddShareData(model.WsShare{
ExpireTime: time.Now().Add(time.Minute * time.Duration(req.Minutes)),
Write: req.Write,
Token: token,
Pid: req.Pid,
CreateBy: getUserName(ctx),
}); err != nil {
return err
}
return gin.H{
"token": token,
}
}