ferry/apis/process/task.go
2023-11-28 22:18:28 +08:00

239 lines
5.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package process
import (
"errors"
"ferry/pkg/pagination"
"ferry/tools"
"ferry/tools/app"
"fmt"
"io/ioutil"
"os"
"strings"
"github.com/gin-gonic/gin"
uuid "github.com/google/uuid"
"github.com/spf13/viper"
)
/*
@Author : lanyulei
*/
// 任务列表
func TaskList(c *gin.Context) {
var (
err error
pageValue pagination.ListRequest
taskName string
taskData []map[string]interface{}
totalCount int
)
taskName = c.DefaultQuery("name", "")
err = c.ShouldBind(&pageValue)
if err != nil {
app.Error(c, -1, err, "")
return
}
if pageValue.Page == 0 {
pageValue.Page = 1
}
if pageValue.PerPage == 0 {
pageValue.PerPage = 10
}
getFileDetails := func(fn string) map[string]interface{} {
file := make(map[string]interface{})
fileClassify := strings.Split(fn, ".")
fileDetails := strings.Split(fileClassify[0], "-")
switch fileClassify[1] {
case "py":
file["classify"] = "Python"
case "sh":
file["classify"] = "Shell"
default:
file["classify"] = "Other"
}
if len(fileDetails) == 3 {
file["name"] = fileDetails[0]
file["uuid"] = fileDetails[1]
file["creator"] = fileDetails[2]
}
file["full_name"] = fn
return file
}
files, _ := ioutil.ReadDir(viper.GetString("script.path"))
var endIndex int
if taskName != "" {
for _, f := range files {
if strings.Contains(strings.Split(f.Name(), "-")[0], taskName) {
taskData = append(taskData, getFileDetails(f.Name()))
}
}
totalCount = len(taskData)
if pageValue.Page*pageValue.PerPage > len(taskData) {
endIndex = len(taskData)
} else {
endIndex = pageValue.Page * pageValue.PerPage
}
taskData = taskData[(pageValue.Page-1)*pageValue.PerPage : endIndex]
} else {
if pageValue.Page*pageValue.PerPage > len(files) {
endIndex = len(files)
} else {
endIndex = pageValue.Page * pageValue.PerPage
}
for _, f := range files[(pageValue.Page-1)*pageValue.PerPage : endIndex] {
taskData = append(taskData, getFileDetails(f.Name()))
}
totalCount = len(files)
}
app.OK(c, map[string]interface{}{
"data": taskData,
"page": pageValue.Page,
"per_page": pageValue.PerPage,
"total_count": totalCount,
}, "")
}
// 创建任务
func CreateTask(c *gin.Context) {
var (
err error
taskValue struct {
Name string `json:"name"`
Classify string `json:"classify"`
Content string `json:"content"`
}
)
err = c.ShouldBind(&taskValue)
if err != nil {
app.Error(c, -1, err, "")
return
}
uuidValue := uuid.Must(uuid.New(), err)
fileName := fmt.Sprintf("%v/%v-%v-%v",
viper.GetString("script.path"),
taskValue.Name,
strings.Split(uuidValue.String(), "-")[4],
tools.GetUserName(c),
)
if taskValue.Classify == "python" {
fileName = fileName + ".py"
} else if taskValue.Classify == "shell" {
fileName = fileName + ".sh"
}
err = ioutil.WriteFile(fileName, []byte(taskValue.Content), 0755)
if err != nil {
app.Error(c, -1, err, fmt.Sprintf("创建任务脚本失败: %v", err.Error()))
return
}
app.OK(c, "", "任务创建成功")
}
// 更新任务
func UpdateTask(c *gin.Context) {
var (
err error
file struct {
Name string `json:"name"`
FullName string `json:"full_name"`
Classify string `json:"classify"`
Content string `json:"content"`
}
)
err = c.ShouldBind(&file)
if err != nil {
app.Error(c, -1, err, "")
return
}
fullNameList := strings.Split(file.FullName, "-")
if fullNameList[0] != file.Name {
fullNameList[0] = file.Name
}
var suffixName string
if strings.ToLower(file.Classify) == "python" {
suffixName = ".py"
} else if strings.ToLower(file.Classify) == "shell" {
suffixName = ".sh"
}
if fullNameList[len(fullNameList)-1][len(fullNameList[len(fullNameList)-1])-3:len(fullNameList[len(fullNameList)-1])] != suffixName {
tList := strings.Split(fullNameList[len(fullNameList)-1], ".")
tList[len(tList)-1] = suffixName[1:len(suffixName)]
fullNameList[len(fullNameList)-1] = strings.Join(tList, ".")
}
fileFullName := strings.Join(fullNameList, "-")
// 修改文件内容
err = ioutil.WriteFile(fmt.Sprintf("%v/%v", viper.GetString("script.path"), fileFullName), []byte(file.Content), 0666)
if err != nil {
app.Error(c, -1, err, fmt.Sprintf("更新脚本文件失败,%v", err.Error()))
return
}
// 修改文件名称
err = os.Rename(
fmt.Sprintf("%v/%v", viper.GetString("script.path"), file.FullName),
fmt.Sprintf("%v/%v", viper.GetString("script.path"), fileFullName),
)
if err != nil {
app.Error(c, -1, err, fmt.Sprintf("更改脚本文件名称失败,%v", err.Error()))
return
}
app.OK(c, "", "更新成功")
}
// 删除任务
func DeleteTask(c *gin.Context) {
fullName := c.DefaultQuery("full_name", "")
if fullName == "" || strings.Contains(fullName, "/") {
app.Error(c, -1, errors.New("参数不正确请确定参数full_name是否传递"), "")
return
}
err := os.RemoveAll(fmt.Sprintf("%v/%v", viper.GetString("script.path"), fullName))
if err != nil {
app.Error(c, -1, err, fmt.Sprintf("删除文件失败,%v", err.Error()))
return
}
app.OK(c, nil, "任务删除成功")
}
// 任务详情
func TaskDetails(c *gin.Context) {
var (
err error
fileName string
content []byte
)
fileName = c.DefaultQuery("file_name", "")
if fileName == "" ||
strings.HasPrefix(fileName, ".") ||
strings.HasPrefix(fileName, "/") ||
strings.HasPrefix(fileName, "\\") {
app.Error(c, -1, errors.New("file_name参数不正确请确认"), "")
return
}
content, err = ioutil.ReadFile(fmt.Sprintf("%v/%v", viper.GetString("script.path"), fileName))
if err != nil {
return
}
app.OK(c, string(content), "")
}