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)
}
}