// package views // import ( // "encoding/json" // "html/template" // "log" // "net/http" // "strconv" // "strings" // "time" // "github.com/dgrijalva/jwt-go" // "github.com/thewhitetulip/Tasks/db" // "github.com/thewhitetulip/Tasks/types" // ) // var mySigningKey = []byte("secret") // //GetTokenHandler will get a token for the username and password // func GetTokenHandler(w http.ResponseWriter, r *http.Request) { // if r.Method == "POST" { // token := jwt.New(jwt.SigningMethodHS256) // r.ParseForm() // username := r.Form.Get("username") // password := r.Form.Get("password") // log.Println(username, " ", password) // if db.ValidUser(username, password) { // /* Set token claims */ // token.Claims["username"] = username // token.Claims["exp"] = time.Now().Add(time.Hour * 5).Unix() // /* Sign the token with our secret */ // tokenString, _ := token.SignedString(mySigningKey) // /* Finally, write the token to the browser window */ // w.Write([]byte(tokenString)) // } else { // w.Write([]byte("Authentication failed")) // } // } // } // //ValidateToken will validate the token // func ValidateToken(myToken string) (bool, string) { // token, err := jwt.Parse(myToken, func(token *jwt.Token) (interface{}, error) { // return []byte(mySigningKey), nil // }) // if (err != nil) || (!token.Valid) { // return false, "" // } // return token.Valid, token.Claims["username"].(string) // } // //GetTasksFuncAPI fetches tasks depending on the request, the authorization will be taken care by our middleare // //in this function we will return all the tasks to the user or tasks per category // //GET /api/get-tasks/ // func GetTasksFuncAPI(w http.ResponseWriter, r *http.Request) { // if r.Method == "GET" { // var strTaskID string // var err error // var message string // var task types.Task // var tasks types.Tasks // var status types.Status // token := r.Header["Token"][0] // w.Header().Set("Content-Type", "application/json; charset=UTF-8") // IsTokenValid, username := ValidateToken(token) // //When the token is not valid show the default error JSON document // if !IsTokenValid { // status = types.Status{StatusCode: http.StatusInternalServerError, Message: message} // w.WriteHeader(http.StatusInternalServerError) // err = json.NewEncoder(w).Encode(status) // if err != nil { // panic(err) // } // return // } // log.Println("token is valid " + username + " is logged in") // strTaskID = r.URL.Path[len("/api/get-task/"):] // //this is when we get a request for all the tasks for that user // if strTaskID == "" { // context, err := db.GetTasks(username, "pending", "") // if err != nil { // message = "GetTasksFuncAPI: api.go: Server error" // log.Println(message) // status = types.Status{StatusCode: http.StatusInternalServerError, Message: message} // w.WriteHeader(http.StatusInternalServerError) // err = json.NewEncoder(w).Encode(tasks) // if err != nil { // panic(err) // } // return // } // tasks = context.Tasks // w.WriteHeader(http.StatusOK) // err = json.NewEncoder(w).Encode(tasks) // if err != nil { // panic(err) // } // return // } // //this is when we get a request for a particular task // taskID, err := strconv.Atoi(strTaskID) // if err != nil { // message = "GetTasksFuncAPI: api.go: Invalid taskID " + strTaskID // log.Println(message) // status = types.Status{StatusCode: http.StatusInternalServerError, Message: message} // w.WriteHeader(http.StatusInternalServerError) // err = json.NewEncoder(w).Encode(status) // if err != nil { // panic(err) // } // return // } // ctx, err := db.GetTaskByID(username, taskID) // task = ctx.Tasks[0] // w.WriteHeader(http.StatusOK) // err = json.NewEncoder(w).Encode(task) // if err != nil { // panic(err) // } // } // } // //AddTaskFuncAPI will add the tasks for the user // func AddTaskFuncAPI(w http.ResponseWriter, r *http.Request) { // if r.Method == "POST" { // token := r.Header["Token"][0] // w.Header().Set("Content-Type", "application/json; charset=UTF-8") // IsTokenValid, username := ValidateToken(token) // //When the token is not valid show the default error JSON document // if !IsTokenValid { // status := types.Status{StatusCode: http.StatusInternalServerError, Message: message} // w.WriteHeader(http.StatusInternalServerError) // err = json.NewEncoder(w).Encode(status) // if err != nil { // panic(err) // } // return // } // log.Println("token is valid " + username + " is logged in") // r.ParseForm() // category := r.FormValue("category") // title := template.HTMLEscapeString(r.Form.Get("title")) // content := template.HTMLEscapeString(r.Form.Get("content")) // taskPriority, priorityErr := strconv.Atoi(r.FormValue("priority")) // if priorityErr != nil { // log.Print(priorityErr) // message = "Bad task priority" // } // priorityList := []int{1, 2, 3} // found := false // for _, priority := range priorityList { // if taskPriority == priority { // found = true // } // } // //If someone gives us incorrect priority number, we give the priority // //to that task as 1 i.e. Low // if !found { // taskPriority = 1 // } // var hidden int // hideTimeline := r.FormValue("hide") // if hideTimeline != "" { // hidden = 1 // } else { // hidden = 0 // } // var taskErr bool // if title != "" && content != "" { // taskTruth := db.AddTask(title, content, category, taskPriority, username, hidden) // if taskTruth != nil { // taskErr = true // } // } // var statusCode int // var message string // if !taskErr { // statusCode = http.StatusInternalServerError // message = "Error adding task to db" // } else { // statusCode = http.StatusOK // message = "Task added to db" // } // status := types.Status{StatusCode: statusCode, Message: message} // json.NewEncoder(w).Encode(status) // } else { // var statusCode int // var message string // statusCode = http.StatusBadRequest // message = "Invalid request" // status := types.Status{StatusCode: statusCode, Message: message} // json.NewEncoder(w).Encode(status) // } // } // //UpdateTaskFuncAPI will add the tasks for the user // func UpdateTaskFuncAPI(w http.ResponseWriter, r *http.Request) { // if r.Method == "POST" { // var taskErr bool // token := r.Header["Token"][0] // w.Header().Set("Content-Type", "application/json; charset=UTF-8") // IsTokenValid, username := ValidateToken(token) // //When the token is not valid show the default error JSON document // if !IsTokenValid { // status := types.Status{StatusCode: http.StatusInternalServerError, Message: message} // w.WriteHeader(http.StatusInternalServerError) // err = json.NewEncoder(w).Encode(status) // if err != nil { // panic(err) // } // return // } // log.Println("token is valid " + username + " is logged in") // r.ParseForm() // strID := r.Form.Get("id") // id, err := strconv.Atoi(strID) // if err != nil { // log.Println(err) // taskErr = true // } // category := r.Form.Get("category") // title := r.Form.Get("title") // content := r.Form.Get("content") // priority, err := strconv.Atoi(r.Form.Get("priority")) // if err != nil { // log.Println(err) // priority = 1 // } // var hidden int // hideTimeline := r.FormValue("hide") // if hideTimeline != "" { // hidden = 1 // } else { // hidden = 0 // } // if strID != "" && title != "" && content != "" { // err = db.UpdateTask(id, title, content, category, priority, username, hidden) // if err != nil { // taskErr = true // } // taskErr = false // } else { // taskErr = true // } // var statusCode int // var message string // if taskErr { // statusCode = http.StatusBadRequest // message = "unable to update task id " // } else { // statusCode = http.StatusOK // message = "updated task id " // } // status := types.Status{StatusCode: statusCode, Message: message} // w.Header().Set("Content-Type", "application/json; charset=UTF-8") // w.WriteHeader(http.StatusOK) // err = json.NewEncoder(w).Encode(status) // if err != nil { // panic(err) // } // } // } // //DeleteTaskFuncAPI will add the tasks for the user // func DeleteTaskFuncAPI(w http.ResponseWriter, r *http.Request) { // if r.Method == "GET" { // token := r.Header["Token"][0] // w.Header().Set("Content-Type", "application/json; charset=UTF-8") // IsTokenValid, username := ValidateToken(token) // //When the token is not valid show the default error JSON document // if !IsTokenValid { // status := types.Status{StatusCode: http.StatusInternalServerError, Message: message} // w.WriteHeader(http.StatusInternalServerError) // err = json.NewEncoder(w).Encode(status) // if err != nil { // panic(err) // } // return // } // log.Println("token is valid " + username + " is logged in") // var strtaskID string // strtaskID = r.URL.Path[len("/api/delete-task/"):] // var statusCode int // var message string // taskID, err := strconv.Atoi(strtaskID) // if err != nil { // log.Println("invalid task id") // statusCode = http.StatusBadRequest // message = "invalid TaskID" // } else { // db.TrashTask(username, taskID) // if err != nil { // statusCode = http.StatusOK // message = "deleted task id " + strtaskID // } else { // statusCode = http.StatusOK // message = "deleted task id " + strtaskID // } // } // status := types.Status{StatusCode: statusCode, Message: message} // w.Header().Set("Content-Type", "application/json; charset=UTF-8") // w.WriteHeader(http.StatusOK) // err = json.NewEncoder(w).Encode(status) // if err != nil { // panic(err) // } // } // } // //GetDeletedTaskFuncAPI will get the deleted tasks for the user // func GetDeletedTaskFuncAPI(w http.ResponseWriter, r *http.Request) { // if r.Method == "GET" { // var err error // var message string // var tasks types.Tasks // var status types.Status // token := r.Header["Token"][0] // w.Header().Set("Content-Type", "application/json; charset=UTF-8") // IsTokenValid, username := ValidateToken(token) // //When the token is not valid show the default error JSON document // if !IsTokenValid { // status = types.Status{StatusCode: http.StatusInternalServerError, Message: message} // w.WriteHeader(http.StatusInternalServerError) // err = json.NewEncoder(w).Encode(status) // if err != nil { // panic(err) // } // return // } // log.Println("token is valid " + username + " is logged in") // //this is when we get a request for all the deleted tasks for that user // context, err := db.GetTasks(username, "deleted", "") // if err != nil { // message = "GetTasksFuncAPI: api.go: Server error" // log.Println(message) // status = types.Status{StatusCode: http.StatusInternalServerError, Message: message} // w.WriteHeader(http.StatusInternalServerError) // err = json.NewEncoder(w).Encode(tasks) // if err != nil { // panic(err) // } // return // } // tasks = context.Tasks // w.WriteHeader(http.StatusOK) // err = json.NewEncoder(w).Encode(tasks) // if err != nil { // panic(err) // } // return // } // } // //GetCategoryFuncAPI will return the categories for the user // //depends on the ID that we get, if we get all, then return all categories of the user // func GetCategoryFuncAPI(w http.ResponseWriter, r *http.Request) { // if r.Method == "GET" { // var err error // var message string // var status types.Status // token := r.Header["Token"][0] // w.Header().Set("Content-Type", "application/json; charset=UTF-8") // IsTokenValid, username := ValidateToken(token) // //When the token is not valid show the default error JSON document // if !IsTokenValid { // status = types.Status{StatusCode: http.StatusInternalServerError, Message: message} // w.WriteHeader(http.StatusInternalServerError) // err = json.NewEncoder(w).Encode(status) // if err != nil { // panic(err) // } // return // } // log.Println("token is valid " + username + " is logged in") // categories := db.GetCategories(username) // w.Header().Set("Content-Type", "application/json; charset=UTF-8") // w.WriteHeader(http.StatusOK) // err = json.NewEncoder(w).Encode(categories) // if err != nil { // panic(err) // } // } // } // //AddCategoryFuncAPI will add the category for the user // func AddCategoryFuncAPI(w http.ResponseWriter, r *http.Request) { // if r.Method == "POST" { // var err error // var message string // var status types.Status // var statusCode int // var categoryErr bool // token := r.Header["Token"][0] // w.Header().Set("Content-Type", "application/json; charset=UTF-8") // IsTokenValid, username := ValidateToken(token) // //When the token is not valid show the default error JSON document // if !IsTokenValid { // status = types.Status{StatusCode: http.StatusInternalServerError, Message: message} // w.WriteHeader(http.StatusInternalServerError) // err = json.NewEncoder(w).Encode(status) // if err != nil { // panic(err) // } // return // } // log.Println("token is valid " + username + " is logged in") // r.ParseForm() // category := r.Form.Get("category") // if strings.Trim(category, " ") != "" { // log.Println("adding category") // err := db.AddCategory(username, category) // if err != nil { // categoryErr = true // } else { // categoryErr = false // } // } else { // categoryErr = true // } // if categoryErr { // statusCode = http.StatusInternalServerError // message = "error adding category" + category // } else { // statusCode = http.StatusOK // message = "added category " + category // } // status = types.Status{StatusCode: statusCode, Message: message} // w.Header().Set("Content-Type", "application/json; charset=UTF-8") // w.WriteHeader(http.StatusOK) // err = json.NewEncoder(w).Encode(status) // if err != nil { // panic(err) // } // } // } // //UpdateCategoryFuncAPI will update the category for the user // func UpdateCategoryFuncAPI(w http.ResponseWriter, r *http.Request) { // if r.Method == "POST" { // var statusCode int // var err error // var message string // var catErr bool // var status types.Status // token := r.Header["Token"][0] // w.Header().Set("Content-Type", "application/json; charset=UTF-8") // IsTokenValid, username := ValidateToken(token) // //When the token is not valid show the default error JSON document // if !IsTokenValid { // status = types.Status{StatusCode: http.StatusInternalServerError, Message: message} // w.WriteHeader(http.StatusInternalServerError) // err = json.NewEncoder(w).Encode(status) // if err != nil { // panic(err) // } // return // } // log.Println("token is valid " + username + " is logged in") // r.ParseForm() // oldName := r.URL.Path[len("/api/update-category/"):] // oldName = strings.Trim(oldName, "/") // newName := r.Form.Get("catname") // if strings.Trim(newName, " ") != "" { // err = db.UpdateCategoryByName(username, oldName, newName) // if err != nil { // catErr = true // } // catErr = false // } else { // catErr = true // } // if catErr { // statusCode = http.StatusInternalServerError // message = "unable to update category from " + oldName + " to " + newName // } else { // statusCode = http.StatusOK // message = "updated category from " + oldName + " to " + newName // } // status = types.Status{StatusCode: statusCode, Message: message} // w.Header().Set("Content-Type", "application/json; charset=UTF-8") // w.WriteHeader(http.StatusOK) // err = json.NewEncoder(w).Encode(status) // if err != nil { // panic(err) // } // } // } // //DeleteCategoryFuncAPI will delete the category for the user // func DeleteCategoryFuncAPI(w http.ResponseWriter, r *http.Request) { // if r.Method == "GET" { // categoryName := r.URL.Path[len("/delete-category/"):] // categoryName = strings.Trim(categoryName, "/") // var statusCode int // var err error // var message string // var catErr bool // token := r.Header["Token"][0] // w.Header().Set("Content-Type", "application/json; charset=UTF-8") // IsTokenValid, username := ValidateToken(token) // //When the token is not valid show the default error JSON document // if !IsTokenValid { // status := types.Status{StatusCode: http.StatusInternalServerError, Message: message} // w.WriteHeader(http.StatusInternalServerError) // err = json.NewEncoder(w).Encode(status) // if err != nil { // panic(err) // } // return // } // log.Println("token is valid " + username + " is logged in") // categoryName = strings.Trim(categoryName, " ") // if categoryName != "" { // catErr = true // } // err = db.DeleteCategoryByName(username, categoryName) // if err != nil { // catErr = true // } else { // catErr = false // } // if catErr { // statusCode = http.StatusBadRequest // message = "error deleting category" + categoryName // } else { // statusCode = http.StatusOK // message = "deleted category " + categoryName // } // status := types.Status{StatusCode: statusCode, Message: message} // w.Header().Set("Content-Type", "application/json; charset=UTF-8") // w.WriteHeader(http.StatusOK) // err = json.NewEncoder(w).Encode(status) // if err != nil { // panic(err) // } // } // }