func UserVerifyAndUpdatePhone()

in src/users/src/users-service/handlers.go [323:420]


func UserVerifyAndUpdatePhone(w http.ResponseWriter, r *http.Request){
	enableCors(&w)
	if (*r).Method == "OPTIONS" {
		w.WriteHeader(http.StatusOK)
		return
	}
	type UserIDandNumber struct {
		UserID		string 	   `json:"user_id" yaml:"user_id"`
		PhoneNumber string 	   `json:"phone_number" yaml:"phone_number"`
	}
	var userDetails UserIDandNumber

	body, err := ioutil.ReadAll(io.LimitReader(r.Body, 1048576))
	if err != nil {
		panic(err)
	}
	if err := r.Body.Close(); err != nil {
		panic(err)
	}
	if err := json.Unmarshal(body, &userDetails); err != nil {
		w.Header().Set("Content-Type", "application/json; charset=UTF-8")
		w.WriteHeader(422) // unprocessable entity
		if err := json.NewEncoder(w).Encode(err); err != nil {
			panic(err)
		}
	}
	fmt.Println(userDetails.PhoneNumber)
	user := RepoFindUserByID(userDetails.UserID)
	if user.ID == "" {
		fmt.Println("User does not exist. Cannot associate phone number to user.")
	} else {
		user.PhoneNumber = userDetails.PhoneNumber
		// check if the number entered by user is valid
		numberValidaterequest := &pinpoint.NumberValidateRequest{
			IsoCountryCode: aws.String("US"),
			PhoneNumber: aws.String(userDetails.PhoneNumber),
		}
		phoneValidateInput := &pinpoint.PhoneNumberValidateInput{
			NumberValidateRequest: numberValidaterequest,
		}
		res, err := pinpoint_client.PhoneNumberValidate(phoneValidateInput)
		if err != nil {
			fmt.Println("Got error calling PhoneNumberValidate:")
			fmt.Println(err.Error())
			http.Error(w, err.Error(), 500)
			return
		} else {
			fmt.Println(res)
			mobilePhoneType := aws.StringValue(res.NumberValidateResponse.PhoneType)
			if (mobilePhoneType == "INVALID" || mobilePhoneType == "LANDLINE") {
				var errMessage string = "The phone number provided is phone number of type "  + mobilePhoneType + ". The number would not not be capable of receiving SMS. Cannot create SMS endpoint for this number. Try entering a valid phone number."
				panic(errMessage)
				http.Error(w, errMessage, 422)
				return
			} else {
				var userAge string = strconv.Itoa(user.Age)
				var userAttributes = make(map[string][]*string)
				userAttributes["Username"] = []*string{&user.Username}
				userAttributes["FirstName"] = []*string{&user.FirstName}
				userAttributes["LastName"] = []*string{&user.LastName}
				userAttributes["Gender"] = []*string{&user.Gender}
				userAttributes["Age"] = []*string{&userAge}

				endpointRequest := &pinpoint.EndpointRequest{
					Address: &userDetails.PhoneNumber,
					ChannelType: aws.String("SMS"),
					OptOut: aws.String("ALL"),
					Location: &pinpoint.EndpointLocation {
						PostalCode: res.NumberValidateResponse.ZipCode,
						City: res.NumberValidateResponse.City,
						Country: res.NumberValidateResponse.CountryCodeIso2,
					},
					Demographic: &pinpoint.EndpointDemographic {
						Timezone: res.NumberValidateResponse.Timezone,
					},
					User: &pinpoint.EndpointUser{
						UserAttributes: userAttributes,
						UserId: &userDetails.UserID,
					},
				}
				var endpointId string = userDetails.PhoneNumber[1:]
				updateEndpointInput := &pinpoint.UpdateEndpointInput{
					ApplicationId: &pinpoint_app_id,
					EndpointId: &endpointId,
					EndpointRequest: endpointRequest,
				}
				CreateEndpointAndSendConfirmation(w, r, updateEndpointInput, userDetails.PhoneNumber)
				}
			}
		}
	t := RepoUpdateUser(user)

	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
	w.WriteHeader(http.StatusCreated)
	if err := json.NewEncoder(w).Encode(t); err != nil {
		panic(err)
	}
}