// POST /developer/token, logs in a user by creating a new token func CreateTokenHandler(rw http.ResponseWriter, req *http.Request) { var body requests.LoginReq decoder := json.NewDecoder(req.Body) err := decoder.Decode(&body) if err != nil { renderer.JSON(rw, http.StatusBadRequest, map[string]string{ "status": requests.StatusFailed, "error": err.Error(), }) return } email := body.Email password := body.Password if email == "" || password == "" { renderer.JSON(rw, http.StatusBadRequest, map[string]string{ "status": requests.StatusFailed, "error": "Email and Password Required.", }) return } query := map[string]interface{}{"email": email} u, err := db.GetDeveloper(query) if err != nil { renderer.JSON(rw, http.StatusInternalServerError, map[string]string{ "status": requests.StatusFailed, "error": "No such developer with email " + email + ".", }) return } if util.HashPassword(password, u.Salt) != u.Password { renderer.JSON(rw, http.StatusInternalServerError, map[string]string{ "status": requests.StatusFailed, "error": "Incorrect Password", }) return } token := util.HashToken() update := map[string]interface{}{"token": token} if err := db.UpdateDeveloper(query, update); err != nil { renderer.JSON(rw, http.StatusInternalServerError, map[string]string{ "status": requests.StatusFailed, "error": err.Error(), }) return } renderer.JSON(rw, http.StatusOK, map[string]interface{}{ "status": requests.StatusCreated, "token": token, }) }
// POST /developers, Creates a new developer func CreateDeveloperHandler(rw http.ResponseWriter, req *http.Request) { type engineer struct { Name string Email string } integrationEngineers := []*engineer{ &engineer{Name: "Steve Kaliski", Email: "*****@*****.**"}, &engineer{Name: "David Byrd", Email: "*****@*****.**"}, &engineer{Name: "Larz Conwell", Email: "*****@*****.**"}, } integrationEngineer := integrationEngineers[rand.Int()%len(integrationEngineers)] var body requests.LoginReq decoder := json.NewDecoder(req.Body) err := decoder.Decode(&body) if err != nil { renderer.JSON(rw, http.StatusBadRequest, map[string]string{ "status": requests.StatusFailed, "error": err.Error(), }) return } if body.Email == "" || body.Password == "" { renderer.JSON(rw, http.StatusBadRequest, map[string]string{ "status": requests.StatusFailed, "error": "Email and Password Required.", }) return } u := &schemas.Developer{ Name: body.Name, Email: body.Email, Password: body.Password, Token: util.HashToken(), IntegrationEngineer: integrationEngineer.Name, IsPaid: false, CreatedAt: time.Now().UnixNano() / int64(time.Millisecond), } _, err = db.GetDeveloper(bson.M{"email": u.Email}) if err == nil { renderer.JSON(rw, http.StatusInternalServerError, map[string]string{ "status": requests.StatusFailed, "error": "email already exists", }) return } if os.Getenv("ENV") == "production" && !strings.Contains(body.Email, "@bowery.io") { if _, err := chimp.ListsSubscribe(gochimp.ListsSubscribe{ ListId: "200e892f56", Email: gochimp.Email{Email: u.Email}, }); err != nil { renderer.JSON(rw, http.StatusBadRequest, map[string]string{ "status": requests.StatusFailed, "error": err.Error(), }) return } message, err := RenderEmail("welcome", map[string]interface{}{ "name": strings.Split(u.Name, " ")[0], "engineer": integrationEngineer, }) if err != nil { renderer.JSON(rw, http.StatusBadRequest, map[string]string{ "status": requests.StatusFailed, "error": err.Error(), }) return } _, err = mandrill.MessageSend(gochimp.Message{ Subject: "Welcome to Bowery!", FromEmail: "*****@*****.**", FromName: integrationEngineer.Name, To: []gochimp.Recipient{{ Email: u.Email, Name: u.Name, }}, Html: message, }, false) if err != nil { renderer.JSON(rw, http.StatusBadRequest, map[string]string{ "status": requests.StatusFailed, "error": err.Error(), }) return } } if err := db.Save(u); err != nil { renderer.JSON(rw, http.StatusBadRequest, map[string]string{ "status": requests.StatusFailed, "error": err.Error(), }) return } // Post to slack if os.Getenv("ENV") == "production" && !strings.Contains(body.Email, "@bowery.io") { channel := "#activity" message := u.Name + " " + u.Email + " just signed up." username := "******" go slackC.SendMessage(channel, message, username) } renderer.JSON(rw, http.StatusOK, map[string]interface{}{ "status": requests.StatusCreated, "developer": u, }) }