// Register takes a doc and attempts to create a new user func Register(registerDoc map[string]interface{}) error { // Make sure we have all the properties we need err := checkPropsExist(registerDoc) if err != nil { return err } // Get the properties we need id := registerDoc["username"].(string) email := registerDoc["email"].(string) password := registerDoc["password"].(string) reCAPTCHA := registerDoc["g-recaptcha-response"].(string) // Make sure the user does not exist already doc, err := api.GetUser(variables.ServiceDBURL, variables.BackendToken, id) if doc != nil { return errors.New("Username is already taken") } // Verify with google reCAPTCHA err = recaptcha.Verify(variables.RecaptchaSecret, reCAPTCHA) if err != nil { return errors.New(err.Error()) } // Hashing the password hashedPassword, err := bcrypt.GenerateFromPassword( []byte(password), variables.BcryptCost, ) if err != nil { return err } // Take only the parts we care about and save them saveUser := map[string]interface{}{ "_id": id, "email": email, "password": string(hashedPassword), } _, err = api.SaveUser(variables.ServiceDBURL, variables.BackendToken, id, saveUser) if err != nil { return err } // Take only the parts we care about and save them saveAccount := map[string]interface{}{ "_id": id, "email": email, } doc, err = api.SaveAccount(variables.ServiceDBURL, variables.BackendToken, id, saveAccount) if err != nil { return err } log.Println("User registered", saveUser) return nil }
// PostUser uses get to retrive a document func PostUser(w rest.ResponseWriter, r *rest.Request) { var recvDoc map[string]interface{} id := r.PathParam("id") err := r.DecodeJsonPayload(&recvDoc) if err != nil { rest.Error(w, err.Error(), http.StatusInternalServerError) return } doc, err := api.SaveUser(variables.ServiceUserURL, r.Env["JWT_RAW"].(string), id, recvDoc) if err != nil { rest.Error(w, err.Error(), http.StatusInternalServerError) return } w.WriteHeader(http.StatusOK) if doc == nil { w.(http.ResponseWriter).Write(variables.BlankResponse) return } w.WriteJson(doc) }
// PostUser uses get to retrive a document func PostUser(w rest.ResponseWriter, r *rest.Request) { var recvDoc map[string]interface{} id := r.PathParam("id") if r.Env["REMOTE_USER"].(string) != id { err := errors.New("Can only save your own user account") rest.Error(w, err.Error(), http.StatusUnauthorized) } err := r.DecodeJsonPayload(&recvDoc) if err != nil { rest.Error(w, err.Error(), http.StatusInternalServerError) return } doc, err := api.SaveUser(variables.ServiceDBURL, r.Env["JWT_RAW"].(string), id, recvDoc) if err != nil { rest.Error(w, err.Error(), http.StatusInternalServerError) return } w.WriteHeader(http.StatusOK) if doc == nil { w.(http.ResponseWriter).Write(variables.BlankResponse) return } w.WriteJson(doc) }