Skip to content

Commit

Permalink
added GET messages routes and tests
Browse files Browse the repository at this point in the history
  • Loading branch information
aorticweb committed Jan 28, 2022
1 parent ba85556 commit 1e5b5ad
Show file tree
Hide file tree
Showing 9 changed files with 431 additions and 3 deletions.
9 changes: 9 additions & 0 deletions app/common/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,15 @@ func GetIDFromRequest(r *http.Request) (int64, error) {
return strconv.ParseInt(id, 10, 64)
}

func GetUsernameFromRequest(r *http.Request) (string, error) {
vars := mux.Vars(r)
username, ok := vars["username"]
if !ok {
return "", errors.New("username not found in request")
}
return username, nil
}

func WrapError(context string, e error) error {
return fmt.Errorf("%s: %s", context, e)
}
13 changes: 13 additions & 0 deletions app/crud/group.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,19 @@ func GroupExists(db *gorm.DB, groupname string) (bool, error) {
return exist, err
}

func FindGroupsByUserID(db *gorm.DB, userID int64) ([]int64, error) {
var userGroups []UserGroup
err := db.Where("user_id = ?", userID).Find(&userGroups).Error
if err != nil {
return nil, err
}
var groupIDs []int64
for _, group := range userGroups {
groupIDs = append(groupIDs, group.GroupID)
}
return groupIDs, nil
}

func CreateGroup(db *gorm.DB, groupname string, users []User) (*Group, error) {
group := Group{Groupname: groupname}
err := db.Transaction(func(tx *gorm.DB) error {
Expand Down
28 changes: 28 additions & 0 deletions app/crud/message.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,31 @@ func GetMessage(db *gorm.DB, messageID int64) (*Message, bool, error) {
}
return &msg, true, nil
}

func GetMessageReplies(db *gorm.DB, messageID int64) ([]Message, error) {
var msgs []Message
query := db.Preload("Sender").Preload("Recipient").Preload("Group")
err := query.Where("re_id = ?", messageID).Order("sent_at DESC").Find(&msgs).Error
if err != nil {
return nil, err
}
return msgs, nil
}

func GetUserMailbox(db *gorm.DB, userID int64) ([]Message, error) {
// Query
// Get Messages where RecipientID = <UserID>
// Get Messages Where GroupID IN (Get UserGroup where UserID = <UserID>)
groupIDs, err := FindGroupsByUserID(db, userID)
if err != nil {
return nil, err
}
var msgs []Message
query := db.Preload("Sender").Preload("Recipient").Preload("Group")
err = query.Where("recipient_id = ? or group_id in ?", userID, groupIDs).Find(&msgs).Error
if err != nil {
return nil, err
}
return msgs, nil

}
65 changes: 65 additions & 0 deletions app/handlers/message.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (

c "github.com/aorticweb/msg-app/app/common"
"github.com/aorticweb/msg-app/app/crud"
"github.com/aorticweb/msg-app/app/model"
m "github.com/aorticweb/msg-app/app/model"
)

Expand Down Expand Up @@ -58,3 +59,67 @@ func (a *API) handleMessageReplyPost() HandlerFunc {
return c.NewGoodResponse(http.StatusCreated, respMessage)
}
}

func (a *API) handleMessageGet() HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) *c.APIResponse {
messageID, err := c.GetIDFromRequest(r)
if err != nil {
return c.NewBadResponse(http.StatusBadRequest, "invalid request", nil)
}
dbMessage, exist, err := crud.GetMessage(a.db, messageID)
if err != nil {
return c.NewBadResponse(http.StatusInternalServerError, "", err)
}
if !exist {
return c.NewBadResponse(http.StatusNotFound, "message not found", nil)
}
respMessage := m.ResponseMessageFromDBMessage(dbMessage)
return c.NewGoodResponse(http.StatusOK, respMessage)
}
}

func (a *API) handleMessageRepliesGet() HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) *c.APIResponse {
messageID, err := c.GetIDFromRequest(r)
if err != nil {
return c.NewBadResponse(http.StatusBadRequest, "invalid request", nil)
}
_, exist, err := crud.GetMessage(a.db, messageID)
if err != nil {
return c.NewBadResponse(http.StatusInternalServerError, "", err)
}
if !exist {
return c.NewBadResponse(http.StatusNotFound, "message not found", nil)
}
dbMessages, err := crud.GetMessageReplies(a.db, messageID)
var data []model.Message

for _, msg := range dbMessages {
data = append(data, *m.ResponseMessageFromDBMessage(&msg))
}
return c.NewGoodResponse(http.StatusOK, data)
}
}

func (a *API) handleInboxGet() HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) *c.APIResponse {
username, err := c.GetUsernameFromRequest(r)
if err != nil {
return c.NewBadResponse(http.StatusBadRequest, "invalid request", nil)
}
user, exist, err := crud.FindUser(a.db, username)
if err != nil {
return c.NewBadResponse(http.StatusInternalServerError, "", c.WrapError("failed to query user", err))
}
if !exist {
return c.NewBadResponse(http.StatusNotFound, "user with given username does not exist", nil)
}
dbMessages, err := crud.GetUserMailbox(a.db, user.ID)
var data []model.Message

for _, msg := range dbMessages {
data = append(data, *m.ResponseMessageFromDBMessage(&msg))
}
return c.NewGoodResponse(http.StatusOK, data)
}
}
12 changes: 10 additions & 2 deletions app/handlers/routes.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,17 @@
package api

func (a *API) routes() {
a.router.HandleFunc("/health", a.middleware(a.handleHealth())).Methods("GET")
a.router.HandleFunc("/users", a.middleware(a.handleUserPost())).Methods("POST")
a.router.HandleFunc("/groups", a.middleware(a.handleGroupPost())).Methods("POST")

a.router.HandleFunc("/health", a.middleware(a.handleHealth())).Methods("GET")

a.router.HandleFunc("/messages/{id}", a.middleware(a.handleMessageGet())).Methods("GET")
a.router.HandleFunc("/messages", a.middleware(a.handleMessagePost())).Methods("POST")

a.router.HandleFunc("/messages/{id}/replies", a.middleware(a.handleMessageRepliesGet())).Methods("GET")
a.router.HandleFunc("/messages/{id}/replies", a.middleware(a.handleMessageReplyPost())).Methods("POST")

a.router.HandleFunc("/users", a.middleware(a.handleUserPost())).Methods("POST")

a.router.HandleFunc("/users/{username}/mailbox", a.middleware(a.handleInboxGet())).Methods("GET")
}
2 changes: 1 addition & 1 deletion app/model/message.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ func (rm *ReplyMessage) Validate(db *gorm.DB, reID int64) (*crud.Message, *c.API
return nil, c.NewBadResponse(http.StatusNotFound, "message with given id does not exist", nil)
}
msg.REID = &reMessage.ID
msg.Recipient = reMessage.Recipient
msg.Recipient = reMessage.Sender
msg.Group = reMessage.Group
return &msg, nil
}
Expand Down
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ require (
github.com/sirupsen/logrus v1.8.1 // indirect
github.com/stretchr/objx v0.2.0 // indirect
github.com/stretchr/testify v1.7.0 // indirect
github.com/thanhpk/randstr v1.0.4 // indirect
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 // indirect
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069 // indirect
golang.org/x/text v0.3.7 // indirect
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,8 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/thanhpk/randstr v1.0.4 h1:IN78qu/bR+My+gHCvMEXhR/i5oriVHcTB/BJJIRTsNo=
github.com/thanhpk/randstr v1.0.4/go.mod h1:M/H2P1eNLZzlDwAzpkkkUvoyNNMbzRGhESZuEQk3r0U=
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
Expand Down
Loading

0 comments on commit 1e5b5ad

Please sign in to comment.