From a0292cd674626f415246e4aae93fe12558786050 Mon Sep 17 00:00:00 2001 From: Qadzif Kamil Zahari <qadzifi@gmail.com> Date: Mon, 6 Dec 2021 20:34:03 +0700 Subject: [PATCH] feat: task post list --- data_struct.go | 13 ++++++ go.mod | 5 +++ go.sum | 2 + main.go | 109 +++++++++++++++++++++++++++++++++++++++++++++---- util.go | 14 +++++++ 5 files changed, 134 insertions(+), 9 deletions(-) create mode 100644 data_struct.go create mode 100644 go.mod create mode 100644 go.sum create mode 100644 util.go diff --git a/data_struct.go b/data_struct.go new file mode 100644 index 0000000..f5a8c2f --- /dev/null +++ b/data_struct.go @@ -0,0 +1,13 @@ +package main + +type Checklist struct { + TaskId int64 `json:"TaskId"` + Status bool `json:"Status"` + Desc string `json:"Desc"` +} + +type Task struct { + Id uint64 `json:"Id"` + Title string `json:"Title"` + Status string `json:"Status"` +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..bae0fff --- /dev/null +++ b/go.mod @@ -0,0 +1,5 @@ +module taskpost/main + +go 1.17 + +require github.com/gorilla/mux v1.8.0 // indirect diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..5350288 --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= diff --git a/main.go b/main.go index 3bbad0f..d2c2a83 100644 --- a/main.go +++ b/main.go @@ -1,21 +1,112 @@ package main import ( - "fmt" - "log" - "net/http" + "encoding/json" + "fmt" + "io/ioutil" + "log" + "net/http" + "strconv" + + "github.com/gorilla/mux" ) -func homePage(w http.ResponseWriter, r *http.Request){ - fmt.Fprintf(w, "Welcome to the HomePage!") - fmt.Println("Endpoint Hit: homePage") +func homePage(w http.ResponseWriter, r *http.Request) { + fmt.Fprintf(w, "Welcome to the HomePage!") + fmt.Println("Endpoint Hit: homePage") +} + +func showCreatePage(w http.ResponseWriter, r *http.Request) { + fmt.Fprintf(w, "Create Task Page") + fmt.Println("Endpoint Hit: createTask") } func handleRequests() { - http.HandleFunc("/", homePage) - log.Fatal(http.ListenAndServe(":10000", nil)) + myRouter := mux.NewRouter().StrictSlash(true) + myRouter.HandleFunc("/", homePage) + myRouter.HandleFunc("/tasklist", returnAllTask) + myRouter.HandleFunc("/task/create", createNewTask).Methods("POST") + myRouter.HandleFunc("/task/create", showCreatePage).Methods("GET") + myRouter.HandleFunc("/task/{id:[0-9]+}", returnSingleTask) + myRouter.HandleFunc("/task/{id:[0-9]+}/checklist", returnTaskCheckList) + myRouter.HandleFunc("/task/{id:[0-9]+}/{status}", changeTaskStatus) + log.Fatal(http.ListenAndServe(":10000", myRouter)) +} + +func returnAllTask(w http.ResponseWriter, r *http.Request) { + json.NewEncoder(w).Encode(Tasklist) +} + +func returnSingleTask(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + key, _ := strconv.ParseUint(vars["id"], 10, 64) + + for _, task := range Tasklist { + if task.Id == key { + json.NewEncoder(w).Encode(task) + } + } +} + +func returnTaskCheckList(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + key, _ := strconv.ParseUint(vars["id"], 10, 64) + checkList := getTaskCheckList(key, []Checklist{}, Checks) + json.NewEncoder(w).Encode(checkList) +} + +func getTaskCheckList(taskId uint64, returnList []Checklist, checkList []Checklist) []Checklist { + for index, check := range Checks { + if check.TaskId == int64(taskId) { + return append(getTaskCheckList(taskId, returnList, checkList[index+1:]), check) + } + } + return returnList +} + +func createNewTask(w http.ResponseWriter, r *http.Request) { + reqBody, _ := ioutil.ReadAll(r.Body) + var task Task + err := json.Unmarshal(reqBody, &task) + if err != nil { + fmt.Println(err) + } + task.Id = FindTaskMaxId(Tasklist) + 1 + task.Status = "waiting" + Tasklist = append(Tasklist, task) + json.NewEncoder(w).Encode(Tasklist) +} + +func changeTaskStatus(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + key, _ := strconv.ParseUint(vars["id"], 10, 64) + status := vars["status"] + + for index, task := range Tasklist { + if task.Id == key { + task.Status = status + Tasklist[index] = task + json.NewEncoder(w).Encode(task) + } + } } func main() { - handleRequests() + handleRequests() +} + +var Tasklist = []Task{ + { + Id: 1, + Title: "Judul 1", + Status: "waiting", + }, +} + +var Checks = []Checklist{ + { + TaskId: 1, + Status: false, + Desc: "Check 1", + }, } diff --git a/util.go b/util.go new file mode 100644 index 0000000..79c059c --- /dev/null +++ b/util.go @@ -0,0 +1,14 @@ +package main + +func FindTaskMaxId(tasks []Task) uint64 { + if len(tasks) == 0 { + return 0 + } + if len(tasks) == 1 { + return tasks[0].Id + } + if tasks[0].Id > tasks[1].Id { + return FindTaskMaxId(append(tasks[2:], tasks[0])) + } + return FindTaskMaxId(append(tasks[2:], tasks[1])) +} -- GitLab