You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

96 lines
2.0 KiB

  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "net/http"
  6. "gopkg.in/mgo.v2/bson"
  7. )
  8. type User struct {
  9. Id bson.ObjectId `json:"id" bson:"_id,omitempty"`
  10. Username string `json:"username"`
  11. Email string `json:"email"`
  12. Password string `json:"password"`
  13. Token string `json:"token"`
  14. }
  15. func Index(w http.ResponseWriter, r *http.Request) {
  16. fmt.Fprintln(w, "clientApp")
  17. }
  18. func Signup(w http.ResponseWriter, r *http.Request) {
  19. decoder := json.NewDecoder(r.Body)
  20. var user User
  21. err := decoder.Decode(&user)
  22. if err != nil {
  23. panic(err)
  24. }
  25. defer r.Body.Close()
  26. fmt.Print("user signup: ")
  27. fmt.Println(user.Username)
  28. //save the new project to mongodb
  29. rUser := User{}
  30. err = userCollection.Find(bson.M{"email": user.Email}).One(&rUser)
  31. if err != nil {
  32. //user not exists
  33. err = userCollection.Insert(user)
  34. err = userCollection.Find(bson.M{"email": user.Email}).One(&user)
  35. } else {
  36. //user exists
  37. http.Error(w, "user already registered", http.StatusConflict)
  38. return
  39. }
  40. fmt.Println(user.Username)
  41. jResp, err := json.Marshal(user)
  42. if err != nil {
  43. panic(err)
  44. }
  45. fmt.Fprintln(w, string(jResp))
  46. }
  47. func Login(w http.ResponseWriter, r *http.Request) {
  48. decoder := json.NewDecoder(r.Body)
  49. var user User
  50. err := decoder.Decode(&user)
  51. if err != nil {
  52. panic(err)
  53. }
  54. defer r.Body.Close()
  55. //TODO check if the user password exists in the database
  56. fmt.Print("user login: ")
  57. fmt.Println(user)
  58. //save the new project to mongodb
  59. rUser := User{}
  60. err = userCollection.Find(bson.M{"email": user.Email}).One(&rUser)
  61. if err != nil {
  62. http.Error(w, "error login, email not foun", http.StatusConflict)
  63. return
  64. }
  65. //user exists, check password
  66. if user.Password != rUser.Password {
  67. http.Error(w, "error login, password not match", http.StatusConflict)
  68. return
  69. }
  70. token, err := newToken()
  71. check(err)
  72. rUser.Token = token
  73. //update with the token
  74. err = userCollection.Update(bson.M{"_id": rUser.Id}, rUser)
  75. check(err)
  76. jResp, err := json.Marshal(rUser)
  77. if err != nil {
  78. panic(err)
  79. }
  80. fmt.Fprintln(w, string(jResp))
  81. }