l1.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package main
  2. import (
  3. "fmt"
  4. "net/http"
  5. "encoding/json"
  6. "strings"
  7. "database/sql"
  8. _ "github.com/mattn/go-sqlite3"
  9. )
  10. type User struct{
  11. Age int `json:"age"`
  12. Name string `json:"name"`
  13. Email string `json:"email"`
  14. Alive bool `json:"alive"`
  15. }
  16. var setChan = make(chan User)
  17. func handle(w http.ResponseWriter, r *http.Request) {
  18. if r.Method != http.MethodPost {
  19. http.Error(w, "not", http.StatusMethodNotAllowed)
  20. return
  21. }
  22. var data User
  23. err := json.NewDecoder(r.Body).Decode(&data)
  24. if err != nil {
  25. http.Error(w,"no", http.StatusBadRequest)
  26. return
  27. }
  28. defer r.Body.Close()
  29. i := 0
  30. if data.Age > 150 {
  31. i++
  32. }
  33. CheckEmail := strings.ContainsAny(data.Email, "@.")
  34. if CheckEmail != true {
  35. i++
  36. }
  37. if data.Alive != true {
  38. i++
  39. }
  40. if i != 0 {
  41. msg := fmt.Sprintf("Error: %d", i)
  42. http.Error(w, msg, http.StatusBadRequest)
  43. return
  44. }
  45. setChan <- data
  46. w.WriteHeader(http.StatusOK)
  47. w.Write([]byte("Data received"))
  48. }
  49. func WatchChanell() {
  50. for u := range setChan {
  51. db, err := sql.Open("sqlite3", "./base.db")
  52. if err != nil {
  53. panic(err)
  54. }
  55. defer db.Close()
  56. sqlStmt := `CREATE TABLE IF NOT EXISTS l1 (
  57. id INTEGER NOT NULL PRIMARY KEY,
  58. age INTEGER DEFAULT 0,
  59. name TEXT,
  60. email TEXT,
  61. alive INTEGER NOT NULL DEFAULT 0 CHECK (alive IN (0, 1))
  62. ); `
  63. _, err = db.Exec(sqlStmt)
  64. if err != nil {
  65. panic(err)
  66. }
  67. var Alive int
  68. if u.Alive {
  69. Alive = 1
  70. } else {
  71. Alive = 0
  72. }
  73. _, err = db.Exec("INSERT INTO l1 (age, name, email, alive) VALUES(?, ?, ?, ?)", u.Age, u.Name, u.Email, Alive)
  74. if err != nil {
  75. panic(err)
  76. }
  77. defer db.Close()
  78. rows, err := db.Query("SELECT id, age, name, email, alive FROM l1")
  79. if err != nil {
  80. panic(err)
  81. }
  82. for rows.Next() {
  83. var id int
  84. var age int
  85. var name string
  86. var email string
  87. var alive int
  88. var boolAlive bool
  89. rows.Scan(&id, &age, &name, &email, &alive)
  90. if alive == 1 {
  91. boolAlive = true
  92. }
  93. if alive == 0 {
  94. boolAlive = false
  95. }
  96. StrAnswer := fmt.Sprintf("ID %d, Age %d, Name %s, Email %s, Alive %t\n", id, age, name, email, boolAlive)
  97. fmt.Printf("%s", StrAnswer)
  98. }
  99. }
  100. }
  101. func main() {
  102. go WatchChanell()
  103. http.HandleFunc("/user", handle)
  104. fmt.Println(":7777")
  105. err := http.ListenAndServe(":7777", nil)
  106. if err != nil {
  107. panic(err)
  108. }
  109. }