148 lines
3.4 KiB
Go
148 lines
3.4 KiB
Go
package main
|
|
|
|
import (
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
"sort"
|
|
"strconv"
|
|
|
|
"github.com/zepyrshut/hrender"
|
|
)
|
|
|
|
type TodoList struct {
|
|
ID int
|
|
Name string
|
|
Completed bool
|
|
}
|
|
|
|
var todoList = []TodoList{
|
|
{
|
|
ID: 1,
|
|
Name: "Sacar a la perra",
|
|
Completed: false,
|
|
},
|
|
{
|
|
ID: 2,
|
|
Name: "Limpiar la casa",
|
|
Completed: false,
|
|
},
|
|
{
|
|
ID: 3,
|
|
Name: "Ir al supermercado",
|
|
Completed: false,
|
|
},
|
|
}
|
|
|
|
func main() {
|
|
templatesFS := os.DirFS("./templates")
|
|
|
|
h := hrender.NewHTMLRender(templatesFS, false)
|
|
|
|
mux := http.NewServeMux()
|
|
mux.Handle("GET /", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
w.Header().Set(hrender.ContentType, hrender.ContentTextHTMLUTF8)
|
|
err := h.Render(w, "pages/index", hrender.H{})
|
|
if err != nil {
|
|
http.Error(w, "error loading template", http.StatusInternalServerError)
|
|
}
|
|
}))
|
|
|
|
mux.Handle("GET /todo", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
w.Header().Set(hrender.ContentType, hrender.ContentTextHTMLUTF8)
|
|
|
|
sort.Slice(todoList, func(i, j int) bool {
|
|
return todoList[i].ID > todoList[j].ID
|
|
})
|
|
|
|
err := h.Render(w, "fragments/todo-widget", hrender.H{
|
|
"TodoList": todoList,
|
|
})
|
|
if err != nil {
|
|
http.Error(w, "error loading template", http.StatusInternalServerError)
|
|
}
|
|
}))
|
|
|
|
mux.Handle("GET /todo/new", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
w.Header().Set(hrender.ContentType, hrender.ContentTextHTMLUTF8)
|
|
err := h.Render(w, "fragments/todo-row-edit", hrender.H{})
|
|
if err != nil {
|
|
http.Error(w, "error loading template", http.StatusInternalServerError)
|
|
}
|
|
}))
|
|
|
|
mux.Handle("POST /todo", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
err := r.ParseForm()
|
|
if err != nil {
|
|
http.Error(w, "bad request", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
newID := 0
|
|
sort.Slice(todoList, func(i, j int) bool {
|
|
return todoList[i].ID > todoList[j].ID
|
|
})
|
|
newID = todoList[0].ID + 1
|
|
|
|
log.Println(todoList[len(todoList)-1].ID)
|
|
log.Println(todoList)
|
|
|
|
newItem := TodoList{
|
|
ID: newID,
|
|
Name: r.FormValue("name"),
|
|
Completed: false,
|
|
}
|
|
|
|
todoList = append(todoList, newItem)
|
|
|
|
w.Header().Set(hrender.ContentType, hrender.ContentTextHTMLUTF8)
|
|
err = h.Render(w, "fragments/todo-row", hrender.H{
|
|
"ID": newID,
|
|
"Name": newItem.Name,
|
|
"Completed": false,
|
|
})
|
|
if err != nil {
|
|
http.Error(w, "error loading template", http.StatusInternalServerError)
|
|
}
|
|
}))
|
|
|
|
mux.Handle("PATCH /todo/{id}/completed", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
idStr := r.PathValue("id")
|
|
id, err := strconv.Atoi(idStr)
|
|
if err != nil {
|
|
http.Error(w, "invalid id", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
var foundItem *TodoList
|
|
for i := range todoList {
|
|
if todoList[i].ID == id {
|
|
todoList[i].Completed = true
|
|
foundItem = &todoList[i]
|
|
break
|
|
}
|
|
}
|
|
|
|
if foundItem == nil {
|
|
http.Error(w, "item not found", http.StatusNotFound)
|
|
return
|
|
}
|
|
|
|
w.Header().Set(hrender.ContentType, hrender.ContentTextHTMLUTF8)
|
|
err = h.Render(w, "fragments/todo-row", hrender.H{
|
|
"ID": foundItem.ID,
|
|
"Name": foundItem.Name,
|
|
"Completed": true,
|
|
})
|
|
if err != nil {
|
|
http.Error(w, "error loading template", http.StatusInternalServerError)
|
|
}
|
|
}))
|
|
|
|
log.Println("server started on port 8080")
|
|
err := http.ListenAndServe(":8080", mux)
|
|
if err != nil {
|
|
panic("server cannot start")
|
|
}
|
|
}
|