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