package handlers import ( "TaskApp/httpClient" "TaskApp/models" "TaskApp/repository" "encoding/json" "fmt" "github.com/gorilla/mux" "net/http" "strconv" ) func InitRoutes(r *mux.Router, rep repository.TaskRepository, cln httpClient.Client) { r.HandleFunc("/", GetTasks(rep)).Methods("GET") r.HandleFunc("/{id:[0-9]+}", GetTaskById(rep)).Methods("GET") r.HandleFunc("/", CreateTask(rep, cln)).Methods("POST") r.HandleFunc("/{id:[0-9]+}", UpdateTask(rep)).Methods("PUT") r.HandleFunc("/{id:[0-9]+}", DeleteTask(rep)).Methods("DELETE") r.HandleFunc("/f/{id:[0-9]+}", GetPersonTasks(rep)).Methods("GET") } func GetTasks(rep repository.TaskRepository) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") tasks, err := rep.GetAllTasks() if err != nil { w.WriteHeader(http.StatusInternalServerError) return } err = json.NewEncoder(w).Encode(tasks) if err != nil { w.WriteHeader(http.StatusInternalServerError) } } } func GetTaskById(rep repository.TaskRepository) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") id, err := strconv.Atoi(mux.Vars(r)["id"]) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } person, err := rep.GetTaskById(id) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } err = json.NewEncoder(w).Encode(person) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } } } func GetPersonTasks(rep repository.TaskRepository) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") id, err := strconv.Atoi(mux.Vars(r)["id"]) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } tasks, err := rep.GetUserTasks(id) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } err = json.NewEncoder(w).Encode(tasks) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } } } func CreateTask(rep repository.TaskRepository, cln httpClient.Client) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") var task *models.TaskCreate err := json.NewDecoder(r.Body).Decode(&task) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } if &task.Name == nil || &task.PersonId == nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } person, err := cln.GetPerson(task.PersonId) if err != nil { fmt.Println(err) http.Error(w, "Connection to PersonApp is confused.", http.StatusInternalServerError) return } if person == nil { http.Error(w, fmt.Sprintf("Person with id=%d is't founded.", person.Id), http.StatusBadGateway) return } newTask, err := rep.CreateTask(*task) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.WriteHeader(http.StatusCreated) err = json.NewEncoder(w).Encode(newTask) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } } } func UpdateTask(rep repository.TaskRepository) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") id, err := strconv.Atoi(mux.Vars(r)["id"]) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } var task *models.TaskCreate err = json.NewDecoder(r.Body).Decode(&task) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } newTask, err := rep.UpdateTask(models.Task{Id: id, Name: task.Name, Date: task.Date}) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } err = json.NewEncoder(w).Encode(newTask) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } } func DeleteTask(rep repository.TaskRepository) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") id, err := strconv.Atoi(mux.Vars(r)["id"]) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } err = rep.DeleteTask(id) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.WriteHeader(http.StatusOK) } }