diff --git a/README.md b/README.md index 534e8c3..073f24f 100644 --- a/README.md +++ b/README.md @@ -25,26 +25,28 @@ Supply environment variables by either exporting them or editing ```.env```. Unless otherwise noted, bodies and responses are with `Content-Type: application/json`. Endpoints marked with a ```*``` require a populated `X-User-Claim` header from `backend-auth`. -| Contents | -| -------- | -| [Create User](#Create-User) | -| [Get Users by Phone](#Get-Users-by-Phone) | -| [Get User by ID](#Get-User-by-ID) | -| [Get User by Username](#Get-User-by-Username) ] -| [Update User](#Update-User) | -| [Create Conversation](#Create-Conversation) | -| [Delete Conversation](#Delete-Conversation) | -| [Update Conversation](#Update-Conversation) | -| [Get Conversations](#Get-Conversations) | -| [Get Conversation](#Get-Conversation) | +| Contents | +| --------------------------------------------------------- | +| [Create User](#Create-User) | +| [Get Users by Phone](#Get-Users-by-Phone) | +| [Get User by ID](#Get-User-by-ID) | +| [Get User by Username](#Get-User-by-Username) | +| [Update User](#Update-User) | +| [Create Conversation](#Create-Conversation) | +| [Delete Conversation](#Delete-Conversation) | +| [Update Conversation](#Update-Conversation) | +| [Get Conversations](#Get-Conversations) | +| [Get Conversation](#Get-Conversation) | +| [Pin Conversation](#Pin-Conversation) | +| [Unpin Conversation](#Unpin-Conversation) | | [Create Conversation Member](#Create-Conversation-Member) | -| [Get Conversation Members](#Get-Conversation-Members) | -| [Create Contact](#Create-Contact) | -| [Get Contacts](#Get-Contacts) | -| [Subscribe Contact](#Subscribe-Contact) | -| [Subscribe Conversation](#Subscribe-Conversation) | -| [Subscribe User](#Subscribe-User) | -| [Subscribe Member](#Subscribe-Member) | +| [Get Conversation Members](#Get-Conversation-Members) | +| [Create Contact](#Create-Contact) | +| [Get Contacts](#Get-Contacts) | +| [Subscribe Contact](#Subscribe-Contact) | +| [Subscribe Conversation](#Subscribe-Conversation) | +| [Subscribe User](#Subscribe-User) | +| [Subscribe Member](#Subscribe-Member) | --- @@ -442,6 +444,33 @@ Blank body. --- +### Unpin Conversation + +``` +DELETE /user/conversation/:conversation/pin +``` + +Unmark the specified conversation as pinned. + +#### URL Params + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| conversation | String | Conversation's ID. | ✓ | + +#### Success Response (200 OK) + +Blank body. + +#### Errors + +| Code | Description | +| ---- | ----------- | +| 400 | Invalid `X-User-Claim` header. | +| 404 | Conversation with supplied ID could not be found in database. | +| 500 | Error occurred editing entry in the database. | + +--- ### Create Conversation Member* ``` diff --git a/conversation.go b/conversation.go index 15be6a1..13847ac 100644 --- a/conversation.go +++ b/conversation.go @@ -487,3 +487,48 @@ func (h *Handler) PinConversation(w http.ResponseWriter, r *http.Request, p http w.WriteHeader(200) } + +func (h *Handler) UnpinConversation(w http.ResponseWriter, r *http.Request, p httprouter.Params) { + conversationID := p.ByName("conversation") + userID := r.Context().Value("user").(string) + + // Check relation exists + var exists int + err := h.db.QueryRow(`SELECT 1 FROM member WHERE "user" = $1 AND "conversation" = $2`, userID, conversationID).Scan(&exists) + if err == sql.ErrNoRows { + http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound) + return + } else if err != nil { + http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) + return + } + + // Update relation + _, err = h.db.Exec(`UPDATE "member" SET "pinned" = FALSE WHERE "user" = $1 AND "conversation" = $2`, userID, conversationID) + if err != nil { + http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) + return + } + + // Publish NATs + if h.nc != nil { + member := Member{ + User: userID, + Conversation: conversationID, + Pinned: false, + } + memberString, err := json.Marshal(&member) + if err == nil { + updateMsg := UpdateMsg{ + Type: "update", + Data: string(memberString), + } + updateMsgString, err := json.Marshal(&updateMsg) + if err == nil { + h.nc.Publish("member", updateMsgString) + } + } + } + + w.WriteHeader(200) +} diff --git a/router.go b/router.go index 164bc91..ae1480a 100644 --- a/router.go +++ b/router.go @@ -23,6 +23,7 @@ func NewRouter(h *Handler) *httprouter.Router { router.PATCH("/user/conversation/:conversation", AuthMiddleware(h.UpdateConversation)) // USER MEMBER CONVERSATION ADMIN=true -> update conversation title //router.DELETE("/user/:user/conversation/:conversation", h.DeleteConversation) // USER MEMBER CONVERSATION -> delete membership router.POST("/user/conversation/:conversation/pin", AuthMiddleware(h.PinConversation)) + router.DELETE("/user/conversation/:conversation/pin", AuthMiddleware(h.UnpinConversation)) router.POST("/user/conversation/:conversation/member", AuthMiddleware(h.CreateConversationMember)) // USER MEMBER CONVERSATION ADMIN=true -> create new membership router.GET("/user/conversation/:conversation/member", AuthMiddleware(h.GetConversationMembers)) // USER MEMBER CONVERSATION //router.DELETE("/user/:user/conversation/:conversation/member/:member", h.DeleteConversationMember) // USER MEMBER CONVERSATION ADMIN=true -> delete membership