|
package handles |
|
|
|
import ( |
|
"context" |
|
|
|
"github.com/alist-org/alist/v3/internal/conf" |
|
"github.com/alist-org/alist/v3/internal/model" |
|
"github.com/alist-org/alist/v3/internal/search" |
|
"github.com/alist-org/alist/v3/internal/setting" |
|
"github.com/alist-org/alist/v3/server/common" |
|
"github.com/gin-gonic/gin" |
|
log "github.com/sirupsen/logrus" |
|
) |
|
|
|
type UpdateIndexReq struct { |
|
Paths []string `json:"paths"` |
|
MaxDepth int `json:"max_depth"` |
|
|
|
} |
|
|
|
func BuildIndex(c *gin.Context) { |
|
if search.Running.Load() { |
|
common.ErrorStrResp(c, "index is running", 400) |
|
return |
|
} |
|
go func() { |
|
ctx := context.Background() |
|
err := search.Clear(ctx) |
|
if err != nil { |
|
log.Errorf("clear index error: %+v", err) |
|
return |
|
} |
|
err = search.BuildIndex(context.Background(), []string{"/"}, |
|
conf.SlicesMap[conf.IgnorePaths], setting.GetInt(conf.MaxIndexDepth, 20), true) |
|
if err != nil { |
|
log.Errorf("build index error: %+v", err) |
|
} |
|
}() |
|
common.SuccessResp(c) |
|
} |
|
|
|
func UpdateIndex(c *gin.Context) { |
|
var req UpdateIndexReq |
|
if err := c.ShouldBind(&req); err != nil { |
|
common.ErrorResp(c, err, 400) |
|
return |
|
} |
|
if search.Running.Load() { |
|
common.ErrorStrResp(c, "index is running", 400) |
|
return |
|
} |
|
if !search.Config(c).AutoUpdate { |
|
common.ErrorStrResp(c, "update is not supported for current index", 400) |
|
return |
|
} |
|
go func() { |
|
ctx := context.Background() |
|
for _, path := range req.Paths { |
|
err := search.Del(ctx, path) |
|
if err != nil { |
|
log.Errorf("delete index on %s error: %+v", path, err) |
|
return |
|
} |
|
} |
|
err := search.BuildIndex(context.Background(), req.Paths, |
|
conf.SlicesMap[conf.IgnorePaths], req.MaxDepth, false) |
|
if err != nil { |
|
log.Errorf("update index error: %+v", err) |
|
} |
|
}() |
|
common.SuccessResp(c) |
|
} |
|
|
|
func StopIndex(c *gin.Context) { |
|
if !search.Running.Load() { |
|
common.ErrorStrResp(c, "index is not running", 400) |
|
return |
|
} |
|
search.Quit <- struct{}{} |
|
common.SuccessResp(c) |
|
} |
|
|
|
func ClearIndex(c *gin.Context) { |
|
if search.Running.Load() { |
|
common.ErrorStrResp(c, "index is running", 400) |
|
return |
|
} |
|
search.Clear(c) |
|
search.WriteProgress(&model.IndexProgress{ |
|
ObjCount: 0, |
|
IsDone: true, |
|
LastDoneTime: nil, |
|
Error: "", |
|
}) |
|
common.SuccessResp(c) |
|
} |
|
|
|
func GetProgress(c *gin.Context) { |
|
progress, err := search.Progress() |
|
if err != nil { |
|
common.ErrorResp(c, err, 500) |
|
return |
|
} |
|
common.SuccessResp(c, progress) |
|
} |
|
|