mirror of
https://git.vectorsigma.ru/public/CasaOS.git
synced 2026-07-29 00:17:43 +00:00
feat: migrate gin to echo (#1854)
This commit is contained in:
85
route/v1.go
85
route/v1.go
@@ -2,50 +2,68 @@ package route
|
||||
|
||||
import (
|
||||
"crypto/ecdsa"
|
||||
"os"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"github.com/IceWhaleTech/CasaOS-Common/external"
|
||||
"github.com/IceWhaleTech/CasaOS-Common/middleware"
|
||||
"github.com/IceWhaleTech/CasaOS-Common/utils/jwt"
|
||||
"github.com/IceWhaleTech/CasaOS/common"
|
||||
"github.com/IceWhaleTech/CasaOS/pkg/config"
|
||||
v1 "github.com/IceWhaleTech/CasaOS/route/v1"
|
||||
|
||||
"github.com/gin-contrib/gzip"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/labstack/echo/v4"
|
||||
echo_middleware "github.com/labstack/echo/v4/middleware"
|
||||
)
|
||||
|
||||
func InitV1Router() *gin.Engine {
|
||||
ginMode := gin.ReleaseMode
|
||||
if config.ServerInfo.RunMode != "" {
|
||||
ginMode = config.ServerInfo.RunMode
|
||||
}
|
||||
if os.Getenv(gin.EnvGinMode) != "" {
|
||||
ginMode = os.Getenv(gin.EnvGinMode)
|
||||
}
|
||||
gin.SetMode(ginMode)
|
||||
func InitV1Router() http.Handler {
|
||||
e := echo.New()
|
||||
|
||||
r := gin.New()
|
||||
r.Use(gin.Recovery())
|
||||
r.Use(middleware.Cors())
|
||||
r.Use(gzip.Gzip(gzip.DefaultCompression))
|
||||
if ginMode != gin.ReleaseMode {
|
||||
r.Use(middleware.WriteLog())
|
||||
}
|
||||
e.Use((echo_middleware.CORSWithConfig(echo_middleware.CORSConfig{
|
||||
AllowOrigins: []string{"*"},
|
||||
AllowMethods: []string{echo.POST, echo.GET, echo.OPTIONS, echo.PUT, echo.DELETE},
|
||||
AllowHeaders: []string{echo.HeaderAuthorization, echo.HeaderContentLength, echo.HeaderXCSRFToken, echo.HeaderContentType, echo.HeaderAccessControlAllowOrigin, echo.HeaderAccessControlAllowHeaders, echo.HeaderAccessControlAllowMethods, echo.HeaderConnection, echo.HeaderOrigin, echo.HeaderXRequestedWith},
|
||||
ExposeHeaders: []string{echo.HeaderContentLength, echo.HeaderAccessControlAllowOrigin, echo.HeaderAccessControlAllowHeaders},
|
||||
MaxAge: 172800,
|
||||
AllowCredentials: true,
|
||||
})))
|
||||
e.Use(echo_middleware.Gzip())
|
||||
e.Use(echo_middleware.Recover())
|
||||
e.Use(echo_middleware.Logger())
|
||||
|
||||
r.GET("/v1/sys/debug", v1.GetSystemConfigDebug) // //debug
|
||||
e.GET("/v1/sys/debug", v1.GetSystemConfigDebug) // //debug
|
||||
|
||||
r.GET("/v1/sys/version/check", v1.GetSystemCheckVersion)
|
||||
r.GET("/v1/sys/version/current", func(ctx *gin.Context) {
|
||||
ctx.String(200, common.VERSION)
|
||||
e.GET("/v1/sys/version/check", v1.GetSystemCheckVersion)
|
||||
e.GET("/v1/sys/version/current", func(ctx echo.Context) error {
|
||||
return ctx.String(200, common.VERSION)
|
||||
})
|
||||
r.GET("/ping", func(ctx *gin.Context) {
|
||||
ctx.String(200, "pong")
|
||||
e.GET("/ping", func(ctx echo.Context) error {
|
||||
return ctx.String(200, "pong")
|
||||
})
|
||||
r.GET("/v1/recover/:type", v1.GetRecoverStorage)
|
||||
v1Group := r.Group("/v1")
|
||||
// r.Any("/v1/test", v1.CheckNetwork)
|
||||
v1Group.Use(jwt.ExceptLocalhost(func() (*ecdsa.PublicKey, error) { return external.GetPublicKey(config.CommonInfo.RuntimePath) }))
|
||||
e.GET("/v1/recover/:type", v1.GetRecoverStorage)
|
||||
v1Group := e.Group("/v1")
|
||||
// e.Any("/v1/test", v1.CheckNetwork)
|
||||
v1Group.Use(echo_middleware.JWTWithConfig(echo_middleware.JWTConfig{
|
||||
Skipper: func(c echo.Context) bool {
|
||||
return c.RealIP() == "::1" || c.RealIP() == "127.0.0.1"
|
||||
},
|
||||
ParseTokenFunc: func(token string, c echo.Context) (interface{}, error) {
|
||||
valid, claims, err := jwt.Validate(token, func() (*ecdsa.PublicKey, error) { return external.GetPublicKey(config.CommonInfo.RuntimePath) })
|
||||
if err != nil || !valid {
|
||||
return nil, echo.ErrUnauthorized
|
||||
}
|
||||
|
||||
c.Request().Header.Set("user_id", strconv.Itoa(claims.ID))
|
||||
|
||||
return claims, nil
|
||||
},
|
||||
TokenLookupFuncs: []echo_middleware.ValuesExtractor{
|
||||
func(ctx echo.Context) ([]string, error) {
|
||||
if len(ctx.Request().Header.Get(echo.HeaderAuthorization)) > 0 {
|
||||
return []string{ctx.Request().Header.Get(echo.HeaderAuthorization)}, nil
|
||||
}
|
||||
return []string{ctx.QueryParam("token")}, nil
|
||||
},
|
||||
},
|
||||
}))
|
||||
{
|
||||
|
||||
v1SysGroup := v1Group.Group("/sys")
|
||||
@@ -98,7 +116,7 @@ func InitV1Router() *gin.Engine {
|
||||
v1FileGroup.GET("/content", v1.GetFilerContent) // file/read
|
||||
|
||||
// File uploads need to be handled separately, and will not be modified here
|
||||
//v1FileGroup.POST("/upload", v1.PostFileUpload)
|
||||
// v1FileGroup.POST("/upload", v1.PostFileUpload)
|
||||
v1FileGroup.POST("/upload", v1.PostFileUpload)
|
||||
v1FileGroup.GET("/upload", v1.GetFileUpload)
|
||||
// v1FileGroup.GET("/download", v1.UserFileDownloadCommonService)
|
||||
@@ -171,7 +189,6 @@ func InitV1Router() *gin.Engine {
|
||||
v1OtherGroup.Use()
|
||||
{
|
||||
v1OtherGroup.GET("/search", v1.GetSearchResult)
|
||||
|
||||
}
|
||||
v1ZerotierGroup := v1Group.Group("/zt")
|
||||
v1ZerotierGroup.Use()
|
||||
@@ -180,5 +197,5 @@ func InitV1Router() *gin.Engine {
|
||||
}
|
||||
}
|
||||
|
||||
return r
|
||||
return e
|
||||
}
|
||||
|
||||
@@ -11,33 +11,31 @@ import (
|
||||
"github.com/IceWhaleTech/CasaOS/pkg/utils/common_err"
|
||||
"github.com/IceWhaleTech/CasaOS/pkg/utils/httper"
|
||||
"github.com/IceWhaleTech/CasaOS/service"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/labstack/echo/v4"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
func ListStorages(c *gin.Context) {
|
||||
func ListStorages(ctx echo.Context) error {
|
||||
// var req model.PageReq
|
||||
// if err := c.ShouldBind(&req); err != nil {
|
||||
// c.JSON(common_err.SUCCESS, model.Result{Success: common_err.CLIENT_ERROR, Message: common_err.GetMsg(common_err.CLIENT_ERROR), Data: err.Error()})
|
||||
// if err := ctx.Bind(&req); err != nil {
|
||||
// return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.CLIENT_ERROR, Message: common_err.GetMsg(common_err.CLIENT_ERROR), Data: err.Error()})
|
||||
// return
|
||||
// }
|
||||
// req.Validate()
|
||||
|
||||
//logger.Info("ListStorages", zap.Any("req", req))
|
||||
//storages, total, err := service.MyService.Storage().GetStorages(req.Page, req.PerPage)
|
||||
// logger.Info("ListStorages", zap.Any("req", req))
|
||||
// storages, total, err := service.MyService.Storage().GetStorages(req.Page, req.PerPage)
|
||||
// if err != nil {
|
||||
// c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
// return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
// return
|
||||
// }
|
||||
// c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: model.PageResp{
|
||||
// return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: model.PageResp{
|
||||
// Content: storages,
|
||||
// Total: total,
|
||||
// }})
|
||||
r, err := service.MyService.Storage().GetStorages()
|
||||
|
||||
if err != nil {
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
return
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
}
|
||||
|
||||
for i := 0; i < len(r.MountPoints); i++ {
|
||||
@@ -53,7 +51,6 @@ func ListStorages(c *gin.Context) {
|
||||
r.MountPoints[i].Icon = dropbox.ICONURL
|
||||
}
|
||||
if dataMap["type"] == "onedrive" {
|
||||
|
||||
r.MountPoints[i].Icon = onedrive.ICONURL
|
||||
}
|
||||
r.MountPoints[i].Name = dataMap["username"]
|
||||
@@ -69,38 +66,36 @@ func ListStorages(c *gin.Context) {
|
||||
})
|
||||
}
|
||||
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: list})
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: list})
|
||||
}
|
||||
|
||||
func UmountStorage(c *gin.Context) {
|
||||
func UmountStorage(ctx echo.Context) error {
|
||||
json := make(map[string]string)
|
||||
c.ShouldBind(&json)
|
||||
ctx.Bind(&json)
|
||||
mountPoint := json["mount_point"]
|
||||
if mountPoint == "" {
|
||||
c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.CLIENT_ERROR, Message: common_err.GetMsg(common_err.CLIENT_ERROR), Data: "mount_point is empty"})
|
||||
return
|
||||
return ctx.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.CLIENT_ERROR, Message: common_err.GetMsg(common_err.CLIENT_ERROR), Data: "mount_point is empty"})
|
||||
}
|
||||
err := service.MyService.Storage().UnmountStorage(mountPoint)
|
||||
if err != nil {
|
||||
c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
return
|
||||
return ctx.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
}
|
||||
service.MyService.Storage().DeleteConfigByName(strings.ReplaceAll(mountPoint, "/mnt/", ""))
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: "success"})
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: "success"})
|
||||
}
|
||||
|
||||
func GetStorage(c *gin.Context) {
|
||||
|
||||
// idStr := c.Query("id")
|
||||
func GetStorage(ctx echo.Context) error {
|
||||
// idStr := ctx.QueryParam("id")
|
||||
// id, err := strconv.Atoi(idStr)
|
||||
// if err != nil {
|
||||
// c.JSON(common_err.SUCCESS, model.Result{Success: common_err.CLIENT_ERROR, Message: common_err.GetMsg(common_err.CLIENT_ERROR), Data: err.Error()})
|
||||
// return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.CLIENT_ERROR, Message: common_err.GetMsg(common_err.CLIENT_ERROR), Data: err.Error()})
|
||||
// return
|
||||
// }
|
||||
// storage, err := service.MyService.Storage().GetStorageById(uint(id))
|
||||
// if err != nil {
|
||||
// c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
// return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
// return
|
||||
// }
|
||||
// c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: storage})
|
||||
// return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: storage})
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -6,10 +6,10 @@ import (
|
||||
"github.com/IceWhaleTech/CasaOS/drivers/google_drive"
|
||||
"github.com/IceWhaleTech/CasaOS/drivers/onedrive"
|
||||
"github.com/IceWhaleTech/CasaOS/model"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/labstack/echo/v4"
|
||||
)
|
||||
|
||||
func ListDriverInfo(c *gin.Context) {
|
||||
func ListDriverInfo(ctx echo.Context) error {
|
||||
list := []model.Drive{}
|
||||
|
||||
google := google_drive.GetConfig()
|
||||
@@ -30,5 +30,5 @@ func ListDriverInfo(c *gin.Context) {
|
||||
Icon: od.Icon,
|
||||
AuthUrl: od.AuthUrl,
|
||||
})
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: list})
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: list})
|
||||
}
|
||||
|
||||
384
route/v1/file.go
384
route/v1/file.go
@@ -20,15 +20,16 @@ import (
|
||||
"github.com/IceWhaleTech/CasaOS-Common/utils/logger"
|
||||
"github.com/IceWhaleTech/CasaOS/model"
|
||||
"github.com/gorilla/websocket"
|
||||
"github.com/labstack/echo/v4"
|
||||
"github.com/robfig/cron/v3"
|
||||
"github.com/tidwall/gjson"
|
||||
|
||||
"github.com/IceWhaleTech/CasaOS/pkg/utils"
|
||||
"github.com/IceWhaleTech/CasaOS/pkg/utils/common_err"
|
||||
"github.com/IceWhaleTech/CasaOS/pkg/utils/file"
|
||||
"github.com/IceWhaleTech/CasaOS/service"
|
||||
model2 "github.com/IceWhaleTech/CasaOS/service/model"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/google/uuid"
|
||||
"go.uber.org/zap"
|
||||
|
||||
@@ -38,8 +39,9 @@ import (
|
||||
type ListReq struct {
|
||||
model.PageReq
|
||||
Path string `json:"path" form:"path"`
|
||||
//Refresh bool `json:"refresh"`
|
||||
// Refresh bool `json:"refresh"`
|
||||
}
|
||||
|
||||
type ObjResp struct {
|
||||
Name string `json:"name"`
|
||||
Size int64 `json:"size"`
|
||||
@@ -82,58 +84,53 @@ var (
|
||||
// @Param path query string true "路径"
|
||||
// @Success 200 {string} string "ok"
|
||||
// @Router /file/read [get]
|
||||
func GetFilerContent(c *gin.Context) {
|
||||
filePath := c.Query("path")
|
||||
func GetFilerContent(ctx echo.Context) error {
|
||||
filePath := ctx.QueryParam("path")
|
||||
if len(filePath) == 0 {
|
||||
c.JSON(common_err.CLIENT_ERROR, model.Result{
|
||||
return ctx.JSON(common_err.CLIENT_ERROR, model.Result{
|
||||
Success: common_err.INVALID_PARAMS,
|
||||
Message: common_err.GetMsg(common_err.INVALID_PARAMS),
|
||||
})
|
||||
return
|
||||
}
|
||||
if !file.Exists(filePath) {
|
||||
c.JSON(common_err.SERVICE_ERROR, model.Result{
|
||||
return ctx.JSON(common_err.SERVICE_ERROR, model.Result{
|
||||
Success: common_err.FILE_DOES_NOT_EXIST,
|
||||
Message: common_err.GetMsg(common_err.FILE_DOES_NOT_EXIST),
|
||||
})
|
||||
return
|
||||
}
|
||||
// 文件读取任务是将文件内容读取到内存中。
|
||||
info, err := ioutil.ReadFile(filePath)
|
||||
if err != nil {
|
||||
c.JSON(common_err.SERVICE_ERROR, model.Result{
|
||||
return ctx.JSON(common_err.SERVICE_ERROR, model.Result{
|
||||
Success: common_err.FILE_READ_ERROR,
|
||||
Message: common_err.GetMsg(common_err.FILE_READ_ERROR),
|
||||
Data: err.Error(),
|
||||
})
|
||||
return
|
||||
}
|
||||
result := string(info)
|
||||
|
||||
c.JSON(common_err.SUCCESS, model.Result{
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{
|
||||
Success: common_err.SUCCESS,
|
||||
Message: common_err.GetMsg(common_err.SUCCESS),
|
||||
Data: result,
|
||||
})
|
||||
}
|
||||
|
||||
func GetLocalFile(c *gin.Context) {
|
||||
path := c.Query("path")
|
||||
func GetLocalFile(ctx echo.Context) error {
|
||||
path := ctx.QueryParam("path")
|
||||
if len(path) == 0 {
|
||||
c.JSON(http.StatusOK, model.Result{
|
||||
return ctx.JSON(http.StatusOK, model.Result{
|
||||
Success: common_err.INVALID_PARAMS,
|
||||
Message: common_err.GetMsg(common_err.INVALID_PARAMS),
|
||||
})
|
||||
return
|
||||
}
|
||||
if !file.Exists(path) {
|
||||
c.JSON(http.StatusOK, model.Result{
|
||||
return ctx.JSON(http.StatusOK, model.Result{
|
||||
Success: common_err.FILE_DOES_NOT_EXIST,
|
||||
Message: common_err.GetMsg(common_err.FILE_DOES_NOT_EXIST),
|
||||
})
|
||||
return
|
||||
}
|
||||
c.File(path)
|
||||
return ctx.File(path)
|
||||
}
|
||||
|
||||
// @Summary download
|
||||
@@ -145,42 +142,39 @@ func GetLocalFile(c *gin.Context) {
|
||||
// @Param files query string true "file list eg: filename1,filename2,filename3 "
|
||||
// @Success 200 {string} string "ok"
|
||||
// @Router /file/download [get]
|
||||
func GetDownloadFile(c *gin.Context) {
|
||||
t := c.Query("format")
|
||||
func GetDownloadFile(ctx echo.Context) error {
|
||||
t := ctx.QueryParam("format")
|
||||
|
||||
files := c.Query("files")
|
||||
files := ctx.QueryParam("files")
|
||||
|
||||
if len(files) == 0 {
|
||||
c.JSON(common_err.CLIENT_ERROR, model.Result{
|
||||
return ctx.JSON(common_err.CLIENT_ERROR, model.Result{
|
||||
Success: common_err.INVALID_PARAMS,
|
||||
Message: common_err.GetMsg(common_err.INVALID_PARAMS),
|
||||
})
|
||||
return
|
||||
}
|
||||
list := strings.Split(files, ",")
|
||||
for _, v := range list {
|
||||
if !file.Exists(v) {
|
||||
c.JSON(common_err.SERVICE_ERROR, model.Result{
|
||||
return ctx.JSON(common_err.SERVICE_ERROR, model.Result{
|
||||
Success: common_err.FILE_DOES_NOT_EXIST,
|
||||
Message: common_err.GetMsg(common_err.FILE_DOES_NOT_EXIST),
|
||||
})
|
||||
return
|
||||
}
|
||||
}
|
||||
c.Header("Content-Type", "application/octet-stream")
|
||||
c.Header("Content-Transfer-Encoding", "binary")
|
||||
c.Header("Cache-Control", "no-cache")
|
||||
ctx.Request().Header.Add("Content-Type", "application/octet-stream")
|
||||
ctx.Request().Header.Add("Content-Transfer-Encoding", "binary")
|
||||
ctx.Request().Header.Add("Cache-Control", "no-cache")
|
||||
// handles only single files not folders and multiple files
|
||||
if len(list) == 1 {
|
||||
|
||||
filePath := list[0]
|
||||
info, err := os.Stat(filePath)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusOK, model.Result{
|
||||
return ctx.JSON(http.StatusOK, model.Result{
|
||||
Success: common_err.FILE_DOES_NOT_EXIST,
|
||||
Message: common_err.GetMsg(common_err.FILE_DOES_NOT_EXIST),
|
||||
})
|
||||
return
|
||||
}
|
||||
if !info.IsDir() {
|
||||
|
||||
@@ -190,29 +184,26 @@ func GetDownloadFile(c *gin.Context) {
|
||||
|
||||
// 获取文件的名称
|
||||
fileName := path.Base(filePath)
|
||||
c.Header("Content-Disposition", "attachment; filename*=utf-8''"+url2.PathEscape(fileName))
|
||||
c.File(filePath)
|
||||
return
|
||||
ctx.Response().Header().Add("Content-Disposition", "attachment; filename*=utf-8''"+url2.PathEscape(fileName))
|
||||
ctx.File(filePath)
|
||||
}
|
||||
}
|
||||
|
||||
extension, ar, err := file.GetCompressionAlgorithm(t)
|
||||
if err != nil {
|
||||
c.JSON(common_err.CLIENT_ERROR, model.Result{
|
||||
return ctx.JSON(common_err.CLIENT_ERROR, model.Result{
|
||||
Success: common_err.INVALID_PARAMS,
|
||||
Message: common_err.GetMsg(common_err.INVALID_PARAMS),
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
err = ar.Create(c.Writer)
|
||||
err = ar.Create(ctx.Response().Writer)
|
||||
if err != nil {
|
||||
c.JSON(common_err.SERVICE_ERROR, model.Result{
|
||||
return ctx.JSON(common_err.SERVICE_ERROR, model.Result{
|
||||
Success: common_err.SERVICE_ERROR,
|
||||
Message: common_err.GetMsg(common_err.SERVICE_ERROR),
|
||||
Data: err.Error(),
|
||||
})
|
||||
return
|
||||
}
|
||||
defer ar.Close()
|
||||
commonDir := file.CommonPrefix(filepath.Separator, list...)
|
||||
@@ -221,27 +212,27 @@ func GetDownloadFile(c *gin.Context) {
|
||||
|
||||
name := "_" + currentPath
|
||||
name += extension
|
||||
c.Header("Content-Disposition", "attachment; filename*=utf-8''"+url.PathEscape(name))
|
||||
ctx.Request().Header.Add("Content-Disposition", "attachment; filename*=utf-8''"+url.PathEscape(name))
|
||||
for _, fname := range list {
|
||||
err = file.AddFile(ar, fname, commonDir)
|
||||
if err != nil {
|
||||
log.Printf("Failed to archive %s: %v", fname, err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetDownloadSingleFile(c *gin.Context) {
|
||||
filePath := c.Query("path")
|
||||
func GetDownloadSingleFile(ctx echo.Context) error {
|
||||
filePath := ctx.QueryParam("path")
|
||||
if len(filePath) == 0 {
|
||||
c.JSON(common_err.CLIENT_ERROR, model.Result{
|
||||
return ctx.JSON(common_err.CLIENT_ERROR, model.Result{
|
||||
Success: common_err.INVALID_PARAMS,
|
||||
Message: common_err.GetMsg(common_err.INVALID_PARAMS),
|
||||
})
|
||||
return
|
||||
}
|
||||
fileName := path.Base(filePath)
|
||||
// c.Header("Content-Disposition", "inline")
|
||||
c.Header("Content-Disposition", "attachment; filename*=utf-8''"+url2.PathEscape(fileName))
|
||||
ctx.Request().Header.Add("Content-Disposition", "attachment; filename*=utf-8''"+url2.PathEscape(fileName))
|
||||
|
||||
fi, err := os.Open(filePath)
|
||||
if err != nil {
|
||||
@@ -255,31 +246,29 @@ func GetDownloadSingleFile(c *gin.Context) {
|
||||
|
||||
kind, _ := filetype.Match(buffer)
|
||||
if kind != filetype.Unknown {
|
||||
c.Header("Content-Type", kind.MIME.Value)
|
||||
ctx.Request().Header.Add("Content-Type", kind.MIME.Value)
|
||||
}
|
||||
node, err := os.Stat(filePath)
|
||||
// Set the Last-Modified header to the timestamp
|
||||
c.Header("Last-Modified", node.ModTime().UTC().Format(http.TimeFormat))
|
||||
ctx.Request().Header.Add("Last-Modified", node.ModTime().UTC().Format(http.TimeFormat))
|
||||
|
||||
knownSize := node.Size() >= 0
|
||||
if knownSize {
|
||||
c.Header("Content-Length", strconv.FormatInt(node.Size(), 10))
|
||||
ctx.Request().Header.Add("Content-Length", strconv.FormatInt(node.Size(), 10))
|
||||
}
|
||||
http.ServeContent(c.Writer, c.Request, fileName, node.ModTime(), fi)
|
||||
//http.ServeFile(c.Writer, c.Request, filePath)
|
||||
http.ServeContent(ctx.Response().Writer, ctx.Request(), fileName, node.ModTime(), fi)
|
||||
// http.ServeFile(c.Writer, ctx.Request(), filePath)
|
||||
defer fi.Close()
|
||||
return
|
||||
fileTmp, err := os.Open(filePath)
|
||||
if err != nil {
|
||||
c.JSON(common_err.SERVICE_ERROR, model.Result{
|
||||
return ctx.JSON(common_err.SERVICE_ERROR, model.Result{
|
||||
Success: common_err.FILE_DOES_NOT_EXIST,
|
||||
Message: common_err.GetMsg(common_err.FILE_DOES_NOT_EXIST),
|
||||
})
|
||||
return
|
||||
}
|
||||
defer fileTmp.Close()
|
||||
|
||||
c.File(filePath)
|
||||
return ctx.File(filePath)
|
||||
}
|
||||
|
||||
// @Summary 获取目录列表
|
||||
@@ -290,17 +279,14 @@ func GetDownloadSingleFile(c *gin.Context) {
|
||||
// @Param path query string false "路径"
|
||||
// @Success 200 {string} string "ok"
|
||||
// @Router /file/dirpath [get]
|
||||
func DirPath(c *gin.Context) {
|
||||
func DirPath(ctx echo.Context) error {
|
||||
var req ListReq
|
||||
if err := c.ShouldBind(&req); err != nil {
|
||||
c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.CLIENT_ERROR, Message: common_err.GetMsg(common_err.CLIENT_ERROR), Data: err.Error()})
|
||||
return
|
||||
}
|
||||
path := ctx.QueryParam("path")
|
||||
req.Path = path
|
||||
req.Validate()
|
||||
info, err := service.MyService.System().GetDirPath(req.Path)
|
||||
if err != nil {
|
||||
c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
return
|
||||
return ctx.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
}
|
||||
shares := service.MyService.Shares().GetSharesList()
|
||||
sharesMap := make(map[string]string)
|
||||
@@ -308,7 +294,7 @@ func DirPath(c *gin.Context) {
|
||||
sharesMap[v.Path] = fmt.Sprint(v.ID)
|
||||
}
|
||||
// if len(info) <= (req.Page-1)*req.Size {
|
||||
// c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.CLIENT_ERROR, Message: common_err.GetMsg(common_err.INVALID_PARAMS), Data: "page out of range"})
|
||||
// return ctx.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.CLIENT_ERROR, Message: common_err.GetMsg(common_err.INVALID_PARAMS), Data: "page out of range"})
|
||||
// return
|
||||
// }
|
||||
forEnd := req.Index * req.Size
|
||||
@@ -380,7 +366,7 @@ func DirPath(c *gin.Context) {
|
||||
Index: req.Index,
|
||||
Size: req.Size,
|
||||
}
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: flist})
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: flist})
|
||||
}
|
||||
|
||||
// @Summary rename file or dir
|
||||
@@ -392,23 +378,21 @@ func DirPath(c *gin.Context) {
|
||||
// @Param newpath body string true "path of new"
|
||||
// @Success 200 {string} string "ok"
|
||||
// @Router /file/rename [put]
|
||||
func RenamePath(c *gin.Context) {
|
||||
func RenamePath(ctx echo.Context) error {
|
||||
json := make(map[string]string)
|
||||
c.ShouldBind(&json)
|
||||
ctx.Bind(&json)
|
||||
op := json["old_path"]
|
||||
np := json["new_path"]
|
||||
if len(op) == 0 || len(np) == 0 {
|
||||
c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
|
||||
return
|
||||
return ctx.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
|
||||
}
|
||||
mounted := service.IsMounted(op)
|
||||
if mounted {
|
||||
c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.MOUNTED_DIRECTIORIES, Message: common_err.GetMsg(common_err.MOUNTED_DIRECTIORIES), Data: common_err.GetMsg(common_err.MOUNTED_DIRECTIORIES)})
|
||||
return
|
||||
return ctx.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.MOUNTED_DIRECTIORIES, Message: common_err.GetMsg(common_err.MOUNTED_DIRECTIORIES), Data: common_err.GetMsg(common_err.MOUNTED_DIRECTIORIES)})
|
||||
}
|
||||
|
||||
success, err := service.MyService.System().RenameFile(op, np)
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: success, Message: common_err.GetMsg(success), Data: err})
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: success, Message: common_err.GetMsg(success), Data: err})
|
||||
}
|
||||
|
||||
// @Summary create folder
|
||||
@@ -419,22 +403,21 @@ func RenamePath(c *gin.Context) {
|
||||
// @Param path body string true "path of folder"
|
||||
// @Success 200 {string} string "ok"
|
||||
// @Router /file/mkdir [post]
|
||||
func MkdirAll(c *gin.Context) {
|
||||
func MkdirAll(ctx echo.Context) error {
|
||||
json := make(map[string]string)
|
||||
c.ShouldBind(&json)
|
||||
ctx.Bind(&json)
|
||||
path := json["path"]
|
||||
var code int
|
||||
if len(path) == 0 {
|
||||
c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
|
||||
return
|
||||
return ctx.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
|
||||
}
|
||||
// decodedPath, err := url.QueryUnescape(path)
|
||||
// if err != nil {
|
||||
// c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
|
||||
// return ctx.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
|
||||
// return
|
||||
// }
|
||||
code, _ = service.MyService.System().MkdirAll(path)
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: code, Message: common_err.GetMsg(code)})
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: code, Message: common_err.GetMsg(code)})
|
||||
}
|
||||
|
||||
// @Summary create file
|
||||
@@ -445,22 +428,21 @@ func MkdirAll(c *gin.Context) {
|
||||
// @Param path body string true "path of folder (path need to url encode)"
|
||||
// @Success 200 {string} string "ok"
|
||||
// @Router /file/create [post]
|
||||
func PostCreateFile(c *gin.Context) {
|
||||
func PostCreateFile(ctx echo.Context) error {
|
||||
json := make(map[string]string)
|
||||
c.ShouldBind(&json)
|
||||
ctx.Bind(&json)
|
||||
path := json["path"]
|
||||
var code int
|
||||
if len(path) == 0 {
|
||||
c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
|
||||
return
|
||||
return ctx.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
|
||||
}
|
||||
// decodedPath, err := url.QueryUnescape(path)
|
||||
// if err != nil {
|
||||
// c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
|
||||
// return ctx.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
|
||||
// return
|
||||
// }
|
||||
code, _ = service.MyService.System().CreateFile(path)
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: code, Message: common_err.GetMsg(code)})
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: code, Message: common_err.GetMsg(code)})
|
||||
}
|
||||
|
||||
// @Summary upload file
|
||||
@@ -472,17 +454,16 @@ func PostCreateFile(c *gin.Context) {
|
||||
// @Param file formData file true "file"
|
||||
// @Success 200 {string} string "ok"
|
||||
// @Router /file/upload [get]
|
||||
func GetFileUpload(c *gin.Context) {
|
||||
relative := c.Query("relativePath")
|
||||
fileName := c.Query("filename")
|
||||
chunkNumber := c.Query("chunkNumber")
|
||||
totalChunks, _ := strconv.Atoi(c.DefaultQuery("totalChunks", "0"))
|
||||
path := c.Query("path")
|
||||
func GetFileUpload(ctx echo.Context) error {
|
||||
relative := ctx.QueryParam("relativePath")
|
||||
fileName := ctx.QueryParam("filename")
|
||||
chunkNumber := ctx.QueryParam("chunkNumber")
|
||||
totalChunks, _ := strconv.Atoi(utils.DefaultQuery(ctx, "totalChunks", "0"))
|
||||
path := ctx.QueryParam("path")
|
||||
dirPath := ""
|
||||
hash := file.GetHashByContent([]byte(fileName))
|
||||
if file.Exists(path + "/" + relative) {
|
||||
c.JSON(http.StatusConflict, model.Result{Success: http.StatusConflict, Message: common_err.GetMsg(common_err.FILE_ALREADY_EXISTS)})
|
||||
return
|
||||
return ctx.JSON(http.StatusConflict, model.Result{Success: http.StatusConflict, Message: common_err.GetMsg(common_err.FILE_ALREADY_EXISTS)})
|
||||
}
|
||||
tempDir := filepath.Join(path, ".temp", hash+strconv.Itoa(totalChunks)) + "/"
|
||||
if fileName != relative {
|
||||
@@ -492,11 +473,10 @@ func GetFileUpload(c *gin.Context) {
|
||||
}
|
||||
tempDir += chunkNumber
|
||||
if !file.CheckNotExist(tempDir) {
|
||||
c.JSON(200, model.Result{Success: 200, Message: common_err.GetMsg(common_err.FILE_ALREADY_EXISTS)})
|
||||
return
|
||||
return ctx.JSON(200, model.Result{Success: 200, Message: common_err.GetMsg(common_err.FILE_ALREADY_EXISTS)})
|
||||
}
|
||||
|
||||
c.JSON(204, model.Result{Success: 204, Message: common_err.GetMsg(common_err.SUCCESS)})
|
||||
return ctx.JSON(204, model.Result{Success: 204, Message: common_err.GetMsg(common_err.SUCCESS)})
|
||||
}
|
||||
|
||||
// @Summary upload file
|
||||
@@ -508,21 +488,20 @@ func GetFileUpload(c *gin.Context) {
|
||||
// @Param file formData file true "file"
|
||||
// @Success 200 {string} string "ok"
|
||||
// @Router /file/upload [post]
|
||||
func PostFileUpload(c *gin.Context) {
|
||||
f, _, _ := c.Request.FormFile("file")
|
||||
relative := c.PostForm("relativePath")
|
||||
fileName := c.PostForm("filename")
|
||||
totalChunks, _ := strconv.Atoi(c.DefaultPostForm("totalChunks", "0"))
|
||||
chunkNumber := c.PostForm("chunkNumber")
|
||||
func PostFileUpload(ctx echo.Context) error {
|
||||
f, _, _ := ctx.Request().FormFile("file")
|
||||
relative := ctx.FormValue("relativePath")
|
||||
fileName := ctx.FormValue("filename")
|
||||
totalChunks, _ := strconv.Atoi(utils.DefaultPostForm(ctx, "totalChunks", "0"))
|
||||
chunkNumber := ctx.FormValue("chunkNumber")
|
||||
dirPath := ""
|
||||
path := c.PostForm("path")
|
||||
path := ctx.FormValue("path")
|
||||
|
||||
hash := file.GetHashByContent([]byte(fileName))
|
||||
|
||||
if len(path) == 0 {
|
||||
logger.Error("path should not be empty")
|
||||
c.JSON(http.StatusBadRequest, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
|
||||
return
|
||||
return ctx.JSON(http.StatusBadRequest, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
|
||||
}
|
||||
tempDir := filepath.Join(path, ".temp", hash+strconv.Itoa(totalChunks)) + "/"
|
||||
|
||||
@@ -531,8 +510,7 @@ func PostFileUpload(c *gin.Context) {
|
||||
tempDir += dirPath
|
||||
if err := file.MkDir(path + "/" + dirPath); err != nil {
|
||||
logger.Error("error when trying to create `"+path+"/"+dirPath+"`", zap.Error(err))
|
||||
c.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: err.Error()})
|
||||
return
|
||||
return ctx.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: err.Error()})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -541,48 +519,41 @@ func PostFileUpload(c *gin.Context) {
|
||||
if !file.CheckNotExist(tempDir + chunkNumber) {
|
||||
if err := file.RMDir(tempDir + chunkNumber); err != nil {
|
||||
logger.Error("error when trying to remove existing `"+tempDir+chunkNumber+"`", zap.Error(err))
|
||||
c.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: err.Error()})
|
||||
return
|
||||
return ctx.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: err.Error()})
|
||||
}
|
||||
}
|
||||
|
||||
if totalChunks > 1 {
|
||||
if err := file.IsNotExistMkDir(tempDir); err != nil {
|
||||
logger.Error("error when trying to create `"+tempDir+"`", zap.Error(err))
|
||||
c.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: err.Error()})
|
||||
return
|
||||
return ctx.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: err.Error()})
|
||||
}
|
||||
|
||||
out, err := os.OpenFile(tempDir+chunkNumber, os.O_WRONLY|os.O_CREATE, 0o644)
|
||||
if err != nil {
|
||||
logger.Error("error when trying to open `"+tempDir+chunkNumber+"` for creation", zap.Error(err))
|
||||
c.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: err.Error()})
|
||||
return
|
||||
return ctx.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: err.Error()})
|
||||
}
|
||||
|
||||
defer out.Close()
|
||||
|
||||
if _, err := io.Copy(out, f); err != nil { // recommend to use https://github.com/iceber/iouring-go for faster copy
|
||||
logger.Error("error when trying to write to `"+tempDir+chunkNumber+"`", zap.Error(err))
|
||||
c.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: err.Error()})
|
||||
return
|
||||
return ctx.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: err.Error()})
|
||||
}
|
||||
|
||||
fileNum, err := ioutil.ReadDir(tempDir)
|
||||
if err != nil {
|
||||
logger.Error("error when trying to read number of files under `"+tempDir+"`", zap.Error(err))
|
||||
c.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: err.Error()})
|
||||
return
|
||||
return ctx.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: err.Error()})
|
||||
}
|
||||
|
||||
if totalChunks == len(fileNum) {
|
||||
if err := file.SpliceFiles(tempDir, path, totalChunks, 1); err != nil {
|
||||
logger.Error("error when trying to splice files under `"+tempDir+"`", zap.Error(err))
|
||||
c.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: err.Error()})
|
||||
return
|
||||
return ctx.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: err.Error()})
|
||||
}
|
||||
go func() {
|
||||
|
||||
time.Sleep(11 * time.Second)
|
||||
if err := file.RMDir(tempDir); err != nil {
|
||||
logger.Error("error when trying to remove `"+tempDir+"`", zap.Error(err))
|
||||
@@ -593,57 +564,49 @@ func PostFileUpload(c *gin.Context) {
|
||||
out, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE, 0o644)
|
||||
if err != nil {
|
||||
logger.Error("error when trying to open `"+path+"` for creation", zap.Error(err))
|
||||
c.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: err.Error()})
|
||||
return
|
||||
return ctx.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: err.Error()})
|
||||
}
|
||||
|
||||
defer out.Close()
|
||||
|
||||
if _, err := io.Copy(out, f); err != nil { // recommend to use https://github.com/iceber/iouring-go for faster copy
|
||||
logger.Error("error when trying to write to `"+path+"`", zap.Error(err))
|
||||
c.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
return
|
||||
return ctx.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
}
|
||||
}
|
||||
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
|
||||
return ctx.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
|
||||
}
|
||||
|
||||
func PostFileOctet(c *gin.Context) {
|
||||
|
||||
content_length := c.Request.ContentLength
|
||||
func PostFileOctet(ctx echo.Context) error {
|
||||
content_length := ctx.Request().ContentLength
|
||||
if content_length <= 0 || content_length > 1024*1024*1024*2*1024 {
|
||||
log.Printf("content_length error\n")
|
||||
c.JSON(http.StatusBadRequest, model.Result{Success: common_err.CLIENT_ERROR, Message: common_err.GetMsg(common_err.CLIENT_ERROR), Data: "content_length error"})
|
||||
return
|
||||
return ctx.JSON(http.StatusBadRequest, model.Result{Success: common_err.CLIENT_ERROR, Message: common_err.GetMsg(common_err.CLIENT_ERROR), Data: "content_length error"})
|
||||
}
|
||||
content_type_, has_key := c.Request.Header["Content-Type"]
|
||||
content_type_, has_key := ctx.Request().Header["Content-Type"]
|
||||
if !has_key {
|
||||
log.Printf("Content-Type error\n")
|
||||
c.JSON(http.StatusBadRequest, model.Result{Success: common_err.CLIENT_ERROR, Message: common_err.GetMsg(common_err.CLIENT_ERROR), Data: "Content-Type error"})
|
||||
return
|
||||
return ctx.JSON(http.StatusBadRequest, model.Result{Success: common_err.CLIENT_ERROR, Message: common_err.GetMsg(common_err.CLIENT_ERROR), Data: "Content-Type error"})
|
||||
}
|
||||
if len(content_type_) != 1 {
|
||||
log.Printf("Content-Type count error\n")
|
||||
c.JSON(http.StatusBadRequest, model.Result{Success: common_err.CLIENT_ERROR, Message: common_err.GetMsg(common_err.CLIENT_ERROR), Data: "Content-Type count error"})
|
||||
return
|
||||
return ctx.JSON(http.StatusBadRequest, model.Result{Success: common_err.CLIENT_ERROR, Message: common_err.GetMsg(common_err.CLIENT_ERROR), Data: "Content-Type count error"})
|
||||
}
|
||||
content_type := content_type_[0]
|
||||
const BOUNDARY string = "; boundary="
|
||||
loc := strings.Index(content_type, BOUNDARY)
|
||||
if loc == -1 {
|
||||
log.Printf("Content-Type error, no boundary\n")
|
||||
c.JSON(http.StatusBadRequest, model.Result{Success: common_err.CLIENT_ERROR, Message: common_err.GetMsg(common_err.CLIENT_ERROR), Data: "Content-Type error, no boundary"})
|
||||
return
|
||||
return ctx.JSON(http.StatusBadRequest, model.Result{Success: common_err.CLIENT_ERROR, Message: common_err.GetMsg(common_err.CLIENT_ERROR), Data: "Content-Type error, no boundary"})
|
||||
}
|
||||
boundary := []byte(content_type[(loc + len(BOUNDARY)):])
|
||||
log.Printf("[%s]\n\n", boundary)
|
||||
read_data := make([]byte, 1024*24)
|
||||
var read_total int = 0
|
||||
for {
|
||||
file_header, file_data, err := file.ParseFromHead(read_data, read_total, append(boundary, []byte("\r\n")...), c.Request.Body)
|
||||
file_header, file_data, err := file.ParseFromHead(read_data, read_total, append(boundary, []byte("\r\n")...), ctx.Request().Body)
|
||||
if err != nil {
|
||||
log.Printf("%v", err)
|
||||
return
|
||||
}
|
||||
log.Printf("file :%s\n", file_header)
|
||||
//
|
||||
@@ -651,16 +614,14 @@ func PostFileOctet(c *gin.Context) {
|
||||
f, err := os.OpenFile(file_header["path"]+"/"+file_header["filename"], os.O_WRONLY|os.O_CREATE, 0o644)
|
||||
if err != nil {
|
||||
log.Printf("create file fail:%v\n", err)
|
||||
return
|
||||
}
|
||||
f.Write(file_data)
|
||||
file_data = nil
|
||||
|
||||
temp_data, reach_end, err := file.ReadToBoundary(boundary, c.Request.Body, f)
|
||||
temp_data, reach_end, err := file.ReadToBoundary(boundary, ctx.Request().Body, f)
|
||||
f.Close()
|
||||
if err != nil {
|
||||
log.Printf("%v\n", err)
|
||||
return
|
||||
}
|
||||
if reach_end {
|
||||
break
|
||||
@@ -670,7 +631,7 @@ func PostFileOctet(c *gin.Context) {
|
||||
continue
|
||||
}
|
||||
}
|
||||
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
|
||||
return ctx.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
|
||||
}
|
||||
|
||||
// @Summary copy or move file
|
||||
@@ -681,17 +642,15 @@ func PostFileOctet(c *gin.Context) {
|
||||
// @Param body body model.FileOperate true "type:move,copy"
|
||||
// @Success 200 {string} string "ok"
|
||||
// @Router /file/operate [post]
|
||||
func PostOperateFileOrDir(c *gin.Context) {
|
||||
func PostOperateFileOrDir(ctx echo.Context) error {
|
||||
list := model.FileOperate{}
|
||||
c.ShouldBind(&list)
|
||||
ctx.Bind(&list)
|
||||
|
||||
if len(list.Item) == 0 {
|
||||
c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
|
||||
return
|
||||
return ctx.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
|
||||
}
|
||||
if list.To == list.Item[0].From[:strings.LastIndex(list.Item[0].From, "/")] {
|
||||
c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SOURCE_DES_SAME, Message: common_err.GetMsg(common_err.SOURCE_DES_SAME)})
|
||||
return
|
||||
return ctx.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SOURCE_DES_SAME, Message: common_err.GetMsg(common_err.SOURCE_DES_SAME)})
|
||||
}
|
||||
|
||||
var total int64 = 0
|
||||
@@ -706,8 +665,7 @@ func PostOperateFileOrDir(c *gin.Context) {
|
||||
if list.Type == "move" {
|
||||
mounted := service.IsMounted(list.Item[i].From)
|
||||
if mounted {
|
||||
c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.MOUNTED_DIRECTIORIES, Message: common_err.GetMsg(common_err.MOUNTED_DIRECTIORIES), Data: common_err.GetMsg(common_err.MOUNTED_DIRECTIORIES)})
|
||||
return
|
||||
return ctx.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.MOUNTED_DIRECTIORIES, Message: common_err.GetMsg(common_err.MOUNTED_DIRECTIORIES), Data: common_err.GetMsg(common_err.MOUNTED_DIRECTIORIES)})
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -726,7 +684,7 @@ func PostOperateFileOrDir(c *gin.Context) {
|
||||
|
||||
}
|
||||
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
|
||||
}
|
||||
|
||||
// @Summary delete file
|
||||
@@ -737,33 +695,30 @@ func PostOperateFileOrDir(c *gin.Context) {
|
||||
// @Param body body string true "paths eg ["/a/b/c","/d/e/f"]"
|
||||
// @Success 200 {string} string "ok"
|
||||
// @Router /file/delete [delete]
|
||||
func DeleteFile(c *gin.Context) {
|
||||
func DeleteFile(ctx echo.Context) error {
|
||||
paths := []string{}
|
||||
c.ShouldBind(&paths)
|
||||
ctx.Bind(&paths)
|
||||
if len(paths) == 0 {
|
||||
c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
|
||||
return
|
||||
return ctx.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
|
||||
}
|
||||
// path := c.Query("path")
|
||||
// path := ctx.QueryParam("path")
|
||||
|
||||
// paths := strings.Split(path, ",")
|
||||
for _, v := range paths {
|
||||
mounted := service.IsMounted(v)
|
||||
if mounted {
|
||||
c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.MOUNTED_DIRECTIORIES, Message: common_err.GetMsg(common_err.MOUNTED_DIRECTIORIES), Data: common_err.GetMsg(common_err.MOUNTED_DIRECTIORIES)})
|
||||
return
|
||||
return ctx.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.MOUNTED_DIRECTIORIES, Message: common_err.GetMsg(common_err.MOUNTED_DIRECTIORIES), Data: common_err.GetMsg(common_err.MOUNTED_DIRECTIORIES)})
|
||||
}
|
||||
}
|
||||
|
||||
for _, v := range paths {
|
||||
err := os.RemoveAll(v)
|
||||
if err != nil {
|
||||
c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.FILE_DELETE_ERROR, Message: common_err.GetMsg(common_err.FILE_DELETE_ERROR), Data: err})
|
||||
return
|
||||
return ctx.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.FILE_DELETE_ERROR, Message: common_err.GetMsg(common_err.FILE_DELETE_ERROR), Data: err})
|
||||
}
|
||||
}
|
||||
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
|
||||
}
|
||||
|
||||
// @Summary update file
|
||||
@@ -775,34 +730,30 @@ func DeleteFile(c *gin.Context) {
|
||||
// @Param content body string true "content"
|
||||
// @Success 200 {string} string "ok"
|
||||
// @Router /file/update [put]
|
||||
func PutFileContent(c *gin.Context) {
|
||||
func PutFileContent(ctx echo.Context) error {
|
||||
fi := model.FileUpdate{}
|
||||
c.ShouldBind(&fi)
|
||||
ctx.Bind(&fi)
|
||||
|
||||
// path := c.PostForm("path")
|
||||
// content := c.PostForm("content")
|
||||
// path := ctx.FormValue("path")
|
||||
// content := ctx.FormValue("content")
|
||||
if !file.Exists(fi.FilePath) {
|
||||
c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.FILE_ALREADY_EXISTS, Message: common_err.GetMsg(common_err.FILE_ALREADY_EXISTS)})
|
||||
return
|
||||
return ctx.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.FILE_ALREADY_EXISTS, Message: common_err.GetMsg(common_err.FILE_ALREADY_EXISTS)})
|
||||
}
|
||||
// err := os.Remove(path)
|
||||
f, err := os.Stat(fi.FilePath)
|
||||
if err != nil {
|
||||
c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.FILE_ALREADY_EXISTS, Message: common_err.GetMsg(common_err.FILE_ALREADY_EXISTS)})
|
||||
return
|
||||
return ctx.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.FILE_ALREADY_EXISTS, Message: common_err.GetMsg(common_err.FILE_ALREADY_EXISTS)})
|
||||
}
|
||||
fm := f.Mode()
|
||||
if err != nil {
|
||||
c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.FILE_DELETE_ERROR, Message: common_err.GetMsg(common_err.FILE_DELETE_ERROR), Data: err})
|
||||
return
|
||||
return ctx.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.FILE_DELETE_ERROR, Message: common_err.GetMsg(common_err.FILE_DELETE_ERROR), Data: err})
|
||||
}
|
||||
os.OpenFile(fi.FilePath, os.O_CREATE, fm)
|
||||
err = file.WriteToFullPath([]byte(fi.FileContent), fi.FilePath, fm)
|
||||
if err != nil {
|
||||
c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
return
|
||||
return ctx.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
}
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
|
||||
}
|
||||
|
||||
// @Summary image thumbnail/original image
|
||||
@@ -814,38 +765,34 @@ func PutFileContent(c *gin.Context) {
|
||||
// @Param type query string false "original,thumbnail" Enums(original,thumbnail)
|
||||
// @Success 200 {string} string "ok"
|
||||
// @Router /file/image [get]
|
||||
func GetFileImage(c *gin.Context) {
|
||||
t := c.Query("type")
|
||||
path := c.Query("path")
|
||||
func GetFileImage(ctx echo.Context) error {
|
||||
t := ctx.QueryParam("type")
|
||||
path := ctx.QueryParam("path")
|
||||
if !file.Exists(path) {
|
||||
c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.FILE_ALREADY_EXISTS, Message: common_err.GetMsg(common_err.FILE_ALREADY_EXISTS)})
|
||||
return
|
||||
return ctx.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.FILE_ALREADY_EXISTS, Message: common_err.GetMsg(common_err.FILE_ALREADY_EXISTS)})
|
||||
}
|
||||
if t == "thumbnail" {
|
||||
f, err := file.GetImage(path, 100, 0)
|
||||
if err != nil {
|
||||
c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
return
|
||||
return ctx.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
}
|
||||
c.Writer.WriteString(string(f))
|
||||
return
|
||||
ctx.Response().Writer.Write(f)
|
||||
}
|
||||
f, err := os.Open(path)
|
||||
if err != nil {
|
||||
c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
return
|
||||
return ctx.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
}
|
||||
defer f.Close()
|
||||
data, err := ioutil.ReadAll(f)
|
||||
if err != nil {
|
||||
c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
return
|
||||
return ctx.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
}
|
||||
c.Writer.WriteString(string(data))
|
||||
ctx.Response().Writer.Write(data)
|
||||
return nil
|
||||
}
|
||||
|
||||
func DeleteOperateFileOrDir(c *gin.Context) {
|
||||
id := c.Param("id")
|
||||
func DeleteOperateFileOrDir(ctx echo.Context) error {
|
||||
id := ctx.Param("id")
|
||||
if id == "0" {
|
||||
service.FileQueue = sync.Map{}
|
||||
service.OpStrArr = []string{}
|
||||
@@ -863,30 +810,29 @@ func DeleteOperateFileOrDir(c *gin.Context) {
|
||||
}
|
||||
|
||||
go service.MyService.Notify().SendFileOperateNotify(true)
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
|
||||
}
|
||||
func GetSize(c *gin.Context) {
|
||||
|
||||
func GetSize(ctx echo.Context) error {
|
||||
json := make(map[string]string)
|
||||
c.ShouldBind(&json)
|
||||
ctx.Bind(&json)
|
||||
path := json["path"]
|
||||
size, err := file.GetFileOrDirSize(path)
|
||||
if err != nil {
|
||||
c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
return
|
||||
return ctx.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
}
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: size})
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: size})
|
||||
}
|
||||
|
||||
func GetFileCount(c *gin.Context) {
|
||||
func GetFileCount(ctx echo.Context) error {
|
||||
json := make(map[string]string)
|
||||
c.ShouldBind(&json)
|
||||
ctx.Bind(&json)
|
||||
path := json["path"]
|
||||
list, err := ioutil.ReadDir(path)
|
||||
if err != nil {
|
||||
c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
return
|
||||
return ctx.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
}
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: len(list)})
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: len(list)})
|
||||
}
|
||||
|
||||
type CenterHandler struct {
|
||||
@@ -919,17 +865,16 @@ type PeerModel struct {
|
||||
RtcSupported bool `json:"rtcSupported"`
|
||||
}
|
||||
|
||||
func ConnectWebSocket(c *gin.Context) {
|
||||
peerId := c.Query("peer")
|
||||
writer := c.Writer
|
||||
request := c.Request
|
||||
func ConnectWebSocket(ctx echo.Context) error {
|
||||
peerId := ctx.QueryParam("peer")
|
||||
writer := ctx.Response().Writer
|
||||
request := ctx.Request()
|
||||
key := uuid.NewString()
|
||||
//peerModel := service.MyService.Peer().GetPeerByUserAgent(c.Request.UserAgent())
|
||||
// peerModel := service.MyService.Peer().GetPeerByUserAgent(ctx.Request().UserAgent())
|
||||
peerModel := model2.PeerDriveDBModel{}
|
||||
name := service.GetName(request)
|
||||
if conn, err = upgraderFile.Upgrade(writer, request, writer.Header()); err != nil {
|
||||
log.Println(err)
|
||||
return
|
||||
}
|
||||
client := &Client{handler: &handler, conn: conn, send: make(chan []byte, 256), ID: service.GetPeerId(request, key), IP: service.GetIP(request), Name: name, RtcSupported: true, TimerId: 0, LastBeat: time.Now()}
|
||||
if peerId != "" || len(peerModel.ID) > 0 {
|
||||
@@ -942,7 +887,7 @@ func ConnectWebSocket(c *gin.Context) {
|
||||
client.Name = service.GetNameByDB(peerModel)
|
||||
}
|
||||
}
|
||||
var list = service.MyService.Peer().GetPeers()
|
||||
list := service.MyService.Peer().GetPeers()
|
||||
if len(peerModel.ID) == 0 {
|
||||
peerModel.ID = key
|
||||
peerModel.DisplayName = name.DisplayName
|
||||
@@ -950,7 +895,7 @@ func ConnectWebSocket(c *gin.Context) {
|
||||
peerModel.Model = name.Model
|
||||
peerModel.OS = name.OS
|
||||
peerModel.Browser = name.Browser
|
||||
peerModel.UserAgent = c.Request.UserAgent()
|
||||
peerModel.UserAgent = ctx.Request().UserAgent()
|
||||
peerModel.IP = client.IP
|
||||
service.MyService.Peer().CreatePeer(&peerModel)
|
||||
list = append(list, peerModel)
|
||||
@@ -994,7 +939,7 @@ func ConnectWebSocket(c *gin.Context) {
|
||||
for _, v := range handler.clients {
|
||||
v.send <- pby
|
||||
}
|
||||
//client.handler.broadcast <- pby
|
||||
// client.handler.broadcast <- pby
|
||||
clients := []PeerModel{}
|
||||
for _, v := range client.handler.clients {
|
||||
if _, ok := handler.clients[v.ID]; ok {
|
||||
@@ -1027,31 +972,34 @@ func ConnectWebSocket(c *gin.Context) {
|
||||
// 每个 client 都挂起 2 个新的协程,监控读、写状态
|
||||
go client.writePump()
|
||||
go client.readPump()
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
|
||||
}
|
||||
|
||||
var handler = CenterHandler{broadcast: make(chan []byte),
|
||||
var handler = CenterHandler{
|
||||
broadcast: make(chan []byte),
|
||||
register: make(chan *Client),
|
||||
unregister: make(chan *Client),
|
||||
clients: make(map[string]*Client)}
|
||||
clients: make(map[string]*Client),
|
||||
}
|
||||
|
||||
func init() {
|
||||
// 起个协程跑起来,监听注册、注销、消息 3 个 channel
|
||||
go handler.monitoring()
|
||||
|
||||
crontab := cron.New(cron.WithSeconds()) //精确到秒
|
||||
//定义定时器调用的任务函数
|
||||
crontab := cron.New(cron.WithSeconds()) // 精确到秒
|
||||
// 定义定时器调用的任务函数
|
||||
|
||||
task := func() {
|
||||
handler.broadcast <- []byte(`{"type":"ping"}`)
|
||||
}
|
||||
//定时任务
|
||||
spec := "*/30 * * * * ?" //cron表达式,每五秒一次
|
||||
// 定时任务
|
||||
spec := "*/30 * * * * ?" // cron表达式,每五秒一次
|
||||
// 添加定时任务,
|
||||
crontab.AddFunc(spec, task)
|
||||
// 启动定时器
|
||||
crontab.Start()
|
||||
}
|
||||
|
||||
func (c *Client) writePump() {
|
||||
defer func() {
|
||||
c.handler.unregister <- c
|
||||
@@ -1106,7 +1054,7 @@ func (c *Client) readPump() {
|
||||
// otherBy, err := json.Marshal(other)
|
||||
// fmt.Println(err)
|
||||
c.handler.broadcast <- []byte(`{"type":"peer-left","peerId":"` + c.ID + `"}`)
|
||||
//c.handler.broadcast <- otherBy
|
||||
// c.handler.broadcast <- otherBy
|
||||
break
|
||||
} else if t.String() == "pong" {
|
||||
c.LastBeat = time.Now()
|
||||
@@ -1131,6 +1079,7 @@ func (c *Client) readPump() {
|
||||
c.handler.broadcast <- message
|
||||
}
|
||||
}
|
||||
|
||||
func (ch *CenterHandler) monitoring() {
|
||||
for {
|
||||
select {
|
||||
@@ -1150,12 +1099,13 @@ func (ch *CenterHandler) monitoring() {
|
||||
}
|
||||
}
|
||||
}
|
||||
func GetPeers(c *gin.Context) {
|
||||
|
||||
func GetPeers(ctx echo.Context) error {
|
||||
peers := service.MyService.Peer().GetPeers()
|
||||
for i := 0; i < len(peers); i++ {
|
||||
if _, ok := handler.clients[peers[i].ID]; ok {
|
||||
peers[i].Online = true
|
||||
}
|
||||
}
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: peers})
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: peers})
|
||||
}
|
||||
|
||||
@@ -6,28 +6,26 @@ import (
|
||||
"github.com/IceWhaleTech/CasaOS/model"
|
||||
"github.com/IceWhaleTech/CasaOS/pkg/utils/common_err"
|
||||
"github.com/IceWhaleTech/CasaOS/service"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/labstack/echo/v4"
|
||||
)
|
||||
|
||||
func PostNotifyMessage(c *gin.Context) {
|
||||
name := c.Param("name")
|
||||
func PostNotifyMessage(ctx echo.Context) error {
|
||||
name := ctx.Param("name")
|
||||
message := make(map[string]interface{})
|
||||
if err := c.ShouldBind(&message); err != nil {
|
||||
c.JSON(http.StatusBadRequest, model.Result{Success: common_err.INVALID_PARAMS, Message: err.Error()})
|
||||
return
|
||||
if err := ctx.Bind(&message); err != nil {
|
||||
return ctx.JSON(http.StatusBadRequest, model.Result{Success: common_err.INVALID_PARAMS, Message: err.Error()})
|
||||
}
|
||||
|
||||
service.MyService.Notify().SendNotify(name, message)
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
|
||||
}
|
||||
|
||||
func PostSystemStatusNotify(c *gin.Context) {
|
||||
func PostSystemStatusNotify(ctx echo.Context) error {
|
||||
message := make(map[string]interface{})
|
||||
if err := c.ShouldBind(&message); err != nil {
|
||||
c.JSON(http.StatusBadRequest, model.Result{Success: common_err.INVALID_PARAMS, Message: err.Error()})
|
||||
return
|
||||
if err := ctx.Bind(&message); err != nil {
|
||||
return ctx.JSON(http.StatusBadRequest, model.Result{Success: common_err.INVALID_PARAMS, Message: err.Error()})
|
||||
}
|
||||
|
||||
service.MyService.Notify().SettingSystemTempData(message)
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
|
||||
}
|
||||
|
||||
@@ -6,8 +6,8 @@ import (
|
||||
|
||||
"github.com/IceWhaleTech/CasaOS/service"
|
||||
"github.com/IceWhaleTech/CasaOS/types"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/gorilla/websocket"
|
||||
"github.com/labstack/echo/v4"
|
||||
)
|
||||
|
||||
var upGrader = websocket.Upgrader{
|
||||
@@ -24,11 +24,11 @@ var upGrader = websocket.Upgrader{
|
||||
// @Param token path string true "token"
|
||||
// @Success 200 {string} string "ok"
|
||||
// @Router /notify/ws [get]
|
||||
func NotifyWS(c *gin.Context) {
|
||||
//升级get请求为webSocket协议
|
||||
ws, err := upGrader.Upgrade(c.Writer, c.Request, nil)
|
||||
func NotifyWS(ctx echo.Context) error {
|
||||
// 升级get请求为webSocket协议
|
||||
ws, err := upGrader.Upgrade(ctx.Response().Writer, ctx.Request(), nil)
|
||||
if err != nil {
|
||||
return
|
||||
return nil
|
||||
}
|
||||
defer ws.Close()
|
||||
service.WebSocketConns = append(service.WebSocketConns, ws)
|
||||
@@ -41,7 +41,6 @@ func NotifyWS(c *gin.Context) {
|
||||
mt, message, err := ws.ReadMessage()
|
||||
fmt.Println(mt, message, err)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// @Summary 标记notify已读
|
||||
@@ -51,12 +50,13 @@ func NotifyWS(c *gin.Context) {
|
||||
// @Security ApiKeyAuth
|
||||
// @Success 200 {string} string "ok"
|
||||
// @Router /notify/read/{id} [put]
|
||||
func PutNotifyRead(c *gin.Context) {
|
||||
id := c.Param("id")
|
||||
func PutNotifyRead(ctx echo.Context) error {
|
||||
id := ctx.Param("id")
|
||||
// if len(id) == 0 {
|
||||
// c.JSON(http.StatusOK, model.Result{Success: oasis_err.INVALID_PARAMS, Message: oasis_err.GetMsg(oasis_err.INVALID_PARAMS)})
|
||||
// return ctx.JSON(http.StatusOK, model.Result{Success: oasis_err.INVALID_PARAMS, Message: oasis_err.GetMsg(oasis_err.INVALID_PARAMS)})
|
||||
// return
|
||||
// }
|
||||
fmt.Println(id)
|
||||
service.MyService.Notify().MarkRead(id, types.NOTIFY_READ)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -6,25 +6,23 @@ import (
|
||||
"github.com/IceWhaleTech/CasaOS/model"
|
||||
"github.com/IceWhaleTech/CasaOS/pkg/utils/common_err"
|
||||
"github.com/IceWhaleTech/CasaOS/service"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/labstack/echo/v4"
|
||||
)
|
||||
|
||||
func GetSearchResult(c *gin.Context) {
|
||||
func GetSearchResult(ctx echo.Context) error {
|
||||
json := make(map[string]string)
|
||||
c.ShouldBind(&json)
|
||||
ctx.Bind(&json)
|
||||
url := json["url"]
|
||||
|
||||
if url == "" {
|
||||
c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS), Data: "key is empty"})
|
||||
return
|
||||
return ctx.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS), Data: "key is empty"})
|
||||
}
|
||||
//data, err := service.MyService.Other().Search(key)
|
||||
// data, err := service.MyService.Other().Search(key)
|
||||
data, err := service.MyService.Other().AgentSearch(url)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
return
|
||||
return ctx.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
}
|
||||
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data})
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data})
|
||||
}
|
||||
|
||||
@@ -10,57 +10,54 @@ import (
|
||||
"github.com/IceWhaleTech/CasaOS/drivers/google_drive"
|
||||
"github.com/IceWhaleTech/CasaOS/drivers/onedrive"
|
||||
"github.com/IceWhaleTech/CasaOS/service"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/labstack/echo/v4"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
func GetRecoverStorage(c *gin.Context) {
|
||||
c.Header("Content-Type", "text/html; charset=utf-8")
|
||||
t := c.Param("type")
|
||||
func GetRecoverStorage(ctx echo.Context) error {
|
||||
ctx.Request().Header.Add("Content-Type", "text/html; charset=utf-8")
|
||||
t := ctx.Param("type")
|
||||
currentTime := time.Now().UTC()
|
||||
currentDate := time.Now().UTC().Format("2006-01-02")
|
||||
notify := make(map[string]interface{})
|
||||
if t == "GoogleDrive" {
|
||||
google_drive := google_drive.GetConfig()
|
||||
google_drive.Code = c.Query("code")
|
||||
google_drive.Code = ctx.QueryParam("code")
|
||||
if len(google_drive.Code) == 0 {
|
||||
c.String(200, `<p>Code cannot be empty</p><script>window.close()</script>`)
|
||||
ctx.String(200, `<p>Code cannot be empty</p><script>window.close()</script>`)
|
||||
notify["status"] = "fail"
|
||||
notify["message"] = "Code cannot be empty"
|
||||
logger.Error("Then code is empty: ", zap.String("code", google_drive.Code), zap.Any("name", "google_drive"))
|
||||
service.MyService.Notify().SendNotify("casaos:file:recover", notify)
|
||||
return
|
||||
}
|
||||
|
||||
err := google_drive.Init(c)
|
||||
err := google_drive.Init(ctx.Request().Context())
|
||||
if err != nil {
|
||||
c.String(200, `<p>Initialization failure:`+err.Error()+`</p><script>window.close()</script>`)
|
||||
ctx.String(200, `<p>Initialization failure:`+err.Error()+`</p><script>window.close()</script>`)
|
||||
notify["status"] = "fail"
|
||||
notify["message"] = "Initialization failure"
|
||||
logger.Error("Then init error: ", zap.Error(err), zap.Any("name", "google_drive"))
|
||||
service.MyService.Notify().SendNotify("casaos:file:recover", notify)
|
||||
return
|
||||
|
||||
}
|
||||
|
||||
username, err := google_drive.GetUserInfo(c)
|
||||
username, err := google_drive.GetUserInfo(ctx.Request().Context())
|
||||
if err != nil {
|
||||
c.String(200, `<p>Failed to get user information:`+err.Error()+`</p><script>window.close()</script>`)
|
||||
ctx.String(200, `<p>Failed to get user information:`+err.Error()+`</p><script>window.close()</script>`)
|
||||
notify["status"] = "fail"
|
||||
notify["message"] = "Failed to get user information"
|
||||
logger.Error("Then get user info error: ", zap.Error(err), zap.Any("name", "google_drive"))
|
||||
service.MyService.Notify().SendNotify("casaos:file:recover", notify)
|
||||
return
|
||||
}
|
||||
dmap := make(map[string]string)
|
||||
dmap["username"] = username
|
||||
configs, err := service.MyService.Storage().GetConfig()
|
||||
if err != nil {
|
||||
c.String(200, `<p>Failed to get rclone config:`+err.Error()+`</p><script>window.close()</script>`)
|
||||
ctx.String(200, `<p>Failed to get rclone config:`+err.Error()+`</p><script>window.close()</script>`)
|
||||
notify["status"] = "fail"
|
||||
notify["message"] = "Failed to get rclone config"
|
||||
logger.Error("Then get config error: ", zap.Error(err), zap.Any("name", "google_drive"))
|
||||
service.MyService.Notify().SendNotify("casaos:file:recover", notify)
|
||||
return
|
||||
}
|
||||
for _, v := range configs.Remotes {
|
||||
cf, err := service.MyService.Storage().GetConfigByName(v)
|
||||
@@ -69,7 +66,7 @@ func GetRecoverStorage(c *gin.Context) {
|
||||
continue
|
||||
}
|
||||
if cf["type"] == "drive" && cf["username"] == dmap["username"] {
|
||||
c.String(200, `<p>The same configuration has been added</p><script>window.close()</script>`)
|
||||
ctx.String(200, `<p>The same configuration has been added</p><script>window.close()</script>`)
|
||||
err := service.MyService.Storage().CheckAndMountByName(v)
|
||||
if err != nil {
|
||||
logger.Error("check and mount by name error: ", zap.Error(err), zap.Any("name", cf["username"]))
|
||||
@@ -77,7 +74,6 @@ func GetRecoverStorage(c *gin.Context) {
|
||||
notify["status"] = "warn"
|
||||
notify["message"] = "The same configuration has been added"
|
||||
service.MyService.Notify().SendNotify("casaos:file:recover", notify)
|
||||
return
|
||||
}
|
||||
}
|
||||
if len(username) > 0 {
|
||||
@@ -85,7 +81,7 @@ func GetRecoverStorage(c *gin.Context) {
|
||||
username = a[0]
|
||||
}
|
||||
|
||||
//username = fileutil.NameAccumulation(username, "/mnt")
|
||||
// username = fileutil.NameAccumulation(username, "/mnt")
|
||||
username += "_google_drive_" + strconv.FormatInt(time.Now().Unix(), 10)
|
||||
|
||||
dmap["client_id"] = google_drive.ClientID
|
||||
@@ -102,45 +98,41 @@ func GetRecoverStorage(c *gin.Context) {
|
||||
service.MyService.Notify().SendNotify("casaos:file:recover", notify)
|
||||
} else if t == "Dropbox" {
|
||||
dropbox := dropbox.GetConfig()
|
||||
dropbox.Code = c.Query("code")
|
||||
dropbox.Code = ctx.QueryParam("code")
|
||||
if len(dropbox.Code) == 0 {
|
||||
c.String(200, `<p>Code cannot be empty</p><script>window.close()</script>`)
|
||||
ctx.String(200, `<p>Code cannot be empty</p><script>window.close()</script>`)
|
||||
notify["status"] = "fail"
|
||||
notify["message"] = "Code cannot be empty"
|
||||
logger.Error("Then code is empty error: ", zap.String("code", dropbox.Code), zap.Any("name", "dropbox"))
|
||||
service.MyService.Notify().SendNotify("casaos:file:recover", notify)
|
||||
return
|
||||
}
|
||||
|
||||
err := dropbox.Init(c)
|
||||
err := dropbox.Init(ctx.Request().Context())
|
||||
if err != nil {
|
||||
c.String(200, `<p>Initialization failure:`+err.Error()+`</p><script>window.close()</script>`)
|
||||
ctx.String(200, `<p>Initialization failure:`+err.Error()+`</p><script>window.close()</script>`)
|
||||
notify["status"] = "fail"
|
||||
notify["message"] = "Initialization failure"
|
||||
logger.Error("Then init error: ", zap.Error(err), zap.Any("name", "dropbox"))
|
||||
service.MyService.Notify().SendNotify("casaos:file:recover", notify)
|
||||
return
|
||||
}
|
||||
username, err := dropbox.GetUserInfo(c)
|
||||
username, err := dropbox.GetUserInfo(ctx.Request().Context())
|
||||
if err != nil {
|
||||
c.String(200, `<p>Failed to get user information:`+err.Error()+`</p><script>window.close()</script>`)
|
||||
ctx.String(200, `<p>Failed to get user information:`+err.Error()+`</p><script>window.close()</script>`)
|
||||
notify["status"] = "fail"
|
||||
notify["message"] = "Failed to get user information"
|
||||
logger.Error("Then get user information: ", zap.Error(err), zap.Any("name", "dropbox"))
|
||||
service.MyService.Notify().SendNotify("casaos:file:recover", notify)
|
||||
return
|
||||
}
|
||||
dmap := make(map[string]string)
|
||||
dmap["username"] = username
|
||||
|
||||
configs, err := service.MyService.Storage().GetConfig()
|
||||
if err != nil {
|
||||
c.String(200, `<p>Failed to get rclone config:`+err.Error()+`</p><script>window.close()</script>`)
|
||||
ctx.String(200, `<p>Failed to get rclone config:`+err.Error()+`</p><script>window.close()</script>`)
|
||||
notify["status"] = "fail"
|
||||
notify["message"] = "Failed to get rclone config"
|
||||
logger.Error("Then get config error: ", zap.Error(err), zap.Any("name", "dropbox"))
|
||||
service.MyService.Notify().SendNotify("casaos:file:recover", notify)
|
||||
return
|
||||
}
|
||||
for _, v := range configs.Remotes {
|
||||
cf, err := service.MyService.Storage().GetConfigByName(v)
|
||||
@@ -149,7 +141,7 @@ func GetRecoverStorage(c *gin.Context) {
|
||||
continue
|
||||
}
|
||||
if cf["type"] == "dropbox" && cf["username"] == dmap["username"] {
|
||||
c.String(200, `<p>The same configuration has been added</p><script>window.close()</script>`)
|
||||
ctx.String(200, `<p>The same configuration has been added</p><script>window.close()</script>`)
|
||||
err := service.MyService.Storage().CheckAndMountByName(v)
|
||||
if err != nil {
|
||||
logger.Error("check and mount by name error: ", zap.Error(err), zap.Any("name", cf["username"]))
|
||||
@@ -158,7 +150,6 @@ func GetRecoverStorage(c *gin.Context) {
|
||||
notify["status"] = "warn"
|
||||
notify["message"] = "The same configuration has been added"
|
||||
service.MyService.Notify().SendNotify("casaos:file:recover", notify)
|
||||
return
|
||||
}
|
||||
}
|
||||
if len(username) > 0 {
|
||||
@@ -179,7 +170,7 @@ func GetRecoverStorage(c *gin.Context) {
|
||||
// data.SetValue(username, "token", `{"access_token":"`+dropbox.AccessToken+`","token_type":"bearer","refresh_token":"`+dropbox.Addition.RefreshToken+`","expiry":"`+currentDate+`T`+currentTime.Add(time.Hour*3).Format("15:04:05")+`.780385354Z"}`)
|
||||
// e = data.Save()
|
||||
// if e != nil {
|
||||
// c.String(200, `<p>保存配置失败:`+e.Error()+`</p>`)
|
||||
// return ctx.String(200, `<p>保存配置失败:`+e.Error()+`</p>`)
|
||||
|
||||
// return
|
||||
// }
|
||||
@@ -192,45 +183,41 @@ func GetRecoverStorage(c *gin.Context) {
|
||||
service.MyService.Notify().SendNotify("casaos:file:recover", notify)
|
||||
} else if t == "Onedrive" {
|
||||
onedrive := onedrive.GetConfig()
|
||||
onedrive.Code = c.Query("code")
|
||||
onedrive.Code = ctx.QueryParam("code")
|
||||
if len(onedrive.Code) == 0 {
|
||||
c.String(200, `<p>Code cannot be empty</p><script>window.close()</script>`)
|
||||
ctx.String(200, `<p>Code cannot be empty</p><script>window.close()</script>`)
|
||||
notify["status"] = "fail"
|
||||
notify["message"] = "Code cannot be empty"
|
||||
logger.Error("Then code is empty error: ", zap.String("code", onedrive.Code), zap.Any("name", "onedrive"))
|
||||
service.MyService.Notify().SendNotify("casaos:file:recover", notify)
|
||||
return
|
||||
}
|
||||
|
||||
err := onedrive.Init(c)
|
||||
err := onedrive.Init(ctx.Request().Context())
|
||||
if err != nil {
|
||||
c.String(200, `<p>Initialization failure:`+err.Error()+`</p><script>window.close()</script>`)
|
||||
ctx.String(200, `<p>Initialization failure:`+err.Error()+`</p><script>window.close()</script>`)
|
||||
notify["status"] = "fail"
|
||||
notify["message"] = "Initialization failure"
|
||||
logger.Error("Then init error: ", zap.Error(err), zap.Any("name", "onedrive"))
|
||||
service.MyService.Notify().SendNotify("casaos:file:recover", notify)
|
||||
return
|
||||
}
|
||||
username, driveId, driveType, err := onedrive.GetInfo(c)
|
||||
username, driveId, driveType, err := onedrive.GetInfo(ctx.Request().Context())
|
||||
if err != nil {
|
||||
c.String(200, `<p>Failed to get user information:`+err.Error()+`</p><script>window.close()</script>`)
|
||||
ctx.String(200, `<p>Failed to get user information:`+err.Error()+`</p><script>window.close()</script>`)
|
||||
notify["status"] = "fail"
|
||||
notify["message"] = "Failed to get user information"
|
||||
logger.Error("Then get user information: ", zap.Error(err), zap.Any("name", "onedrive"))
|
||||
service.MyService.Notify().SendNotify("casaos:file:recover", notify)
|
||||
return
|
||||
}
|
||||
dmap := make(map[string]string)
|
||||
dmap["username"] = username
|
||||
|
||||
configs, err := service.MyService.Storage().GetConfig()
|
||||
if err != nil {
|
||||
c.String(200, `<p>Failed to get rclone config:`+err.Error()+`</p><script>window.close()</script>`)
|
||||
ctx.String(200, `<p>Failed to get rclone config:`+err.Error()+`</p><script>window.close()</script>`)
|
||||
notify["status"] = "fail"
|
||||
notify["message"] = "Failed to get rclone config"
|
||||
logger.Error("Then get config error: ", zap.Error(err), zap.Any("name", "onedrive"))
|
||||
service.MyService.Notify().SendNotify("casaos:file:recover", notify)
|
||||
return
|
||||
}
|
||||
for _, v := range configs.Remotes {
|
||||
cf, err := service.MyService.Storage().GetConfigByName(v)
|
||||
@@ -239,7 +226,7 @@ func GetRecoverStorage(c *gin.Context) {
|
||||
continue
|
||||
}
|
||||
if cf["type"] == "onedrive" && cf["username"] == dmap["username"] {
|
||||
c.String(200, `<p>The same configuration has been added</p><script>window.close()</script>`)
|
||||
ctx.String(200, `<p>The same configuration has been added</p><script>window.close()</script>`)
|
||||
err := service.MyService.Storage().CheckAndMountByName(v)
|
||||
if err != nil {
|
||||
logger.Error("check and mount by name error: ", zap.Error(err), zap.Any("name", cf["username"]))
|
||||
@@ -248,7 +235,6 @@ func GetRecoverStorage(c *gin.Context) {
|
||||
notify["status"] = "warn"
|
||||
notify["message"] = "The same configuration has been added"
|
||||
service.MyService.Notify().SendNotify("casaos:file:recover", notify)
|
||||
return
|
||||
}
|
||||
}
|
||||
if len(username) > 0 {
|
||||
@@ -271,7 +257,7 @@ func GetRecoverStorage(c *gin.Context) {
|
||||
// data.SetValue(username, "token", `{"access_token":"`+dropbox.AccessToken+`","token_type":"bearer","refresh_token":"`+dropbox.Addition.RefreshToken+`","expiry":"`+currentDate+`T`+currentTime.Add(time.Hour*3).Format("15:04:05")+`.780385354Z"}`)
|
||||
// e = data.Save()
|
||||
// if e != nil {
|
||||
// c.String(200, `<p>保存配置失败:`+e.Error()+`</p>`)
|
||||
// return ctx.String(200, `<p>保存配置失败:`+e.Error()+`</p>`)
|
||||
|
||||
// return
|
||||
// }
|
||||
@@ -284,5 +270,5 @@ func GetRecoverStorage(c *gin.Context) {
|
||||
service.MyService.Notify().SendNotify("casaos:file:recover", notify)
|
||||
}
|
||||
|
||||
c.String(200, `<p>Just close the page</p><script>window.close()</script>`)
|
||||
return ctx.String(200, `<p>Just close the page</p><script>window.close()</script>`)
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@ import (
|
||||
|
||||
"github.com/IceWhaleTech/CasaOS-Common/utils/logger"
|
||||
"github.com/IceWhaleTech/CasaOS-Common/utils/systemctl"
|
||||
"github.com/labstack/echo/v4"
|
||||
"go.uber.org/zap"
|
||||
|
||||
"github.com/IceWhaleTech/CasaOS/model"
|
||||
@@ -28,18 +29,16 @@ import (
|
||||
"github.com/IceWhaleTech/CasaOS/pkg/utils/file"
|
||||
"github.com/IceWhaleTech/CasaOS/service"
|
||||
model2 "github.com/IceWhaleTech/CasaOS/service/model"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
// service
|
||||
|
||||
func GetSambaStatus(c *gin.Context) {
|
||||
func GetSambaStatus(ctx echo.Context) error {
|
||||
if status, err := systemctl.IsServiceRunning("smbd"); err != nil || !status {
|
||||
c.JSON(http.StatusInternalServerError, model.Result{
|
||||
return ctx.JSON(http.StatusInternalServerError, model.Result{
|
||||
Success: common_err.SERVICE_NOT_RUNNING,
|
||||
Message: common_err.GetMsg(common_err.SERVICE_NOT_RUNNING),
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
needInit := true
|
||||
@@ -51,10 +50,10 @@ func GetSambaStatus(c *gin.Context) {
|
||||
}
|
||||
data := make(map[string]string, 1)
|
||||
data["need_init"] = fmt.Sprintf("%v", needInit)
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data})
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data})
|
||||
}
|
||||
|
||||
func GetSambaSharesList(c *gin.Context) {
|
||||
func GetSambaSharesList(ctx echo.Context) error {
|
||||
shares := service.MyService.Shares().GetSharesList()
|
||||
shareList := []model.Shares{}
|
||||
for _, v := range shares {
|
||||
@@ -64,28 +63,24 @@ func GetSambaSharesList(c *gin.Context) {
|
||||
ID: v.ID,
|
||||
})
|
||||
}
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: shareList})
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: shareList})
|
||||
}
|
||||
|
||||
func PostSambaSharesCreate(c *gin.Context) {
|
||||
func PostSambaSharesCreate(ctx echo.Context) error {
|
||||
shares := []model.Shares{}
|
||||
c.ShouldBindJSON(&shares)
|
||||
ctx.Bind(&shares)
|
||||
for _, v := range shares {
|
||||
if v.Path == "" {
|
||||
c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INSUFFICIENT_PERMISSIONS, Message: common_err.GetMsg(common_err.INSUFFICIENT_PERMISSIONS)})
|
||||
return
|
||||
return ctx.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INSUFFICIENT_PERMISSIONS, Message: common_err.GetMsg(common_err.INSUFFICIENT_PERMISSIONS)})
|
||||
}
|
||||
if !file.Exists(v.Path) {
|
||||
c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.DIR_NOT_EXISTS, Message: common_err.GetMsg(common_err.DIR_NOT_EXISTS)})
|
||||
return
|
||||
return ctx.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.DIR_NOT_EXISTS, Message: common_err.GetMsg(common_err.DIR_NOT_EXISTS)})
|
||||
}
|
||||
if len(service.MyService.Shares().GetSharesByPath(v.Path)) > 0 {
|
||||
c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.SHARE_ALREADY_EXISTS, Message: common_err.GetMsg(common_err.SHARE_ALREADY_EXISTS)})
|
||||
return
|
||||
return ctx.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.SHARE_ALREADY_EXISTS, Message: common_err.GetMsg(common_err.SHARE_ALREADY_EXISTS)})
|
||||
}
|
||||
if len(service.MyService.Shares().GetSharesByPath(filepath.Base(v.Path))) > 0 {
|
||||
c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.SHARE_NAME_ALREADY_EXISTS, Message: common_err.GetMsg(common_err.SHARE_NAME_ALREADY_EXISTS)})
|
||||
return
|
||||
return ctx.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.SHARE_NAME_ALREADY_EXISTS, Message: common_err.GetMsg(common_err.SHARE_NAME_ALREADY_EXISTS)})
|
||||
}
|
||||
}
|
||||
for _, v := range shares {
|
||||
@@ -97,21 +92,20 @@ func PostSambaSharesCreate(c *gin.Context) {
|
||||
service.MyService.Shares().CreateShare(shareDBModel)
|
||||
}
|
||||
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: shares})
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: shares})
|
||||
}
|
||||
|
||||
func DeleteSambaShares(c *gin.Context) {
|
||||
id := c.Param("id")
|
||||
func DeleteSambaShares(ctx echo.Context) error {
|
||||
id := ctx.Param("id")
|
||||
if id == "" {
|
||||
c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INSUFFICIENT_PERMISSIONS, Message: common_err.GetMsg(common_err.INSUFFICIENT_PERMISSIONS)})
|
||||
return
|
||||
return ctx.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INSUFFICIENT_PERMISSIONS, Message: common_err.GetMsg(common_err.INSUFFICIENT_PERMISSIONS)})
|
||||
}
|
||||
service.MyService.Shares().DeleteShare(id)
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: id})
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: id})
|
||||
}
|
||||
|
||||
// client
|
||||
func GetSambaConnectionsList(c *gin.Context) {
|
||||
func GetSambaConnectionsList(ctx echo.Context) error {
|
||||
connections := service.MyService.Connections().GetConnectionsList()
|
||||
connectionList := []model.Connections{}
|
||||
for _, v := range connections {
|
||||
@@ -123,34 +117,33 @@ func GetSambaConnectionsList(c *gin.Context) {
|
||||
MountPoint: v.MountPoint,
|
||||
})
|
||||
}
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: connectionList})
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: connectionList})
|
||||
}
|
||||
|
||||
func PostSambaConnectionsCreate(c *gin.Context) {
|
||||
func PostSambaConnectionsCreate(ctx echo.Context) error {
|
||||
connection := model.Connections{}
|
||||
c.ShouldBindJSON(&connection)
|
||||
ctx.Bind(&connection)
|
||||
if connection.Port == "" {
|
||||
connection.Port = "445"
|
||||
}
|
||||
if connection.Username == "" || connection.Host == "" {
|
||||
c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.CHARACTER_LIMIT, Message: common_err.GetMsg(common_err.CHARACTER_LIMIT)})
|
||||
return
|
||||
return ctx.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.CHARACTER_LIMIT, Message: common_err.GetMsg(common_err.CHARACTER_LIMIT)})
|
||||
}
|
||||
|
||||
// if ok, _ := regexp.MatchString(`^[\w@#*.]{4,30}$`, connection.Password); !ok {
|
||||
// c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.CHARACTER_LIMIT, Message: common_err.GetMsg(common_err.CHARACTER_LIMIT)})
|
||||
// return ctx.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.CHARACTER_LIMIT, Message: common_err.GetMsg(common_err.CHARACTER_LIMIT)})
|
||||
// return
|
||||
// }
|
||||
// if ok, _ := regexp.MatchString(`^[\w@#*.]{4,30}$`, connection.Username); !ok {
|
||||
// c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
|
||||
// return ctx.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
|
||||
// return
|
||||
// }
|
||||
// if !ip_helper.IsIPv4(connection.Host) && !ip_helper.IsIPv6(connection.Host) {
|
||||
// c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
|
||||
// return ctx.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
|
||||
// return
|
||||
// }
|
||||
// if ok, _ := regexp.MatchString("^[0-9]{1,6}$", connection.Port); !ok {
|
||||
// c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
|
||||
// return ctx.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
|
||||
// return
|
||||
// }
|
||||
|
||||
@@ -158,14 +151,12 @@ func PostSambaConnectionsCreate(c *gin.Context) {
|
||||
// check is exists
|
||||
connections := service.MyService.Connections().GetConnectionByHost(connection.Host)
|
||||
if len(connections) > 0 {
|
||||
c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.Record_ALREADY_EXIST, Message: common_err.GetMsg(common_err.Record_ALREADY_EXIST), Data: common_err.GetMsg(common_err.Record_ALREADY_EXIST)})
|
||||
return
|
||||
return ctx.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.Record_ALREADY_EXIST, Message: common_err.GetMsg(common_err.Record_ALREADY_EXIST), Data: common_err.GetMsg(common_err.Record_ALREADY_EXIST)})
|
||||
}
|
||||
// check connect is ok
|
||||
directories, err := samba.GetSambaSharesList(connection.Host, connection.Port, connection.Username, connection.Password)
|
||||
if err != nil {
|
||||
c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
return
|
||||
return ctx.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
}
|
||||
|
||||
connectionDBModel := model2.ConnectionsDBModel{}
|
||||
@@ -187,21 +178,19 @@ func PostSambaConnectionsCreate(c *gin.Context) {
|
||||
service.MyService.Connections().CreateConnection(&connectionDBModel)
|
||||
|
||||
connection.ID = connectionDBModel.ID
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: connection})
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: connection})
|
||||
}
|
||||
|
||||
func DeleteSambaConnections(c *gin.Context) {
|
||||
id := c.Param("id")
|
||||
func DeleteSambaConnections(ctx echo.Context) error {
|
||||
id := ctx.Param("id")
|
||||
connection := service.MyService.Connections().GetConnectionByID(id)
|
||||
if connection.Username == "" {
|
||||
c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.Record_NOT_EXIST, Message: common_err.GetMsg(common_err.Record_NOT_EXIST)})
|
||||
return
|
||||
return ctx.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.Record_NOT_EXIST, Message: common_err.GetMsg(common_err.Record_NOT_EXIST)})
|
||||
}
|
||||
mountPointList, err := samba.GetSambaSharesList(connection.Host, connection.Port, connection.Username, connection.Password)
|
||||
//mountPointList, err := service.MyService.System().GetDirPath(connection.MountPoint)
|
||||
// mountPointList, err := service.MyService.System().GetDirPath(connection.MountPoint)
|
||||
if err != nil {
|
||||
c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
return
|
||||
return ctx.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
}
|
||||
baseHostPath := "/mnt/" + connection.Host
|
||||
for _, v := range mountPointList {
|
||||
@@ -209,16 +198,14 @@ func DeleteSambaConnections(c *gin.Context) {
|
||||
err := service.MyService.Connections().UnmountSmaba(baseHostPath + "/" + v)
|
||||
if err != nil {
|
||||
logger.Error("unmount smaba error", zap.Error(err), zap.Any("path", baseHostPath+"/"+v))
|
||||
c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
return
|
||||
return ctx.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
dir, _ := ioutil.ReadDir(connection.MountPoint)
|
||||
if len(dir) == 0 {
|
||||
os.RemoveAll(connection.MountPoint)
|
||||
}
|
||||
service.MyService.Connections().DeleteConnection(id)
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: id})
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: id})
|
||||
}
|
||||
|
||||
@@ -16,8 +16,8 @@ import (
|
||||
"testing"
|
||||
|
||||
v1 "github.com/IceWhaleTech/CasaOS/route/v1"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/golang/mock/gomock"
|
||||
"github.com/labstack/echo/v4"
|
||||
"gotest.tools/assert"
|
||||
)
|
||||
|
||||
@@ -54,17 +54,22 @@ func performRequest(r http.Handler, method, path string) *httptest.ResponseRecor
|
||||
func TestGetSambaSharesList(t *testing.T) {
|
||||
t.Skip("This test is always failing. Skipped to unblock releasing - MUST FIX!")
|
||||
|
||||
gin.SetMode(gin.TestMode)
|
||||
ctrl := gomock.NewController(t)
|
||||
defer ctrl.Finish()
|
||||
|
||||
|
||||
executeWithContext := func() *httptest.ResponseRecorder {
|
||||
response := httptest.NewRecorder()
|
||||
con, ginEngine := gin.CreateTestContext(response)
|
||||
// con, ginEngine := gin.CreateTestContext(response)
|
||||
e := echo.New()
|
||||
|
||||
requestUrl := "/v1/samba/shares"
|
||||
httpRequest, _ := http.NewRequest("GET", requestUrl, nil)
|
||||
|
||||
con := e.NewContext(httpRequest, response)
|
||||
|
||||
v1.GetSambaSharesList(con)
|
||||
ginEngine.ServeHTTP(response, httpRequest)
|
||||
e.ServeHTTP(response, httpRequest)
|
||||
return response
|
||||
}
|
||||
|
||||
|
||||
@@ -10,8 +10,9 @@ import (
|
||||
"github.com/IceWhaleTech/CasaOS-Common/utils/common_err"
|
||||
"github.com/IceWhaleTech/CasaOS-Common/utils/logger"
|
||||
sshHelper "github.com/IceWhaleTech/CasaOS-Common/utils/ssh"
|
||||
"github.com/IceWhaleTech/CasaOS/pkg/utils"
|
||||
"github.com/labstack/echo/v4"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/gorilla/websocket"
|
||||
"go.uber.org/zap"
|
||||
"golang.org/x/crypto/ssh"
|
||||
@@ -26,44 +27,41 @@ var upgrader = websocket.Upgrader{
|
||||
HandshakeTimeout: time.Duration(time.Second * 5),
|
||||
}
|
||||
|
||||
func PostSshLogin(c *gin.Context) {
|
||||
func PostSshLogin(ctx echo.Context) error {
|
||||
j := make(map[string]string)
|
||||
c.ShouldBind(&j)
|
||||
ctx.Bind(&j)
|
||||
userName := j["username"]
|
||||
password := j["password"]
|
||||
port := j["port"]
|
||||
if userName == "" || password == "" || port == "" {
|
||||
c.JSON(common_err.CLIENT_ERROR, modelCommon.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS), Data: "Username or password or port is empty"})
|
||||
return
|
||||
return ctx.JSON(common_err.CLIENT_ERROR, modelCommon.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS), Data: "Username or password or port is empty"})
|
||||
}
|
||||
_, err := sshHelper.NewSshClient(userName, password, port)
|
||||
if err != nil {
|
||||
c.JSON(common_err.CLIENT_ERROR, modelCommon.Result{Success: common_err.CLIENT_ERROR, Message: common_err.GetMsg(common_err.CLIENT_ERROR), Data: "Please check if the username and port are correct, and make sure that ssh server is installed."})
|
||||
return ctx.JSON(common_err.CLIENT_ERROR, modelCommon.Result{Success: common_err.CLIENT_ERROR, Message: common_err.GetMsg(common_err.CLIENT_ERROR), Data: "Please check if the username and port are correct, and make sure that ssh server is installed."})
|
||||
logger.Error("connect ssh error", zap.Any("error", err))
|
||||
return
|
||||
}
|
||||
c.JSON(common_err.SUCCESS, modelCommon.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
|
||||
return ctx.JSON(common_err.SUCCESS, modelCommon.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
|
||||
}
|
||||
|
||||
func WsSsh(c *gin.Context) {
|
||||
func WsSsh(ctx echo.Context) error {
|
||||
_, e := exec.LookPath("ssh")
|
||||
if e != nil {
|
||||
c.JSON(common_err.SERVICE_ERROR, modelCommon.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: "ssh server not found"})
|
||||
return
|
||||
return ctx.JSON(common_err.SERVICE_ERROR, modelCommon.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: "ssh server not found"})
|
||||
}
|
||||
|
||||
userName := c.Query("username")
|
||||
password := c.Query("password")
|
||||
port := c.Query("port")
|
||||
wsConn, _ := upgrader.Upgrade(c.Writer, c.Request, nil)
|
||||
userName := ctx.QueryParam("username")
|
||||
password := ctx.QueryParam("password")
|
||||
port := ctx.QueryParam("port")
|
||||
wsConn, _ := upgrader.Upgrade(ctx.Response().Writer, ctx.Request(), nil)
|
||||
logBuff := new(bytes.Buffer)
|
||||
|
||||
quitChan := make(chan bool, 3)
|
||||
// user := ""
|
||||
// password := ""
|
||||
var login int = 1
|
||||
cols, _ := strconv.Atoi(c.DefaultQuery("cols", "200"))
|
||||
rows, _ := strconv.Atoi(c.DefaultQuery("rows", "32"))
|
||||
cols, _ := strconv.Atoi(utils.DefaultQuery(ctx, "cols", "200"))
|
||||
rows, _ := strconv.Atoi(utils.DefaultQuery(ctx, "rows", "32"))
|
||||
var client *ssh.Client
|
||||
for login != 0 {
|
||||
|
||||
@@ -93,4 +91,5 @@ func WsSsh(c *gin.Context) {
|
||||
go ssConn.SessionWait(quitChan)
|
||||
|
||||
<-quitChan
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -19,12 +19,13 @@ import (
|
||||
"github.com/IceWhaleTech/CasaOS/common"
|
||||
"github.com/IceWhaleTech/CasaOS/model"
|
||||
"github.com/IceWhaleTech/CasaOS/pkg/config"
|
||||
"github.com/IceWhaleTech/CasaOS/pkg/utils"
|
||||
"github.com/IceWhaleTech/CasaOS/pkg/utils/common_err"
|
||||
"github.com/IceWhaleTech/CasaOS/pkg/utils/version"
|
||||
"github.com/IceWhaleTech/CasaOS/service"
|
||||
model2 "github.com/IceWhaleTech/CasaOS/service/model"
|
||||
"github.com/IceWhaleTech/CasaOS/types"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/labstack/echo/v4"
|
||||
"github.com/tidwall/gjson"
|
||||
)
|
||||
|
||||
@@ -35,7 +36,7 @@ import (
|
||||
// @Security ApiKeyAuth
|
||||
// @Success 200 {string} string "ok"
|
||||
// @Router /sys/version/check [get]
|
||||
func GetSystemCheckVersion(c *gin.Context) {
|
||||
func GetSystemCheckVersion(ctx echo.Context) error {
|
||||
need, version := version.IsNeedUpdate(service.MyService.Casa().GetCasaosVersion())
|
||||
if need {
|
||||
installLog := model2.AppNotify{}
|
||||
@@ -51,7 +52,7 @@ func GetSystemCheckVersion(c *gin.Context) {
|
||||
data["need_update"] = need
|
||||
data["version"] = version
|
||||
data["current_version"] = common.VERSION
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data})
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data})
|
||||
}
|
||||
|
||||
// @Summary 系统信息
|
||||
@@ -61,12 +62,12 @@ func GetSystemCheckVersion(c *gin.Context) {
|
||||
// @Security ApiKeyAuth
|
||||
// @Success 200 {string} string "ok"
|
||||
// @Router /sys/update [post]
|
||||
func SystemUpdate(c *gin.Context) {
|
||||
func SystemUpdate(ctx echo.Context) error {
|
||||
need, version := version.IsNeedUpdate(service.MyService.Casa().GetCasaosVersion())
|
||||
if need {
|
||||
service.MyService.System().UpdateSystemVersion(version.Version)
|
||||
}
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
|
||||
}
|
||||
|
||||
// @Summary get logs
|
||||
@@ -76,13 +77,13 @@ func SystemUpdate(c *gin.Context) {
|
||||
// @Security ApiKeyAuth
|
||||
// @Success 200 {string} string "ok"
|
||||
// @Router /sys/error/logs [get]
|
||||
func GetCasaOSErrorLogs(c *gin.Context) {
|
||||
line, _ := strconv.Atoi(c.DefaultQuery("line", "100"))
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: service.MyService.System().GetCasaOSLogs(line)})
|
||||
func GetCasaOSErrorLogs(ctx echo.Context) error {
|
||||
line, _ := strconv.Atoi(utils.DefaultQuery(ctx, "line", "100"))
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: service.MyService.System().GetCasaOSLogs(line)})
|
||||
}
|
||||
|
||||
// 系统配置
|
||||
func GetSystemConfigDebug(c *gin.Context) {
|
||||
func GetSystemConfigDebug(ctx echo.Context) error {
|
||||
array := service.MyService.System().GetSystemConfigDebug()
|
||||
disk := service.MyService.System().GetDiskInfo()
|
||||
sys := service.MyService.System().GetSysInfo()
|
||||
@@ -100,7 +101,7 @@ func GetSystemConfigDebug(c *gin.Context) {
|
||||
|
||||
// array = append(array, fmt.Sprintf("disk,total:%v,used:%v,UsedPercent:%v", disk.Total>>20, disk.Used>>20, disk.UsedPercent))
|
||||
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: bugContent})
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: bugContent})
|
||||
}
|
||||
|
||||
// @Summary get casaos server port
|
||||
@@ -110,8 +111,8 @@ func GetSystemConfigDebug(c *gin.Context) {
|
||||
// @Security ApiKeyAuth
|
||||
// @Success 200 {string} string "ok"
|
||||
// @Router /sys/port [get]
|
||||
func GetCasaOSPort(c *gin.Context) {
|
||||
c.JSON(common_err.SUCCESS,
|
||||
func GetCasaOSPort(ctx echo.Context) error {
|
||||
return ctx.JSON(common_err.SUCCESS,
|
||||
model.Result{
|
||||
Success: common_err.SUCCESS,
|
||||
Message: common_err.GetMsg(common_err.SUCCESS),
|
||||
@@ -127,31 +128,29 @@ func GetCasaOSPort(c *gin.Context) {
|
||||
// @Param port json string true "port"
|
||||
// @Success 200 {string} string "ok"
|
||||
// @Router /sys/port [put]
|
||||
func PutCasaOSPort(c *gin.Context) {
|
||||
func PutCasaOSPort(ctx echo.Context) error {
|
||||
json := make(map[string]string)
|
||||
c.ShouldBind(&json)
|
||||
ctx.Bind(&json)
|
||||
portStr := json["port"]
|
||||
portNumber, err := strconv.Atoi(portStr)
|
||||
if err != nil {
|
||||
c.JSON(common_err.SERVICE_ERROR,
|
||||
return ctx.JSON(common_err.SERVICE_ERROR,
|
||||
model.Result{
|
||||
Success: common_err.SERVICE_ERROR,
|
||||
Message: err.Error(),
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
isAvailable := port.IsPortAvailable(portNumber, "tcp")
|
||||
if !isAvailable {
|
||||
c.JSON(common_err.SERVICE_ERROR,
|
||||
return ctx.JSON(common_err.SERVICE_ERROR,
|
||||
model.Result{
|
||||
Success: common_err.PORT_IS_OCCUPIED,
|
||||
Message: common_err.GetMsg(common_err.PORT_IS_OCCUPIED),
|
||||
})
|
||||
return
|
||||
}
|
||||
service.MyService.System().UpSystemPort(strconv.Itoa(portNumber))
|
||||
c.JSON(common_err.SUCCESS,
|
||||
return ctx.JSON(common_err.SUCCESS,
|
||||
model.Result{
|
||||
Success: common_err.SUCCESS,
|
||||
Message: common_err.GetMsg(common_err.SUCCESS),
|
||||
@@ -165,8 +164,9 @@ func PutCasaOSPort(c *gin.Context) {
|
||||
// @Security ApiKeyAuth
|
||||
// @Success 200 {string} string "ok"
|
||||
// @Router /sys/restart [post]
|
||||
func PostKillCasaOS(c *gin.Context) {
|
||||
func PostKillCasaOS(ctx echo.Context) error {
|
||||
os.Exit(0)
|
||||
return nil
|
||||
}
|
||||
|
||||
// @Summary get system hardware info
|
||||
@@ -176,20 +176,20 @@ func PostKillCasaOS(c *gin.Context) {
|
||||
// @Security ApiKeyAuth
|
||||
// @Success 200 {string} string "ok"
|
||||
// @Router /sys/hardware/info [get]
|
||||
func GetSystemHardwareInfo(c *gin.Context) {
|
||||
func GetSystemHardwareInfo(ctx echo.Context) error {
|
||||
data := make(map[string]string, 1)
|
||||
data["drive_model"] = service.MyService.System().GetDeviceTree()
|
||||
data["arch"] = runtime.GOARCH
|
||||
|
||||
if cpu := service.MyService.System().GetCpuInfo(); len(cpu) > 0 {
|
||||
|
||||
c.JSON(common_err.SUCCESS,
|
||||
return ctx.JSON(common_err.SUCCESS,
|
||||
model.Result{
|
||||
Success: common_err.SUCCESS,
|
||||
Message: common_err.GetMsg(common_err.SUCCESS),
|
||||
Data: data,
|
||||
})
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// @Summary system utilization
|
||||
@@ -199,7 +199,7 @@ func GetSystemHardwareInfo(c *gin.Context) {
|
||||
// @Security ApiKeyAuth
|
||||
// @Success 200 {string} string "ok"
|
||||
// @Router /sys/utilization [get]
|
||||
func GetSystemUtilization(c *gin.Context) {
|
||||
func GetSystemUtilization(ctx echo.Context) error {
|
||||
data := make(map[string]interface{})
|
||||
cpu := service.MyService.System().GetCpuPercent()
|
||||
num := service.MyService.System().GetCpuCoreNum()
|
||||
@@ -243,7 +243,7 @@ func GetSystemUtilization(c *gin.Context) {
|
||||
data[key.(string)] = value
|
||||
return true
|
||||
})
|
||||
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data})
|
||||
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data})
|
||||
}
|
||||
|
||||
// @Summary get cpu info
|
||||
@@ -253,13 +253,13 @@ func GetSystemUtilization(c *gin.Context) {
|
||||
// @Security ApiKeyAuth
|
||||
// @Success 200 {string} string "ok"
|
||||
// @Router /sys/cpu [get]
|
||||
func GetSystemCupInfo(c *gin.Context) {
|
||||
func GetSystemCupInfo(ctx echo.Context) error {
|
||||
cpu := service.MyService.System().GetCpuPercent()
|
||||
num := service.MyService.System().GetCpuCoreNum()
|
||||
data := make(map[string]interface{})
|
||||
data["percent"] = cpu
|
||||
data["num"] = num
|
||||
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data})
|
||||
return ctx.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data})
|
||||
}
|
||||
|
||||
// @Summary get mem info
|
||||
@@ -269,9 +269,9 @@ func GetSystemCupInfo(c *gin.Context) {
|
||||
// @Security ApiKeyAuth
|
||||
// @Success 200 {string} string "ok"
|
||||
// @Router /sys/mem [get]
|
||||
func GetSystemMemInfo(c *gin.Context) {
|
||||
func GetSystemMemInfo(ctx echo.Context) error {
|
||||
mem := service.MyService.System().GetMemInfo()
|
||||
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: mem})
|
||||
return ctx.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: mem})
|
||||
}
|
||||
|
||||
// @Summary get disk info
|
||||
@@ -281,9 +281,9 @@ func GetSystemMemInfo(c *gin.Context) {
|
||||
// @Security ApiKeyAuth
|
||||
// @Success 200 {string} string "ok"
|
||||
// @Router /sys/disk [get]
|
||||
func GetSystemDiskInfo(c *gin.Context) {
|
||||
func GetSystemDiskInfo(ctx echo.Context) error {
|
||||
disk := service.MyService.System().GetDiskInfo()
|
||||
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: disk})
|
||||
return ctx.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: disk})
|
||||
}
|
||||
|
||||
// @Summary get Net info
|
||||
@@ -293,7 +293,7 @@ func GetSystemDiskInfo(c *gin.Context) {
|
||||
// @Security ApiKeyAuth
|
||||
// @Success 200 {string} string "ok"
|
||||
// @Router /sys/net [get]
|
||||
func GetSystemNetInfo(c *gin.Context) {
|
||||
func GetSystemNetInfo(ctx echo.Context) error {
|
||||
netList := service.MyService.System().GetNetInfo()
|
||||
newNet := []model.IOCountersStat{}
|
||||
for _, n := range netList {
|
||||
@@ -308,35 +308,36 @@ func GetSystemNetInfo(c *gin.Context) {
|
||||
}
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: newNet})
|
||||
return ctx.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: newNet})
|
||||
}
|
||||
|
||||
func GetSystemProxy(c *gin.Context) {
|
||||
url := c.Query("url")
|
||||
func GetSystemProxy(ctx echo.Context) error {
|
||||
url := ctx.QueryParam("url")
|
||||
resp, err := http2.Get(url, 30*time.Second)
|
||||
if err != nil {
|
||||
return
|
||||
return ctx.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: err.Error()})
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
for k, v := range c.Request.Header {
|
||||
c.Header(k, v[0])
|
||||
for k, v := range ctx.Request().Header {
|
||||
ctx.Request().Header.Add(k, v[0])
|
||||
}
|
||||
rda, _ := ioutil.ReadAll(resp.Body)
|
||||
// json.NewEncoder(c.Writer).Encode(json.RawMessage(string(rda)))
|
||||
// 响应状态码
|
||||
c.Writer.WriteHeader(resp.StatusCode)
|
||||
ctx.Response().Writer.WriteHeader(resp.StatusCode)
|
||||
// 复制转发的响应Body到响应Body
|
||||
io.Copy(c.Writer, ioutil.NopCloser(bytes.NewBuffer(rda)))
|
||||
io.Copy(ctx.Response().Writer, ioutil.NopCloser(bytes.NewBuffer(rda)))
|
||||
return nil
|
||||
}
|
||||
|
||||
func PutSystemState(c *gin.Context) {
|
||||
state := c.Param("state")
|
||||
func PutSystemState(ctx echo.Context) error {
|
||||
state := ctx.Param("state")
|
||||
if strings.ToLower(state) == "off" {
|
||||
service.MyService.System().SystemShutdown()
|
||||
} else if strings.ToLower(state) == "restart" {
|
||||
service.MyService.System().SystemReboot()
|
||||
}
|
||||
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: "The operation will be completed shortly."})
|
||||
return ctx.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: "The operation will be completed shortly."})
|
||||
}
|
||||
|
||||
// @Summary 获取一个可用端口
|
||||
@@ -347,8 +348,8 @@ func PutSystemState(c *gin.Context) {
|
||||
// @Security ApiKeyAuth
|
||||
// @Success 200 {string} string "ok"
|
||||
// @Router /app/getport [get]
|
||||
func GetPort(c *gin.Context) {
|
||||
t := c.DefaultQuery("type", "tcp")
|
||||
func GetPort(ctx echo.Context) error {
|
||||
t := utils.DefaultQuery(ctx, "type", "tcp")
|
||||
var p int
|
||||
ok := true
|
||||
for ok {
|
||||
@@ -356,7 +357,7 @@ func GetPort(c *gin.Context) {
|
||||
ok = !port.IsPortAvailable(p, t)
|
||||
}
|
||||
// @tiger 这里最好封装成 {'port': ...} 的形式,来体现出参的上下文
|
||||
c.JSON(common_err.SUCCESS, &model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: p})
|
||||
return ctx.JSON(common_err.SUCCESS, &model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: p})
|
||||
}
|
||||
|
||||
// @Summary 检查端口是否可用
|
||||
@@ -368,18 +369,17 @@ func GetPort(c *gin.Context) {
|
||||
// @Security ApiKeyAuth
|
||||
// @Success 200 {string} string "ok"
|
||||
// @Router /app/check/{port} [get]
|
||||
func PortCheck(c *gin.Context) {
|
||||
p, _ := strconv.Atoi(c.Param("port"))
|
||||
t := c.DefaultQuery("type", "tcp")
|
||||
c.JSON(common_err.SUCCESS, &model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: port.IsPortAvailable(p, t)})
|
||||
func PortCheck(ctx echo.Context) error {
|
||||
p, _ := strconv.Atoi(ctx.Param("port"))
|
||||
t := utils.DefaultQuery(ctx, "type", "tcp")
|
||||
return ctx.JSON(common_err.SUCCESS, &model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: port.IsPortAvailable(p, t)})
|
||||
}
|
||||
|
||||
func GetSystemEntry(c *gin.Context) {
|
||||
func GetSystemEntry(ctx echo.Context) error {
|
||||
entry := service.MyService.System().GetSystemEntry()
|
||||
str := json.RawMessage(entry)
|
||||
if !gjson.ValidBytes(str) {
|
||||
c.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: entry, Data: json.RawMessage("[]")})
|
||||
return
|
||||
return ctx.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: entry, Data: json.RawMessage("[]")})
|
||||
}
|
||||
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: str})
|
||||
return ctx.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: str})
|
||||
}
|
||||
|
||||
@@ -12,19 +12,18 @@ import (
|
||||
"github.com/IceWhaleTech/CasaOS-Common/utils/logger"
|
||||
"github.com/IceWhaleTech/CasaOS/common"
|
||||
"github.com/IceWhaleTech/CasaOS/pkg/utils/httper"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/labstack/echo/v4"
|
||||
"github.com/tidwall/gjson"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
func ZerotierProxy(c *gin.Context) {
|
||||
func ZerotierProxy(ctx echo.Context) error {
|
||||
// Read the port number from the file
|
||||
w := c.Writer
|
||||
r := c.Request
|
||||
w := ctx.Response().Writer
|
||||
r := ctx.Request()
|
||||
port, err := ioutil.ReadFile("/var/lib/zerotier-one/zerotier-one.port")
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
// Get the request path and remove "/zt"
|
||||
@@ -38,14 +37,12 @@ func ZerotierProxy(c *gin.Context) {
|
||||
req, err := http.NewRequest(r.Method, targetURL, r.Body)
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
// Add the X-ZT1-AUTH header
|
||||
authToken, err := ioutil.ReadFile("/var/lib/zerotier-one/authtoken.secret")
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
req.Header.Set("X-ZT1-AUTH", strings.TrimSpace(string(authToken)))
|
||||
|
||||
@@ -55,7 +52,6 @@ func ZerotierProxy(c *gin.Context) {
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
@@ -64,12 +60,13 @@ func ZerotierProxy(c *gin.Context) {
|
||||
respBody, err := ioutil.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
// Return the response to the client
|
||||
w.WriteHeader(resp.StatusCode)
|
||||
w.Write(respBody)
|
||||
// TODO
|
||||
return nil
|
||||
}
|
||||
|
||||
func copyHeaders(destination, source http.Header) {
|
||||
@@ -130,6 +127,7 @@ func CheckNetwork() {
|
||||
JoinAndUpdateNet(address, networkId, ip)
|
||||
}
|
||||
}
|
||||
|
||||
func GetAddress() string {
|
||||
nodeRes, err := httper.ZTGet("/status")
|
||||
if err != nil {
|
||||
@@ -138,6 +136,7 @@ func GetAddress() string {
|
||||
}
|
||||
return gjson.GetBytes(nodeRes, "address").String()
|
||||
}
|
||||
|
||||
func JoinAndUpdateNet(address, networkId, ip string) {
|
||||
logger.Info("start join network", zap.Any("ip", ip))
|
||||
_, err := httper.ZTPost("/network/"+networkId, "")
|
||||
@@ -162,6 +161,7 @@ func JoinAndUpdateNet(address, networkId, ip string) {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func CreateNet(address, s, e, c string) string {
|
||||
body := `{
|
||||
"name": "` + common.RANW_NAME + `",
|
||||
|
||||
17
route/v2.go
17
route/v2.go
@@ -71,8 +71,7 @@ func InitV2Router() http.Handler {
|
||||
e.Use(echo_middleware.JWTWithConfig(echo_middleware.JWTConfig{
|
||||
Skipper: func(c echo.Context) bool {
|
||||
return c.RealIP() == "::1" || c.RealIP() == "127.0.0.1"
|
||||
//return true
|
||||
|
||||
// return true
|
||||
},
|
||||
ParseTokenFunc: func(token string, c echo.Context) (interface{}, error) {
|
||||
valid, claims, err := jwt.Validate(token, func() (*ecdsa.PublicKey, error) { return external.GetPublicKey(config.CommonInfo.RuntimePath) })
|
||||
@@ -84,11 +83,11 @@ func InitV2Router() http.Handler {
|
||||
return claims, nil
|
||||
},
|
||||
TokenLookupFuncs: []echo_middleware.ValuesExtractor{
|
||||
func(c echo.Context) ([]string, error) {
|
||||
if len(c.Request().Header.Get(echo.HeaderAuthorization)) > 0 {
|
||||
return []string{c.Request().Header.Get(echo.HeaderAuthorization)}, nil
|
||||
func(ctx echo.Context) ([]string, error) {
|
||||
if len(ctx.Request().Header.Get(echo.HeaderAuthorization)) > 0 {
|
||||
return []string{ctx.Request().Header.Get(echo.HeaderAuthorization)}, nil
|
||||
}
|
||||
return []string{c.QueryParam("token")}, nil
|
||||
return []string{ctx.QueryParam("token")}, nil
|
||||
},
|
||||
},
|
||||
}))
|
||||
@@ -168,7 +167,7 @@ func InitFile() http.Handler {
|
||||
fileName := path.Base(filePath)
|
||||
w.Header().Add("Content-Disposition", "attachment; filename*=utf-8''"+url.PathEscape(fileName))
|
||||
http.ServeFile(w, r, filePath)
|
||||
//http.ServeFile(w, r, filePath)
|
||||
// http.ServeFile(w, r, filePath)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -202,7 +201,7 @@ func InitDir() http.Handler {
|
||||
list := strings.Split(files, ",")
|
||||
for _, v := range list {
|
||||
if !file.Exists(v) {
|
||||
// c.JSON(common_err.SERVICE_ERROR, model.Result{
|
||||
// return ctx.JSON(common_err.SERVICE_ERROR, model.Result{
|
||||
// Success: common_err.FILE_DOES_NOT_EXIST,
|
||||
// Message: common_err.GetMsg(common_err.FILE_DOES_NOT_EXIST),
|
||||
// })
|
||||
@@ -238,7 +237,7 @@ func InitDir() http.Handler {
|
||||
|
||||
err = ar.Create(w)
|
||||
if err != nil {
|
||||
// c.JSON(common_err.SERVICE_ERROR, model.Result{
|
||||
// return ctx.JSON(common_err.SERVICE_ERROR, model.Result{
|
||||
// Success: common_err.SERVICE_ERROR,
|
||||
// Message: common_err.GetMsg(common_err.SERVICE_ERROR),
|
||||
// Data: err.Error(),
|
||||
|
||||
Reference in New Issue
Block a user