-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathverifyHandler.go
More file actions
105 lines (92 loc) · 3.68 KB
/
verifyHandler.go
File metadata and controls
105 lines (92 loc) · 3.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package main
import (
"encoding/json"
"fmt"
"net/http"
"strconv"
"strings"
)
func verifyHandler(w http.ResponseWriter, r *http.Request) {
decoder := json.NewDecoder(r.Body)
Req := struct {
Token string `json:"token"`
PhoneNumber string `json:"phone_number"`
FirebaseID string `json:"firebase_id"`
}{"", "", ""}
err := decoder.Decode(&Req)
if err != nil {
failWithStatusCode(err, http.StatusText(http.StatusBadRequest), w, http.StatusBadRequest)
return
}
if Req.Token == "" || Req.PhoneNumber == "" || Req.FirebaseID == "" {
w.WriteHeader(http.StatusBadRequest)
fmt.Fprintf(w, "Bad request")
return
}
Req.PhoneNumber = strings.Replace(Req.PhoneNumber, "-", "", -1)
_, err = strconv.Atoi(Req.PhoneNumber)
if (err != nil) || (len(Req.PhoneNumber) < 10 || len(Req.PhoneNumber) > 16) {
failWithStatusCode(err, http.StatusText(http.StatusBadRequest), w, http.StatusBadRequest)
return
}
User := struct {
FirstName string
LastName string
PhoneNumber string
Token string
}{"", "", "", ""}
queryString := "SELECT first_name, last_name, phone_number, token FROM temp_users WHERE phone_number = $1"
stmt, err := db.Prepare(queryString)
if err != nil {
failWithStatusCode(err, http.StatusText(http.StatusInternalServerError), w, http.StatusInternalServerError)
return
}
err = stmt.QueryRow(Req.PhoneNumber).Scan(&User.FirstName, &User.LastName, &User.PhoneNumber, &User.Token)
if User.Token == "" {
failWithStatusCode(err, "Attempting to verify user that does not exist", w, http.StatusNotFound)
return
}
if Req.Token == User.Token {
queryString = "INSERT INTO users(first_name, last_name, phone_number, current_status, api_token, firebase_id) " +
"VALUES($1, $2, $3, $4, $5, $6)" +
"ON CONFLICT (phone_number) DO UPDATE " +
"SET first_name = $1, last_name = $2, current_status = $4, api_token = $5, firebase_id = $6 " +
"WHERE EXCLUDED.phone_number = $3"
stmt, err = db.Prepare(queryString)
if err != nil {
failWithStatusCode(err, "Error preparing query", w, http.StatusInternalServerError)
return
}
var apiToken = randString(16)
res, err := stmt.Exec(User.FirstName, User.LastName, User.PhoneNumber, "active", apiToken, Req.FirebaseID)
if err != nil {
failWithStatusCode(err, "Error Inserting User", w, http.StatusInternalServerError)
return
}
numRows, err := res.RowsAffected()
if numRows < 1 {
failWithStatusCode(err, "Error Inserting User", w, http.StatusConflict)
return
}
queryString = "DELETE FROM temp_users WHERE phone_number = $1"
stmt, err = db.Prepare(queryString)
if err != nil {
failWithStatusCode(err, "Error preparing query", w, http.StatusInternalServerError)
return
}
res, err = stmt.Exec(Req.PhoneNumber)
if err != nil {
failWithStatusCode(err, "Problem deleting temp entry", w, http.StatusInternalServerError)
return
}
numRows, err = res.RowsAffected()
if numRows < 1 {
failWithStatusCode(err, "Problem deleting temp entry", w, http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusOK)
fmt.Fprintf(w, "{\"api_token\":\"%s\"}", apiToken)
} else {
failWithStatusCode(err, "Token does not match", w, http.StatusUnauthorized)
}
}