Endpoint to edit users. Fixes #11
parent
cfc9ea0672
commit
31b305a9c6
41
README.md
41
README.md
|
@ -31,6 +31,7 @@ Unless otherwise noted, bodies and responses are with `Content-Type: application
|
||||||
| [Get Users by Phone](#Get-Users-by-Phone) |
|
| [Get Users by Phone](#Get-Users-by-Phone) |
|
||||||
| [Get User by ID](#Get-User-by-ID) |
|
| [Get User by ID](#Get-User-by-ID) |
|
||||||
| [Get User by Username(#Get-User-by-Username) ]
|
| [Get User by Username(#Get-User-by-Username) ]
|
||||||
|
| [Update User](#Update-User) |
|
||||||
| [Create Conversation](#Create-Conversation) |
|
| [Create Conversation](#Create-Conversation) |
|
||||||
| [Delete Conversation](#Delete-Conversation) |
|
| [Delete Conversation](#Delete-Conversation) |
|
||||||
| [Update Conversation](#Update-Conversation) |
|
| [Update Conversation](#Update-Conversation) |
|
||||||
|
@ -57,6 +58,7 @@ Create a new user.
|
||||||
| ---- | ---- | ----------- | -------- |
|
| ---- | ---- | ----------- | -------- |
|
||||||
| username | String | Username of the added user. Must be unique. | ✓ |
|
| username | String | Username of the added user. Must be unique. | ✓ |
|
||||||
| bio | String | Bio of the added user | ✓ |
|
| bio | String | Bio of the added user | ✓ |
|
||||||
|
| profile_pic | String | URL of added user's profile picture | ✓ |
|
||||||
| first_name | String | First name of the added user. | ✓ |
|
| first_name | String | First name of the added user. | ✓ |
|
||||||
| last_name | String | Last name of the added user. | ✓ |
|
| last_name | String | Last name of the added user. | ✓ |
|
||||||
| phone_number | String | Phone number of the added user. Shouldn't be needed but makes life easier. | X |
|
| phone_number | String | Phone number of the added user. Shouldn't be needed but makes life easier. | X |
|
||||||
|
@ -70,6 +72,7 @@ Created user object.
|
||||||
"id": "<id>",
|
"id": "<id>",
|
||||||
"username": "<username>",
|
"username": "<username>",
|
||||||
"bio": "<bio>",
|
"bio": "<bio>",
|
||||||
|
"profile_pic: "<profile_pic>",
|
||||||
"first_name": "<first_name>",
|
"first_name": "<first_name>",
|
||||||
"last_name": "<last_name>",
|
"last_name": "<last_name>",
|
||||||
"phone_number": "<phone_number>"
|
"phone_number": "<phone_number>"
|
||||||
|
@ -109,6 +112,7 @@ List of users.
|
||||||
"id": "<id>",
|
"id": "<id>",
|
||||||
"username": "<username>",
|
"username": "<username>",
|
||||||
"bio": "<bio>",
|
"bio": "<bio>",
|
||||||
|
"profile_pic": "<profile_pic>",
|
||||||
"first_name": "<first_name>",
|
"first_name": "<first_name>",
|
||||||
"last_name": "<last_name>"
|
"last_name": "<last_name>"
|
||||||
},
|
},
|
||||||
|
@ -149,6 +153,7 @@ User object.
|
||||||
"id": "<id>",
|
"id": "<id>",
|
||||||
"username": "<username>",
|
"username": "<username>",
|
||||||
"bio": "<bio>",
|
"bio": "<bio>",
|
||||||
|
"profile_pic": "<profile_pic>",
|
||||||
"first_name": "<first_name>",
|
"first_name": "<first_name>",
|
||||||
"last_name": "<last_name>",
|
"last_name": "<last_name>",
|
||||||
"phone_number": "<phone_number>"
|
"phone_number": "<phone_number>"
|
||||||
|
@ -187,6 +192,7 @@ User object.
|
||||||
"id": "<id>",
|
"id": "<id>",
|
||||||
"username": "<username>",
|
"username": "<username>",
|
||||||
"bio": "<bio>",
|
"bio": "<bio>",
|
||||||
|
"profile_pic": "<profile_pic>",
|
||||||
"first_name": "<first_name>",
|
"first_name": "<first_name>",
|
||||||
"last_name": "<last_name>",
|
"last_name": "<last_name>",
|
||||||
"phone_number": "<phone_number>"
|
"phone_number": "<phone_number>"
|
||||||
|
@ -202,6 +208,37 @@ User object.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
### Update User
|
||||||
|
|
||||||
|
```
|
||||||
|
PATCH /user
|
||||||
|
```
|
||||||
|
|
||||||
|
Update an existing user. User ID is taken from header supplied by `backend-auth`. If one does not wish to update a field, leave it the value acquire from Get-User.
|
||||||
|
|
||||||
|
#### Body
|
||||||
|
|
||||||
|
| Name | Type | Description | Required |
|
||||||
|
| ---- | ---- | ----------- | -------- |
|
||||||
|
| username | String | Updated username. | X |
|
||||||
|
| bio | String | Updated bio. | X |
|
||||||
|
| profile_pic | String | Updated URL of profile picture. | X |
|
||||||
|
| first_name | String | Updated first name. | X |
|
||||||
|
| last_name | String | Updated last name | X |
|
||||||
|
|
||||||
|
#### Success (200 OK)
|
||||||
|
|
||||||
|
Empty body.
|
||||||
|
|
||||||
|
#### Errors
|
||||||
|
|
||||||
|
| Code | Description |
|
||||||
|
| ---- | ----------- |
|
||||||
|
| 400 | Error parsing body/User with username already exists. |
|
||||||
|
| 500 | Error occurred updating database. |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
### Create Conversation*
|
### Create Conversation*
|
||||||
|
|
||||||
```
|
```
|
||||||
|
@ -421,6 +458,9 @@ List of user objects in conversation.
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
"id": "<id>",
|
"id": "<id>",
|
||||||
|
"username": "<username>",
|
||||||
|
"bio": "<bio>",
|
||||||
|
"profile_pic": "<profile_pic>",
|
||||||
"first_name": "<first_name>",
|
"first_name": "<first_name>",
|
||||||
"last_name": "<last_name>",
|
"last_name": "<last_name>",
|
||||||
"phone_number": "<phone_number>"
|
"phone_number": "<phone_number>"
|
||||||
|
@ -483,6 +523,7 @@ List of user objects in user's contacts.
|
||||||
"id": "<id>",
|
"id": "<id>",
|
||||||
"username": "<username>",
|
"username": "<username>",
|
||||||
"bio": "<bio>",
|
"bio": "<bio>",
|
||||||
|
"profile_pic": "<profile_pic",
|
||||||
"first_name": "<first_name>",
|
"first_name": "<first_name>",
|
||||||
"last_name": "<last_name>"
|
"last_name": "<last_name>"
|
||||||
},
|
},
|
||||||
|
|
46
handlers.go
46
handlers.go
|
@ -153,6 +153,50 @@ func (h *Handler) GetUserByUsername(w http.ResponseWriter, r *http.Request, p ht
|
||||||
json.NewEncoder(w).Encode(user)
|
json.NewEncoder(w).Encode(user)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *Handler) UpdateUser(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
|
||||||
|
// Parse
|
||||||
|
userID := r.Context().Value("user").(string)
|
||||||
|
user := User{}
|
||||||
|
decoder := json.NewDecoder(r.Body)
|
||||||
|
err := decoder.Decode(&user)
|
||||||
|
if err != nil {
|
||||||
|
http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for duplicate username
|
||||||
|
var _id string
|
||||||
|
err = h.db.QueryRow(`
|
||||||
|
SELECT id FROM "user" WHERE "user".id <> $1 AND "user".username = $2
|
||||||
|
`, userID, user.Username).Scan(&_id)
|
||||||
|
if err == nil {
|
||||||
|
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
} else if err != sql.ErrNoRows {
|
||||||
|
http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update
|
||||||
|
_, err = h.db.Exec(`
|
||||||
|
UPDATE "user"
|
||||||
|
SET
|
||||||
|
username = $2,
|
||||||
|
bio = $3,
|
||||||
|
profile_pic = $4,
|
||||||
|
first_name = $5,
|
||||||
|
last_name = $6
|
||||||
|
WHERE id = $1
|
||||||
|
`, userID, user.Username, user.Bio, user.ProfilePic, user.FirstName, user.LastName)
|
||||||
|
if err != nil {
|
||||||
|
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
|
||||||
|
log.Print(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
w.WriteHeader(200);
|
||||||
|
}
|
||||||
|
|
||||||
func (h *Handler) CreateConversation(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
|
func (h *Handler) CreateConversation(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
|
||||||
// Parse
|
// Parse
|
||||||
userID := r.Context().Value("user").(string)
|
userID := r.Context().Value("user").(string)
|
||||||
|
@ -335,7 +379,7 @@ func (h *Handler) DeleteConversation(w http.ResponseWriter, r *http.Request, p h
|
||||||
if err != nil {
|
if err != nil {
|
||||||
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
|
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
|
||||||
log.Print(err)
|
log.Print(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check
|
// Check
|
||||||
|
|
2
main.go
2
main.go
|
@ -43,7 +43,7 @@ func main() {
|
||||||
router.GET("/user", h.GetUsersByPhone)
|
router.GET("/user", h.GetUsersByPhone)
|
||||||
router.GET("/user/id/:user", h.GetUser)
|
router.GET("/user/id/:user", h.GetUser)
|
||||||
router.GET("/user/username/:username", h.GetUserByUsername)
|
router.GET("/user/username/:username", h.GetUserByUsername)
|
||||||
//router.PATCH("/user/:user", h.UpdateUser)
|
router.PATCH("/user", h.UpdateUser)
|
||||||
// Conversations
|
// Conversations
|
||||||
router.POST("/user/conversation", AuthMiddleware(h.CreateConversation))
|
router.POST("/user/conversation", AuthMiddleware(h.CreateConversation))
|
||||||
router.GET("/user/conversation", AuthMiddleware(h.GetConversations)) // USER MEMBER CONVERSATION
|
router.GET("/user/conversation", AuthMiddleware(h.GetConversations)) // USER MEMBER CONVERSATION
|
||||||
|
|
Loading…
Reference in New Issue