forked from Alexey/DAS_2024_1
158 lines
3.9 KiB
Go
158 lines
3.9 KiB
Go
|
package handlers
|
||
|
|
||
|
import (
|
||
|
"PersonApp/httpClient"
|
||
|
"PersonApp/models"
|
||
|
"PersonApp/repository"
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
"github.com/gorilla/mux"
|
||
|
"net/http"
|
||
|
"strconv"
|
||
|
)
|
||
|
|
||
|
func InitRoutes(r *mux.Router, rep repository.PersonRepository, cln httpClient.Client) {
|
||
|
r.HandleFunc("/", GetPersons(rep, cln)).Methods("GET")
|
||
|
r.HandleFunc("/{id:[0-9]+}", GetPersonById(rep, cln)).Methods("GET")
|
||
|
r.HandleFunc("/", CreatePerson(rep)).Methods("POST")
|
||
|
r.HandleFunc("/{id:[0-9]+}", UpdatePerson(rep)).Methods("PUT")
|
||
|
r.HandleFunc("/{id:[0-9]+}", DeletePerson(rep)).Methods("DELETE")
|
||
|
}
|
||
|
|
||
|
func GetPersons(rep repository.PersonRepository, cln httpClient.Client) http.HandlerFunc {
|
||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||
|
w.Header().Set("Content-Type", "application/json")
|
||
|
fmt.Println("GET PERSONS")
|
||
|
|
||
|
persons, err := rep.GetAllPersons()
|
||
|
if err != nil {
|
||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
for i := 0; i < len(persons); i++ {
|
||
|
tasks, _ := cln.GetPersonTasks(persons[i].Id)
|
||
|
persons[i].Tasks = tasks
|
||
|
}
|
||
|
|
||
|
err = json.NewEncoder(w).Encode(persons)
|
||
|
if err != nil {
|
||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func GetPersonById(rep repository.PersonRepository, cln httpClient.Client) 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.GetPersonById(id)
|
||
|
if err != nil {
|
||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
tasks, err := cln.GetPersonTasks(id)
|
||
|
if err != nil {
|
||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||
|
return
|
||
|
} else {
|
||
|
person.Tasks = tasks
|
||
|
}
|
||
|
|
||
|
err = json.NewEncoder(w).Encode(person)
|
||
|
if err != nil {
|
||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func CreatePerson(rep repository.PersonRepository) http.HandlerFunc {
|
||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||
|
w.Header().Set("Content-Type", "application/json")
|
||
|
|
||
|
var person *models.Person
|
||
|
|
||
|
err := json.NewDecoder(r.Body).Decode(&person)
|
||
|
if err != nil {
|
||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
person, err = rep.CreatePerson(*person)
|
||
|
if err != nil {
|
||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
w.WriteHeader(http.StatusCreated)
|
||
|
err = json.NewEncoder(w).Encode(person)
|
||
|
if err != nil {
|
||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func UpdatePerson(rep repository.PersonRepository) 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
|
||
|
}
|
||
|
|
||
|
var person *models.Person
|
||
|
err = json.NewDecoder(r.Body).Decode(&person)
|
||
|
if err != nil {
|
||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
person, err = rep.UpdatePerson(models.Person{
|
||
|
Id: id,
|
||
|
Name: person.Name,
|
||
|
Tasks: nil,
|
||
|
})
|
||
|
if err != nil {
|
||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
w.WriteHeader(http.StatusAccepted)
|
||
|
err = json.NewEncoder(w).Encode(person)
|
||
|
if err != nil {
|
||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func DeletePerson(rep repository.PersonRepository) 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
|
||
|
}
|
||
|
|
||
|
err = rep.DeletePerson(id)
|
||
|
if err != nil {
|
||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
w.WriteHeader(http.StatusOK)
|
||
|
}
|
||
|
}
|