Replaced ChannelMember.MarkUnreadLevel with ChannelMember.NotifyProps

Этот коммит содержится в:
hmhealey
2015-09-30 11:08:36 -04:00
родитель 111fbb2495
Коммит c16b9de8dc
13 изменённых файлов: 227 добавлений и 119 удалений

Просмотреть файл

@@ -24,7 +24,7 @@ func InitChannel(r *mux.Router) {
sr.Handle("/update", ApiUserRequired(updateChannel)).Methods("POST") sr.Handle("/update", ApiUserRequired(updateChannel)).Methods("POST")
sr.Handle("/update_desc", ApiUserRequired(updateChannelDesc)).Methods("POST") sr.Handle("/update_desc", ApiUserRequired(updateChannelDesc)).Methods("POST")
sr.Handle("/update_notify_level", ApiUserRequired(updateNotifyLevel)).Methods("POST") sr.Handle("/update_notify_level", ApiUserRequired(updateNotifyLevel)).Methods("POST")
sr.Handle("/update_mark_unread_level", ApiUserRequired(updateMarkUnreadLevel)).Methods("POST") sr.Handle("/update_notify_props", ApiUserRequired(updateNotifyProps)).Methods("POST")
sr.Handle("/{id:[A-Za-z0-9]+}/", ApiUserRequiredActivity(getChannel, false)).Methods("GET") sr.Handle("/{id:[A-Za-z0-9]+}/", ApiUserRequiredActivity(getChannel, false)).Methods("GET")
sr.Handle("/{id:[A-Za-z0-9]+}/extra_info", ApiUserRequired(getChannelExtraInfo)).Methods("GET") sr.Handle("/{id:[A-Za-z0-9]+}/extra_info", ApiUserRequired(getChannelExtraInfo)).Methods("GET")
sr.Handle("/{id:[A-Za-z0-9]+}/join", ApiUserRequired(joinChannel)).Methods("POST") sr.Handle("/{id:[A-Za-z0-9]+}/join", ApiUserRequired(joinChannel)).Methods("POST")
@@ -77,7 +77,7 @@ func CreateChannel(c *Context, channel *model.Channel, addMember bool) (*model.C
if addMember { if addMember {
cm := &model.ChannelMember{ChannelId: sc.Id, UserId: c.Session.UserId, Roles: model.CHANNEL_ROLE_ADMIN, cm := &model.ChannelMember{ChannelId: sc.Id, UserId: c.Session.UserId, Roles: model.CHANNEL_ROLE_ADMIN,
NotifyLevel: model.CHANNEL_NOTIFY_DEFAULT, MarkUnreadLevel: model.CHANNEL_MARK_UNREAD_ALL} NotifyLevel: model.CHANNEL_NOTIFY_DEFAULT, NotifyProps: model.GetDefaultChannelNotifyProps()}
if cmresult := <-Srv.Store.Channel().SaveMember(cm); cmresult.Err != nil { if cmresult := <-Srv.Store.Channel().SaveMember(cm); cmresult.Err != nil {
return nil, cmresult.Err return nil, cmresult.Err
@@ -136,7 +136,7 @@ func CreateDirectChannel(c *Context, otherUserId string) (*model.Channel, *model
return nil, err return nil, err
} else { } else {
cm := &model.ChannelMember{ChannelId: sc.Id, UserId: otherUserId, Roles: "", cm := &model.ChannelMember{ChannelId: sc.Id, UserId: otherUserId, Roles: "",
NotifyLevel: model.CHANNEL_NOTIFY_DEFAULT, MarkUnreadLevel: model.CHANNEL_MARK_UNREAD_ALL} NotifyLevel: model.CHANNEL_NOTIFY_DEFAULT, NotifyProps: model.GetDefaultChannelNotifyProps()}
if cmresult := <-Srv.Store.Channel().SaveMember(cm); cmresult.Err != nil { if cmresult := <-Srv.Store.Channel().SaveMember(cm); cmresult.Err != nil {
return nil, cmresult.Err return nil, cmresult.Err
@@ -374,7 +374,7 @@ func JoinChannel(c *Context, channelId string, role string) {
if channel.Type == model.CHANNEL_OPEN { if channel.Type == model.CHANNEL_OPEN {
cm := &model.ChannelMember{ChannelId: channel.Id, UserId: c.Session.UserId, Roles: role, cm := &model.ChannelMember{ChannelId: channel.Id, UserId: c.Session.UserId, Roles: role,
NotifyLevel: model.CHANNEL_NOTIFY_DEFAULT, MarkUnreadLevel: model.CHANNEL_MARK_UNREAD_ALL} NotifyLevel: model.CHANNEL_NOTIFY_DEFAULT, NotifyProps: model.GetDefaultChannelNotifyProps()}
if cmresult := <-Srv.Store.Channel().SaveMember(cm); cmresult.Err != nil { if cmresult := <-Srv.Store.Channel().SaveMember(cm); cmresult.Err != nil {
c.Err = cmresult.Err c.Err = cmresult.Err
@@ -408,7 +408,7 @@ func JoinDefaultChannels(user *model.User, channelRole string) *model.AppError {
err = result.Err err = result.Err
} else { } else {
cm := &model.ChannelMember{ChannelId: result.Data.(*model.Channel).Id, UserId: user.Id, Roles: channelRole, cm := &model.ChannelMember{ChannelId: result.Data.(*model.Channel).Id, UserId: user.Id, Roles: channelRole,
NotifyLevel: model.CHANNEL_NOTIFY_DEFAULT, MarkUnreadLevel: model.CHANNEL_MARK_UNREAD_ALL} NotifyLevel: model.CHANNEL_NOTIFY_DEFAULT, NotifyProps: model.GetDefaultChannelNotifyProps()}
if cmResult := <-Srv.Store.Channel().SaveMember(cm); cmResult.Err != nil { if cmResult := <-Srv.Store.Channel().SaveMember(cm); cmResult.Err != nil {
err = cmResult.Err err = cmResult.Err
@@ -419,7 +419,7 @@ func JoinDefaultChannels(user *model.User, channelRole string) *model.AppError {
err = result.Err err = result.Err
} else { } else {
cm := &model.ChannelMember{ChannelId: result.Data.(*model.Channel).Id, UserId: user.Id, Roles: channelRole, cm := &model.ChannelMember{ChannelId: result.Data.(*model.Channel).Id, UserId: user.Id, Roles: channelRole,
NotifyLevel: model.CHANNEL_NOTIFY_DEFAULT, MarkUnreadLevel: model.CHANNEL_MARK_UNREAD_ALL} NotifyLevel: model.CHANNEL_NOTIFY_DEFAULT, NotifyProps: model.GetDefaultChannelNotifyProps()}
if cmResult := <-Srv.Store.Channel().SaveMember(cm); cmResult.Err != nil { if cmResult := <-Srv.Store.Channel().SaveMember(cm); cmResult.Err != nil {
err = cmResult.Err err = cmResult.Err
@@ -700,7 +700,8 @@ func addChannelMember(c *Context, w http.ResponseWriter, r *http.Request) {
} else { } else {
oUser := oresult.Data.(*model.User) oUser := oresult.Data.(*model.User)
cm := &model.ChannelMember{ChannelId: channel.Id, UserId: userId, NotifyLevel: model.CHANNEL_NOTIFY_DEFAULT, MarkUnreadLevel: model.CHANNEL_MARK_UNREAD_ALL} cm := &model.ChannelMember{ChannelId: channel.Id, UserId: userId,
NotifyLevel: model.CHANNEL_NOTIFY_DEFAULT, NotifyProps: model.GetDefaultChannelNotifyProps()}
if cmresult := <-Srv.Store.Channel().SaveMember(cm); cmresult.Err != nil { if cmresult := <-Srv.Store.Channel().SaveMember(cm); cmresult.Err != nil {
l4g.Error("Failed to add member user_id=%v channel_id=%v err=%v", userId, id, cmresult.Err) l4g.Error("Failed to add member user_id=%v channel_id=%v err=%v", userId, id, cmresult.Err)
@@ -790,6 +791,7 @@ func removeChannelMember(c *Context, w http.ResponseWriter, r *http.Request) {
} }
// TODO remove me
func updateNotifyLevel(c *Context, w http.ResponseWriter, r *http.Request) { func updateNotifyLevel(c *Context, w http.ResponseWriter, r *http.Request) {
data := model.MapFromJson(r.Body) data := model.MapFromJson(r.Body)
userId := data["user_id"] userId := data["user_id"]
@@ -828,8 +830,9 @@ func updateNotifyLevel(c *Context, w http.ResponseWriter, r *http.Request) {
w.Write([]byte(model.MapToJson(data))) w.Write([]byte(model.MapToJson(data)))
} }
func updateMarkUnreadLevel(c *Context, w http.ResponseWriter, r *http.Request) { func updateNotifyProps(c *Context, w http.ResponseWriter, r *http.Request) {
data := model.MapFromJson(r.Body) data := model.MapFromJson(r.Body)
userId := data["user_id"] userId := data["user_id"]
if len(userId) != 26 { if len(userId) != 26 {
c.SetInvalidParam("updateMarkUnreadLevel", "user_id") c.SetInvalidParam("updateMarkUnreadLevel", "user_id")
@@ -842,26 +845,39 @@ func updateMarkUnreadLevel(c *Context, w http.ResponseWriter, r *http.Request) {
return return
} }
markUnreadLevel := data["mark_unread_level"]
if len(markUnreadLevel) == 0 || !model.IsChannelMarkUnreadLevelValid(markUnreadLevel) {
c.SetInvalidParam("updateMarkUnreadLevel", "mark_unread_level")
return
}
cchan := Srv.Store.Channel().CheckPermissionsTo(c.Session.TeamId, channelId, c.Session.UserId) cchan := Srv.Store.Channel().CheckPermissionsTo(c.Session.TeamId, channelId, c.Session.UserId)
if !c.HasPermissionsToUser(userId, "updateMarkUnreadLevel") { if !c.HasPermissionsToUser(userId, "updateNotifyLevel") {
return return
} }
if !c.HasPermissionsToChannel(cchan, "updateMarkUnreadLevel") { if !c.HasPermissionsToChannel(cchan, "updateNotifyLevel") {
return return
} }
if result := <-Srv.Store.Channel().UpdateMarkUnreadLevel(channelId, userId, markUnreadLevel); result.Err != nil { result := <-Srv.Store.Channel().GetMember(channelId, userId)
if result.Err != nil {
c.Err = result.Err c.Err = result.Err
return return
} }
w.Write([]byte(model.MapToJson(data))) member := result.Data.(model.ChannelMember)
// update whichever notify properties have been provided, but don't change the others
if markUnread, exists := data["mark_unread"]; exists {
member.NotifyProps["mark_unread"] = markUnread
}
if desktop, exists := data["desktop"]; exists {
member.NotifyProps["desktop"] = desktop
}
if result := <-Srv.Store.Channel().UpdateMember(&member); result.Err != nil {
c.Err = result.Err
return
} else {
// return the updated notify properties including any unchanged ones
w.Write([]byte(model.MapToJson(member.NotifyProps)))
}
} }

Просмотреть файл

@@ -885,7 +885,7 @@ func TestUpdateNotifyLevel(t *testing.T) {
} }
} }
func TestUpdateMarkUnreadLevel(t *testing.T) { func TestUpdateNotifyProps(t *testing.T) {
Setup() Setup()
team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
@@ -903,55 +903,94 @@ func TestUpdateMarkUnreadLevel(t *testing.T) {
data := make(map[string]string) data := make(map[string]string)
data["channel_id"] = channel1.Id data["channel_id"] = channel1.Id
data["user_id"] = user.Id data["user_id"] = user.Id
data["mark_unread_level"] = model.CHANNEL_MARK_UNREAD_MENTION data["desktop"] = model.CHANNEL_NOTIFY_MENTION
timeBeforeUpdate := model.GetMillis() timeBeforeUpdate := model.GetMillis()
time.Sleep(100 * time.Millisecond) time.Sleep(100 * time.Millisecond)
if _, err := Client.UpdateMarkUnreadLevel(data); err != nil { // test updating desktop
if result, err := Client.UpdateNotifyProps(data); err != nil {
t.Fatal(err) t.Fatal(err)
} else if notifyProps := result.Data.(map[string]string); notifyProps["desktop"] != model.CHANNEL_NOTIFY_MENTION {
t.Fatal("NotifyProps[\"desktop\"] did not update properly")
} else if notifyProps["mark_unread"] != model.CHANNEL_MARK_UNREAD_ALL {
t.Fatalf("NotifyProps[\"mark_unread\"] changed to %v", notifyProps["mark_unread"])
} }
rget := Client.Must(Client.GetChannels("")) rget := Client.Must(Client.GetChannels(""))
rdata := rget.Data.(*model.ChannelList) rdata := rget.Data.(*model.ChannelList)
if len(rdata.Members) == 0 || rdata.Members[channel1.Id].MarkUnreadLevel != data["mark_unread_level"] { if len(rdata.Members) == 0 || rdata.Members[channel1.Id].NotifyProps["desktop"] != data["desktop"] {
t.Fatal("MarkUnreadLevel did not update properly") t.Fatal("NotifyProps[\"desktop\"] did not update properly")
} } else if rdata.Members[channel1.Id].LastUpdateAt <= timeBeforeUpdate {
if rdata.Members[channel1.Id].LastUpdateAt <= timeBeforeUpdate {
t.Fatal("LastUpdateAt did not update") t.Fatal("LastUpdateAt did not update")
} }
// test an empty update
delete(data, "desktop")
if result, err := Client.UpdateNotifyProps(data); err != nil {
t.Fatal(err)
} else if notifyProps := result.Data.(map[string]string); notifyProps["mark_unread"] != model.CHANNEL_MARK_UNREAD_ALL {
t.Fatalf("NotifyProps[\"mark_unread\"] changed to %v", notifyProps["mark_unread"])
} else if notifyProps["desktop"] != model.CHANNEL_NOTIFY_MENTION {
t.Fatalf("NotifyProps[\"desktop\"] changed to %v", notifyProps["desktop"])
}
// test updating mark unread
data["mark_unread"] = model.CHANNEL_MARK_UNREAD_MENTION
if result, err := Client.UpdateNotifyProps(data); err != nil {
t.Fatal(err)
} else if notifyProps := result.Data.(map[string]string); notifyProps["mark_unread"] != model.CHANNEL_MARK_UNREAD_MENTION {
t.Fatal("NotifyProps[\"mark_unread\"] did not update properly")
} else if notifyProps["desktop"] != model.CHANNEL_NOTIFY_MENTION {
t.Fatalf("NotifyProps[\"desktop\"] changed to %v", notifyProps["desktop"])
}
// test updating both
data["desktop"] = model.CHANNEL_NOTIFY_NONE
data["mark_unread"] = model.CHANNEL_MARK_UNREAD_MENTION
if result, err := Client.UpdateNotifyProps(data); err != nil {
t.Fatal(err)
} else if notifyProps := result.Data.(map[string]string); notifyProps["desktop"] != model.CHANNEL_NOTIFY_NONE {
t.Fatal("NotifyProps[\"desktop\"] did not update properly")
} else if notifyProps["mark_unread"] != model.CHANNEL_MARK_UNREAD_MENTION {
t.Fatal("NotifyProps[\"mark_unread\"] did not update properly")
}
// test error cases
data["user_id"] = "junk" data["user_id"] = "junk"
if _, err := Client.UpdateMarkUnreadLevel(data); err == nil { if _, err := Client.UpdateNotifyProps(data); err == nil {
t.Fatal("Should have errored - bad user id") t.Fatal("Should have errored - bad user id")
} }
data["user_id"] = "12345678901234567890123456" data["user_id"] = "12345678901234567890123456"
if _, err := Client.UpdateMarkUnreadLevel(data); err == nil { if _, err := Client.UpdateNotifyProps(data); err == nil {
t.Fatal("Should have errored - bad user id") t.Fatal("Should have errored - bad user id")
} }
data["user_id"] = user.Id data["user_id"] = user.Id
data["channel_id"] = "junk" data["channel_id"] = "junk"
if _, err := Client.UpdateMarkUnreadLevel(data); err == nil { if _, err := Client.UpdateNotifyProps(data); err == nil {
t.Fatal("Should have errored - bad channel id") t.Fatal("Should have errored - bad channel id")
} }
data["channel_id"] = "12345678901234567890123456" data["channel_id"] = "12345678901234567890123456"
if _, err := Client.UpdateMarkUnreadLevel(data); err == nil { if _, err := Client.UpdateNotifyProps(data); err == nil {
t.Fatal("Should have errored - bad channel id") t.Fatal("Should have errored - bad channel id")
} }
data["channel_id"] = channel1.Id data["desktop"] = "junk"
data["mark_unread_level"] = "" data["mark_unread"] = model.CHANNEL_MARK_UNREAD_ALL
if _, err := Client.UpdateMarkUnreadLevel(data); err == nil { if _, err := Client.UpdateNotifyProps(data); err == nil {
t.Fatal("Should have errored - empty notify level") t.Fatal("Should have errored - bad desktop notify level")
} }
data["mark_unread_level"] = "junk" data["desktop"] = model.CHANNEL_NOTIFY_ALL
if _, err := Client.UpdateMarkUnreadLevel(data); err == nil { data["mark_unread"] = "junk"
t.Fatal("Should have errored - bad notify level") if _, err := Client.UpdateNotifyProps(data); err == nil {
t.Fatal("Should have errored - bad mark unread level")
} }
user2 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user2 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
@@ -961,8 +1000,9 @@ func TestUpdateMarkUnreadLevel(t *testing.T) {
data["channel_id"] = channel1.Id data["channel_id"] = channel1.Id
data["user_id"] = user2.Id data["user_id"] = user2.Id
data["mark_unread_level"] = model.CHANNEL_MARK_UNREAD_MENTION data["desktop"] = model.CHANNEL_NOTIFY_MENTION
if _, err := Client.UpdateMarkUnreadLevel(data); err == nil { data["mark_unread"] = model.CHANNEL_MARK_UNREAD_MENTION
if _, err := Client.UpdateNotifyLevel(data); err == nil {
t.Fatal("Should have errored - user not in channel") t.Fatal("Should have errored - user not in channel")
} }
} }

Просмотреть файл

@@ -20,15 +20,15 @@ const (
) )
type ChannelMember struct { type ChannelMember struct {
ChannelId string `json:"channel_id"` ChannelId string `json:"channel_id"`
UserId string `json:"user_id"` UserId string `json:"user_id"`
Roles string `json:"roles"` Roles string `json:"roles"`
LastViewedAt int64 `json:"last_viewed_at"` LastViewedAt int64 `json:"last_viewed_at"`
MsgCount int64 `json:"msg_count"` MsgCount int64 `json:"msg_count"`
MentionCount int64 `json:"mention_count"` MentionCount int64 `json:"mention_count"`
NotifyLevel string `json:"notify_level"` NotifyProps StringMap `json:"notify_props"`
MarkUnreadLevel string `json:"mark_unread_level"` NotifyLevel string `json:"notify_level"`
LastUpdateAt int64 `json:"last_update_at"` LastUpdateAt int64 `json:"last_update_at"`
} }
func (o *ChannelMember) ToJson() string { func (o *ChannelMember) ToJson() string {
@@ -71,8 +71,9 @@ func (o *ChannelMember) IsValid() *AppError {
return NewAppError("ChannelMember.IsValid", "Invalid notify level", "notify_level="+o.NotifyLevel) return NewAppError("ChannelMember.IsValid", "Invalid notify level", "notify_level="+o.NotifyLevel)
} }
if len(o.MarkUnreadLevel) > 20 || !IsChannelMarkUnreadLevelValid(o.MarkUnreadLevel) { markUnreadLevel := o.NotifyProps["mark_unread"]
return NewAppError("ChannelMember.IsValid", "Invalid mark unread level", "mark_unread_level="+o.MarkUnreadLevel) if len(markUnreadLevel) > 20 || !IsChannelMarkUnreadLevelValid(markUnreadLevel) {
return NewAppError("ChannelMember.IsValid", "Invalid mark unread level", "mark_unread_level="+markUnreadLevel)
} }
return nil return nil
@@ -82,6 +83,10 @@ func (o *ChannelMember) PreSave() {
o.LastUpdateAt = GetMillis() o.LastUpdateAt = GetMillis()
} }
func (o *ChannelMember) PreUpdate() {
o.LastUpdateAt = GetMillis()
}
func IsChannelNotifyLevelValid(notifyLevel string) bool { func IsChannelNotifyLevelValid(notifyLevel string) bool {
return notifyLevel == CHANNEL_NOTIFY_DEFAULT || return notifyLevel == CHANNEL_NOTIFY_DEFAULT ||
notifyLevel == CHANNEL_NOTIFY_ALL || notifyLevel == CHANNEL_NOTIFY_ALL ||
@@ -92,3 +97,10 @@ func IsChannelNotifyLevelValid(notifyLevel string) bool {
func IsChannelMarkUnreadLevelValid(markUnreadLevel string) bool { func IsChannelMarkUnreadLevelValid(markUnreadLevel string) bool {
return markUnreadLevel == CHANNEL_MARK_UNREAD_ALL || markUnreadLevel == CHANNEL_MARK_UNREAD_MENTION return markUnreadLevel == CHANNEL_MARK_UNREAD_ALL || markUnreadLevel == CHANNEL_MARK_UNREAD_MENTION
} }
func GetDefaultChannelNotifyProps() StringMap {
return StringMap{
"desktop": CHANNEL_NOTIFY_DEFAULT,
"mark_unread": CHANNEL_MARK_UNREAD_ALL,
}
}

Просмотреть файл

@@ -32,7 +32,7 @@ func TestChannelMemberIsValid(t *testing.T) {
o.Roles = "missing" o.Roles = "missing"
o.NotifyLevel = CHANNEL_NOTIFY_ALL o.NotifyLevel = CHANNEL_NOTIFY_ALL
o.MarkUnreadLevel = CHANNEL_MARK_UNREAD_ALL o.NotifyProps = GetDefaultChannelNotifyProps()
o.UserId = NewId() o.UserId = NewId()
if err := o.IsValid(); err == nil { if err := o.IsValid(); err == nil {
t.Fatal("should be invalid") t.Fatal("should be invalid")
@@ -54,12 +54,12 @@ func TestChannelMemberIsValid(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
o.MarkUnreadLevel = "123456789012345678901" o.NotifyProps["mark_unread"] = "123456789012345678901"
if err := o.IsValid(); err == nil { if err := o.IsValid(); err == nil {
t.Fatal("should be invalid") t.Fatal("should be invalid")
} }
o.MarkUnreadLevel = CHANNEL_MARK_UNREAD_ALL o.NotifyProps["mark_unread"] = CHANNEL_MARK_UNREAD_ALL
if err := o.IsValid(); err != nil { if err := o.IsValid(); err != nil {
t.Fatal(err) t.Fatal(err)
} }

Просмотреть файл

@@ -459,8 +459,8 @@ func (c *Client) UpdateNotifyLevel(data map[string]string) (*Result, *AppError)
} }
} }
func (c *Client) UpdateMarkUnreadLevel(data map[string]string) (*Result, *AppError) { func (c *Client) UpdateNotifyProps(data map[string]string) (*Result, *AppError) {
if r, err := c.DoApiPost("/channels/update_mark_unread_level", MapToJson(data)); err != nil { if r, err := c.DoApiPost("/channels/update_notify_props", MapToJson(data)); err != nil {
return nil, err return nil, err
} else { } else {
return &Result{r.Header.Get(HEADER_REQUEST_ID), return &Result{r.Header.Get(HEADER_REQUEST_ID),

Просмотреть файл

@@ -4,6 +4,7 @@
package store package store
import ( import (
l4g "code.google.com/p/log4go"
"github.com/mattermost/platform/model" "github.com/mattermost/platform/model"
"github.com/mattermost/platform/utils" "github.com/mattermost/platform/utils"
) )
@@ -30,14 +31,56 @@ func NewSqlChannelStore(sqlStore *SqlStore) ChannelStore {
tablem.ColMap("ChannelId").SetMaxSize(26) tablem.ColMap("ChannelId").SetMaxSize(26)
tablem.ColMap("UserId").SetMaxSize(26) tablem.ColMap("UserId").SetMaxSize(26)
tablem.ColMap("Roles").SetMaxSize(64) tablem.ColMap("Roles").SetMaxSize(64)
tablem.ColMap("NotifyLevel").SetMaxSize(20) tablem.ColMap("NotifyProps").SetMaxSize(2000)
} }
return s return s
} }
func (s SqlChannelStore) UpgradeSchemaIfNeeded() { func (s SqlChannelStore) UpgradeSchemaIfNeeded() {
s.CreateColumnIfNotExists("ChannelMembers", "MarkUnreadLevel", "varchar(20)", "varchar(20)", model.CHANNEL_MARK_UNREAD_ALL) if s.CreateColumnIfNotExists("ChannelMembers", "NotifyProps", "varchar(2000)", "varchar(2000)", "{}") {
// populate NotifyProps from existing NotifyLevel field
// set default values
_, err := s.GetMaster().Exec(
`UPDATE
ChannelMembers
SET
NotifyProps = CONCAT('{"desktop":"', CONCAT(NotifyLevel, '","mark_unread":"` + model.CHANNEL_MARK_UNREAD_ALL + `"}'))`)
if err != nil {
l4g.Error("Unable to set default values for ChannelMembers.NotifyProps")
l4g.Error(err.Error())
}
// assume channels with all notifications enabled are just using the default settings
_, err = s.GetMaster().Exec(
`UPDATE
ChannelMembers
SET
NotifyProps = '{"desktop":"` + model.CHANNEL_NOTIFY_DEFAULT + `","mark_unread":"` + model.CHANNEL_MARK_UNREAD_ALL + `"}'
WHERE
NotifyLevel = '` + model.CHANNEL_NOTIFY_ALL + `'`)
if err != nil {
l4g.Error("Unable to set values for ChannelMembers.NotifyProps when members previously had notifyLevel=all")
l4g.Error(err.Error())
}
// set quiet mode channels to have no notifications and only mark the channel unread on mentions
_, err = s.GetMaster().Exec(
`UPDATE
ChannelMembers
SET
NotifyProps = '{"desktop":"` + model.CHANNEL_NOTIFY_NONE + `","mark_unread":"` + model.CHANNEL_MARK_UNREAD_MENTION + `"}'
WHERE
NotifyLevel = 'quiet'`)
if err != nil {
l4g.Error("Unable to set values for ChannelMembers.NotifyProps when members previously had notifyLevel=quiet")
l4g.Error(err.Error())
}
// TODO uncomment me
// s.RemoveColumnIfExists("ChannelMembers", "NotifyLevel")
}
} }
func (s SqlChannelStore) CreateIndexesIfNotExists() { func (s SqlChannelStore) CreateIndexesIfNotExists() {
@@ -387,6 +430,34 @@ func (s SqlChannelStore) SaveMember(member *model.ChannelMember) StoreChannel {
return storeChannel return storeChannel
} }
func (s SqlChannelStore) UpdateMember(member *model.ChannelMember) StoreChannel {
storeChannel := make(StoreChannel)
go func() {
result := StoreResult{}
member.PreUpdate()
if result.Err = member.IsValid(); result.Err != nil {
storeChannel <- result
close(storeChannel)
return
}
if _, err := s.GetMaster().Update(member); err != nil {
result.Err = model.NewAppError("SqlChannelStore.UpdateMember", "We encounted an error updating the channel member",
"channel_id="+member.ChannelId+", "+"user_id="+member.UserId+", "+err.Error())
} else {
result.Data = member
}
storeChannel <- result
close(storeChannel)
}()
return storeChannel
}
func (s SqlChannelStore) GetMembers(channelId string) StoreChannel { func (s SqlChannelStore) GetMembers(channelId string) StoreChannel {
storeChannel := make(StoreChannel) storeChannel := make(StoreChannel)
@@ -650,6 +721,7 @@ func (s SqlChannelStore) IncrementMentionCount(channelId string, userId string)
return storeChannel return storeChannel
} }
// TODO remove me
func (s SqlChannelStore) UpdateNotifyLevel(channelId, userId, notifyLevel string) StoreChannel { func (s SqlChannelStore) UpdateNotifyLevel(channelId, userId, notifyLevel string) StoreChannel {
storeChannel := make(StoreChannel) storeChannel := make(StoreChannel)
@@ -679,35 +751,6 @@ func (s SqlChannelStore) UpdateNotifyLevel(channelId, userId, notifyLevel string
return storeChannel return storeChannel
} }
func (s SqlChannelStore) UpdateMarkUnreadLevel(channelId, userId, markUnreadLevel string) StoreChannel {
storeChannel := make(StoreChannel)
go func() {
result := StoreResult{}
updateAt := model.GetMillis()
_, err := s.GetMaster().Exec(
`UPDATE
ChannelMembers
SET
MarkUnreadLevel = :MarkUnreadLevel,
LastUpdateAt = :LastUpdateAt
WHERE
UserId = :UserId
AND ChannelId = :ChannelId`,
map[string]interface{}{"ChannelId": channelId, "UserId": userId, "MarkUnreadLevel": markUnreadLevel, "LastUpdateAt": updateAt})
if err != nil {
result.Err = model.NewAppError("SqlChannelStore.UpdateMarkUnreadLevel", "We couldn't update the mark unread level", "channel_id="+channelId+", user_id="+userId+", "+err.Error())
}
storeChannel <- result
close(storeChannel)
}()
return storeChannel
}
func (s SqlChannelStore) GetForExport(teamId string) StoreChannel { func (s SqlChannelStore) GetForExport(teamId string) StoreChannel {
storeChannel := make(StoreChannel) storeChannel := make(StoreChannel)

Просмотреть файл

@@ -136,14 +136,14 @@ func TestChannelStoreDelete(t *testing.T) {
m1.ChannelId = o1.Id m1.ChannelId = o1.Id
m1.UserId = model.NewId() m1.UserId = model.NewId()
m1.NotifyLevel = model.CHANNEL_NOTIFY_ALL m1.NotifyLevel = model.CHANNEL_NOTIFY_ALL
m1.MarkUnreadLevel = model.CHANNEL_MARK_UNREAD_ALL m1.NotifyProps = model.GetDefaultChannelNotifyProps()
Must(store.Channel().SaveMember(&m1)) Must(store.Channel().SaveMember(&m1))
m2 := model.ChannelMember{} m2 := model.ChannelMember{}
m2.ChannelId = o2.Id m2.ChannelId = o2.Id
m2.UserId = m1.UserId m2.UserId = m1.UserId
m2.NotifyLevel = model.CHANNEL_NOTIFY_ALL m2.NotifyLevel = model.CHANNEL_NOTIFY_ALL
m2.MarkUnreadLevel = model.CHANNEL_MARK_UNREAD_ALL m2.NotifyProps = model.GetDefaultChannelNotifyProps()
Must(store.Channel().SaveMember(&m2)) Must(store.Channel().SaveMember(&m2))
if r := <-store.Channel().Delete(o1.Id, model.GetMillis()); r.Err != nil { if r := <-store.Channel().Delete(o1.Id, model.GetMillis()); r.Err != nil {
@@ -225,14 +225,14 @@ func TestChannelMemberStore(t *testing.T) {
o1.ChannelId = c1.Id o1.ChannelId = c1.Id
o1.UserId = u1.Id o1.UserId = u1.Id
o1.NotifyLevel = model.CHANNEL_NOTIFY_ALL o1.NotifyLevel = model.CHANNEL_NOTIFY_ALL
o1.MarkUnreadLevel = model.CHANNEL_MARK_UNREAD_ALL o1.NotifyProps = model.GetDefaultChannelNotifyProps()
Must(store.Channel().SaveMember(&o1)) Must(store.Channel().SaveMember(&o1))
o2 := model.ChannelMember{} o2 := model.ChannelMember{}
o2.ChannelId = c1.Id o2.ChannelId = c1.Id
o2.UserId = u2.Id o2.UserId = u2.Id
o2.NotifyLevel = model.CHANNEL_NOTIFY_ALL o2.NotifyLevel = model.CHANNEL_NOTIFY_ALL
o2.MarkUnreadLevel = model.CHANNEL_MARK_UNREAD_ALL o2.NotifyProps = model.GetDefaultChannelNotifyProps()
Must(store.Channel().SaveMember(&o2)) Must(store.Channel().SaveMember(&o2))
c1t2 := (<-store.Channel().Get(c1.Id)).Data.(*model.Channel) c1t2 := (<-store.Channel().Get(c1.Id)).Data.(*model.Channel)
@@ -296,7 +296,7 @@ func TestChannelStorePermissionsTo(t *testing.T) {
m1.ChannelId = o1.Id m1.ChannelId = o1.Id
m1.UserId = model.NewId() m1.UserId = model.NewId()
m1.NotifyLevel = model.CHANNEL_NOTIFY_ALL m1.NotifyLevel = model.CHANNEL_NOTIFY_ALL
m1.MarkUnreadLevel = model.CHANNEL_MARK_UNREAD_ALL m1.NotifyProps = model.GetDefaultChannelNotifyProps()
Must(store.Channel().SaveMember(&m1)) Must(store.Channel().SaveMember(&m1))
count := (<-store.Channel().CheckPermissionsTo(o1.TeamId, o1.Id, m1.UserId)).Data.(int64) count := (<-store.Channel().CheckPermissionsTo(o1.TeamId, o1.Id, m1.UserId)).Data.(int64)
@@ -377,21 +377,21 @@ func TestChannelStoreGetChannels(t *testing.T) {
m1.ChannelId = o1.Id m1.ChannelId = o1.Id
m1.UserId = model.NewId() m1.UserId = model.NewId()
m1.NotifyLevel = model.CHANNEL_NOTIFY_ALL m1.NotifyLevel = model.CHANNEL_NOTIFY_ALL
m1.MarkUnreadLevel = model.CHANNEL_MARK_UNREAD_ALL m1.NotifyProps = model.GetDefaultChannelNotifyProps()
Must(store.Channel().SaveMember(&m1)) Must(store.Channel().SaveMember(&m1))
m2 := model.ChannelMember{} m2 := model.ChannelMember{}
m2.ChannelId = o1.Id m2.ChannelId = o1.Id
m2.UserId = model.NewId() m2.UserId = model.NewId()
m2.NotifyLevel = model.CHANNEL_NOTIFY_ALL m2.NotifyLevel = model.CHANNEL_NOTIFY_ALL
m2.MarkUnreadLevel = model.CHANNEL_MARK_UNREAD_ALL m2.NotifyProps = model.GetDefaultChannelNotifyProps()
Must(store.Channel().SaveMember(&m2)) Must(store.Channel().SaveMember(&m2))
m3 := model.ChannelMember{} m3 := model.ChannelMember{}
m3.ChannelId = o2.Id m3.ChannelId = o2.Id
m3.UserId = model.NewId() m3.UserId = model.NewId()
m3.NotifyLevel = model.CHANNEL_NOTIFY_ALL m3.NotifyLevel = model.CHANNEL_NOTIFY_ALL
m3.MarkUnreadLevel = model.CHANNEL_MARK_UNREAD_ALL m3.NotifyProps = model.GetDefaultChannelNotifyProps()
Must(store.Channel().SaveMember(&m3)) Must(store.Channel().SaveMember(&m3))
cresult := <-store.Channel().GetChannels(o1.TeamId, m1.UserId) cresult := <-store.Channel().GetChannels(o1.TeamId, m1.UserId)
@@ -423,21 +423,21 @@ func TestChannelStoreGetMoreChannels(t *testing.T) {
m1.ChannelId = o1.Id m1.ChannelId = o1.Id
m1.UserId = model.NewId() m1.UserId = model.NewId()
m1.NotifyLevel = model.CHANNEL_NOTIFY_ALL m1.NotifyLevel = model.CHANNEL_NOTIFY_ALL
m1.MarkUnreadLevel = model.CHANNEL_MARK_UNREAD_ALL m1.NotifyProps = model.GetDefaultChannelNotifyProps()
Must(store.Channel().SaveMember(&m1)) Must(store.Channel().SaveMember(&m1))
m2 := model.ChannelMember{} m2 := model.ChannelMember{}
m2.ChannelId = o1.Id m2.ChannelId = o1.Id
m2.UserId = model.NewId() m2.UserId = model.NewId()
m2.NotifyLevel = model.CHANNEL_NOTIFY_ALL m2.NotifyLevel = model.CHANNEL_NOTIFY_ALL
m2.MarkUnreadLevel = model.CHANNEL_MARK_UNREAD_ALL m2.NotifyProps = model.GetDefaultChannelNotifyProps()
Must(store.Channel().SaveMember(&m2)) Must(store.Channel().SaveMember(&m2))
m3 := model.ChannelMember{} m3 := model.ChannelMember{}
m3.ChannelId = o2.Id m3.ChannelId = o2.Id
m3.UserId = model.NewId() m3.UserId = model.NewId()
m3.NotifyLevel = model.CHANNEL_NOTIFY_ALL m3.NotifyLevel = model.CHANNEL_NOTIFY_ALL
m3.MarkUnreadLevel = model.CHANNEL_MARK_UNREAD_ALL m3.NotifyProps = model.GetDefaultChannelNotifyProps()
Must(store.Channel().SaveMember(&m3)) Must(store.Channel().SaveMember(&m3))
o3 := model.Channel{} o3 := model.Channel{}
@@ -494,21 +494,21 @@ func TestChannelStoreGetChannelCounts(t *testing.T) {
m1.ChannelId = o1.Id m1.ChannelId = o1.Id
m1.UserId = model.NewId() m1.UserId = model.NewId()
m1.NotifyLevel = model.CHANNEL_NOTIFY_ALL m1.NotifyLevel = model.CHANNEL_NOTIFY_ALL
m1.MarkUnreadLevel = model.CHANNEL_MARK_UNREAD_ALL m1.NotifyProps = model.GetDefaultChannelNotifyProps()
Must(store.Channel().SaveMember(&m1)) Must(store.Channel().SaveMember(&m1))
m2 := model.ChannelMember{} m2 := model.ChannelMember{}
m2.ChannelId = o1.Id m2.ChannelId = o1.Id
m2.UserId = model.NewId() m2.UserId = model.NewId()
m2.NotifyLevel = model.CHANNEL_NOTIFY_ALL m2.NotifyLevel = model.CHANNEL_NOTIFY_ALL
m2.MarkUnreadLevel = model.CHANNEL_MARK_UNREAD_ALL m2.NotifyProps = model.GetDefaultChannelNotifyProps()
Must(store.Channel().SaveMember(&m2)) Must(store.Channel().SaveMember(&m2))
m3 := model.ChannelMember{} m3 := model.ChannelMember{}
m3.ChannelId = o2.Id m3.ChannelId = o2.Id
m3.UserId = model.NewId() m3.UserId = model.NewId()
m3.NotifyLevel = model.CHANNEL_NOTIFY_ALL m3.NotifyLevel = model.CHANNEL_NOTIFY_ALL
m3.MarkUnreadLevel = model.CHANNEL_MARK_UNREAD_ALL m3.NotifyProps = model.GetDefaultChannelNotifyProps()
Must(store.Channel().SaveMember(&m3)) Must(store.Channel().SaveMember(&m3))
cresult := <-store.Channel().GetChannelCounts(o1.TeamId, m1.UserId) cresult := <-store.Channel().GetChannelCounts(o1.TeamId, m1.UserId)
@@ -538,7 +538,7 @@ func TestChannelStoreUpdateLastViewedAt(t *testing.T) {
m1.ChannelId = o1.Id m1.ChannelId = o1.Id
m1.UserId = model.NewId() m1.UserId = model.NewId()
m1.NotifyLevel = model.CHANNEL_NOTIFY_ALL m1.NotifyLevel = model.CHANNEL_NOTIFY_ALL
m1.MarkUnreadLevel = model.CHANNEL_MARK_UNREAD_ALL m1.NotifyProps = model.GetDefaultChannelNotifyProps()
Must(store.Channel().SaveMember(&m1)) Must(store.Channel().SaveMember(&m1))
err := (<-store.Channel().UpdateLastViewedAt(m1.ChannelId, m1.UserId)).Err err := (<-store.Channel().UpdateLastViewedAt(m1.ChannelId, m1.UserId)).Err
@@ -567,7 +567,7 @@ func TestChannelStoreIncrementMentionCount(t *testing.T) {
m1.ChannelId = o1.Id m1.ChannelId = o1.Id
m1.UserId = model.NewId() m1.UserId = model.NewId()
m1.NotifyLevel = model.CHANNEL_NOTIFY_ALL m1.NotifyLevel = model.CHANNEL_NOTIFY_ALL
m1.MarkUnreadLevel = model.CHANNEL_MARK_UNREAD_ALL m1.NotifyProps = model.GetDefaultChannelNotifyProps()
Must(store.Channel().SaveMember(&m1)) Must(store.Channel().SaveMember(&m1))
err := (<-store.Channel().IncrementMentionCount(m1.ChannelId, m1.UserId)).Err err := (<-store.Channel().IncrementMentionCount(m1.ChannelId, m1.UserId)).Err

Просмотреть файл

@@ -485,7 +485,7 @@ func TestPostStoreSearch(t *testing.T) {
m1.ChannelId = c1.Id m1.ChannelId = c1.Id
m1.UserId = userId m1.UserId = userId
m1.NotifyLevel = model.CHANNEL_NOTIFY_ALL m1.NotifyLevel = model.CHANNEL_NOTIFY_ALL
m1.MarkUnreadLevel = model.CHANNEL_MARK_UNREAD_ALL m1.NotifyProps = model.GetDefaultChannelNotifyProps()
Must(store.Channel().SaveMember(&m1)) Must(store.Channel().SaveMember(&m1))
c2 := &model.Channel{} c2 := &model.Channel{}

Просмотреть файл

@@ -62,6 +62,7 @@ type ChannelStore interface {
GetForExport(teamId string) StoreChannel GetForExport(teamId string) StoreChannel
SaveMember(member *model.ChannelMember) StoreChannel SaveMember(member *model.ChannelMember) StoreChannel
UpdateMember(member *model.ChannelMember) StoreChannel
GetMembers(channelId string) StoreChannel GetMembers(channelId string) StoreChannel
GetMember(channelId string, userId string) StoreChannel GetMember(channelId string, userId string) StoreChannel
RemoveMember(channelId string, userId string) StoreChannel RemoveMember(channelId string, userId string) StoreChannel
@@ -72,7 +73,6 @@ type ChannelStore interface {
UpdateLastViewedAt(channelId string, userId string) StoreChannel UpdateLastViewedAt(channelId string, userId string) StoreChannel
IncrementMentionCount(channelId string, userId string) StoreChannel IncrementMentionCount(channelId string, userId string) StoreChannel
UpdateNotifyLevel(channelId string, userId string, notifyLevel string) StoreChannel UpdateNotifyLevel(channelId string, userId string, notifyLevel string) StoreChannel
UpdateMarkUnreadLevel(channelId string, userId string, markUnreadLevel string) StoreChannel
} }
type PostStore interface { type PostStore interface {

Просмотреть файл

@@ -42,7 +42,7 @@ export default class ChannelNotifications extends React.Component {
const member = ChannelStore.getMember(channelId); const member = ChannelStore.getMember(channelId);
var notifyLevel = member.notify_level; var notifyLevel = member.notify_level;
var markUnreadLevel = member.mark_unread_level; var markUnreadLevel = member.notify_props.mark_unread;
this.setState({ this.setState({
notifyLevel, notifyLevel,
@@ -63,7 +63,7 @@ export default class ChannelNotifications extends React.Component {
const member = ChannelStore.getMember(this.state.channelId); const member = ChannelStore.getMember(this.state.channelId);
var notifyLevel = member.notify_level; var notifyLevel = member.notify_level;
var markUnreadLevel = member.mark_unread_level; var markUnreadLevel = member.notify_props.mark_unread;
var newState = this.state; var newState = this.state;
newState.notifyLevel = notifyLevel; newState.notifyLevel = notifyLevel;
@@ -249,7 +249,7 @@ export default class ChannelNotifications extends React.Component {
const channelId = this.state.channelId; const channelId = this.state.channelId;
const markUnreadLevel = this.state.markUnreadLevel; const markUnreadLevel = this.state.markUnreadLevel;
if (ChannelStore.getMember(channelId).mark_unread_level === markUnreadLevel) { if (ChannelStore.getMember(channelId).notify_props.mark_unread === markUnreadLevel) {
this.updateSection(''); this.updateSection('');
return; return;
} }
@@ -257,17 +257,13 @@ export default class ChannelNotifications extends React.Component {
const data = { const data = {
channel_id: channelId, channel_id: channelId,
user_id: UserStore.getCurrentId(), user_id: UserStore.getCurrentId(),
mark_unread_level: markUnreadLevel mark_unread: markUnreadLevel
}; };
if (!data.mark_unread_level || data.mark_unread_level.length === 0) { Client.updateNotifyProps(data,
return;
}
Client.updateMarkUnreadLevel(data,
() => { () => {
var member = ChannelStore.getMember(channelId); var member = ChannelStore.getMember(channelId);
member.mark_unread_level = markUnreadLevel; member.notify_props.mark_unread = markUnreadLevel;
ChannelStore.setChannelMember(member); ChannelStore.setChannelMember(member);
this.updateSection(''); this.updateSection('');
}, },

Просмотреть файл

@@ -15,7 +15,7 @@ function getCountsStateFromStores() {
count += channel.total_msg_count - channelMember.msg_count; count += channel.total_msg_count - channelMember.msg_count;
} else if (channelMember.mention_count > 0) { } else if (channelMember.mention_count > 0) {
count += channelMember.mention_count; count += channelMember.mention_count;
} else if (channelMember.mark_unread_level !== 'mention' && channel.total_msg_count - channelMember.msg_count > 0) { } else if (channelMember.notify_props.mark_unread !== 'mention' && channel.total_msg_count - channelMember.msg_count > 0) {
count += 1; count += 1;
} }
}); });

Просмотреть файл

@@ -334,7 +334,7 @@ export default class Sidebar extends React.Component {
var unread = false; var unread = false;
if (channelMember) { if (channelMember) {
msgCount = channel.total_msg_count - channelMember.msg_count; msgCount = channel.total_msg_count - channelMember.msg_count;
unread = (msgCount > 0 && channelMember.mark_unread_level !== 'mention') || channelMember.mention_count > 0; unread = (msgCount > 0 && channelMember.notify_props.mark_unread !== 'mention') || channelMember.mention_count > 0;
} }
var titleClass = ''; var titleClass = '';

Просмотреть файл

@@ -568,6 +568,7 @@ export function updateChannelDesc(data, success, error) {
track('api', 'api_channels_desc'); track('api', 'api_channels_desc');
} }
// TODO remove me
export function updateNotifyLevel(data, success, error) { export function updateNotifyLevel(data, success, error) {
$.ajax({ $.ajax({
url: '/api/v1/channels/update_notify_level', url: '/api/v1/channels/update_notify_level',
@@ -583,16 +584,16 @@ export function updateNotifyLevel(data, success, error) {
}); });
} }
export function updateMarkUnreadLevel(data, success, error) { export function updateNotifyProps(data, success, error) {
$.ajax({ $.ajax({
url: '/api/v1/channels/update_mark_unread_level', url: '/api/v1/channels/update_notify_props',
dataType: 'json', dataType: 'json',
contentType: 'application/json', contentType: 'application/json',
type: 'POST', type: 'POST',
data: JSON.stringify(data), data: JSON.stringify(data),
success, success,
error: function onError(xhr, status, err) { error: function onError(xhr, status, err) {
var e = handleError('updateMarkUnreadLevel', xhr, status, err); var e = handleError('updateNotifyProps', xhr, status, err);
error(e); error(e);
} }
}); });