MM-24132: Migrate AppError from SaveDirectChannel/channel_store.go (#14318)
* MM-24135: Migrate AppError from SaveChannel/channel_store.go This is the first POC of migration of store app errors to plain error. We create a few basic error types in the store package and use them to return the errors from store methods. In the app layer, we inspect the error and re-create the exact app errors. This lets us preserve the same error content, but yet move to plain errors. Since this is a gradual migration, this means that the error inspection code will be duplicated across the app layer whenever a store method is invoked. But all of that should go away once we start propagating the errors higher up the hierarchy. There have been a significant amount of changes in the storetest and searchtest layer, primarily because we have to rename the err variable now that it is of a different type. * Addressed review comments * MM-24132: Migrate AppError from SaveDirectChannel/channel_store.go This PR migrates 2 new methods SaveDirectChannel and CreateDirectChannel to return error instead of AppError. We also need to handle the error internally in SaveMultipleMember for now until that is migrated too. * Fix layers Co-authored-by: mattermod <mattermod@users.noreply.github.com>
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
624980ff54
Коммит
090743de86
@@ -336,20 +336,44 @@ func (a *App) createDirectChannel(userId string, otherUserId string) (*model.Cha
|
|||||||
}
|
}
|
||||||
otherUser := result.Data.(*model.User)
|
otherUser := result.Data.(*model.User)
|
||||||
|
|
||||||
channel, err := a.Srv().Store.Channel().CreateDirectChannel(user, otherUser)
|
channel, nErr := a.Srv().Store.Channel().CreateDirectChannel(user, otherUser)
|
||||||
if err != nil {
|
if nErr != nil {
|
||||||
if err.Id == store.CHANNEL_EXISTS_ERROR {
|
var invErr *store.ErrInvalidInput
|
||||||
return channel, err
|
var cErr *store.ErrConflict
|
||||||
|
var ltErr *store.ErrLimitExceeded
|
||||||
|
var appErr *model.AppError
|
||||||
|
switch {
|
||||||
|
case errors.As(nErr, &invErr):
|
||||||
|
switch {
|
||||||
|
case invErr.Entity == "Channel" && invErr.Field == "DeleteAt":
|
||||||
|
return nil, model.NewAppError("CreateChannel", "store.sql_channel.save.archived_channel.app_error", nil, "", http.StatusBadRequest)
|
||||||
|
case invErr.Entity == "Channel" && invErr.Field == "Type":
|
||||||
|
return nil, model.NewAppError("CreateChannel", "store.sql_channel.save_direct_channel.not_direct.app_error", nil, "", http.StatusBadRequest)
|
||||||
|
case invErr.Entity == "Channel" && invErr.Field == "Id":
|
||||||
|
return nil, model.NewAppError("SqlChannelStore.Save", "store.sql_channel.save_channel.existing.app_error", nil, "id="+invErr.Value.(string), http.StatusBadRequest)
|
||||||
|
}
|
||||||
|
case errors.As(nErr, &cErr):
|
||||||
|
switch cErr.Resource {
|
||||||
|
case "Channel":
|
||||||
|
return channel, model.NewAppError("CreateChannel", store.CHANNEL_EXISTS_ERROR, nil, cErr.Error(), http.StatusBadRequest)
|
||||||
|
case "ChannelMembers":
|
||||||
|
return nil, model.NewAppError("CreateChannel", "store.sql_channel.save_member.exists.app_error", nil, cErr.Error(), http.StatusBadRequest)
|
||||||
|
}
|
||||||
|
case errors.As(nErr, <Err):
|
||||||
|
return nil, model.NewAppError("CreateChannel", "store.sql_channel.save_channel.limit.app_error", nil, ltErr.Error(), http.StatusBadRequest)
|
||||||
|
case errors.As(nErr, &appErr): // in case we haven't converted to plain error.
|
||||||
|
return nil, appErr
|
||||||
|
default: // last fallback in case it doesn't map to an existing app error.
|
||||||
|
return nil, model.NewAppError("CreateDirectChannel", "app.channel.create_direct_channel.internal_error", nil, nErr.Error(), http.StatusInternalServerError)
|
||||||
}
|
}
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = a.Srv().Store.ChannelMemberHistory().LogJoinEvent(userId, channel.Id, model.GetMillis()); err != nil {
|
if err := a.Srv().Store.ChannelMemberHistory().LogJoinEvent(userId, channel.Id, model.GetMillis()); err != nil {
|
||||||
mlog.Error("Failed to update ChannelMemberHistory table", mlog.Err(err))
|
mlog.Error("Failed to update ChannelMemberHistory table", mlog.Err(err))
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if userId != otherUserId {
|
if userId != otherUserId {
|
||||||
if err = a.Srv().Store.ChannelMemberHistory().LogJoinEvent(otherUserId, channel.Id, model.GetMillis()); err != nil {
|
if err := a.Srv().Store.ChannelMemberHistory().LogJoinEvent(otherUserId, channel.Id, model.GetMillis()); err != nil {
|
||||||
mlog.Error("Failed to update ChannelMemberHistory table", mlog.Err(err))
|
mlog.Error("Failed to update ChannelMemberHistory table", mlog.Err(err))
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
40
i18n/en.json
40
i18n/en.json
@@ -2938,6 +2938,10 @@
|
|||||||
"id": "app.channel.create_channel.no_team_id.app_error",
|
"id": "app.channel.create_channel.no_team_id.app_error",
|
||||||
"translation": "Must specify the team ID to create a channel."
|
"translation": "Must specify the team ID to create a channel."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "app.channel.create_direct_channel.internal_error",
|
||||||
|
"translation": "Unable to save direct channel."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "app.channel.move_channel.members_do_not_match.error",
|
"id": "app.channel.move_channel.members_do_not_match.error",
|
||||||
"translation": "Unable to move a channel unless all its members are already members of the destination team."
|
"translation": "Unable to move a channel unless all its members are already members of the destination team."
|
||||||
@@ -6062,26 +6066,10 @@
|
|||||||
"id": "store.sql_channel.save_channel.limit.app_error",
|
"id": "store.sql_channel.save_channel.limit.app_error",
|
||||||
"translation": "You've reached the limit of the number of allowed channels."
|
"translation": "You've reached the limit of the number of allowed channels."
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"id": "store.sql_channel.save_direct_channel.add_members.app_error",
|
|
||||||
"translation": "Unable to add direct channel members."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "store.sql_channel.save_direct_channel.commit.app_error",
|
|
||||||
"translation": "Unable to commit transaction."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "store.sql_channel.save_direct_channel.internal_error",
|
|
||||||
"translation": "Unable to save direct channel."
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"id": "store.sql_channel.save_direct_channel.not_direct.app_error",
|
"id": "store.sql_channel.save_direct_channel.not_direct.app_error",
|
||||||
"translation": "Not a direct channel attempted to be created with SaveDirectChannel."
|
"translation": "Not a direct channel attempted to be created with SaveDirectChannel."
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"id": "store.sql_channel.save_direct_channel.open_transaction.app_error",
|
|
||||||
"translation": "Unable to open transaction."
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"id": "store.sql_channel.save_member.commit_transaction.app_error",
|
"id": "store.sql_channel.save_member.commit_transaction.app_error",
|
||||||
"translation": "Unable to commit transaction."
|
"translation": "Unable to commit transaction."
|
||||||
@@ -6094,26 +6082,6 @@
|
|||||||
"id": "store.sql_channel.save_member.open_transaction.app_error",
|
"id": "store.sql_channel.save_member.open_transaction.app_error",
|
||||||
"translation": "Unable to open transaction."
|
"translation": "Unable to open transaction."
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"id": "store.sql_channel.save_member.save.app_error",
|
|
||||||
"translation": "Unable to save the channel member."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "store.sql_channel.save_multimple_members.channel_roles.app_error",
|
|
||||||
"translation": "Unable to build query to get the channel roles."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "store.sql_channel.save_multimple_members.channel_roles_query.app_error",
|
|
||||||
"translation": "Error fetching the channel roles."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "store.sql_channel.save_multimple_members.team_roles.app_error",
|
|
||||||
"translation": "Unable to build query to get the team roles."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "store.sql_channel.save_multimple_members.team_roles_query.app_error",
|
|
||||||
"translation": "Error fetching the team roles."
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"id": "store.sql_channel.search.app_error",
|
"id": "store.sql_channel.search.app_error",
|
||||||
"translation": "We encountered an error searching channels."
|
"translation": "We encountered an error searching channels."
|
||||||
|
|||||||
@@ -594,7 +594,7 @@ func (s *OpenTracingLayerChannelStore) CountPostsAfter(channelId string, timesta
|
|||||||
return resultVar0, resultVar1
|
return resultVar0, resultVar1
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *OpenTracingLayerChannelStore) CreateDirectChannel(userId *model.User, otherUserId *model.User) (*model.Channel, *model.AppError) {
|
func (s *OpenTracingLayerChannelStore) CreateDirectChannel(userId *model.User, otherUserId *model.User) (*model.Channel, error) {
|
||||||
origCtx := s.Root.Store.Context()
|
origCtx := s.Root.Store.Context()
|
||||||
span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "ChannelStore.CreateDirectChannel")
|
span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "ChannelStore.CreateDirectChannel")
|
||||||
s.Root.Store.SetContext(newCtx)
|
s.Root.Store.SetContext(newCtx)
|
||||||
@@ -1683,7 +1683,7 @@ func (s *OpenTracingLayerChannelStore) Save(channel *model.Channel, maxChannelsP
|
|||||||
return resultVar0, resultVar1
|
return resultVar0, resultVar1
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *OpenTracingLayerChannelStore) SaveDirectChannel(channel *model.Channel, member1 *model.ChannelMember, member2 *model.ChannelMember) (*model.Channel, *model.AppError) {
|
func (s *OpenTracingLayerChannelStore) SaveDirectChannel(channel *model.Channel, member1 *model.ChannelMember, member2 *model.ChannelMember) (*model.Channel, error) {
|
||||||
origCtx := s.Root.Store.Context()
|
origCtx := s.Root.Store.Context()
|
||||||
span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "ChannelStore.SaveDirectChannel")
|
span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "ChannelStore.SaveDirectChannel")
|
||||||
s.Root.Store.SetContext(newCtx)
|
s.Root.Store.SetContext(newCtx)
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ func (c *SearchChannelStore) RemoveMember(channelId, userIdToRemove string) *mod
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *SearchChannelStore) CreateDirectChannel(user *model.User, otherUser *model.User) (*model.Channel, *model.AppError) {
|
func (c *SearchChannelStore) CreateDirectChannel(user *model.User, otherUser *model.User) (*model.Channel, error) {
|
||||||
channel, err := c.ChannelStore.CreateDirectChannel(user, otherUser)
|
channel, err := c.ChannelStore.CreateDirectChannel(user, otherUser)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
c.rootStore.indexUserFromID(user.Id)
|
c.rootStore.indexUserFromID(user.Id)
|
||||||
|
|||||||
@@ -534,7 +534,7 @@ func (s SqlChannelStore) Save(channel *model.Channel, maxChannelsPerTeam int64)
|
|||||||
return newChannel, nil
|
return newChannel, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s SqlChannelStore) CreateDirectChannel(user *model.User, otherUser *model.User) (*model.Channel, *model.AppError) {
|
func (s SqlChannelStore) CreateDirectChannel(user *model.User, otherUser *model.User) (*model.Channel, error) {
|
||||||
channel := new(model.Channel)
|
channel := new(model.Channel)
|
||||||
|
|
||||||
channel.DisplayName = ""
|
channel.DisplayName = ""
|
||||||
@@ -559,74 +559,42 @@ func (s SqlChannelStore) CreateDirectChannel(user *model.User, otherUser *model.
|
|||||||
return s.SaveDirectChannel(channel, cm1, cm2)
|
return s.SaveDirectChannel(channel, cm1, cm2)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s SqlChannelStore) SaveDirectChannel(directchannel *model.Channel, member1 *model.ChannelMember, member2 *model.ChannelMember) (*model.Channel, *model.AppError) {
|
func (s SqlChannelStore) SaveDirectChannel(directchannel *model.Channel, member1 *model.ChannelMember, member2 *model.ChannelMember) (*model.Channel, error) {
|
||||||
if directchannel.DeleteAt != 0 {
|
if directchannel.DeleteAt != 0 {
|
||||||
return nil, model.NewAppError("SqlChannelStore.Save", "store.sql_channel.save.archived_channel.app_error", nil, "", http.StatusBadRequest)
|
return nil, store.NewErrInvalidInput("Channel", "DeleteAt", directchannel.DeleteAt)
|
||||||
}
|
}
|
||||||
|
|
||||||
if directchannel.Type != model.CHANNEL_DIRECT {
|
if directchannel.Type != model.CHANNEL_DIRECT {
|
||||||
return nil, model.NewAppError("SqlChannelStore.SaveDirectChannel", "store.sql_channel.save_direct_channel.not_direct.app_error", nil, "", http.StatusBadRequest)
|
return nil, store.NewErrInvalidInput("Channel", "Type", directchannel.Type)
|
||||||
}
|
}
|
||||||
|
|
||||||
transaction, err := s.GetMaster().Begin()
|
transaction, err := s.GetMaster().Begin()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, model.NewAppError("SqlChannelStore.SaveDirectChannel", "store.sql_channel.save_direct_channel.open_transaction.app_error", nil, err.Error(), http.StatusInternalServerError)
|
return nil, errors.Wrap(err, "begin_transaction")
|
||||||
}
|
}
|
||||||
defer finalizeTransaction(transaction)
|
defer finalizeTransaction(transaction)
|
||||||
|
|
||||||
directchannel.TeamId = ""
|
directchannel.TeamId = ""
|
||||||
newChannel, err := s.saveChannelT(transaction, directchannel, 0)
|
newChannel, err := s.saveChannelT(transaction, directchannel, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// TODO: This will go away once SaveDirectChannel returns error
|
return newChannel, err
|
||||||
var invErr *store.ErrInvalidInput
|
|
||||||
var cErr *store.ErrConflict
|
|
||||||
var ltErr *store.ErrLimitExceeded
|
|
||||||
var appErr *model.AppError
|
|
||||||
if errors.As(err, &invErr) {
|
|
||||||
if invErr.Entity == "Channel" && invErr.Field == "DeleteAt" {
|
|
||||||
return newChannel, model.NewAppError("CreateChannel", "store.sql_channel.save.archived_channel.app_error", nil, "", http.StatusBadRequest)
|
|
||||||
}
|
|
||||||
if invErr.Entity == "Channel" && invErr.Field == "Type" {
|
|
||||||
return newChannel, model.NewAppError("CreateChannel", "store.sql_channel.save.direct_channel.app_error", nil, "", http.StatusBadRequest)
|
|
||||||
}
|
|
||||||
if invErr.Entity == "Channel" && invErr.Field == "Id" {
|
|
||||||
return newChannel, model.NewAppError("SqlChannelStore.Save", "store.sql_channel.save_channel.existing.app_error", nil, "id="+invErr.Value.(string), http.StatusBadRequest)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if errors.As(err, &cErr) {
|
|
||||||
if cErr.Resource == "Channel" {
|
|
||||||
return newChannel, model.NewAppError("CreateChannel", store.CHANNEL_EXISTS_ERROR, nil, cErr.Error(), http.StatusBadRequest)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if errors.As(err, <Err) {
|
|
||||||
if ltErr.What == "channels_per_team" {
|
|
||||||
return newChannel, model.NewAppError("CreateChannel", "store.sql_channel.save_channel.limit.app_error", nil, ltErr.Error(), http.StatusBadRequest)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if errors.As(err, &appErr) {
|
|
||||||
return nil, appErr
|
|
||||||
} else {
|
|
||||||
return nil, model.NewAppError("SqlChannelStore.SaveDirectChannel", "store.sql_channel.save_direct_channel.internal_error", nil, err.Error(), http.StatusInternalServerError)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Members need new channel ID
|
// Members need new channel ID
|
||||||
member1.ChannelId = newChannel.Id
|
member1.ChannelId = newChannel.Id
|
||||||
member2.ChannelId = newChannel.Id
|
member2.ChannelId = newChannel.Id
|
||||||
|
|
||||||
var memberSaveErr *model.AppError
|
|
||||||
if member1.UserId != member2.UserId {
|
if member1.UserId != member2.UserId {
|
||||||
_, memberSaveErr = s.saveMultipleMembersT(transaction, []*model.ChannelMember{member1, member2})
|
_, err = s.saveMultipleMembersT(transaction, []*model.ChannelMember{member1, member2})
|
||||||
} else {
|
} else {
|
||||||
_, memberSaveErr = s.saveMemberT(transaction, member2)
|
_, err = s.saveMemberT(transaction, member2)
|
||||||
}
|
}
|
||||||
|
if err != nil {
|
||||||
if memberSaveErr != nil {
|
return nil, err
|
||||||
return nil, model.NewAppError("SqlChannelStore.SaveDirectChannel", "store.sql_channel.save_direct_channel.add_members.app_error", nil, memberSaveErr.Error(), http.StatusInternalServerError)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := transaction.Commit(); err != nil {
|
if err := transaction.Commit(); err != nil {
|
||||||
return nil, model.NewAppError("SqlChannelStore.SaveDirectChannel", "store.sql_channel.save_direct_channel.commit.app_error", nil, err.Error(), http.StatusInternalServerError)
|
return nil, errors.Wrap(err, "commit_transaction")
|
||||||
}
|
}
|
||||||
|
|
||||||
return newChannel, nil
|
return newChannel, nil
|
||||||
@@ -639,7 +607,7 @@ func (s SqlChannelStore) saveChannelT(transaction *gorp.Transaction, channel *mo
|
|||||||
}
|
}
|
||||||
|
|
||||||
channel.PreSave()
|
channel.PreSave()
|
||||||
if err := channel.IsValid(); err != nil { // TODO: this needs to return plain error
|
if err := channel.IsValid(); err != nil { // TODO: this needs to return plain error in v6.
|
||||||
return nil, err // we just pass through the error as-is for now.
|
return nil, err // we just pass through the error as-is for now.
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1345,9 +1313,21 @@ func (s SqlChannelStore) SaveMultipleMembers(members []*model.ChannelMember) ([]
|
|||||||
}
|
}
|
||||||
defer finalizeTransaction(transaction)
|
defer finalizeTransaction(transaction)
|
||||||
|
|
||||||
newMembers, appErr := s.saveMultipleMembersT(transaction, members)
|
newMembers, err := s.saveMultipleMembersT(transaction, members)
|
||||||
if appErr != nil {
|
if err != nil { // TODO: this will go away once SaveMultipleMembers is migrated too.
|
||||||
return nil, appErr
|
var cErr *store.ErrConflict
|
||||||
|
var appErr *model.AppError
|
||||||
|
switch {
|
||||||
|
case errors.As(err, &cErr):
|
||||||
|
switch cErr.Resource {
|
||||||
|
case "ChannelMembers":
|
||||||
|
return nil, model.NewAppError("CreateChannel", "store.sql_channel.save_member.exists.app_error", nil, cErr.Error(), http.StatusBadRequest)
|
||||||
|
}
|
||||||
|
case errors.As(err, &appErr): // in case we haven't converted to plain error.
|
||||||
|
return nil, appErr
|
||||||
|
default: // last fallback in case it doesn't map to an existing app error.
|
||||||
|
return nil, model.NewAppError("CreateDirectChannel", "app.channel.create_direct_channel.internal_error", nil, err.Error(), http.StatusInternalServerError)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := transaction.Commit(); err != nil {
|
if err := transaction.Commit(); err != nil {
|
||||||
@@ -1365,7 +1345,7 @@ func (s SqlChannelStore) SaveMember(member *model.ChannelMember) (*model.Channel
|
|||||||
return newMembers[0], nil
|
return newMembers[0], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s SqlChannelStore) saveMultipleMembersT(transaction *gorp.Transaction, members []*model.ChannelMember) ([]*model.ChannelMember, *model.AppError) {
|
func (s SqlChannelStore) saveMultipleMembersT(transaction *gorp.Transaction, members []*model.ChannelMember) ([]*model.ChannelMember, error) {
|
||||||
newChannelMembers := map[string]int{}
|
newChannelMembers := map[string]int{}
|
||||||
users := map[string]bool{}
|
users := map[string]bool{}
|
||||||
for _, member := range members {
|
for _, member := range members {
|
||||||
@@ -1377,7 +1357,7 @@ func (s SqlChannelStore) saveMultipleMembersT(transaction *gorp.Transaction, mem
|
|||||||
users[member.UserId] = true
|
users[member.UserId] = true
|
||||||
|
|
||||||
member.PreSave()
|
member.PreSave()
|
||||||
if err := member.IsValid(); err != nil {
|
if err := member.IsValid(); err != nil { // TODO: this needs to return plain error in v6.
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1407,7 +1387,7 @@ func (s SqlChannelStore) saveMultipleMembersT(transaction *gorp.Transaction, mem
|
|||||||
|
|
||||||
channelRolesSql, channelRolesArgs, err := channelRolesQuery.ToSql()
|
channelRolesSql, channelRolesArgs, err := channelRolesQuery.ToSql()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, model.NewAppError("SqlChannelStore.SaveMultipleMembers", "store.sql_channel.save_multimple_members.channel_roles.app_error", nil, err.Error(), http.StatusInternalServerError)
|
return nil, errors.Wrap(err, "channel_roles_tosql")
|
||||||
}
|
}
|
||||||
|
|
||||||
var defaultChannelsRoles []struct {
|
var defaultChannelsRoles []struct {
|
||||||
@@ -1418,7 +1398,7 @@ func (s SqlChannelStore) saveMultipleMembersT(transaction *gorp.Transaction, mem
|
|||||||
}
|
}
|
||||||
_, err = s.GetMaster().Select(&defaultChannelsRoles, channelRolesSql, channelRolesArgs...)
|
_, err = s.GetMaster().Select(&defaultChannelsRoles, channelRolesSql, channelRolesArgs...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, model.NewAppError("SqlChannelStore.SaveMultipleMembers", "store.sql_channel.save_multimple_members.channel_roles_query.app_error", nil, err.Error(), http.StatusInternalServerError)
|
return nil, errors.Wrap(err, "default_channel_roles_select")
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, defaultRoles := range defaultChannelsRoles {
|
for _, defaultRoles := range defaultChannelsRoles {
|
||||||
@@ -1446,7 +1426,7 @@ func (s SqlChannelStore) saveMultipleMembersT(transaction *gorp.Transaction, mem
|
|||||||
|
|
||||||
teamRolesSql, teamRolesArgs, err := teamRolesQuery.ToSql()
|
teamRolesSql, teamRolesArgs, err := teamRolesQuery.ToSql()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, model.NewAppError("SqlChannelStore.SaveMultipleMembers", "store.sql_channel.save_multimple_members.team_roles.app_error", nil, err.Error(), http.StatusInternalServerError)
|
return nil, errors.Wrap(err, "team_roles_tosql")
|
||||||
}
|
}
|
||||||
|
|
||||||
var defaultTeamsRoles []struct {
|
var defaultTeamsRoles []struct {
|
||||||
@@ -1457,7 +1437,7 @@ func (s SqlChannelStore) saveMultipleMembersT(transaction *gorp.Transaction, mem
|
|||||||
}
|
}
|
||||||
_, err = s.GetMaster().Select(&defaultTeamsRoles, teamRolesSql, teamRolesArgs...)
|
_, err = s.GetMaster().Select(&defaultTeamsRoles, teamRolesSql, teamRolesArgs...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, model.NewAppError("SqlChannelStore.SaveMultipleMembers", "store.sql_channel.save_multimple_members.team_roles_query.app_error", nil, err.Error(), http.StatusInternalServerError)
|
return nil, errors.Wrap(err, "default_team_roles_select")
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, defaultRoles := range defaultTeamsRoles {
|
for _, defaultRoles := range defaultTeamsRoles {
|
||||||
@@ -1471,14 +1451,14 @@ func (s SqlChannelStore) saveMultipleMembersT(transaction *gorp.Transaction, mem
|
|||||||
|
|
||||||
sql, args, err := query.ToSql()
|
sql, args, err := query.ToSql()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, model.NewAppError("SqlTeamStore.SaveMember", "store.sql_channel.save_member.save.app_error", nil, err.Error(), http.StatusInternalServerError)
|
return nil, errors.Wrap(err, "channel_members_tosql")
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := s.GetMaster().Exec(sql, args...); err != nil {
|
if _, err := s.GetMaster().Exec(sql, args...); err != nil {
|
||||||
if IsUniqueConstraintError(err, []string{"ChannelId", "channelmembers_pkey", "PRIMARY"}) {
|
if IsUniqueConstraintError(err, []string{"ChannelId", "channelmembers_pkey", "PRIMARY"}) {
|
||||||
return nil, model.NewAppError("SqlTeamStore.SaveMember", "store.sql_channel.save_member.exists.app_error", nil, err.Error(), http.StatusBadRequest)
|
return nil, store.NewErrConflict("ChannelMembers", err, "")
|
||||||
}
|
}
|
||||||
return nil, model.NewAppError("SqlTeamStore.SaveMember", "store.sql_channel.save_member.save.app_error", nil, err.Error(), http.StatusInternalServerError)
|
return nil, errors.Wrap(err, "channel_members_save")
|
||||||
}
|
}
|
||||||
|
|
||||||
newMembers := []*model.ChannelMember{}
|
newMembers := []*model.ChannelMember{}
|
||||||
@@ -1506,7 +1486,7 @@ func (s SqlChannelStore) saveMultipleMembersT(transaction *gorp.Transaction, mem
|
|||||||
return newMembers, nil
|
return newMembers, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s SqlChannelStore) saveMemberT(transaction *gorp.Transaction, member *model.ChannelMember) (*model.ChannelMember, *model.AppError) {
|
func (s SqlChannelStore) saveMemberT(transaction *gorp.Transaction, member *model.ChannelMember) (*model.ChannelMember, error) {
|
||||||
members, err := s.saveMultipleMembersT(transaction, []*model.ChannelMember{member})
|
members, err := s.saveMultipleMembersT(transaction, []*model.ChannelMember{member})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|||||||
@@ -128,8 +128,8 @@ type TeamStore interface {
|
|||||||
|
|
||||||
type ChannelStore interface {
|
type ChannelStore interface {
|
||||||
Save(channel *model.Channel, maxChannelsPerTeam int64) (*model.Channel, error)
|
Save(channel *model.Channel, maxChannelsPerTeam int64) (*model.Channel, error)
|
||||||
CreateDirectChannel(userId *model.User, otherUserId *model.User) (*model.Channel, *model.AppError)
|
CreateDirectChannel(userId *model.User, otherUserId *model.User) (*model.Channel, error)
|
||||||
SaveDirectChannel(channel *model.Channel, member1 *model.ChannelMember, member2 *model.ChannelMember) (*model.Channel, *model.AppError)
|
SaveDirectChannel(channel *model.Channel, member1 *model.ChannelMember, member2 *model.ChannelMember) (*model.Channel, error)
|
||||||
Update(channel *model.Channel) (*model.Channel, *model.AppError)
|
Update(channel *model.Channel) (*model.Channel, *model.AppError)
|
||||||
Get(id string, allowFromCache bool) (*model.Channel, *model.AppError)
|
Get(id string, allowFromCache bool) (*model.Channel, *model.AppError)
|
||||||
InvalidateChannel(id string)
|
InvalidateChannel(id string)
|
||||||
|
|||||||
@@ -185,15 +185,15 @@ func testChannelStoreSaveDirectChannel(t *testing.T, ss store.Store, s SqlSuppli
|
|||||||
m2.UserId = u2.Id
|
m2.UserId = u2.Id
|
||||||
m2.NotifyProps = model.GetDefaultChannelNotifyProps()
|
m2.NotifyProps = model.GetDefaultChannelNotifyProps()
|
||||||
|
|
||||||
_, err = ss.Channel().SaveDirectChannel(&o1, &m1, &m2)
|
_, nErr := ss.Channel().SaveDirectChannel(&o1, &m1, &m2)
|
||||||
require.Nil(t, err, "couldn't save direct channel", err)
|
require.Nil(t, nErr, "couldn't save direct channel", nErr)
|
||||||
|
|
||||||
members, err := ss.Channel().GetMembers(o1.Id, 0, 100)
|
members, err := ss.Channel().GetMembers(o1.Id, 0, 100)
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
require.Len(t, *members, 2, "should have saved 2 members")
|
require.Len(t, *members, 2, "should have saved 2 members")
|
||||||
|
|
||||||
_, err = ss.Channel().SaveDirectChannel(&o1, &m1, &m2)
|
_, nErr = ss.Channel().SaveDirectChannel(&o1, &m1, &m2)
|
||||||
require.NotNil(t, err, "shoudn't be a able to update from save")
|
require.NotNil(t, nErr, "shoudn't be a able to update from save")
|
||||||
|
|
||||||
// Attempt to save a direct channel that already exists
|
// Attempt to save a direct channel that already exists
|
||||||
o1a := model.Channel{
|
o1a := model.Channel{
|
||||||
@@ -203,25 +203,26 @@ func testChannelStoreSaveDirectChannel(t *testing.T, ss store.Store, s SqlSuppli
|
|||||||
Type: o1.Type,
|
Type: o1.Type,
|
||||||
}
|
}
|
||||||
|
|
||||||
returnedChannel, err := ss.Channel().SaveDirectChannel(&o1a, &m1, &m2)
|
returnedChannel, nErr := ss.Channel().SaveDirectChannel(&o1a, &m1, &m2)
|
||||||
require.NotNil(t, err, "should've failed to save a duplicate direct channel")
|
require.NotNil(t, nErr, "should've failed to save a duplicate direct channel")
|
||||||
require.Equal(t, store.CHANNEL_EXISTS_ERROR, err.Id, "should've returned CHANNEL_EXISTS_ERROR")
|
var cErr *store.ErrConflict
|
||||||
|
require.Truef(t, errors.As(nErr, &cErr), "should've returned CHANNEL_EXISTS_ERROR")
|
||||||
require.Equal(t, o1.Id, returnedChannel.Id, "should've failed to save a duplicate direct channel")
|
require.Equal(t, o1.Id, returnedChannel.Id, "should've failed to save a duplicate direct channel")
|
||||||
|
|
||||||
// Attempt to save a non-direct channel
|
// Attempt to save a non-direct channel
|
||||||
o1.Id = ""
|
o1.Id = ""
|
||||||
o1.Name = "zz" + model.NewId() + "b"
|
o1.Name = "zz" + model.NewId() + "b"
|
||||||
o1.Type = model.CHANNEL_OPEN
|
o1.Type = model.CHANNEL_OPEN
|
||||||
_, err = ss.Channel().SaveDirectChannel(&o1, &m1, &m2)
|
_, nErr = ss.Channel().SaveDirectChannel(&o1, &m1, &m2)
|
||||||
require.NotNil(t, err, "Should not be able to save non-direct channel")
|
require.NotNil(t, nErr, "Should not be able to save non-direct channel")
|
||||||
|
|
||||||
// Save yourself Direct Message
|
// Save yourself Direct Message
|
||||||
o1.Id = ""
|
o1.Id = ""
|
||||||
o1.DisplayName = "Myself"
|
o1.DisplayName = "Myself"
|
||||||
o1.Name = "zz" + model.NewId() + "b"
|
o1.Name = "zz" + model.NewId() + "b"
|
||||||
o1.Type = model.CHANNEL_DIRECT
|
o1.Type = model.CHANNEL_DIRECT
|
||||||
_, err = ss.Channel().SaveDirectChannel(&o1, &m1, &m1)
|
_, nErr = ss.Channel().SaveDirectChannel(&o1, &m1, &m1)
|
||||||
require.Nil(t, err, "couldn't save direct channel", err)
|
require.Nil(t, nErr, "couldn't save direct channel", nErr)
|
||||||
|
|
||||||
members, err = ss.Channel().GetMembers(o1.Id, 0, 100)
|
members, err = ss.Channel().GetMembers(o1.Id, 0, 100)
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
@@ -248,8 +249,8 @@ func testChannelStoreCreateDirectChannel(t *testing.T, ss store.Store) {
|
|||||||
_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}, -1)
|
_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}, -1)
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
|
|
||||||
c1, err := ss.Channel().CreateDirectChannel(u1, u2)
|
c1, nErr := ss.Channel().CreateDirectChannel(u1, u2)
|
||||||
require.Nil(t, err, "couldn't create direct channel", err)
|
require.Nil(t, nErr, "couldn't create direct channel", nErr)
|
||||||
defer func() {
|
defer func() {
|
||||||
ss.Channel().PermanentDeleteMembersByChannel(c1.Id)
|
ss.Channel().PermanentDeleteMembersByChannel(c1.Id)
|
||||||
ss.Channel().PermanentDelete(c1.Id)
|
ss.Channel().PermanentDelete(c1.Id)
|
||||||
@@ -402,8 +403,8 @@ func testChannelStoreGet(t *testing.T, ss store.Store, s SqlSupplier) {
|
|||||||
m2.UserId = u2.Id
|
m2.UserId = u2.Id
|
||||||
m2.NotifyProps = model.GetDefaultChannelNotifyProps()
|
m2.NotifyProps = model.GetDefaultChannelNotifyProps()
|
||||||
|
|
||||||
_, err = ss.Channel().SaveDirectChannel(&o2, &m1, &m2)
|
_, nErr = ss.Channel().SaveDirectChannel(&o2, &m1, &m2)
|
||||||
require.Nil(t, err)
|
require.Nil(t, nErr)
|
||||||
|
|
||||||
c2, err := ss.Channel().Get(o2.Id, false)
|
c2, err := ss.Channel().Get(o2.Id, false)
|
||||||
require.Nil(t, err, err)
|
require.Nil(t, err, err)
|
||||||
@@ -478,8 +479,8 @@ func testChannelStoreGetChannelsByIds(t *testing.T, ss store.Store) {
|
|||||||
m2.UserId = u2.Id
|
m2.UserId = u2.Id
|
||||||
m2.NotifyProps = model.GetDefaultChannelNotifyProps()
|
m2.NotifyProps = model.GetDefaultChannelNotifyProps()
|
||||||
|
|
||||||
_, err = ss.Channel().SaveDirectChannel(&o2, &m1, &m2)
|
_, nErr = ss.Channel().SaveDirectChannel(&o2, &m1, &m2)
|
||||||
require.Nil(t, err)
|
require.Nil(t, nErr)
|
||||||
|
|
||||||
t.Run("Get 2 existing channels", func(t *testing.T) {
|
t.Run("Get 2 existing channels", func(t *testing.T) {
|
||||||
r1, err := ss.Channel().GetChannelsByIds([]string{o1.Id, o2.Id}, false)
|
r1, err := ss.Channel().GetChannelsByIds([]string{o1.Id, o2.Id}, false)
|
||||||
@@ -3235,8 +3236,8 @@ func testChannelStoreGetAllChannels(t *testing.T, ss store.Store, s SqlSupplier)
|
|||||||
|
|
||||||
u1 := model.User{Id: model.NewId()}
|
u1 := model.User{Id: model.NewId()}
|
||||||
u2 := model.User{Id: model.NewId()}
|
u2 := model.User{Id: model.NewId()}
|
||||||
_, err = ss.Channel().CreateDirectChannel(&u1, &u2)
|
_, nErr = ss.Channel().CreateDirectChannel(&u1, &u2)
|
||||||
require.Nil(t, err)
|
require.Nil(t, nErr)
|
||||||
|
|
||||||
userIds := []string{model.NewId(), model.NewId(), model.NewId()}
|
userIds := []string{model.NewId(), model.NewId(), model.NewId()}
|
||||||
|
|
||||||
@@ -3711,13 +3712,13 @@ func testChannelStoreGetMembersForUser(t *testing.T, ss store.Store) {
|
|||||||
u2 := model.User{Id: model.NewId()}
|
u2 := model.User{Id: model.NewId()}
|
||||||
u3 := model.User{Id: model.NewId()}
|
u3 := model.User{Id: model.NewId()}
|
||||||
u4 := model.User{Id: model.NewId()}
|
u4 := model.User{Id: model.NewId()}
|
||||||
_, err = ss.Channel().CreateDirectChannel(&u1, &user)
|
_, nErr = ss.Channel().CreateDirectChannel(&u1, &user)
|
||||||
require.Nil(t, err)
|
require.Nil(t, nErr)
|
||||||
_, err = ss.Channel().CreateDirectChannel(&u2, &user)
|
_, nErr = ss.Channel().CreateDirectChannel(&u2, &user)
|
||||||
require.Nil(t, err)
|
require.Nil(t, nErr)
|
||||||
// other user direct message
|
// other user direct message
|
||||||
_, err = ss.Channel().CreateDirectChannel(&u3, &u4)
|
_, nErr = ss.Channel().CreateDirectChannel(&u3, &u4)
|
||||||
require.Nil(t, err)
|
require.Nil(t, nErr)
|
||||||
|
|
||||||
var members *model.ChannelMembers
|
var members *model.ChannelMembers
|
||||||
members, err = ss.Channel().GetMembersForUser(o1.TeamId, m1.UserId)
|
members, err = ss.Channel().GetMembersForUser(o1.TeamId, m1.UserId)
|
||||||
@@ -5502,8 +5503,8 @@ func testChannelStoreAnalyticsDeletedTypeCount(t *testing.T, ss store.Store) {
|
|||||||
_, err = ss.User().Save(u2)
|
_, err = ss.User().Save(u2)
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
|
|
||||||
d4, err := ss.Channel().CreateDirectChannel(u1, u2)
|
d4, nErr := ss.Channel().CreateDirectChannel(u1, u2)
|
||||||
require.Nil(t, err)
|
require.Nil(t, nErr)
|
||||||
defer func() {
|
defer func() {
|
||||||
ss.Channel().PermanentDeleteMembersByChannel(d4.Id)
|
ss.Channel().PermanentDeleteMembersByChannel(d4.Id)
|
||||||
ss.Channel().PermanentDelete(d4.Id)
|
ss.Channel().PermanentDelete(d4.Id)
|
||||||
|
|||||||
@@ -239,8 +239,8 @@ func testComplianceExportDirectMessages(t *testing.T, ss store.Store) {
|
|||||||
c1, nErr := ss.Channel().Save(c1, -1)
|
c1, nErr := ss.Channel().Save(c1, -1)
|
||||||
require.Nil(t, nErr)
|
require.Nil(t, nErr)
|
||||||
|
|
||||||
cDM, err := ss.Channel().CreateDirectChannel(u1, u2)
|
cDM, nErr := ss.Channel().CreateDirectChannel(u1, u2)
|
||||||
require.Nil(t, err)
|
require.Nil(t, nErr)
|
||||||
o1 := &model.Post{}
|
o1 := &model.Post{}
|
||||||
o1.ChannelId = c1.Id
|
o1.ChannelId = c1.Id
|
||||||
o1.UserId = u1.Id
|
o1.UserId = u1.Id
|
||||||
@@ -546,8 +546,8 @@ func testMessageExportDirectMessageChannel(t *testing.T, ss store.Store) {
|
|||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
|
|
||||||
// as well as a DM channel between those users
|
// as well as a DM channel between those users
|
||||||
directMessageChannel, err := ss.Channel().CreateDirectChannel(user1, user2)
|
directMessageChannel, nErr := ss.Channel().CreateDirectChannel(user1, user2)
|
||||||
require.Nil(t, err)
|
require.Nil(t, nErr)
|
||||||
|
|
||||||
// user1 also sends a DM to user2
|
// user1 also sends a DM to user2
|
||||||
post := &model.Post{
|
post := &model.Post{
|
||||||
|
|||||||
@@ -156,7 +156,7 @@ func (_m *ChannelStore) CountPostsAfter(channelId string, timestamp int64, userI
|
|||||||
}
|
}
|
||||||
|
|
||||||
// CreateDirectChannel provides a mock function with given fields: userId, otherUserId
|
// CreateDirectChannel provides a mock function with given fields: userId, otherUserId
|
||||||
func (_m *ChannelStore) CreateDirectChannel(userId *model.User, otherUserId *model.User) (*model.Channel, *model.AppError) {
|
func (_m *ChannelStore) CreateDirectChannel(userId *model.User, otherUserId *model.User) (*model.Channel, error) {
|
||||||
ret := _m.Called(userId, otherUserId)
|
ret := _m.Called(userId, otherUserId)
|
||||||
|
|
||||||
var r0 *model.Channel
|
var r0 *model.Channel
|
||||||
@@ -168,13 +168,11 @@ func (_m *ChannelStore) CreateDirectChannel(userId *model.User, otherUserId *mod
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var r1 *model.AppError
|
var r1 error
|
||||||
if rf, ok := ret.Get(1).(func(*model.User, *model.User) *model.AppError); ok {
|
if rf, ok := ret.Get(1).(func(*model.User, *model.User) error); ok {
|
||||||
r1 = rf(userId, otherUserId)
|
r1 = rf(userId, otherUserId)
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(1) != nil {
|
r1 = ret.Error(1)
|
||||||
r1 = ret.Get(1).(*model.AppError)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
@@ -1447,7 +1445,7 @@ func (_m *ChannelStore) Save(channel *model.Channel, maxChannelsPerTeam int64) (
|
|||||||
}
|
}
|
||||||
|
|
||||||
// SaveDirectChannel provides a mock function with given fields: channel, member1, member2
|
// SaveDirectChannel provides a mock function with given fields: channel, member1, member2
|
||||||
func (_m *ChannelStore) SaveDirectChannel(channel *model.Channel, member1 *model.ChannelMember, member2 *model.ChannelMember) (*model.Channel, *model.AppError) {
|
func (_m *ChannelStore) SaveDirectChannel(channel *model.Channel, member1 *model.ChannelMember, member2 *model.ChannelMember) (*model.Channel, error) {
|
||||||
ret := _m.Called(channel, member1, member2)
|
ret := _m.Called(channel, member1, member2)
|
||||||
|
|
||||||
var r0 *model.Channel
|
var r0 *model.Channel
|
||||||
@@ -1459,13 +1457,11 @@ func (_m *ChannelStore) SaveDirectChannel(channel *model.Channel, member1 *model
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var r1 *model.AppError
|
var r1 error
|
||||||
if rf, ok := ret.Get(1).(func(*model.Channel, *model.ChannelMember, *model.ChannelMember) *model.AppError); ok {
|
if rf, ok := ret.Get(1).(func(*model.Channel, *model.ChannelMember, *model.ChannelMember) error); ok {
|
||||||
r1 = rf(channel, member1, member2)
|
r1 = rf(channel, member1, member2)
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(1) != nil {
|
r1 = ret.Error(1)
|
||||||
r1 = ret.Get(1).(*model.AppError)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
|
|||||||
@@ -1971,8 +1971,8 @@ func testUserUnreadCount(t *testing.T, ss store.Store) {
|
|||||||
m1.ChannelId = c2.Id
|
m1.ChannelId = c2.Id
|
||||||
m2.ChannelId = c2.Id
|
m2.ChannelId = c2.Id
|
||||||
|
|
||||||
_, err = ss.Channel().SaveDirectChannel(&c2, &m1, &m2)
|
_, nErr = ss.Channel().SaveDirectChannel(&c2, &m1, &m2)
|
||||||
require.Nil(t, err, "couldn't save direct channel")
|
require.Nil(t, nErr, "couldn't save direct channel")
|
||||||
|
|
||||||
p1 := model.Post{}
|
p1 := model.Post{}
|
||||||
p1.ChannelId = c1.Id
|
p1.ChannelId = c1.Id
|
||||||
|
|||||||
@@ -568,7 +568,7 @@ func (s *TimerLayerChannelStore) CountPostsAfter(channelId string, timestamp int
|
|||||||
return resultVar0, resultVar1
|
return resultVar0, resultVar1
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *TimerLayerChannelStore) CreateDirectChannel(userId *model.User, otherUserId *model.User) (*model.Channel, *model.AppError) {
|
func (s *TimerLayerChannelStore) CreateDirectChannel(userId *model.User, otherUserId *model.User) (*model.Channel, error) {
|
||||||
start := timemodule.Now()
|
start := timemodule.Now()
|
||||||
|
|
||||||
resultVar0, resultVar1 := s.ChannelStore.CreateDirectChannel(userId, otherUserId)
|
resultVar0, resultVar1 := s.ChannelStore.CreateDirectChannel(userId, otherUserId)
|
||||||
@@ -1569,7 +1569,7 @@ func (s *TimerLayerChannelStore) Save(channel *model.Channel, maxChannelsPerTeam
|
|||||||
return resultVar0, resultVar1
|
return resultVar0, resultVar1
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *TimerLayerChannelStore) SaveDirectChannel(channel *model.Channel, member1 *model.ChannelMember, member2 *model.ChannelMember) (*model.Channel, *model.AppError) {
|
func (s *TimerLayerChannelStore) SaveDirectChannel(channel *model.Channel, member1 *model.ChannelMember, member2 *model.ChannelMember) (*model.Channel, error) {
|
||||||
start := timemodule.Now()
|
start := timemodule.Now()
|
||||||
|
|
||||||
resultVar0, resultVar1 := s.ChannelStore.SaveDirectChannel(channel, member1, member2)
|
resultVar0, resultVar1 := s.ChannelStore.SaveDirectChannel(channel, member1, member2)
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user