🚧 合并get与list
This commit is contained in:
@ -7,6 +7,7 @@ import (
|
|||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"gorm.io/driver/sqlite"
|
"gorm.io/driver/sqlite"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
func InitModel() bool {
|
func InitModel() bool {
|
||||||
@ -14,6 +15,10 @@ func InitModel() bool {
|
|||||||
switch conf.Conf.Database.Type {
|
switch conf.Conf.Database.Type {
|
||||||
case "sqlite3":
|
case "sqlite3":
|
||||||
{
|
{
|
||||||
|
if !(strings.HasSuffix(conf.Conf.Database.DBFile, ".db") && len(conf.Conf.Database.DBFile) > 3) {
|
||||||
|
log.Errorf("db名称不正确.")
|
||||||
|
return false
|
||||||
|
}
|
||||||
needMigrate := !utils.Exists(conf.Conf.Database.DBFile)
|
needMigrate := !utils.Exists(conf.Conf.Database.DBFile)
|
||||||
db, err := gorm.Open(sqlite.Open(conf.Conf.Database.DBFile), &gorm.Config{})
|
db, err := gorm.Open(sqlite.Open(conf.Conf.Database.DBFile), &gorm.Config{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -20,10 +20,11 @@ type Config struct {
|
|||||||
} `yaml:"preview" json:"preview"`
|
} `yaml:"preview" json:"preview"`
|
||||||
} `yaml:"info"`
|
} `yaml:"info"`
|
||||||
Server struct {
|
Server struct {
|
||||||
Port string `yaml:"port"` //端口
|
Port string `yaml:"port"` //端口
|
||||||
Search bool `yaml:"search" json:"search"` //允许搜索
|
Search bool `yaml:"search"` //允许搜索
|
||||||
Static string `yaml:"static"`
|
Static string `yaml:"static"`
|
||||||
SiteUrl string `yaml:"site_url" json:"site_url"` //网站url
|
SiteUrl string `yaml:"site_url"` //网站url
|
||||||
|
Password string `yaml:"password"`
|
||||||
} `yaml:"server"`
|
} `yaml:"server"`
|
||||||
AliDrive struct {
|
AliDrive struct {
|
||||||
ApiUrl string `yaml:"api_url"` //阿里云盘api
|
ApiUrl string `yaml:"api_url"` //阿里云盘api
|
||||||
|
@ -10,7 +10,7 @@ import (
|
|||||||
|
|
||||||
// get request bean
|
// get request bean
|
||||||
type GetReq struct {
|
type GetReq struct {
|
||||||
File string `json:"file" binding:"required"`
|
Path string `json:"path" binding:"required"`
|
||||||
Password string `json:"password"`
|
Password string `json:"password"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -22,11 +22,11 @@ func Get(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
log.Debugf("list:%+v", get)
|
log.Debugf("list:%+v", get)
|
||||||
dir, name := filepath.Split(get.File)
|
dir, name := filepath.Split(get.Path)
|
||||||
file, err := models.GetFileByParentPathAndName(dir, name)
|
file, err := models.GetFileByDirAndName(dir, name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if file == nil {
|
if file == nil {
|
||||||
c.JSON(200, MetaResponse(404, "File not found."))
|
c.JSON(200, MetaResponse(404, "Path not found."))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
c.JSON(200, MetaResponse(500, err.Error()))
|
c.JSON(200, MetaResponse(500, err.Error()))
|
||||||
@ -49,7 +49,7 @@ type DownReq struct {
|
|||||||
|
|
||||||
// handle download request
|
// handle download request
|
||||||
func Down(c *gin.Context) {
|
func Down(c *gin.Context) {
|
||||||
filePath := c.Param("file")
|
filePath := c.Param("path")[1:]
|
||||||
var down DownReq
|
var down DownReq
|
||||||
if err := c.ShouldBindQuery(&down); err != nil {
|
if err := c.ShouldBindQuery(&down); err != nil {
|
||||||
c.JSON(200, MetaResponse(400, "Bad Request."))
|
c.JSON(200, MetaResponse(400, "Bad Request."))
|
||||||
@ -57,10 +57,10 @@ func Down(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
log.Debugf("down:%s", filePath)
|
log.Debugf("down:%s", filePath)
|
||||||
dir, name := filepath.Split(filePath)
|
dir, name := filepath.Split(filePath)
|
||||||
fileModel, err := models.GetFileByParentPathAndName(dir, name)
|
fileModel, err := models.GetFileByDirAndName(dir, name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if fileModel == nil {
|
if fileModel == nil {
|
||||||
c.JSON(200, MetaResponse(404, "File not found."))
|
c.JSON(200, MetaResponse(404, "Path not found."))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
c.JSON(200, MetaResponse(500, err.Error()))
|
c.JSON(200, MetaResponse(500, err.Error()))
|
||||||
@ -74,6 +74,10 @@ func Down(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if fileModel.Type == "folder" {
|
||||||
|
c.JSON(200, MetaResponse(406, "无法下载目录."))
|
||||||
|
return
|
||||||
|
}
|
||||||
file, err := alidrive.GetDownLoadUrl(fileModel.FileId)
|
file, err := alidrive.GetDownLoadUrl(fileModel.FileId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(200, MetaResponse(500, err.Error()))
|
c.JSON(200, MetaResponse(500, err.Error()))
|
||||||
|
@ -9,7 +9,7 @@ import (
|
|||||||
|
|
||||||
// list request bean
|
// list request bean
|
||||||
type ListReq struct {
|
type ListReq struct {
|
||||||
Path string `json:"path" binding:"required"`
|
Dir string `json:"dir" binding:"required"`
|
||||||
Password string `json:"password"`
|
Password string `json:"password"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -22,11 +22,11 @@ func List(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
log.Debugf("list:%+v", list)
|
log.Debugf("list:%+v", list)
|
||||||
// find folder model
|
// find folder model
|
||||||
dir, file := filepath.Split(list.Path)
|
dir, name := filepath.Split(list.Dir)
|
||||||
fileModel, err := models.GetFileByParentPathAndName(dir, file)
|
file, err := models.GetFileByDirAndName(dir, name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// folder model not exist
|
// folder model not exist
|
||||||
if fileModel == nil {
|
if file == nil {
|
||||||
c.JSON(200, MetaResponse(404, "folder not found."))
|
c.JSON(200, MetaResponse(404, "folder not found."))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -34,7 +34,7 @@ func List(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
// check password
|
// check password
|
||||||
if fileModel.Password != "" && fileModel.Password != list.Password {
|
if file.Password != "" && file.Password != list.Password {
|
||||||
if list.Password == "" {
|
if list.Password == "" {
|
||||||
c.JSON(200, MetaResponse(401, "need password."))
|
c.JSON(200, MetaResponse(401, "need password."))
|
||||||
} else {
|
} else {
|
||||||
@ -42,14 +42,14 @@ func List(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
files, err := models.GetFilesByParentPath(list.Path + "/")
|
files, err := models.GetFilesByDir(list.Dir + "/")
|
||||||
// delete password
|
|
||||||
for i, _ := range *files {
|
|
||||||
(*files)[i].Password = ""
|
|
||||||
}
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(200, MetaResponse(500, err.Error()))
|
c.JSON(200, MetaResponse(500, err.Error()))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
// delete password
|
||||||
|
for i, _ := range *files {
|
||||||
|
(*files)[i].Password = ""
|
||||||
|
}
|
||||||
c.JSON(200, DataResponse(files))
|
c.JSON(200, DataResponse(files))
|
||||||
}
|
}
|
||||||
|
61
server/controllers/path.go
Normal file
61
server/controllers/path.go
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
package controllers
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/Xhofe/alist/server/models"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
"path/filepath"
|
||||||
|
)
|
||||||
|
|
||||||
|
// path request bean
|
||||||
|
type PathReq struct {
|
||||||
|
Path string `json:"path" binding:"required"`
|
||||||
|
Password string `json:"password"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// handle path request
|
||||||
|
func Path(c *gin.Context) {
|
||||||
|
var req PathReq
|
||||||
|
if err := c.ShouldBindJSON(&req); err != nil {
|
||||||
|
c.JSON(200, MetaResponse(400, "Bad Request:"+err.Error()))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.Debugf("path:%+v", req)
|
||||||
|
// find model
|
||||||
|
dir, name := filepath.Split(req.Path)
|
||||||
|
file, err := models.GetFileByDirAndName(dir, name)
|
||||||
|
if err != nil {
|
||||||
|
// folder model not exist
|
||||||
|
if file == nil {
|
||||||
|
c.JSON(200, MetaResponse(404, "path not found."))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.JSON(200, MetaResponse(500, err.Error()))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// check password
|
||||||
|
if file.Password != "" && file.Password != req.Password {
|
||||||
|
if req.Password == "" {
|
||||||
|
c.JSON(200, MetaResponse(401, "need password."))
|
||||||
|
} else {
|
||||||
|
c.JSON(200, MetaResponse(401, "wrong password."))
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// file
|
||||||
|
if file.Type == "file" {
|
||||||
|
c.JSON(200, DataResponse(file))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// folder
|
||||||
|
files, err := models.GetFilesByDir(req.Path + "/")
|
||||||
|
if err != nil {
|
||||||
|
c.JSON(200, MetaResponse(500, err.Error()))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// delete password
|
||||||
|
for i, _ := range *files {
|
||||||
|
(*files)[i].Password = ""
|
||||||
|
}
|
||||||
|
c.JSON(200, DataResponse(files))
|
||||||
|
}
|
@ -1,11 +1,35 @@
|
|||||||
package controllers
|
package controllers
|
||||||
|
|
||||||
import "github.com/gin-gonic/gin"
|
import (
|
||||||
|
"github.com/Xhofe/alist/server/models"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
)
|
||||||
|
|
||||||
|
type SearchReq struct {
|
||||||
|
Keyword string `json:"keyword" binding:"required"`
|
||||||
|
Dir string `json:"dir" binding:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
func LocalSearch(c *gin.Context) {
|
func LocalSearch(c *gin.Context) {
|
||||||
|
var req SearchReq
|
||||||
|
if err := c.ShouldBindJSON(&req); err != nil {
|
||||||
|
c.JSON(200, MetaResponse(400, "Bad Request:"+err.Error()))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.Debugf("list:%+v", req)
|
||||||
|
files, err := models.SearchByNameInDir(req.Keyword, req.Dir)
|
||||||
|
if err != nil {
|
||||||
|
if files == nil {
|
||||||
|
c.JSON(200, MetaResponse(404, "Path not found."))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.JSON(200, MetaResponse(500, err.Error()))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.JSON(200, DataResponse(files))
|
||||||
}
|
}
|
||||||
|
|
||||||
func GlobalSearch(c *gin.Context) {
|
func GlobalSearch(c *gin.Context) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,15 @@ func Info(c *gin.Context) {
|
|||||||
|
|
||||||
// rebuild tree
|
// rebuild tree
|
||||||
func RebuildTree(c *gin.Context) {
|
func RebuildTree(c *gin.Context) {
|
||||||
|
password := c.Param("password")[1:]
|
||||||
|
if password != conf.Conf.Server.Password {
|
||||||
|
if password == "" {
|
||||||
|
c.JSON(200, MetaResponse(401, "need password."))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.JSON(200, MetaResponse(401, "wrong password."))
|
||||||
|
return
|
||||||
|
}
|
||||||
if err := models.Clear(); err != nil {
|
if err := models.Clear(); err != nil {
|
||||||
c.JSON(200, MetaResponse(500, err.Error()))
|
c.JSON(200, MetaResponse(500, err.Error()))
|
||||||
return
|
return
|
||||||
|
@ -22,16 +22,16 @@ func BuildTree() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
rootFile := File{
|
rootFile := File{
|
||||||
ParentPath: "/",
|
Dir: "",
|
||||||
FileId: conf.Conf.AliDrive.RootFolder,
|
FileId: conf.Conf.AliDrive.RootFolder,
|
||||||
Name: "root",
|
Name: "root",
|
||||||
Type: "folder",
|
Type: "folder",
|
||||||
}
|
}
|
||||||
if err := tx.Create(&rootFile).Error; err != nil {
|
if err := tx.Create(&rootFile).Error; err != nil {
|
||||||
tx.Rollback()
|
tx.Rollback()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := BuildOne(conf.Conf.AliDrive.RootFolder, "/root/", tx, ""); err != nil {
|
if err := BuildOne(conf.Conf.AliDrive.RootFolder, "root/", tx, ""); err != nil {
|
||||||
tx.Rollback()
|
tx.Rollback()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -55,7 +55,7 @@ func BuildOne(parent string, path string, tx *gorm.DB, parentPassword string) er
|
|||||||
password = file.Name[index+10:]
|
password = file.Name[index+10:]
|
||||||
}
|
}
|
||||||
newFile := File{
|
newFile := File{
|
||||||
ParentPath: path,
|
Dir: path,
|
||||||
FileExtension: file.FileExtension,
|
FileExtension: file.FileExtension,
|
||||||
FileId: file.FileId,
|
FileId: file.FileId,
|
||||||
Name: name,
|
Name: name,
|
||||||
|
@ -7,7 +7,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type File struct {
|
type File struct {
|
||||||
ParentPath string `json:"parent_path" gorm:"index"`
|
Dir string `json:"dir" gorm:"index"`
|
||||||
FileExtension string `json:"file_extension"`
|
FileExtension string `json:"file_extension"`
|
||||||
FileId string `json:"file_id"`
|
FileId string `json:"file_id"`
|
||||||
Name string `json:"name" gorm:"index"`
|
Name string `json:"name" gorm:"index"`
|
||||||
@ -27,17 +27,17 @@ func Clear() error {
|
|||||||
return conf.DB.Where("1 = 1").Delete(&File{}).Error
|
return conf.DB.Where("1 = 1").Delete(&File{}).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetFileByParentPathAndName(parentPath, name string) (*File, error) {
|
func GetFileByDirAndName(dir, name string) (*File, error) {
|
||||||
var file File
|
var file File
|
||||||
if err := conf.DB.Where("parent_path = ? AND name = ?", parentPath, name).First(&file).Error; err != nil {
|
if err := conf.DB.Where("dir = ? AND name = ?", dir, name).First(&file).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return &file, nil
|
return &file, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetFilesByParentPath(parentPath string) (*[]File, error) {
|
func GetFilesByDir(dir string) (*[]File, error) {
|
||||||
var files []File
|
var files []File
|
||||||
if err := conf.DB.Where("parent_path = ?", parentPath).Find(&files).Error; err != nil {
|
if err := conf.DB.Where("dir = ?", dir).Find(&files).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return &files, nil
|
return &files, nil
|
||||||
@ -45,15 +45,15 @@ func GetFilesByParentPath(parentPath string) (*[]File, error) {
|
|||||||
|
|
||||||
func SearchByNameGlobal(keyword string) (*[]File, error) {
|
func SearchByNameGlobal(keyword string) (*[]File, error) {
|
||||||
var files []File
|
var files []File
|
||||||
if err := conf.DB.Where("name LIKE ?", fmt.Sprintf("%%%s%%", keyword)).Find(&files).Error; err != nil {
|
if err := conf.DB.Where("name LIKE ? AND password = ''", fmt.Sprintf("%%%s%%", keyword)).Find(&files).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return &files, nil
|
return &files, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func SearchByNameInPath(keyword string, parentPath string) (*[]File, error) {
|
func SearchByNameInDir(keyword string, dir string) (*[]File, error) {
|
||||||
var files []File
|
var files []File
|
||||||
if err := conf.DB.Where("parent_path LIKE ? AND name LIKE ?", fmt.Sprintf("%s%%", parentPath), fmt.Sprintf("%%%s%%", keyword)).Find(&files).Error; err != nil {
|
if err := conf.DB.Where("dir LIKE ? AND name LIKE ? AND password = ''", fmt.Sprintf("%s%%", dir), fmt.Sprintf("%%%s%%", keyword)).Find(&files).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return &files, nil
|
return &files, nil
|
||||||
|
@ -26,10 +26,11 @@ func InitApiRouter(engine *gin.Engine) {
|
|||||||
apiV2.GET("/info", controllers.Info)
|
apiV2.GET("/info", controllers.Info)
|
||||||
apiV2.POST("/list", controllers.List)
|
apiV2.POST("/list", controllers.List)
|
||||||
apiV2.POST("/get", controllers.Get)
|
apiV2.POST("/get", controllers.Get)
|
||||||
|
apiV2.POST("/path", controllers.Path)
|
||||||
apiV2.POST("/office_preview", controllers.OfficePreview)
|
apiV2.POST("/office_preview", controllers.OfficePreview)
|
||||||
apiV2.POST("/local_search", controllers.LocalSearch)
|
apiV2.POST("/local_search", controllers.LocalSearch)
|
||||||
apiV2.POST("/global_search", controllers.GlobalSearch)
|
apiV2.POST("/global_search", controllers.GlobalSearch)
|
||||||
}
|
}
|
||||||
engine.GET("/d/*file", controllers.Down)
|
engine.GET("/d/*path", controllers.Down)
|
||||||
engine.GET("/rebuild", controllers.RebuildTree)
|
engine.GET("/rebuild/*password", controllers.RebuildTree)
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,6 @@ func TestPassword(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestDir(t *testing.T) {
|
func TestDir(t *testing.T) {
|
||||||
dir,file:=filepath.Split("/root/")
|
dir,file:=filepath.Split("root")
|
||||||
fmt.Printf("dir:%s\nfile:%s\n",dir,file)
|
fmt.Printf("dir:%s\nfile:%s\n",dir,file)
|
||||||
}
|
}
|
Reference in New Issue
Block a user