Skip to content

Commit

Permalink
Merge 0a852a0 into f513879
Browse files Browse the repository at this point in the history
  • Loading branch information
andreistanciu24 committed Mar 2, 2017
2 parents f513879 + 0a852a0 commit 1a44844
Show file tree
Hide file tree
Showing 9 changed files with 207 additions and 0 deletions.
21 changes: 21 additions & 0 deletions api4/team.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ func InitTeam() {
BaseRoutes.Team.Handle("", ApiSessionRequired(getTeam)).Methods("GET")
BaseRoutes.Team.Handle("/stats", ApiSessionRequired(getTeamStats)).Methods("GET")
BaseRoutes.Team.Handle("/members", ApiSessionRequired(getTeamMembers)).Methods("GET")
BaseRoutes.Team.Handle("/unread", ApiSessionRequired(getTeamUnread)).Methods("GET")

BaseRoutes.TeamByName.Handle("", ApiSessionRequired(getTeamByName)).Methods("GET")
BaseRoutes.TeamMember.Handle("", ApiSessionRequired(getTeamMember)).Methods("GET")
Expand Down Expand Up @@ -168,6 +169,26 @@ func getTeamMembers(c *Context, w http.ResponseWriter, r *http.Request) {
}
}

func getTeamUnread(c *Context, w http.ResponseWriter, r *http.Request) {
c.RequireTeamId()
if c.Err != nil {
return
}

if !app.SessionHasPermissionTo(c.Session, model.PERMISSION_MANAGE_SYSTEM) {
c.SetPermissionError(model.PERMISSION_MANAGE_SYSTEM)
return
}

unreadTeam, err := app.GetTeamUnread(c.Params.TeamId)
if err != nil {
c.Err = err
return
}

w.Write([]byte(unreadTeam.ToJson()))
}

func getTeamStats(c *Context, w http.ResponseWriter, r *http.Request) {
c.RequireTeamId()
if c.Err != nil {
Expand Down
25 changes: 25 additions & 0 deletions api4/team_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,31 @@ func TestGetTeamStats(t *testing.T) {
CheckUnauthorizedStatus(t, resp)
}

func TestGetTeamUnread(t *testing.T) {
th := Setup().InitBasic().InitSystemAdmin()
defer TearDown()
Client := th.Client

user := th.BasicUser
Client.Login(user.Email, user.Password)

_, resp := Client.GetTeamUnread(model.NewRandomString(16))
CheckBadRequestStatus(t, resp)

_, resp = Client.GetTeamUnread(th.BasicTeam.Id)
CheckForbiddenStatus(t, resp)

Client.Logout()
_, resp = Client.GetTeamUnread(th.BasicTeam.Id)
CheckUnauthorizedStatus(t, resp)

teamUnread, resp := th.SystemAdminClient.GetTeamUnread(th.BasicTeam.Id)
CheckNoError(t, resp)
if teamUnread.TeamId != th.BasicTeam.Id {
t.Fatal("wrong team id returned")
}
}

func TestUpdateTeamMemberRoles(t *testing.T) {
th := Setup().InitBasic().InitSystemAdmin()
defer TearDown()
Expand Down
24 changes: 24 additions & 0 deletions app/team.go
Original file line number Diff line number Diff line change
Expand Up @@ -550,6 +550,30 @@ func GetTeamsUnreadForUser(teamId string, userId string) ([]*model.TeamUnread, *
}
}

func GetTeamUnread(teamId string) (*model.TeamUnread, *model.AppError) {
result := <-Srv.Store.Team().GetTeamUnread(teamId);
if result.Err != nil {
return nil, result.Err
}

channelUnreads := result.Data.([]*model.ChannelUnread)
var teamUnread = &model.TeamUnread{
MsgCount: 0,
MentionCount: 0,
TeamId: teamId,
}

for i := range channelUnreads {
teamUnread.MentionCount += channelUnreads[i].MentionCount

if channelUnreads[i].NotifyProps["mark_unread"] != model.CHANNEL_MARK_UNREAD_MENTION {
teamUnread.MsgCount += (channelUnreads[i].TotalMsgCount - channelUnreads[i].MsgCount)
}
}

return teamUnread, nil
}

func PermanentDeleteTeam(team *model.Team) *model.AppError {
team.DeleteAt = model.GetMillis()
if result := <-Srv.Store.Team().Update(team); result.Err != nil {
Expand Down
12 changes: 12 additions & 0 deletions model/client4.go
Original file line number Diff line number Diff line change
Expand Up @@ -654,6 +654,18 @@ func (c *Client4) GetTeamStats(teamId, etag string) (*TeamStats, *Response) {
}
}

// GetTeamUnread will return a TeamUnread object that contains the amount of
// unread messages and mentions the current user has for the teams it belongs to.
// Must be authenticated.
func (c *Client4) GetTeamUnread(teamId string) (*TeamUnread, *Response) {
if r, err := c.DoApiGet(c.GetTeamRoute(teamId)+"/unread", ""); err != nil {
return nil, &Response{StatusCode: r.StatusCode, Error: err}
} else {
defer closeBody(r)
return TeamUnreadFromJson(r.Body), BuildResponse(r)
}
}

// Channel Section

// CreateChannel creates a channel based on the provided channel struct.
Expand Down
20 changes: 20 additions & 0 deletions model/team_member.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,15 @@ func (o *TeamMember) ToJson() string {
}
}

func (o *TeamUnread) ToJson() string {
b, err := json.Marshal(o)
if err != nil {
return ""
} else {
return string(b)
}
}

func TeamMemberFromJson(data io.Reader) *TeamMember {
decoder := json.NewDecoder(data)
var o TeamMember
Expand Down Expand Up @@ -69,6 +78,17 @@ func TeamsUnreadToJson(o []*TeamUnread) string {
}
}

func TeamUnreadFromJson(data io.Reader) *TeamUnread {
decoder := json.NewDecoder(data)
var o TeamUnread
err := decoder.Decode(&o)
if err == nil {
return &o
} else {
return nil
}
}

func TeamsUnreadFromJson(data io.Reader) []*TeamUnread {
decoder := json.NewDecoder(data)
var o []*TeamUnread
Expand Down
14 changes: 14 additions & 0 deletions model/team_member_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,17 @@ func TestTeamMemberIsValid(t *testing.T) {
t.Fatal(err)
}*/
}

func TestUnreadMemberJson(t *testing.T) {
o := TeamUnread{TeamId: NewId(), MsgCount: 5, MentionCount: 3}
json := o.ToJson()

r := TeamUnreadFromJson(strings.NewReader(json))
if o.TeamId != r.TeamId {
t.Fatal("Ids do not match")
}

if o.MsgCount != r.MsgCount {
t.Fatal("MsgCount do not match")
}
}
29 changes: 29 additions & 0 deletions store/sql_team_store.go
Original file line number Diff line number Diff line change
Expand Up @@ -692,6 +692,35 @@ func (s SqlTeamStore) GetTeamsUnreadForUser(teamId, userId string) StoreChannel
return storeChannel
}

func (s SqlTeamStore) GetTeamUnread(teamId string) StoreChannel {
storeChannel := make(StoreChannel, 1)

go func() {
result := StoreResult{}

var data []*model.ChannelUnread
_, err := s.GetReplica().Select(&data,
`SELECT
Channels.TeamId, Channels.TotalMsgCount, ChannelMembers.MsgCount, ChannelMembers.MentionCount, ChannelMembers.NotifyProps
FROM
Channels, ChannelMembers
WHERE
Id = ChannelId AND TeamId = :TeamId`,
map[string]interface{}{"TeamId": teamId})

if err != nil {
result.Err = model.NewLocAppError("SqlTeamStore.GetTeamUnread", "store.sql_team.get_unread.app_error", nil, "teamId="+teamId+" "+err.Error())
} else {
result.Data = data
}

storeChannel <- result
close(storeChannel)
}()

return storeChannel
}

func (s SqlTeamStore) RemoveMember(teamId string, userId string) StoreChannel {
storeChannel := make(StoreChannel, 1)

Expand Down
61 changes: 61 additions & 0 deletions store/sql_team_store_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -611,3 +611,64 @@ func TestMyTeamMembersUnread(t *testing.T) {
t.Fatal(r1.Err)
}
}

func TestGetTeamUnread(t *testing.T) {
Setup()

teamId1 := model.NewId()
teamId2 := model.NewId()

uid := model.NewId()
m1 := &model.TeamMember{TeamId: teamId1, UserId: uid}
m2 := &model.TeamMember{TeamId: teamId2, UserId: uid}
Must(store.Team().SaveMember(m1))
Must(store.Team().SaveMember(m2))

// Setup Team 1
c1 := &model.Channel{TeamId: m1.TeamId, Name: model.NewId(), DisplayName: "Town Square", Type: model.CHANNEL_OPEN}
Must(store.Channel().Save(c1))
cm1 := &model.ChannelMember{ChannelId: c1.Id, UserId: m1.UserId, NotifyProps: model.GetDefaultChannelNotifyProps()}
Must(store.Channel().SaveMember(cm1))

// Setup Team 2
c2 := &model.Channel{TeamId: m2.TeamId, Name: model.NewId(), DisplayName: "Town Square2", Type: model.CHANNEL_OPEN}
Must(store.Channel().Save(c2))
c3 := &model.Channel{TeamId: m2.TeamId, Name: model.NewId(), DisplayName: "Town Square2", Type: model.CHANNEL_OPEN}
Must(store.Channel().Save(c3))
cm2 := &model.ChannelMember{ChannelId: c2.Id, UserId: m2.UserId, NotifyProps: model.GetDefaultChannelNotifyProps()}
Must(store.Channel().SaveMember(cm2))
cm3 := &model.ChannelMember{ChannelId: c3.Id, UserId: m2.UserId, NotifyProps: model.GetDefaultChannelNotifyProps()}
Must(store.Channel().SaveMember(cm3))

// Check for Team 1
if resp := <-store.Team().GetTeamUnread(teamId1); resp.Err != nil {
t.Fatal(resp.Err)
} else {
ms := resp.Data.([]*model.ChannelUnread)
for i := range ms {
if teamId1 != ms[i].TeamId {
t.Fatal("Wrong team id")
}
}

if len(ms) != 1 {
t.Fatal("Should be just one unread channel for Team1")
}
}

// Check for Team 2
if resp2 := <-store.Team().GetTeamUnread(teamId2); resp2.Err != nil {
t.Fatal(resp2.Err)
} else {
ms := resp2.Data.([]*model.ChannelUnread)
for i := range ms {
if teamId2 != ms[i].TeamId {
t.Fatal("Wrong team id")
}
}

if len(ms) != 2 {
t.Fatal("Should be 2 unreads channels for Team2")
}
}
}
1 change: 1 addition & 0 deletions store/store.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ type TeamStore interface {
GetActiveMemberCount(teamId string) StoreChannel
GetTeamsForUser(userId string) StoreChannel
GetTeamsUnreadForUser(teamId, userId string) StoreChannel
GetTeamUnread(teamId string) StoreChannel
RemoveMember(teamId string, userId string) StoreChannel
RemoveAllMembersByTeam(teamId string) StoreChannel
RemoveAllMembersByUser(userId string) StoreChannel
Expand Down

0 comments on commit 1a44844

Please sign in to comment.