mirror of
https://github.com/lzh-1625/go_process_manager.git
synced 2025-09-27 12:22:13 +08:00
150 lines
3.9 KiB
Go
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,
|
|
}
|
|
}
|