From b2c5b7befcbce47fe46ccab6231a93f8fa34cb26 Mon Sep 17 00:00:00 2001 From: Nichelle A Hall Date: Mon, 20 Jun 2016 17:14:54 -0700 Subject: [PATCH 01/27] This is the list.go file that will list all tasks in the csv file. --- todo-app/list.go | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 todo-app/list.go diff --git a/todo-app/list.go b/todo-app/list.go new file mode 100644 index 0000000..46deb42 --- /dev/null +++ b/todo-app/list.go @@ -0,0 +1,39 @@ +package main + + import ( + "encoding/csv" + "fmt" + "os" + ) + + func main() { + + csvfile, err := os.Open("somecsvfile.csv") + + if err != nil { + fmt.Println(err) + return + } + + defer csvfile.Close() + + reader := csv.NewReader(csvfile) + + reader.FieldsPerRecord = -1 // see the Reader struct information below + + rawCSVdata, err := reader.ReadAll() + + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + // sanity check, display to standard output + for _, each := range rawCSVdata { + status := "unchecked" + if(each[1]){ // each[1] will be the status - either true or false + status = "checked" + } + fmt.Fprintln("ID: %s , Status : %s , Date Added: %s , Date Due: %s , Task: %s", each[0], status, each[2], each[3], each[4]) + } + } \ No newline at end of file From 06be104f91d40093f7ad7000c74ab532d85a7d28 Mon Sep 17 00:00:00 2001 From: kindermoumoute Date: Mon, 20 Jun 2016 17:21:22 -0700 Subject: [PATCH 02/27] Added base files Now you can play --- simple-rest-server/delete.go | 12 ++++++++++++ simple-rest-server/get.go | 16 ++++++++++++++++ simple-rest-server/main.go | 20 ++++---------------- simple-rest-server/post.go | 12 ++++++++++++ simple-rest-server/put.go | 1 + 5 files changed, 45 insertions(+), 16 deletions(-) create mode 100644 simple-rest-server/delete.go create mode 100644 simple-rest-server/get.go create mode 100644 simple-rest-server/post.go create mode 100644 simple-rest-server/put.go diff --git a/simple-rest-server/delete.go b/simple-rest-server/delete.go new file mode 100644 index 0000000..2b03f94 --- /dev/null +++ b/simple-rest-server/delete.go @@ -0,0 +1,12 @@ +package main + +import ( + "fmt" + "net/http" + + "github.com/julienschmidt/httprouter" +) + +func DeleteTask(respWriter http.ResponseWriter, request *http.Request, params httprouter.Params) { + fmt.Fprintf(respWriter, "Show Details for ToDo '%s'\n", params.ByName("todelete")) +} diff --git a/simple-rest-server/get.go b/simple-rest-server/get.go new file mode 100644 index 0000000..17f831d --- /dev/null +++ b/simple-rest-server/get.go @@ -0,0 +1,16 @@ +package main + +import ( + "fmt" + "net/http" + + "github.com/julienschmidt/httprouter" +) + +func ListTask(respWriter http.ResponseWriter, request *http.Request, params httprouter.Params) { + fmt.Fprintf(respWriter, "Show Details for ToDo") +} + +func SearchTask(respWriter http.ResponseWriter, request *http.Request, params httprouter.Params) { + fmt.Fprintf(respWriter, "Show Details for ToDo\n") +} diff --git a/simple-rest-server/main.go b/simple-rest-server/main.go index 3394dde..93deff4 100644 --- a/simple-rest-server/main.go +++ b/simple-rest-server/main.go @@ -1,30 +1,18 @@ package main import ( - "fmt" "log" "net/http" "github.com/julienschmidt/httprouter" ) -func Index(respWriter http.ResponseWriter, request *http.Request, _ httprouter.Params) { - fmt.Fprintln(respWriter, "ToDo RESTful App") -} - -func TodoIndex(respWriter http.ResponseWriter, request *http.Request, _ httprouter.Params) { - fmt.Fprintln(respWriter, "Return ToDo List") -} - -func TodoShow(respWriter http.ResponseWriter, request *http.Request, params httprouter.Params) { - fmt.Fprintf(respWriter, "Show Details for ToDo '%s'\n", params.ByName("todoId")) -} - func main() { router := httprouter.New() - router.GET("/", Index) - router.GET("/todos", TodoIndex) - router.GET("/todos/:todoId", TodoShow) + router.GET("/search", SearchTask) + router.GET("/list", ListTask) + router.POST("/add/:toadd", AddTask) + router.DELETE("/delete/:todelete", DeleteTask) log.Fatal(http.ListenAndServe(":8080", router)) } diff --git a/simple-rest-server/post.go b/simple-rest-server/post.go new file mode 100644 index 0000000..66e1274 --- /dev/null +++ b/simple-rest-server/post.go @@ -0,0 +1,12 @@ +package main + +import ( + "fmt" + "net/http" + + "github.com/julienschmidt/httprouter" +) + +func AddTask(respWriter http.ResponseWriter, request *http.Request, params httprouter.Params) { + fmt.Fprintf(respWriter, "Show Details for ToDo '%s'\n", params.ByName("todelete")) +} diff --git a/simple-rest-server/put.go b/simple-rest-server/put.go new file mode 100644 index 0000000..85f0393 --- /dev/null +++ b/simple-rest-server/put.go @@ -0,0 +1 @@ +package main \ No newline at end of file From ab3025c826003ca1257a84cac3744f887630ac33 Mon Sep 17 00:00:00 2001 From: Nichelle A Hall Date: Mon, 20 Jun 2016 17:49:11 -0700 Subject: [PATCH 03/27] updated get gile to include the list function --- simple-rest-server/get.go | 32 ++++++++++++++++++++++++++++++-- todo-app/list.go | 39 --------------------------------------- 2 files changed, 30 insertions(+), 41 deletions(-) delete mode 100644 todo-app/list.go diff --git a/simple-rest-server/get.go b/simple-rest-server/get.go index 17f831d..6921f87 100644 --- a/simple-rest-server/get.go +++ b/simple-rest-server/get.go @@ -3,12 +3,40 @@ package main import ( "fmt" "net/http" - + "os" + "encoding/csv" "github.com/julienschmidt/httprouter" ) func ListTask(respWriter http.ResponseWriter, request *http.Request, params httprouter.Params) { - fmt.Fprintf(respWriter, "Show Details for ToDo") + csvfile, err := os.Open("tasks.csv") + + if err != nil { + fmt.Println(err) + return + } + + defer csvfile.Close() + + reader := csv.NewReader(csvfile) + + reader.FieldsPerRecord = -1 + + rawCSVdata, err := reader.ReadAll() + + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + // sanity check, display to standard output + for _, each := range rawCSVdata { + status := "unchecked" + if each[1] == "true" { // each[1] will be the status - either true or false + status = "checked" + } + fmt.Fprintln(respWriter,"ID:", each[0], "Status :", status, "Date Added:", each[2], "Date Due:", each[3], "Task:", each[4]) + } } func SearchTask(respWriter http.ResponseWriter, request *http.Request, params httprouter.Params) { diff --git a/todo-app/list.go b/todo-app/list.go deleted file mode 100644 index 46deb42..0000000 --- a/todo-app/list.go +++ /dev/null @@ -1,39 +0,0 @@ -package main - - import ( - "encoding/csv" - "fmt" - "os" - ) - - func main() { - - csvfile, err := os.Open("somecsvfile.csv") - - if err != nil { - fmt.Println(err) - return - } - - defer csvfile.Close() - - reader := csv.NewReader(csvfile) - - reader.FieldsPerRecord = -1 // see the Reader struct information below - - rawCSVdata, err := reader.ReadAll() - - if err != nil { - fmt.Println(err) - os.Exit(1) - } - - // sanity check, display to standard output - for _, each := range rawCSVdata { - status := "unchecked" - if(each[1]){ // each[1] will be the status - either true or false - status = "checked" - } - fmt.Fprintln("ID: %s , Status : %s , Date Added: %s , Date Due: %s , Task: %s", each[0], status, each[2], each[3], each[4]) - } - } \ No newline at end of file From 233827f8d7d0d7af952eb1d1c561cec70751ba60 Mon Sep 17 00:00:00 2001 From: Christina Nguyen Date: Mon, 20 Jun 2016 18:01:13 -0700 Subject: [PATCH 04/27] .gitignore added --- .gitignore | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4ed51ad --- /dev/null +++ b/.gitignore @@ -0,0 +1,36 @@ +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test +.idea +tmp/ +*.tmp +scratch/ +build/ +*.swp +profile.cov +gin-bin + +# we don't vendor godep _workspace +**/Godeps/_workspace/** + +# OSX stuff +.DS_Store From 8cb699a712e5abf97fd4a953697e18af19473e78 Mon Sep 17 00:00:00 2001 From: kindermoumoute Date: Tue, 21 Jun 2016 00:07:15 -0700 Subject: [PATCH 05/27] Updated main.go We don't need to get any value from the path. --- simple-rest-server/main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/simple-rest-server/main.go b/simple-rest-server/main.go index 93deff4..d9dc793 100644 --- a/simple-rest-server/main.go +++ b/simple-rest-server/main.go @@ -11,8 +11,8 @@ func main() { router := httprouter.New() router.GET("/search", SearchTask) router.GET("/list", ListTask) - router.POST("/add/:toadd", AddTask) - router.DELETE("/delete/:todelete", DeleteTask) + router.POST("/add", AddTask) + router.DELETE("/delete", DeleteTask) log.Fatal(http.ListenAndServe(":8080", router)) } From 2bfcce1d09e98726eebbd8df378b28a500f326f2 Mon Sep 17 00:00:00 2001 From: Christina Nguyen Date: Tue, 21 Jun 2016 09:16:18 -0700 Subject: [PATCH 06/27] Added simple-rest-server to .gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 4ed51ad..ad8410d 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,6 @@ gin-bin # OSX stuff .DS_Store + +# Default name of executable +simple-rest-server/simple-rest-server From df9ce3c8203396515f9d1b83911c9a1419a4264b Mon Sep 17 00:00:00 2001 From: Christina Nguyen Date: Tue, 21 Jun 2016 09:23:46 -0700 Subject: [PATCH 07/27] testing --- test | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test diff --git a/test b/test new file mode 100644 index 0000000..e69de29 From f2e086d92ee7ece373b6287116820b9c9dc145dc Mon Sep 17 00:00:00 2001 From: Christina Nguyen Date: Tue, 21 Jun 2016 09:34:17 -0700 Subject: [PATCH 08/27] Removed test file --- test | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 test diff --git a/test b/test deleted file mode 100644 index e69de29..0000000 From a7b543818c832dfd7fc5d9c85d314af1dff7b04d Mon Sep 17 00:00:00 2001 From: zachary-trudo Date: Tue, 21 Jun 2016 10:30:58 -0700 Subject: [PATCH 09/27] Added checkout.go with associated funciton. Also added a 'getIndexByTaskID function' will probably move to main.go --- simple-rest-server/checkout.go | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 simple-rest-server/checkout.go diff --git a/simple-rest-server/checkout.go b/simple-rest-server/checkout.go new file mode 100644 index 0000000..6e95184 --- /dev/null +++ b/simple-rest-server/checkout.go @@ -0,0 +1,27 @@ +package main + +import ( + "encoding/csv" + "errors" + "fmt" +) + +func getIndexByTaskID(taskID string, csv [][]string) (index int, err error) { + for i, line := range csv { + if taskID == line[0] { + index = i + return + } + } + err = error.New("GetIndexByTaskID: TaskID " + taskID + " Not Found.") + index = -1 +} + +func checkTaskAsComplete(taskID string, csv [][]string) (err error) { + index, err = getIndexByTaskID(taskID, csv) + if err != nil { + log.Println(err) + return err + } + csv[index][1] = 1 +} From c95f5f793ca3a91c1ffbf9e483cfd5bc742a470e Mon Sep 17 00:00:00 2001 From: zachary-trudo Date: Tue, 21 Jun 2016 11:23:46 -0700 Subject: [PATCH 10/27] Updated function for use with Olivier's future changes. --- simple-rest-server/checkout.go | 26 +++++++++++--------------- simple-rest-server/main.go | 16 ++++++++++++++++ 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/simple-rest-server/checkout.go b/simple-rest-server/checkout.go index 6e95184..c3f732c 100644 --- a/simple-rest-server/checkout.go +++ b/simple-rest-server/checkout.go @@ -6,22 +6,18 @@ import ( "fmt" ) -func getIndexByTaskID(taskID string, csv [][]string) (index int, err error) { - for i, line := range csv { - if taskID == line[0] { - index = i - return - } - } - err = error.New("GetIndexByTaskID: TaskID " + taskID + " Not Found.") - index = -1 -} - -func checkTaskAsComplete(taskID string, csv [][]string) (err error) { - index, err = getIndexByTaskID(taskID, csv) +func checkTaskAsComplete(taskID string) (err error) { + // Get the index. + index, err = getIndexByTaskID(taskID) if err != nil { log.Println(err) - return err + return } - csv[index][1] = 1 + + // Lock the tasks. + accessTasks.Lock() + defer accessTasks.Unlock() + + // Set the task to checked. + allTasks.checked = true } diff --git a/simple-rest-server/main.go b/simple-rest-server/main.go index d9dc793..5ecb1c6 100644 --- a/simple-rest-server/main.go +++ b/simple-rest-server/main.go @@ -7,6 +7,22 @@ import ( "github.com/julienschmidt/httprouter" ) +func getIndexByTaskID(taskID string) (index int, err error) { + accessTasks.Lock() + defer accesTasks.Unlock() + + // Search for the taskID and return the index. + for i, line := range allTask { + if taskID == line.ID { + index = i + return + } + } + // We didn't find the task ID - return an error and set the index to -1... + err = error.New("GetIndexByTaskID: TaskID " + taskID + " Not Found.") + index = -1 +} + func main() { router := httprouter.New() router.GET("/search", SearchTask) From 19475a7c8b88966916eb2f49be966fba89ad7266 Mon Sep 17 00:00:00 2001 From: kindermoumoute Date: Tue, 21 Jun 2016 11:26:39 -0700 Subject: [PATCH 11/27] Add Handler + simultaneous access + Task global struct The global struct allow to access the datas without opening the CSV file. Also added the function saveCSV() to automatically save the global struct into the CSV - by default every minutes. Added the `accessTasks` ressource to avoid simultaneous access to the global struct. Added the `Add` Handler for the REST API. --- simple-rest-server/main.go | 70 ++++++++++++++++++++++++++++++++++++++ simple-rest-server/post.go | 24 +++++++++++-- 2 files changed, 92 insertions(+), 2 deletions(-) diff --git a/simple-rest-server/main.go b/simple-rest-server/main.go index d9dc793..b47536d 100644 --- a/simple-rest-server/main.go +++ b/simple-rest-server/main.go @@ -1,13 +1,65 @@ package main import ( + "encoding/csv" + "fmt" + "io/ioutil" "log" "net/http" + "os" + "sync" + "time" "github.com/julienschmidt/httprouter" ) +type Task struct { + ID int + Checked bool `json:"checked"` + TimeAdded time.Time `json:"time_added"` + Deadline time.Time `json:"deadline"` + Task string `json:"task"` +} + +var ( + allTasks []Task + accessTasks = &sync.Mutex{} +) + +const ( + timeFormat = time.RFC3339 +) + func main() { + + // Loading the csv file into the RAM + csvfile, err := os.Open("tasks.csv") + panic(err) + rawCSVdata, err := csv.NewReader(csvfile).ReadAll() + panic(err) + + for i, each := range rawCSVdata { + timeAdded, err := time.Parse(timeFormat, each[2]) + panic(err) + deadline, err := time.Parse(timeFormat, each[3]) + panic(err) + status := false + if each[1] == "true" { + status = true + } + allTasks = append(allTasks, Task{ID: i, Task: each[4], TimeAdded: timeAdded, Deadline: deadline, Checked: status}) + } + + // Autosave every minutes + csvfile.Close() + go func() { + for { + saveCSV() + time.Sleep(1 * time.Minute) + } + }() + + // Start the API router := httprouter.New() router.GET("/search", SearchTask) router.GET("/list", ListTask) @@ -16,3 +68,21 @@ func main() { log.Fatal(http.ListenAndServe(":8080", router)) } + +func saveCSV() { + myString := "" + accessTasks.Lock() + for _, each := range allTasks { + myString += fmt.Sprintf("%v,%v,%v,%v,\"%v\"\n", each.ID, each.Checked, each.TimeAdded.Format(timeFormat), each.Deadline.Format(timeFormat), each.Task) + } + ioutil.WriteFile("tasks.csv", []byte(myString), 0644) + accessTasks.Unlock() +} + +func panic(err error) { + if err != nil { + // Maybe change to log later + fmt.Println(err) + os.Exit(1) + } +} diff --git a/simple-rest-server/post.go b/simple-rest-server/post.go index 66e1274..5d3b864 100644 --- a/simple-rest-server/post.go +++ b/simple-rest-server/post.go @@ -1,12 +1,32 @@ package main import ( + "encoding/json" "fmt" + "io/ioutil" "net/http" "github.com/julienschmidt/httprouter" ) -func AddTask(respWriter http.ResponseWriter, request *http.Request, params httprouter.Params) { - fmt.Fprintf(respWriter, "Show Details for ToDo '%s'\n", params.ByName("todelete")) +func AddTask(respWriter http.ResponseWriter, request *http.Request, _ httprouter.Params) { + var task Task + body, err := ioutil.ReadAll(request.Body) + if err != nil { + fmt.Println(err) + } + err = json.Unmarshal(body, &task) + if err != nil { + fmt.Println(err) + } + fmt.Fprintf(respWriter, "Show Details for ToDo '%v'\n", task) + + accessTasks.Lock() + task.ID = allTasks[len(allTasks)-1].ID + 1 + + allTasks = append(allTasks, task) + accessTasks.Unlock() + + saveCSV() + } From fa48c9eb725c312968875fc1fea7aa0db919086e Mon Sep 17 00:00:00 2001 From: zachary-trudo Date: Tue, 21 Jun 2016 11:41:43 -0700 Subject: [PATCH 12/27] Merged my current changes with Olivier's --- simple-rest-server/checkout.go | 2 +- simple-rest-server/main.go | 70 ++++++++++++++++++++++++++++++++++ simple-rest-server/post.go | 24 +++++++++++- 3 files changed, 93 insertions(+), 3 deletions(-) diff --git a/simple-rest-server/checkout.go b/simple-rest-server/checkout.go index c3f732c..34bb3e9 100644 --- a/simple-rest-server/checkout.go +++ b/simple-rest-server/checkout.go @@ -19,5 +19,5 @@ func checkTaskAsComplete(taskID string) (err error) { defer accessTasks.Unlock() // Set the task to checked. - allTasks.checked = true + allTasks[index].checked = true } diff --git a/simple-rest-server/main.go b/simple-rest-server/main.go index 5ecb1c6..5238d96 100644 --- a/simple-rest-server/main.go +++ b/simple-rest-server/main.go @@ -1,8 +1,14 @@ package main import ( + "encoding/csv" + "fmt" + "io/ioutil" "log" "net/http" + "os" + "sync" + "time" "github.com/julienschmidt/httprouter" ) @@ -23,7 +29,53 @@ func getIndexByTaskID(taskID string) (index int, err error) { index = -1 } +type Task struct { + ID int + Checked bool `json:"checked"` + TimeAdded time.Time `json:"time_added"` + Deadline time.Time `json:"deadline"` + Task string `json:"task"` +} + +var ( + allTasks []Task + accessTasks = &sync.Mutex{} +) + +const ( + timeFormat = time.RFC3339 +) + func main() { + + // Loading the csv file into the RAM + csvfile, err := os.Open("tasks.csv") + panic(err) + rawCSVdata, err := csv.NewReader(csvfile).ReadAll() + panic(err) + + for i, each := range rawCSVdata { + timeAdded, err := time.Parse(timeFormat, each[2]) + panic(err) + deadline, err := time.Parse(timeFormat, each[3]) + panic(err) + status := false + if each[1] == "true" { + status = true + } + allTasks = append(allTasks, Task{ID: i, Task: each[4], TimeAdded: timeAdded, Deadline: deadline, Checked: status}) + } + + // Autosave every minutes + csvfile.Close() + go func() { + for { + saveCSV() + time.Sleep(1 * time.Minute) + } + }() + + // Start the API router := httprouter.New() router.GET("/search", SearchTask) router.GET("/list", ListTask) @@ -32,3 +84,21 @@ func main() { log.Fatal(http.ListenAndServe(":8080", router)) } + +func saveCSV() { + myString := "" + accessTasks.Lock() + for _, each := range allTasks { + myString += fmt.Sprintf("%v,%v,%v,%v,\"%v\"\n", each.ID, each.Checked, each.TimeAdded.Format(timeFormat), each.Deadline.Format(timeFormat), each.Task) + } + ioutil.WriteFile("tasks.csv", []byte(myString), 0644) + accessTasks.Unlock() +} + +func panic(err error) { + if err != nil { + // Maybe change to log later + fmt.Println(err) + os.Exit(1) + } +} diff --git a/simple-rest-server/post.go b/simple-rest-server/post.go index 66e1274..5d3b864 100644 --- a/simple-rest-server/post.go +++ b/simple-rest-server/post.go @@ -1,12 +1,32 @@ package main import ( + "encoding/json" "fmt" + "io/ioutil" "net/http" "github.com/julienschmidt/httprouter" ) -func AddTask(respWriter http.ResponseWriter, request *http.Request, params httprouter.Params) { - fmt.Fprintf(respWriter, "Show Details for ToDo '%s'\n", params.ByName("todelete")) +func AddTask(respWriter http.ResponseWriter, request *http.Request, _ httprouter.Params) { + var task Task + body, err := ioutil.ReadAll(request.Body) + if err != nil { + fmt.Println(err) + } + err = json.Unmarshal(body, &task) + if err != nil { + fmt.Println(err) + } + fmt.Fprintf(respWriter, "Show Details for ToDo '%v'\n", task) + + accessTasks.Lock() + task.ID = allTasks[len(allTasks)-1].ID + 1 + + allTasks = append(allTasks, task) + accessTasks.Unlock() + + saveCSV() + } From 2cf6fa445fe36a20f1721b90e37ae4afe66292a1 Mon Sep 17 00:00:00 2001 From: zachary-trudo Date: Tue, 21 Jun 2016 11:46:54 -0700 Subject: [PATCH 13/27] Changing how I lock and unlock --- simple-rest-server/main.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/simple-rest-server/main.go b/simple-rest-server/main.go index 5238d96..fc587b0 100644 --- a/simple-rest-server/main.go +++ b/simple-rest-server/main.go @@ -14,19 +14,21 @@ import ( ) func getIndexByTaskID(taskID string) (index int, err error) { + // We didn't find the task ID - return an error and set the index to -1... + err = error.New("GetIndexByTaskID: TaskID " + taskID + " Not Found.") + index = -1 + accessTasks.Lock() - defer accesTasks.Unlock() + defer accessTasks.Unlock() // Search for the taskID and return the index. for i, line := range allTask { if taskID == line.ID { index = i + err = nil return } } - // We didn't find the task ID - return an error and set the index to -1... - err = error.New("GetIndexByTaskID: TaskID " + taskID + " Not Found.") - index = -1 } type Task struct { From 1cedf769a919cad79b0130a3f6309b84cd112a5c Mon Sep 17 00:00:00 2001 From: zachary-trudo Date: Tue, 21 Jun 2016 13:17:48 -0700 Subject: [PATCH 14/27] Finished ups some changes - added remove. --- simple-rest-server/checkout.go | 11 +++++------ simple-rest-server/delete.go | 20 ++++++++++++++++---- simple-rest-server/main.go | 10 ++++++---- simple-rest-server/post.go | 4 ++++ simple-rest-server/remove.go | 17 +++++++++++++++++ simple-rest-server/tasks.csv | 0 6 files changed, 48 insertions(+), 14 deletions(-) create mode 100644 simple-rest-server/remove.go create mode 100644 simple-rest-server/tasks.csv diff --git a/simple-rest-server/checkout.go b/simple-rest-server/checkout.go index 34bb3e9..7df8e1b 100644 --- a/simple-rest-server/checkout.go +++ b/simple-rest-server/checkout.go @@ -1,14 +1,12 @@ package main import ( - "encoding/csv" - "errors" - "fmt" + "log" ) -func checkTaskAsComplete(taskID string) (err error) { +func checkTaskAsComplete(taskID int) (err error) { // Get the index. - index, err = getIndexByTaskID(taskID) + index, err := getIndexByTaskID(taskID) if err != nil { log.Println(err) return @@ -19,5 +17,6 @@ func checkTaskAsComplete(taskID string) (err error) { defer accessTasks.Unlock() // Set the task to checked. - allTasks[index].checked = true + allTasks[index].Checked = true + return } diff --git a/simple-rest-server/delete.go b/simple-rest-server/delete.go index 2b03f94..da5c293 100644 --- a/simple-rest-server/delete.go +++ b/simple-rest-server/delete.go @@ -1,12 +1,24 @@ package main import ( + "encoding/json" "fmt" - "net/http" - "github.com/julienschmidt/httprouter" + "io/ioutil" + "net/http" ) -func DeleteTask(respWriter http.ResponseWriter, request *http.Request, params httprouter.Params) { - fmt.Fprintf(respWriter, "Show Details for ToDo '%s'\n", params.ByName("todelete")) +func DeleteTask(respWriter http.ResponseWriter, request *http.Request, _ httprouter.Params) { + var remove Remove + body, err := ioutil.ReadAll(request.Body) + if err != nil { + fmt.Println(err) + } + err = json.Unmarshal(body, &remove) + if err != nil { + fmt.Println(err) + } + + removeTaskByID(remove.ID) + } diff --git a/simple-rest-server/main.go b/simple-rest-server/main.go index fc587b0..311ad39 100644 --- a/simple-rest-server/main.go +++ b/simple-rest-server/main.go @@ -2,6 +2,7 @@ package main import ( "encoding/csv" + "errors" "fmt" "io/ioutil" "log" @@ -13,22 +14,23 @@ import ( "github.com/julienschmidt/httprouter" ) -func getIndexByTaskID(taskID string) (index int, err error) { +func getIndexByTaskID(taskID int) (index int, err error) { // We didn't find the task ID - return an error and set the index to -1... - err = error.New("GetIndexByTaskID: TaskID " + taskID + " Not Found.") + err = errors.New("GetIndexByTaskID: TaskID " + string(taskID) + " Not Found.") index = -1 accessTasks.Lock() defer accessTasks.Unlock() // Search for the taskID and return the index. - for i, line := range allTask { + for i, line := range allTasks { if taskID == line.ID { index = i err = nil - return + break } } + return } type Task struct { diff --git a/simple-rest-server/post.go b/simple-rest-server/post.go index 5d3b864..077b157 100644 --- a/simple-rest-server/post.go +++ b/simple-rest-server/post.go @@ -9,6 +9,10 @@ import ( "github.com/julienschmidt/httprouter" ) +type Remove struct { + ID int `json:"id"` +} + func AddTask(respWriter http.ResponseWriter, request *http.Request, _ httprouter.Params) { var task Task body, err := ioutil.ReadAll(request.Body) diff --git a/simple-rest-server/remove.go b/simple-rest-server/remove.go new file mode 100644 index 0000000..40a2ccf --- /dev/null +++ b/simple-rest-server/remove.go @@ -0,0 +1,17 @@ +package main + +import ( + "log" +) + +func removeTaskByID(taskID int) (err error) { + index, err := getIndexByTaskID(taskID) + if err != nil { + log.Println(err) + return + } + accessTasks.Lock() + allTasks = append(allTasks[:index-1], allTasks[index+1:]...) + accessTasks.Unlock() + return +} diff --git a/simple-rest-server/tasks.csv b/simple-rest-server/tasks.csv new file mode 100644 index 0000000..e69de29 From df17d3758751993f6fc57e626a6d51cf8daa167d Mon Sep 17 00:00:00 2001 From: Nichelle A Hall Date: Tue, 21 Jun 2016 14:54:16 -0700 Subject: [PATCH 15/27] Edited the ListTask function to return JSON file. --- simple-rest-server/get.go | 32 +++----------------------------- 1 file changed, 3 insertions(+), 29 deletions(-) diff --git a/simple-rest-server/get.go b/simple-rest-server/get.go index 6921f87..4db31fc 100644 --- a/simple-rest-server/get.go +++ b/simple-rest-server/get.go @@ -3,40 +3,14 @@ package main import ( "fmt" "net/http" - "os" - "encoding/csv" + "encoding/json" "github.com/julienschmidt/httprouter" ) func ListTask(respWriter http.ResponseWriter, request *http.Request, params httprouter.Params) { - csvfile, err := os.Open("tasks.csv") - if err != nil { - fmt.Println(err) - return - } - - defer csvfile.Close() - - reader := csv.NewReader(csvfile) - - reader.FieldsPerRecord = -1 - - rawCSVdata, err := reader.ReadAll() - - if err != nil { - fmt.Println(err) - os.Exit(1) - } - - // sanity check, display to standard output - for _, each := range rawCSVdata { - status := "unchecked" - if each[1] == "true" { // each[1] will be the status - either true or false - status = "checked" - } - fmt.Fprintln(respWriter,"ID:", each[0], "Status :", status, "Date Added:", each[2], "Date Due:", each[3], "Task:", each[4]) - } + output, _ := json.MarshalIndent(allTasks, "", " ") + fmt.Fprintln(respWriter, string(output)) } func SearchTask(respWriter http.ResponseWriter, request *http.Request, params httprouter.Params) { From 8e39341f99a78e547c835d6aabbc2312e72cb961 Mon Sep 17 00:00:00 2001 From: kindermoumoute Date: Tue, 21 Jun 2016 14:54:45 -0700 Subject: [PATCH 16/27] Renamed panic into ifPanic There is already a build-in function called `panic`. --- simple-rest-server/main.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/simple-rest-server/main.go b/simple-rest-server/main.go index b47536d..c53f638 100644 --- a/simple-rest-server/main.go +++ b/simple-rest-server/main.go @@ -34,15 +34,15 @@ func main() { // Loading the csv file into the RAM csvfile, err := os.Open("tasks.csv") - panic(err) + ifPanic(err) rawCSVdata, err := csv.NewReader(csvfile).ReadAll() - panic(err) + ifPanic(err) for i, each := range rawCSVdata { timeAdded, err := time.Parse(timeFormat, each[2]) - panic(err) + ifPanic(err) deadline, err := time.Parse(timeFormat, each[3]) - panic(err) + ifPanic(err) status := false if each[1] == "true" { status = true @@ -79,7 +79,7 @@ func saveCSV() { accessTasks.Unlock() } -func panic(err error) { +func ifPanic(err error) { if err != nil { // Maybe change to log later fmt.Println(err) From 2516ad19163b373704c880de9e74820401e73773 Mon Sep 17 00:00:00 2001 From: Christina Nguyen Date: Tue, 21 Jun 2016 19:10:07 -0700 Subject: [PATCH 17/27] Search implementation --- simple-rest-server/get.go | 53 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/simple-rest-server/get.go b/simple-rest-server/get.go index 17f831d..4eec289 100644 --- a/simple-rest-server/get.go +++ b/simple-rest-server/get.go @@ -1,16 +1,63 @@ package main import ( + "encoding/json" "fmt" - "net/http" - "github.com/julienschmidt/httprouter" + "io/ioutil" + "net/http" + "strings" + "time" ) +/* + * + */ +type Search struct { + Word string `json:"search"` + TimeBefore time.Time `json:"before"` +} + func ListTask(respWriter http.ResponseWriter, request *http.Request, params httprouter.Params) { fmt.Fprintf(respWriter, "Show Details for ToDo") } func SearchTask(respWriter http.ResponseWriter, request *http.Request, params httprouter.Params) { - fmt.Fprintf(respWriter, "Show Details for ToDo\n") + var query Search + body, err := ioutil.ReadAll(request.Body) + if err != nil { + fmt.Println(err) + } + err = json.Unmarshal(body, &query) + if err != nil { + fmt.Println(err) + } + + var indicies []int + timezero := time.Time{} + if query.Word != "" { + indicies = append(indicies, searchByWord(query.Word)[:]...) + } else if query.TimeBefore != timezero { + indicies = append(indicies, searchByTime(query.TimeBefore)[:]...) + } else { + fmt.Println("Undefined search query") + } +} + +func searchByWord(query string) (result []int) { + for i, task := range allTasks { + if strings.Contains(task.Task, query) { + result = append(result, i) + } + } + return +} + +func searchByTime(query time.Time) (result []int) { + for i, task := range allTasks { + if task.TimeAdded.Before(query) || task.TimeAdded == query { + result = append(result, i) + } + } + return } From 84ce4b562c60a7214ff2a89c074c8c6d617ab160 Mon Sep 17 00:00:00 2001 From: zachary-trudo Date: Tue, 21 Jun 2016 22:10:47 -0700 Subject: [PATCH 18/27] Added a homepage --- simple-rest-server/get.go | 13 +++++++++++++ simple-rest-server/main.go | 1 + simple-rest-server/tasks.csv | 0 3 files changed, 14 insertions(+) create mode 100644 simple-rest-server/tasks.csv diff --git a/simple-rest-server/get.go b/simple-rest-server/get.go index 22ff50b..da22eb8 100644 --- a/simple-rest-server/get.go +++ b/simple-rest-server/get.go @@ -15,6 +15,19 @@ type Search struct { TimeBefore time.Time `json:"before"` } +func Index(respWriter http.ResponseWriter, request *http.Request, params httprouter.Params) { + htmlOut := `Todo List API. + +

/add

+

/delete

+

/search

+

/list

+` + + respWriter.Header().Set("Content-Type", "text/html; charset=utf-8") + respWriter.Write([]byte(htmlOut)) +} + func ListTask(respWriter http.ResponseWriter, request *http.Request, params httprouter.Params) { output, _ := json.MarshalIndent(allTasks, "", " ") diff --git a/simple-rest-server/main.go b/simple-rest-server/main.go index c53f638..a7ec0e0 100644 --- a/simple-rest-server/main.go +++ b/simple-rest-server/main.go @@ -61,6 +61,7 @@ func main() { // Start the API router := httprouter.New() + router.GET("/", Index) router.GET("/search", SearchTask) router.GET("/list", ListTask) router.POST("/add", AddTask) diff --git a/simple-rest-server/tasks.csv b/simple-rest-server/tasks.csv new file mode 100644 index 0000000..e69de29 From 7857f29aa9638625d95632285b2d38e5c8f4a835 Mon Sep 17 00:00:00 2001 From: zachary-trudo Date: Tue, 21 Jun 2016 23:01:52 -0700 Subject: [PATCH 19/27] Changed locations of functions and removed files. - No longer need checkout.go, put.go, or remove.go. - Moved functions to where they should be. --- simple-rest-server/checkout.go | 22 ----------------- simple-rest-server/delete.go | 22 ++++++++++++++--- simple-rest-server/get.go | 1 - simple-rest-server/main.go | 11 +++++++-- simple-rest-server/post.go | 45 +++++++++++++++++++++++++++++----- simple-rest-server/put.go | 1 - simple-rest-server/remove.go | 17 ------------- 7 files changed, 67 insertions(+), 52 deletions(-) delete mode 100644 simple-rest-server/checkout.go delete mode 100644 simple-rest-server/put.go delete mode 100644 simple-rest-server/remove.go diff --git a/simple-rest-server/checkout.go b/simple-rest-server/checkout.go deleted file mode 100644 index 7df8e1b..0000000 --- a/simple-rest-server/checkout.go +++ /dev/null @@ -1,22 +0,0 @@ -package main - -import ( - "log" -) - -func checkTaskAsComplete(taskID int) (err error) { - // Get the index. - index, err := getIndexByTaskID(taskID) - if err != nil { - log.Println(err) - return - } - - // Lock the tasks. - accessTasks.Lock() - defer accessTasks.Unlock() - - // Set the task to checked. - allTasks[index].Checked = true - return -} diff --git a/simple-rest-server/delete.go b/simple-rest-server/delete.go index da5c293..3b12269 100644 --- a/simple-rest-server/delete.go +++ b/simple-rest-server/delete.go @@ -2,23 +2,39 @@ package main import ( "encoding/json" - "fmt" "github.com/julienschmidt/httprouter" "io/ioutil" + "log" "net/http" ) +type Remove struct { + ID int `json:"id"` +} + +// Delete API call func DeleteTask(respWriter http.ResponseWriter, request *http.Request, _ httprouter.Params) { var remove Remove body, err := ioutil.ReadAll(request.Body) if err != nil { - fmt.Println(err) + log.Println(err) } err = json.Unmarshal(body, &remove) if err != nil { - fmt.Println(err) + log.Println(err) } removeTaskByID(remove.ID) +} +func removeTaskByID(taskID int) (err error) { + index, err := getIndexByTaskID(taskID) + if err != nil { + log.Println(err) + return + } + accessTasks.Lock() + allTasks = append(allTasks[:index-1], allTasks[index+1:]...) + accessTasks.Unlock() + return } diff --git a/simple-rest-server/get.go b/simple-rest-server/get.go index da22eb8..e42ac99 100644 --- a/simple-rest-server/get.go +++ b/simple-rest-server/get.go @@ -29,7 +29,6 @@ func Index(respWriter http.ResponseWriter, request *http.Request, params httprou } func ListTask(respWriter http.ResponseWriter, request *http.Request, params httprouter.Params) { - output, _ := json.MarshalIndent(allTasks, "", " ") fmt.Fprintln(respWriter, string(output)) } diff --git a/simple-rest-server/main.go b/simple-rest-server/main.go index 9e8068f..962acf5 100644 --- a/simple-rest-server/main.go +++ b/simple-rest-server/main.go @@ -15,12 +15,11 @@ import ( ) func getIndexByTaskID(taskID int) (index int, err error) { - // We didn't find the task ID - return an error and set the index to -1... + // If we didn't find the task ID - return an error and set the index to -1... err = errors.New("GetIndexByTaskID: TaskID " + string(taskID) + " Not Found.") index = -1 accessTasks.Lock() - defer accessTasks.Unlock() // Search for the taskID and return the index. for i, line := range allTasks { @@ -30,6 +29,7 @@ func getIndexByTaskID(taskID int) (index int, err error) { break } } + accessTasks.Unlock() return } @@ -55,9 +55,12 @@ func main() { // Loading the csv file into the RAM csvfile, err := os.Open("tasks.csv") ifPanic(err) + + // Loading csv with csv Library returns [][]string rawCSVdata, err := csv.NewReader(csvfile).ReadAll() ifPanic(err) + // For each line in csv do.... for i, each := range rawCSVdata { timeAdded, err := time.Parse(timeFormat, each[2]) ifPanic(err) @@ -72,6 +75,8 @@ func main() { // Autosave every minutes csvfile.Close() + + // go func() starts a new process. go func() { for { saveCSV() @@ -85,11 +90,13 @@ func main() { router.GET("/search", SearchTask) router.GET("/list", ListTask) router.POST("/add", AddTask) + router.POST("/checkoff", CheckOff) router.DELETE("/delete", DeleteTask) log.Fatal(http.ListenAndServe(":8080", router)) } +// Function to save the CSV func saveCSV() { myString := "" accessTasks.Lock() diff --git a/simple-rest-server/post.go b/simple-rest-server/post.go index 077b157..701755d 100644 --- a/simple-rest-server/post.go +++ b/simple-rest-server/post.go @@ -3,16 +3,12 @@ package main import ( "encoding/json" "fmt" + "github.com/julienschmidt/httprouter" "io/ioutil" + "log" "net/http" - - "github.com/julienschmidt/httprouter" ) -type Remove struct { - ID int `json:"id"` -} - func AddTask(respWriter http.ResponseWriter, request *http.Request, _ httprouter.Params) { var task Task body, err := ioutil.ReadAll(request.Body) @@ -32,5 +28,42 @@ func AddTask(respWriter http.ResponseWriter, request *http.Request, _ httprouter accessTasks.Unlock() saveCSV() +} +type Check struct { + ID int `json:"id"` +} + +func CheckOff(respWriter http.ResponseWriter, request *http.Request, _ httprouter.Params) { + var check Check + body, err := ioutil.ReadAll(request.Body) + if err != nil { + log.Println(err) + return + } + err = json.Unmarshal(body, &check) + if err != nil { + log.Println(err) + return + } + + checkTaskAsComplete(check.ID) +} + +func checkTaskAsComplete(taskID int) (err error) { + // Get the index. + index, err := getIndexByTaskID(taskID) + if err != nil { + log.Println(err) + return + } + + // Lock the tasks. + accessTasks.Lock() + + // Set the task to checked. + allTasks[index].Checked = true + + accessTasks.Unlock() + return } diff --git a/simple-rest-server/put.go b/simple-rest-server/put.go deleted file mode 100644 index 85f0393..0000000 --- a/simple-rest-server/put.go +++ /dev/null @@ -1 +0,0 @@ -package main \ No newline at end of file diff --git a/simple-rest-server/remove.go b/simple-rest-server/remove.go deleted file mode 100644 index 40a2ccf..0000000 --- a/simple-rest-server/remove.go +++ /dev/null @@ -1,17 +0,0 @@ -package main - -import ( - "log" -) - -func removeTaskByID(taskID int) (err error) { - index, err := getIndexByTaskID(taskID) - if err != nil { - log.Println(err) - return - } - accessTasks.Lock() - allTasks = append(allTasks[:index-1], allTasks[index+1:]...) - accessTasks.Unlock() - return -} From 4ef7767ba8ddfb2150fb9b777d2bf60dbd2d48f9 Mon Sep 17 00:00:00 2001 From: zachary-trudo Date: Tue, 21 Jun 2016 23:10:50 -0700 Subject: [PATCH 20/27] Fixed some bugs - replaced put.go since I accidentally deleted it --- simple-rest-server/get.go | 4 ++++ simple-rest-server/put.go | 1 + 2 files changed, 5 insertions(+) create mode 100644 simple-rest-server/put.go diff --git a/simple-rest-server/get.go b/simple-rest-server/get.go index e42ac99..3c02b74 100644 --- a/simple-rest-server/get.go +++ b/simple-rest-server/get.go @@ -56,19 +56,23 @@ func SearchTask(respWriter http.ResponseWriter, request *http.Request, params ht } func searchByWord(query string) (result []int) { + accessTasks.Lock() for i, task := range allTasks { if strings.Contains(task.Task, query) { result = append(result, i) } } + accessTasks.Unlock() return } func searchByTime(query time.Time) (result []int) { + accessTasks.Lock() for i, task := range allTasks { if task.TimeAdded.Before(query) || task.TimeAdded == query { result = append(result, i) } } + accessTasks.Unlock() return } diff --git a/simple-rest-server/put.go b/simple-rest-server/put.go new file mode 100644 index 0000000..06ab7d0 --- /dev/null +++ b/simple-rest-server/put.go @@ -0,0 +1 @@ +package main From dc9a5eea7c682f62726e7d2d552b27d801be10c5 Mon Sep 17 00:00:00 2001 From: zachary-trudo Date: Wed, 22 Jun 2016 09:11:29 -0700 Subject: [PATCH 21/27] Autogenerating html example. Just showing simple example of how to autogenerate html code. --- simple-rest-server/get.go | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/simple-rest-server/get.go b/simple-rest-server/get.go index 3c02b74..4047263 100644 --- a/simple-rest-server/get.go +++ b/simple-rest-server/get.go @@ -15,14 +15,17 @@ type Search struct { TimeBefore time.Time `json:"before"` } -func Index(respWriter http.ResponseWriter, request *http.Request, params httprouter.Params) { - htmlOut := `Todo List API. +func htmlParagraph(text *string, paragraph string) { + *text += "\n

" + paragraph + "

" +} -

/add

-

/delete

-

/search

-

/list

-` +func Index(respWriter http.ResponseWriter, request *http.Request, params httprouter.Params) { + htmlOut := `Todo List API.` + htmlParagraph(&htmlOut, "/add") + htmlParagraph(&htmlOut, "/delete") + htmlParagraph(&htmlOut, "/search") + htmlParagraph(&htmlOut, "/list") + htmlParagraph(&htmlOut, "/checkout") respWriter.Header().Set("Content-Type", "text/html; charset=utf-8") respWriter.Write([]byte(htmlOut)) From e614be3521cd3600bbd523fb90a9f8f0178dee9f Mon Sep 17 00:00:00 2001 From: zachary-trudo Date: Wed, 22 Jun 2016 10:27:01 -0700 Subject: [PATCH 22/27] Fix 0 items in csv bug --- simple-rest-server/post.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/simple-rest-server/post.go b/simple-rest-server/post.go index 701755d..b192337 100644 --- a/simple-rest-server/post.go +++ b/simple-rest-server/post.go @@ -22,7 +22,10 @@ func AddTask(respWriter http.ResponseWriter, request *http.Request, _ httprouter fmt.Fprintf(respWriter, "Show Details for ToDo '%v'\n", task) accessTasks.Lock() - task.ID = allTasks[len(allTasks)-1].ID + 1 + task.ID = 0 + if len(allTasks) > 0 { + task.ID = allTasks[len(allTasks)-1].ID + 1 + } allTasks = append(allTasks, task) accessTasks.Unlock() From 13a10c218c2c73f599c1274d813e5514f62a06b5 Mon Sep 17 00:00:00 2001 From: zachary-trudo Date: Wed, 22 Jun 2016 11:20:05 -0700 Subject: [PATCH 23/27] Now able to search for results and have the display - If no results are found, we display 'No Resultsgit add get.gogit add get.go!' --- simple-rest-server/get.go | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/simple-rest-server/get.go b/simple-rest-server/get.go index 4047263..be8dfdb 100644 --- a/simple-rest-server/get.go +++ b/simple-rest-server/get.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/julienschmidt/httprouter" "io/ioutil" + "log" "net/http" "strings" "time" @@ -25,7 +26,7 @@ func Index(respWriter http.ResponseWriter, request *http.Request, params httprou htmlParagraph(&htmlOut, "/delete") htmlParagraph(&htmlOut, "/search") htmlParagraph(&htmlOut, "/list") - htmlParagraph(&htmlOut, "/checkout") + htmlParagraph(&htmlOut, "/checkoff") respWriter.Header().Set("Content-Type", "text/html; charset=utf-8") respWriter.Write([]byte(htmlOut)) @@ -48,6 +49,7 @@ func SearchTask(respWriter http.ResponseWriter, request *http.Request, params ht } var indicies []int + fmt.Fprintln(respWriter, "Searching for "+query.Word) timezero := time.Time{} if query.Word != "" { indicies = append(indicies, searchByWord(query.Word)[:]...) @@ -56,6 +58,20 @@ func SearchTask(respWriter http.ResponseWriter, request *http.Request, params ht } else { fmt.Println("Undefined search query") } + + if len(indicies) == 0 { + fmt.Fprintln(respWriter, "No Results!!!!!") + } + for _, index := range indicies { + accessTasks.Lock() + prettyJson, err := json.MarshalIndent(allTasks[index], "", " ") + accessTasks.Unlock() + if err != nil { + log.Print(err) + return + } + fmt.Fprintln(respWriter, string(prettyJson)) + } } func searchByWord(query string) (result []int) { From f42f6f8c24297e007a183314ab350dc3c99dc146 Mon Sep 17 00:00:00 2001 From: zachary-trudo Date: Wed, 22 Jun 2016 11:34:51 -0700 Subject: [PATCH 24/27] Fixed bugs in delete functionality. --- simple-rest-server/delete.go | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/simple-rest-server/delete.go b/simple-rest-server/delete.go index 3b12269..03e7b67 100644 --- a/simple-rest-server/delete.go +++ b/simple-rest-server/delete.go @@ -2,6 +2,7 @@ package main import ( "encoding/json" + "fmt" "github.com/julienschmidt/httprouter" "io/ioutil" "log" @@ -24,17 +25,31 @@ func DeleteTask(respWriter http.ResponseWriter, request *http.Request, _ httprou log.Println(err) } - removeTaskByID(remove.ID) + index, err := removeTaskByID(remove.ID) + if index == -1 { + fmt.Fprintln(respWriter, "Task ID not found. Unable to delete") + } else { + fmt.Fprintln(respWriter, "Task ID: "+string(index)+" found.") + } } -func removeTaskByID(taskID int) (err error) { +func removeTaskByID(taskID int) (int, error) { index, err := getIndexByTaskID(taskID) if err != nil { log.Println(err) - return + return index, err } + accessTasks.Lock() - allTasks = append(allTasks[:index-1], allTasks[index+1:]...) + if index == -1 { + return index, err + } else if index == 0 { + allTasks = allTasks[1:] + } else if index == len(allTasks)-1 { + allTasks = allTasks[:len(allTasks)-1] + } else { + allTasks = append(allTasks[:index-1], allTasks[index+1:]...) + } accessTasks.Unlock() - return + return index, err } From 14696b665df20e1bc4dd5ed7f167431ccca04dc3 Mon Sep 17 00:00:00 2001 From: kindermoumoute Date: Wed, 22 Jun 2016 10:28:34 -0700 Subject: [PATCH 25/27] New pathing This is an overview of the remaining work. --- simple-rest-server/delete.go | 4 ++- simple-rest-server/main.go | 56 +++++++++++++++++++----------------- simple-rest-server/post.go | 43 ++------------------------- simple-rest-server/put.go | 55 +++++++++++++++++++++++++++++++++++ 4 files changed, 90 insertions(+), 68 deletions(-) diff --git a/simple-rest-server/delete.go b/simple-rest-server/delete.go index 3b12269..feede83 100644 --- a/simple-rest-server/delete.go +++ b/simple-rest-server/delete.go @@ -2,10 +2,11 @@ package main import ( "encoding/json" - "github.com/julienschmidt/httprouter" "io/ioutil" "log" "net/http" + + "github.com/julienschmidt/httprouter" ) type Remove struct { @@ -25,6 +26,7 @@ func DeleteTask(respWriter http.ResponseWriter, request *http.Request, _ httprou } removeTaskByID(remove.ID) + // TODO: error 400, print it on the body } func removeTaskByID(taskID int) (err error) { diff --git a/simple-rest-server/main.go b/simple-rest-server/main.go index 962acf5..d5d5f64 100644 --- a/simple-rest-server/main.go +++ b/simple-rest-server/main.go @@ -14,25 +14,6 @@ import ( "github.com/julienschmidt/httprouter" ) -func getIndexByTaskID(taskID int) (index int, err error) { - // If we didn't find the task ID - return an error and set the index to -1... - err = errors.New("GetIndexByTaskID: TaskID " + string(taskID) + " Not Found.") - index = -1 - - accessTasks.Lock() - - // Search for the taskID and return the index. - for i, line := range allTasks { - if taskID == line.ID { - index = i - err = nil - break - } - } - accessTasks.Unlock() - return -} - type Task struct { ID int Checked bool `json:"checked"` @@ -80,18 +61,22 @@ func main() { go func() { for { saveCSV() - time.Sleep(1 * time.Minute) + time.Sleep(5 * time.Second) } }() // Start the API router := httprouter.New() - router.GET("/", Index) - router.GET("/search", SearchTask) - router.GET("/list", ListTask) - router.POST("/add", AddTask) - router.POST("/checkoff", CheckOff) - router.DELETE("/delete", DeleteTask) + + router.GET("/v1/task", ListTask) + router.POST("/v1/task", AddTask) + router.PUT("/v1/task", nil) + router.DELETE("/v1/task", nil) + + router.GET("/v1/task/:id", SearchTask) + router.POST("/v1/task/:id", nil) + router.PUT("/v1/task/:id", Modify) + router.DELETE("/v1/task/:id", DeleteTask) log.Fatal(http.ListenAndServe(":8080", router)) } @@ -114,3 +99,22 @@ func ifPanic(err error) { os.Exit(1) } } + +func getIndexByTaskID(taskID int) (index int, err error) { + // If we didn't find the task ID - return an error and set the index to -1... + err = errors.New("GetIndexByTaskID: TaskID " + string(taskID) + " Not Found.") + index = -1 + + accessTasks.Lock() + + // Search for the taskID and return the index. + for i, line := range allTasks { + if taskID == line.ID { + index = i + err = nil + break + } + } + accessTasks.Unlock() + return +} diff --git a/simple-rest-server/post.go b/simple-rest-server/post.go index 701755d..71510ef 100644 --- a/simple-rest-server/post.go +++ b/simple-rest-server/post.go @@ -3,10 +3,10 @@ package main import ( "encoding/json" "fmt" - "github.com/julienschmidt/httprouter" "io/ioutil" - "log" "net/http" + + "github.com/julienschmidt/httprouter" ) func AddTask(respWriter http.ResponseWriter, request *http.Request, _ httprouter.Params) { @@ -19,7 +19,6 @@ func AddTask(respWriter http.ResponseWriter, request *http.Request, _ httprouter if err != nil { fmt.Println(err) } - fmt.Fprintf(respWriter, "Show Details for ToDo '%v'\n", task) accessTasks.Lock() task.ID = allTasks[len(allTasks)-1].ID + 1 @@ -29,41 +28,3 @@ func AddTask(respWriter http.ResponseWriter, request *http.Request, _ httprouter saveCSV() } - -type Check struct { - ID int `json:"id"` -} - -func CheckOff(respWriter http.ResponseWriter, request *http.Request, _ httprouter.Params) { - var check Check - body, err := ioutil.ReadAll(request.Body) - if err != nil { - log.Println(err) - return - } - err = json.Unmarshal(body, &check) - if err != nil { - log.Println(err) - return - } - - checkTaskAsComplete(check.ID) -} - -func checkTaskAsComplete(taskID int) (err error) { - // Get the index. - index, err := getIndexByTaskID(taskID) - if err != nil { - log.Println(err) - return - } - - // Lock the tasks. - accessTasks.Lock() - - // Set the task to checked. - allTasks[index].Checked = true - - accessTasks.Unlock() - return -} diff --git a/simple-rest-server/put.go b/simple-rest-server/put.go index 06ab7d0..19ab1bf 100644 --- a/simple-rest-server/put.go +++ b/simple-rest-server/put.go @@ -1 +1,56 @@ package main + +import ( + "encoding/json" + "io/ioutil" + "log" + "net/http" + "strconv" + + "github.com/julienschmidt/httprouter" +) + +type Check struct { + ID int `json:"id"` +} + +func Modify(respWriter http.ResponseWriter, request *http.Request, ps httprouter.Params) { + var check Check + body, err := ioutil.ReadAll(request.Body) + if err != nil { + log.Println(err) + return + } + err = json.Unmarshal(body, &check) + if err != nil { + log.Println(err) + return + } + ID, err := strconv.Atoi(ps.ByName("id")) + if err != nil { + // TODO: display 400, id is not a number + return + } + + // TODO: be able to change anything + checkTaskAsComplete(ID) + // TODO: error 400, print it on the body +} + +func checkTaskAsComplete(taskID int) (err error) { + // Get the index. + index, err := getIndexByTaskID(taskID) + if err != nil { + log.Println(err) + return + } + + // Lock the tasks. + accessTasks.Lock() + + // Set the task to checked. + allTasks[index].Checked = true + + accessTasks.Unlock() + return +} From a3bb57e14a5d559b44c0025ae4231cb7e306ae83 Mon Sep 17 00:00:00 2001 From: zachary-trudo Date: Wed, 22 Jun 2016 14:38:49 -0700 Subject: [PATCH 26/27] Added 400 error --- simple-rest-server/delete.go | 10 ++++++++++ simple-rest-server/get.go | 7 ++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/simple-rest-server/delete.go b/simple-rest-server/delete.go index 03e7b67..9498597 100644 --- a/simple-rest-server/delete.go +++ b/simple-rest-server/delete.go @@ -18,11 +18,15 @@ func DeleteTask(respWriter http.ResponseWriter, request *http.Request, _ httprou var remove Remove body, err := ioutil.ReadAll(request.Body) if err != nil { + fmt.Fprintln(respWriter, "Bad request: %v", err) log.Println(err) + respWriter.WriteHeader(400) } err = json.Unmarshal(body, &remove) if err != nil { + fmt.Fprintln(respWriter, "Bad request: %v", err) log.Println(err) + respWriter.WriteHeader(400) } index, err := removeTaskByID(remove.ID) @@ -31,6 +35,12 @@ func DeleteTask(respWriter http.ResponseWriter, request *http.Request, _ httprou } else { fmt.Fprintln(respWriter, "Task ID: "+string(index)+" found.") } + if err != nil { + fmt.Fprintln(respWriter, "Bad request: %v", err) + log.Println(err) + respWriter.WriteHeader(400) + } + } func removeTaskByID(taskID int) (int, error) { diff --git a/simple-rest-server/get.go b/simple-rest-server/get.go index be8dfdb..6eb5dc2 100644 --- a/simple-rest-server/get.go +++ b/simple-rest-server/get.go @@ -42,10 +42,15 @@ func SearchTask(respWriter http.ResponseWriter, request *http.Request, params ht body, err := ioutil.ReadAll(request.Body) if err != nil { fmt.Println(err) + fmt.Fprintln(respWriter, "Bad request: %v", err) + log.Println(err) + respWriter.WriteHeader(400) } err = json.Unmarshal(body, &query) if err != nil { - fmt.Println(err) + fmt.Fprintln(respWriter, "Bad request: %v", err) + log.Println(err) + respWriter.WriteHeader(400) } var indicies []int From 98a0c16c8ead27d3d7d91f37e24097b0f5cd6251 Mon Sep 17 00:00:00 2001 From: kindermoumoute Date: Wed, 22 Jun 2016 21:58:19 -0700 Subject: [PATCH 27/27] Last changes and Tom's comments Feel free to work on it! --- simple-rest-server/get.go | 21 ++++++++++++++++++++- simple-rest-server/main.go | 15 +++++++++------ simple-rest-server/post.go | 28 +++++++++++++++++++++------- simple-rest-server/tasks.csv | 3 +++ 4 files changed, 53 insertions(+), 14 deletions(-) diff --git a/simple-rest-server/get.go b/simple-rest-server/get.go index 6eb5dc2..63866c7 100644 --- a/simple-rest-server/get.go +++ b/simple-rest-server/get.go @@ -3,12 +3,14 @@ package main import ( "encoding/json" "fmt" - "github.com/julienschmidt/httprouter" "io/ioutil" "log" "net/http" + "strconv" "strings" "time" + + "github.com/julienschmidt/httprouter" ) type Search struct { @@ -37,6 +39,23 @@ func ListTask(respWriter http.ResponseWriter, request *http.Request, params http fmt.Fprintln(respWriter, string(output)) } +func GetTask(respWriter http.ResponseWriter, request *http.Request, params httprouter.Params) { + i, err := strconv.Atoi(params.ByName("id")) + if err != nil { + fmt.Fprintf(respWriter, "Bad request: %v", err) + respWriter.WriteHeader(400) + return + } + i, err = getIndexByTaskID(i) + if err != nil { + fmt.Fprintf(respWriter, "Bad request: %v", err) + respWriter.WriteHeader(400) + return + } + output, _ := json.MarshalIndent(allTasks[i], "", " ") + fmt.Fprintln(respWriter, string(output)) +} + func SearchTask(respWriter http.ResponseWriter, request *http.Request, params httprouter.Params) { var query Search body, err := ioutil.ReadAll(request.Body) diff --git a/simple-rest-server/main.go b/simple-rest-server/main.go index d5d5f64..996b815 100644 --- a/simple-rest-server/main.go +++ b/simple-rest-server/main.go @@ -70,26 +70,29 @@ func main() { router.GET("/v1/task", ListTask) router.POST("/v1/task", AddTask) - router.PUT("/v1/task", nil) - router.DELETE("/v1/task", nil) + //router.PUT("/v1/task", nil) + //router.DELETE("/v1/task", nil) - router.GET("/v1/task/:id", SearchTask) - router.POST("/v1/task/:id", nil) + router.GET("/v1/task/:id", GetTask) + //router.POST("/v1/task/:id", nil) router.PUT("/v1/task/:id", Modify) router.DELETE("/v1/task/:id", DeleteTask) + router.GET("/v1/query", SearchTask) + log.Fatal(http.ListenAndServe(":8080", router)) } // Function to save the CSV -func saveCSV() { +func saveCSV() error { myString := "" accessTasks.Lock() for _, each := range allTasks { myString += fmt.Sprintf("%v,%v,%v,%v,\"%v\"\n", each.ID, each.Checked, each.TimeAdded.Format(timeFormat), each.Deadline.Format(timeFormat), each.Task) } - ioutil.WriteFile("tasks.csv", []byte(myString), 0644) + err := ioutil.WriteFile("tasks.csv", []byte(myString), 0644) accessTasks.Unlock() + return err } func ifPanic(err error) { diff --git a/simple-rest-server/post.go b/simple-rest-server/post.go index 8368fc6..0e59bac 100644 --- a/simple-rest-server/post.go +++ b/simple-rest-server/post.go @@ -10,24 +10,38 @@ import ( ) func AddTask(respWriter http.ResponseWriter, request *http.Request, _ httprouter.Params) { - var task Task + var newTask Task body, err := ioutil.ReadAll(request.Body) if err != nil { fmt.Println(err) } - err = json.Unmarshal(body, &task) + err = json.Unmarshal(body, &newTask) if err != nil { - fmt.Println(err) + fmt.Fprintf(respWriter, "Bad request: %v", err) + respWriter.WriteHeader(400) + return } accessTasks.Lock() - task.ID = 0 + newTask.ID = 0 if len(allTasks) > 0 { - task.ID = allTasks[len(allTasks)-1].ID + 1 + newTask.ID = allTasks[len(allTasks)-1].ID + 1 } + // lastID := allTasks[len(allTasks)-1].ID + // for i := range newTask { + // lastID++ + // newTask[i].ID = lastID + 1 + // } - allTasks = append(allTasks, task) + // allTasks = append(allTasks, newTask...) + newTask.ID = allTasks[len(allTasks)-1].ID + 1 + allTasks = append(allTasks, newTask) accessTasks.Unlock() - saveCSV() + err = saveCSV() + if err != nil { + fmt.Fprintf(respWriter, "Internal error: %v", err) + respWriter.WriteHeader(500) + return + } } diff --git a/simple-rest-server/tasks.csv b/simple-rest-server/tasks.csv index e69de29..d9fc8fe 100644 --- a/simple-rest-server/tasks.csv +++ b/simple-rest-server/tasks.csv @@ -0,0 +1,3 @@ +0,false,2012-04-23T18:25:43Z,2012-04-23T18:25:43Z,"plop" +1,true,2012-04-23T18:25:43Z,2012-04-23T18:25:43Z,"As a user I wanna do something" +2,true,2012-04-23T18:25:43Z,2012-04-23T18:25:43Z,"As a user I wanna do something"