finished tag implementation

This commit is contained in:
ston1th 2019-08-24 14:27:58 +02:00
commit c3076c328a
28 changed files with 396 additions and 296 deletions

View file

@ -174,49 +174,45 @@ func rawHandler(ctx *Context) {
http.ServeContent(ctx.Response, ctx.Request, fi.Name(), fi.ModTime(), f)
}
func scanFile(ctx *Context, path string) (err error) {
err = ctx.Srv.FS.AddScan(path)
if err != nil {
return
}
go func() {
defer ctx.Srv.FS.RemoveScan(path)
l := ctx.Srv.FS.Log
file, txt, err := ctx.Srv.Scanner.Scan(path)
if err != nil {
l.Printf("scanner: %s: %s", path, err)
return
}
t, err := ctx.Srv.DB.GetAllTags()
if err != nil {
l.Printf("getTags: %s: %s", path, err)
}
found := tags.Find(txt, t)
id, err := ctx.Srv.DB.Index.Add(txt, found)
if err != nil {
l.Printf("index: %s: %s", path, err)
return
}
err = ctx.Srv.DB.NewFile(id, file, found)
if err != nil {
l.Printf("newFile: %s: %s", path, err)
}
}()
return
}
func indexHandler(ctx *Context) {
path := strings.TrimPrefix(ctx.Path(), core.IndexPrefix)
switch ctx.Method() {
case "GET":
earlyErr := make(chan error)
go func() {
err := ctx.Srv.FS.AddScan(path)
if err != nil {
select {
case earlyErr <- err:
default:
}
return
}
defer ctx.Srv.FS.RemoveScan(path)
file, txt, err := ctx.Srv.Scanner.Scan(path)
if err != nil {
select {
case earlyErr <- err:
default:
}
log.Printf("scanner: %s: %s", path, err)
return
}
t, err := ctx.Srv.DB.GetAllTags()
if err != nil {
log.Printf("getTags: %s: %s", path, err)
}
found := tags.Find(txt, t)
id, err := ctx.Srv.DB.Index.Add(txt, found)
if err != nil {
log.Printf("index: %s: %s", path, err)
return
}
err = ctx.Srv.DB.NewFile(id, file, found)
if err != nil {
log.Printf("newFile: %s: %s", path, err)
}
}()
err := scanFile(ctx, path)
p, _ := filepath.Split(path)
p = filepath.Dir(p)
select {
case err := <-earlyErr:
if err != nil {
ctx.Template("iseHandler")
ctx.Data = webData{
Data: template.HTML(strings.ReplaceAll(err.Error(), "\n", "<br>")),
@ -225,7 +221,6 @@ func indexHandler(ctx *Context) {
ctx.Status(http.StatusInternalServerError)
ctx.Exec()
return
case <-time.After(time.Second):
}
ctx.Redirect(p, http.StatusFound)
}
@ -383,7 +378,7 @@ func deleteHandler(ctx *Context) {
clean := ctx.Form("clean")
if clean == "true" {
f := fs.Clean(path)
id, err := ctx.Srv.DB.DeleteFile(f)
id, _, err := ctx.Srv.DB.DeleteFile(f)
if err != nil {
log.Printf("db: delete: %s %s", f, err)
}
@ -405,7 +400,7 @@ func deleteHandler(ctx *Context) {
return
}
for _, f := range files {
id, err := ctx.Srv.DB.DeleteFile(f)
id, _, err := ctx.Srv.DB.DeleteFile(f)
if err != nil {
log.Printf("db: delete: %s %s", f, err)
}
@ -581,11 +576,7 @@ func searchHandler(ctx *Context) {
ctx.Error(err)
return
}
err = ctx.Srv.DB.GetPaths(res)
if err != nil {
ctx.Error(err)
return
}
ctx.Srv.DB.GetPaths(res)
ctx.Data.Data = res
ctx.Exec()
}
@ -693,71 +684,117 @@ func userTotpHandler(ctx *Context) {
}
}
func logsHandler(ctx *Context) {
ctx.Template("logsHandler")
ctx.Data = webData{
Title: "Scan Logs",
BodyTitle: "Scan Logs",
}
switch ctx.Method() {
case "GET":
ctx.Data.Data = ctx.Srv.FS.Log.Logs()
ctx.Exec()
}
}
func tagsHandler(ctx *Context) {
ctx.Template("tagsHandler")
ctx.Data = webData{
Title: "Tags",
BodyTitle: "Tags",
}
t, err := ctx.Srv.DB.GetAllTags()
if err != nil {
ctx.Error(err)
return
}
ctx.Data.Data = t
switch ctx.Method() {
case "GET":
t, err := ctx.Srv.DB.GetAllTags()
if err != nil {
ctx.Error(err)
return
}
ctx.Data.Data = t
ctx.Exec()
}
}
func tagsNewHandler(ctx *Context) {
ctx.Template("tagsNewHandler")
ctx.Data = webData{
Title: "New Tag",
BodyTitle: "New Tag",
}
switch ctx.Method() {
case "GET":
ctx.Data.Data = core.Tag{}
ctx.Exec()
case "POST":
if !ctx.CheckXsrf() {
return
}
var t core.Tag
t.Name = ctx.Form("name")
t.Regex = ctx.Form("regex")
ctx.Data.Data = t
if t.Name == "" {
ctx.Error("name cannot be empty")
return
}
if t.Regex == "" {
ctx.Error("regex cannot be empty")
return
}
if err := ctx.Srv.DB.NewTag(t.Name, t.Regex); err != nil {
ctx.Error(err)
return
}
log.Printf("tag %s created by: %s\n", t.Name, ctx.User())
ctx.Redirect(core.TagsURI, http.StatusFound)
}
}
func tagsEditHandler(ctx *Context) {
ctx.Template("tagsEditHandler")
ctx.Data = webData{
Title: "Edit User",
BodyTitle: "Edit User",
Title: "Edit Tag",
BodyTitle: "Edit Tag",
}
u, err := ctx.Srv.DB.GetUserWithoutPassword()
if err != nil {
ctx.Error(err)
return
}
ctx.Data.Data = u
name := ctx.Var("tag")
switch ctx.Method() {
case "GET":
t, err := ctx.Srv.DB.GetTags(name)
if err != nil {
ctx.Error(err)
return
}
ctx.Data.Data = t
ctx.Exec()
case "POST":
if !ctx.CheckXsrf() {
return
}
password := ctx.Form("password")
repeat := ctx.Form("repeat")
if password != repeat {
ctx.Error("passwords do not match")
var t core.Tag
t.Name = name
t.Regex = ctx.Form("regex")
ctx.Data.Data = t
if t.Regex == "" {
ctx.Error("regex cannot be empty")
return
}
if err := ctx.Srv.DB.UpdateUserPassword(password); err != nil {
if err := ctx.Srv.DB.NewTag(t.Name, t.Regex); err != nil {
ctx.Error(err)
return
}
log.Printf("update: %s updated\n", ctx.User())
ctx.Redirect(core.IndexURI, http.StatusFound)
log.Printf("tag %s updated by: %s\n", t.Name, ctx.User())
ctx.Redirect(core.TagsURI, http.StatusFound)
}
}
func tagsDelHandler(ctx *Context) {
ctx.Template("tagsDelHandler")
ctx.Data = webData{
Title: "Edit User",
BodyTitle: "Edit User",
Title: "Delete Tag",
BodyTitle: "Delete Tag",
}
u, err := ctx.Srv.DB.GetUserWithoutPassword()
if err != nil {
ctx.Error(err)
return
}
ctx.Data.Data = u
name := ctx.Var("tag")
ctx.Data.Data = name
switch ctx.Method() {
case "GET":
ctx.Exec()
@ -765,19 +802,12 @@ func tagsDelHandler(ctx *Context) {
if !ctx.CheckXsrf() {
return
}
password := ctx.Form("password")
repeat := ctx.Form("repeat")
if password != repeat {
ctx.Error("passwords do not match")
return
}
if err := ctx.Srv.DB.UpdateUserPassword(password); err != nil {
if err := ctx.Srv.DB.DeleteTag(name); err != nil {
ctx.Error(err)
return
}
log.Printf("update: %s updated\n", ctx.User())
ctx.Redirect(core.IndexURI, http.StatusFound)
log.Printf("tag %s deleted by: %s\n", name, ctx.User())
ctx.Redirect(core.TagsURI, http.StatusFound)
}
}