todo-server/server/ajax/task.go

136 lines
3.2 KiB
Go

package ajax
import (
"encoding/json"
"errors"
"fmt"
"local/todo-server/server/ajax/form"
"local/todo-server/server/ajax/task"
"net/http"
"strings"
)
func (a *Ajax) loadTasks(w http.ResponseWriter, r *http.Request) error {
listID, _, _ := a.Cur(r)
filterComplete := func(t *task.Task) bool {
if form.Get(r, "compl") == "" {
return true
}
return t.Complete == (form.Get(r, "compl") != "0")
}
filterTags := func(t *task.Task) bool {
if form.Get(r, "t") == "" {
return true
}
whitelistTags := form.ToStrArr(form.Get(r, "t"))
if len(whitelistTags) == 0 {
return true
}
whitelistTagMap := make(map[string]struct{})
for _, tag := range whitelistTags {
whitelistTagMap[tag] = struct{}{}
}
for _, tag := range t.Tags {
if _, ok := whitelistTagMap[tag]; ok {
return true
}
}
return false
}
filterSubstr := func(t *task.Task) bool {
substr := form.Get(r, "s")
return substr == "" || strings.Contains(fmt.Sprintf("%+v", t), substr)
}
tasks, err := a.storageListTasks(listID, filterComplete, filterTags, filterSubstr)
if err != nil {
return err
}
return json.NewEncoder(w).Encode(map[string]interface{}{"list": tasks})
}
func (a *Ajax) newTask(w http.ResponseWriter, r *http.Request) error {
listID, newTask, err := a.makeTask(r)
if err != nil {
return err
}
if err := a.storageSetTask(listID, newTask); err != nil {
return err
}
return json.NewEncoder(w).Encode(map[string]interface{}{
"total": 1,
"list": []*task.Task{newTask},
})
}
func (a *Ajax) makeTask(r *http.Request) (string, *task.Task, error) {
listID, _, tags := a.Cur(r)
task, err := task.New(r)
if err != nil {
return "", nil, err
}
task.AppendTags(tags)
return listID, task, nil
}
func (a *Ajax) deleteTask(w http.ResponseWriter, r *http.Request) error {
_, taskID, _ := a.Cur(r)
return a.storageDelTask(taskID)
}
func (a *Ajax) completeTask(w http.ResponseWriter, r *http.Request) error {
listID, taskID, _ := a.Cur(r)
task, err := a.storageGetTask(taskID)
if err != nil {
return err
}
task.SetComplete(form.Get(r, "compl") == "1")
return a.storageSetTask(listID, task)
}
func (a *Ajax) editNote(w http.ResponseWriter, r *http.Request) error {
listID, taskID, _ := a.Cur(r)
task, err := a.storageGetTask(taskID)
if err != nil {
return err
}
task.SetNote(form.Get(r, "note"))
return a.storageSetTask(listID, task)
}
func (a *Ajax) editTask(w http.ResponseWriter, r *http.Request) error {
listID, task, err := a.makeTask(r)
if err != nil {
return err
}
_, taskID, _ := a.Cur(r)
task.UUID = taskID
return a.storageSetTask(listID, task)
}
func (a *Ajax) setPrio(w http.ResponseWriter, r *http.Request) error {
listID, taskID, _ := a.Cur(r)
task, err := a.storageGetTask(taskID)
if err != nil {
return err
}
task.SetPrio(form.ToInt(form.Get(r, "prio")))
return a.storageSetTask(listID, task)
}
func (a *Ajax) moveTask(w http.ResponseWriter, r *http.Request) error {
_, taskID, _ := a.Cur(r)
toList := form.Get(r, "to")
task, err := a.storageGetTask(taskID)
if err != nil {
return err
}
if err := a.storageDelTask(taskID); err != nil {
return err
}
return a.storageSetTask(toList, task)
}
func (a *Ajax) parseTaskStr(w http.ResponseWriter, r *http.Request) error {
return errors.New("not impl")
}