serv_http.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. // package serv_http -- веб-сервер сервиса (графика и АПИ)
  2. package serv_http
  3. import (
  4. "fmt"
  5. "io"
  6. "log"
  7. "net/http"
  8. "adt/pkg/entities/order"
  9. "adt/pkg/types"
  10. )
  11. // ServHttp -- веб-сервер сервиса (графика и АПИ)
  12. type ServHttp struct {
  13. mux *http.ServeMux
  14. proc types.IServProcess
  15. }
  16. // NewServHttp -- возвращает новый объект веб-сервера
  17. func NewServHttp(servProcess types.IServProcess) (*ServHttp, error) {
  18. log.Println("NewServHttp()")
  19. if servProcess == nil {
  20. return nil, fmt.Errorf("NewServHttp(): IServProcess==nil")
  21. }
  22. sf := &ServHttp{
  23. mux: http.NewServeMux(),
  24. proc: servProcess,
  25. }
  26. sf.mux.HandleFunc("/api/order/new", sf.createOrder)
  27. return sf, nil
  28. }
  29. // Run -- запускает веб-сервер в работу
  30. func (sf *ServHttp) Run() error {
  31. log.Println("ServHttp.Run(): on http://localhost:8090/")
  32. err := http.ListenAndServe(":8090", sf.mux)
  33. if err != nil {
  34. return fmt.Errorf("ServHttp.Run(): in ListenAndServe, err=\n\t%w", err)
  35. }
  36. return nil
  37. }
  38. // Создаёт новый заказ, FIXME: не проверяет метод и хидер application/json
  39. func (sf *ServHttp) createOrder(w http.ResponseWriter, r *http.Request) {
  40. binData, err := io.ReadAll(r.Body)
  41. if err != nil {
  42. msg := fmt.Sprintf("ERROR ServHttp.createOrder(): in ioutil.ReadAll, err=\n\t%v\n", err)
  43. http.Error(w, msg, http.StatusBadRequest)
  44. log.Println(msg)
  45. return
  46. }
  47. var newOrder types.IHotelRoomOrder
  48. newOrder, err = order.Unmarshall(binData)
  49. if err != nil {
  50. msg := fmt.Sprintf("ERROR ServHttp.createOrder(): in order.Unmarshal, err=\n\t%v\n", err)
  51. http.Error(w, msg, http.StatusBadRequest)
  52. log.Println(msg)
  53. return
  54. }
  55. err = sf.proc.MakeHotelRoomOrder(newOrder)
  56. if err != nil {
  57. msg := fmt.Sprintf("ERROR ServHttp.createOrder(): in proc.MakeHotelRoomOrder, err=\n\t%v\n", err)
  58. http.Error(w, msg, http.StatusBadRequest)
  59. log.Println(msg)
  60. return
  61. }
  62. w.Header().Set("Content-Type", "application/json")
  63. w.WriteHeader(http.StatusCreated)
  64. _, err = w.Write(newOrder.Marshall())
  65. if err != nil {
  66. msg := fmt.Sprintf("ERROR ServHttp.createOrder(): in w.Write response, err=\n\t%v\n", err)
  67. http.Error(w, msg, http.StatusBadRequest)
  68. log.Println(msg)
  69. return
  70. }
  71. log.Printf("ServHttp.createOrder(): order=%q, created ok\n", newOrder.Id())
  72. }