From 3514e0f79f89046e0492731898ad8a4d4d2aa518 Mon Sep 17 00:00:00 2001 From: Agniva De Sarker Date: Tue, 31 Jan 2023 14:02:40 +0530 Subject: [PATCH] MM-50024: Handle empty team name for DM/GMs (#22160) https://mattermost.atlassian.net/browse/MM-50024 ```release-note NONE ``` --- app/post.go | 14 +++++++++++--- store/sqlstore/post_store.go | 16 ++++++++-------- store/storetest/post_store.go | 25 +++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 11 deletions(-) diff --git a/app/post.go b/app/post.go index 759bb3c4a2..2b4d599d5c 100644 --- a/app/post.go +++ b/app/post.go @@ -2058,8 +2058,16 @@ func (a *App) SetPostReminder(postID, userID string, targetTime int64) *model.Ap return model.NewAppError("SetPostReminder", model.NoTranslation, nil, "", http.StatusInternalServerError).Wrap(err) } - parsed := time.Unix(targetTime, 0).UTC().Format(time.RFC822) + parsedTime := time.Unix(targetTime, 0).UTC().Format(time.RFC822) siteURL := *a.Config().ServiceSettings.SiteURL + + var permalink string + if metadata.TeamName == "" { + permalink = fmt.Sprintf("%s/pl/%s", siteURL, postID) + } else { + permalink = fmt.Sprintf("%s/%s/pl/%s", siteURL, metadata.TeamName, postID) + } + // Send an ack message. ephemeralPost := &model.Post{ Type: model.PostTypeEphemeral, @@ -2070,7 +2078,7 @@ func (a *App) SetPostReminder(postID, userID string, targetTime int64) *model.Ap ChannelId: metadata.ChannelId, // It's okay to keep this non-translated. This is just a fallback. // The webapp will parse the timestamp and show that in user's local timezone. - Message: fmt.Sprintf("You will be reminded about %s/%s/pl/%s by @%s at %s", siteURL, metadata.TeamName, postID, metadata.Username, parsed), + Message: fmt.Sprintf("You will be reminded about %s by @%s at %s", permalink, metadata.Username, parsedTime), Props: model.StringInterface{ "target_time": targetTime, "team_name": metadata.TeamName, @@ -2133,7 +2141,7 @@ func (a *App) CheckPostReminders() { for _, postID := range postIDs { metadata, err := a.Srv().Store().Post().GetPostReminderMetadata(postID) if err != nil { - mlog.Error("Failed to get post reminder metadata", mlog.Err(err)) + mlog.Error("Failed to get post reminder metadata", mlog.Err(err), mlog.String("post_id", postID)) continue } diff --git a/store/sqlstore/post_store.go b/store/sqlstore/post_store.go index 8bb4de38cd..3cf2310a48 100644 --- a/store/sqlstore/post_store.go +++ b/store/sqlstore/post_store.go @@ -3313,15 +3313,15 @@ func (s *SqlPostStore) GetPostReminders(now int64) (_ []*model.PostReminder, err func (s *SqlPostStore) GetPostReminderMetadata(postID string) (*store.PostReminderMetadata, error) { meta := &store.PostReminderMetadata{} err := s.GetReplicaX().Get(meta, `SELECT c.id as ChannelId, - t.name as TeamName, - u.locale as UserLocale, u.username as Username - FROM Posts p, Channels c, Teams t, Users u - WHERE p.ChannelId=c.Id - AND c.TeamId=t.Id - AND p.UserId=u.Id - AND p.Id=?`, postID) + COALESCE(t.name, '') as TeamName, + u.locale as UserLocale, u.username as Username + FROM Posts p + JOIN Channels c ON p.ChannelId=c.Id + LEFT JOIN Teams t ON c.TeamId=t.Id + JOIN Users u ON p.UserId=u.Id + AND p.Id=?`, postID) if err != nil { - return nil, errors.Wrap(err, "failed to get post reminder metadata") + return nil, errors.Wrapf(err, "failed to get post reminder metadata: postId %s", postID) } return meta, nil diff --git a/store/storetest/post_store.go b/store/storetest/post_store.go index c6e9ecd7ef..10f84c132e 100644 --- a/store/storetest/post_store.go +++ b/store/storetest/post_store.go @@ -4657,6 +4657,15 @@ func testGetPostReminderMetadata(t *testing.T, ss store.Store, s SqlStore) { ch, err = ss.Channel().Save(ch, -1) require.NoError(t, err) + ch2 := &model.Channel{ + TeamId: "", + DisplayName: "GM_display", + Name: NewTestId(), + Type: model.ChannelTypeGroup, + } + ch2, err = ss.Channel().Save(ch2, -1) + require.NoError(t, err) + u1 := &model.User{ Email: MakeEmail(), Username: model.NewId(), @@ -4675,12 +4684,28 @@ func testGetPostReminderMetadata(t *testing.T, ss store.Store, s SqlStore) { p1, err = ss.Post().Save(p1) require.NoError(t, err) + p2 := &model.Post{ + UserId: u1.Id, + ChannelId: ch2.Id, + Message: "hi there 2", + Type: model.PostTypeDefault, + } + p2, err = ss.Post().Save(p2) + require.NoError(t, err) + meta, err := ss.Post().GetPostReminderMetadata(p1.Id) require.NoError(t, err) assert.Equal(t, meta.ChannelId, ch.Id) assert.Equal(t, meta.TeamName, team.Name) assert.Equal(t, meta.Username, u1.Username) assert.Equal(t, meta.UserLocale, u1.Locale) + + meta, err = ss.Post().GetPostReminderMetadata(p2.Id) + require.NoError(t, err) + assert.Equal(t, meta.ChannelId, ch2.Id) + assert.Equal(t, meta.TeamName, "") + assert.Equal(t, meta.Username, u1.Username) + assert.Equal(t, meta.UserLocale, u1.Locale) } func getPostIds(posts []*model.Post, morePosts ...*model.Post) []string {