main.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/jinzhu/gorm"
  6. _ "github.com/jinzhu/gorm/dialects/sqlite"
  7. "log"
  8. "net/http"
  9. "strings"
  10. "strconv"
  11. )
  12. type server struct {
  13. name string
  14. db *gorm.DB
  15. }
  16. type Message struct {
  17. ID uint
  18. Name string
  19. Content string
  20. }
  21. func main() {
  22. db, err := gorm.Open("sqlite3", "sqlite.db")
  23. if err != nil {
  24. log.Fatal("Could not open database", err)
  25. }
  26. defer db.Close()
  27. db.DropTableIfExists(&Message{})
  28. db.AutoMigrate(&Message{})
  29. s := server{name: "Golang Hands-on", db: db}
  30. http.Handle("/", http.FileServer(http.Dir("resources")))
  31. http.HandleFunc("/api/greet/", s.titleHandler)
  32. http.HandleFunc("/api/sum/", s.sumHandler)
  33. http.HandleFunc("/api/store/", s.storeHandler)
  34. if err != nil {
  35. log.Fatal(err)
  36. }
  37. log.Println("Listening on http://localhost:8080")
  38. err = http.ListenAndServe(":8080", nil)
  39. log.Fatal(err)
  40. }
  41. type greet struct {
  42. Title string `json:"title"`
  43. Subtitle string `json:"subtitle"`
  44. }
  45. func (s server) titleHandler(w http.ResponseWriter, r *http.Request) {
  46. var err error
  47. if strings.Contains(r.Header.Get("Accept"), "application/json") {
  48. w.Header().Set("Content-Type", "application/json; charset=utf8")
  49. e := json.NewEncoder(w)
  50. err = e.Encode(greet{Title: s.name, Subtitle: "Hallo Quintor!"})
  51. } else {
  52. w.Header().Set("Content-Type", "text/plain; charset=utf8")
  53. _, err = fmt.Fprint(w, s.name)
  54. }
  55. if err != nil {
  56. log.Println(err)
  57. }
  58. }
  59. type sumRequest struct {
  60. Start int `json:"start"`
  61. End int `json:"end"`
  62. Numbers []int `json:"numbers"`
  63. }
  64. type sumResponse struct {
  65. Answer int `json:"answer"`
  66. Count int `json:"contributers"`
  67. }
  68. func (s server) sumHandler(w http.ResponseWriter, r *http.Request) {
  69. w.Header().Set("Content-Type", "application/json; charset=utf8")
  70. var sreq sumRequest
  71. d := json.NewDecoder(r.Body)
  72. err := d.Decode(&sreq)
  73. if err != nil {
  74. log.Println(err)
  75. http.Error(w, "Bad request", http.StatusBadRequest)
  76. return
  77. }
  78. var sresp sumResponse
  79. for _, val := range sreq.Numbers[sreq.Start:sreq.End] {
  80. sresp.Answer += val
  81. sresp.Count++
  82. }
  83. e := json.NewEncoder(w)
  84. err = e.Encode(sresp)
  85. if err != nil {
  86. log.Println(err)
  87. }
  88. }
  89. type storeMessage struct {
  90. Name string `json:"name"`
  91. Content string `json:"message"`
  92. }
  93. type storeResponse struct {
  94. Id uint `json:"id"`
  95. }
  96. func (s server) storeHandler(w http.ResponseWriter, r *http.Request) {
  97. w.Header().Set("Content-Type", "application/json; charset=utf8")
  98. if r.Method == http.MethodPost {
  99. storeHandlePost(s.db, w, r)
  100. } else {
  101. storeHandleGet(s.db, w, r)
  102. }
  103. }
  104. func storeHandlePost(db *gorm.DB, w http.ResponseWriter, r *http.Request) {
  105. var sm storeMessage
  106. d := json.NewDecoder(r.Body)
  107. err := d.Decode(&sm)
  108. if err != nil {
  109. log.Println(err)
  110. http.Error(w, "Bad request", http.StatusBadRequest)
  111. return
  112. }
  113. m := Message{Name: sm.Name, Content: sm.Content}
  114. db.Create(&m)
  115. log.Println("message id", m.ID)
  116. e := json.NewEncoder(w)
  117. err = e.Encode(storeResponse{Id: m.ID})
  118. if err != nil {
  119. log.Println(err)
  120. }
  121. }
  122. func storeHandleGet(db *gorm.DB, w http.ResponseWriter, r *http.Request) {
  123. log.Println(r.URL.Path, strings.TrimPrefix(r.URL.Path, "/api/store/"))
  124. id, err := strconv.Atoi(strings.TrimPrefix(r.URL.Path, "/api/store/"))
  125. if err != nil {
  126. http.NotFound(w, r)
  127. return
  128. }
  129. var m Message
  130. if err := db.First(&m, id).Error; err != nil {
  131. log.Println(err)
  132. http.NotFound(w, r)
  133. return
  134. }
  135. e := json.NewEncoder(w)
  136. err = e.Encode(storeMessage{m.Name, m.Content})
  137. if err != nil {
  138. log.Println(err)
  139. }
  140. }