Add top DMs route and handlers

Этот коммит содержится в:
Shivashis Padhi
2022-06-22 16:11:40 +05:30
родитель 56cf4b4ee7
Коммит 0ab2189941
11 изменённых файлов: 226 добавлений и 0 удалений

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

@@ -2963,3 +2963,55 @@ func (s *SqlPostStore) updateThreadsFromPosts(transaction *sqlxTxWrapper, posts
}
return nil
}
func (s *SqlPostStore) GetTopDMsForUserSince(userID string, since int64, offset int, limit int) (*model.TopDMList, error) {
channelSelector := s.getQueryBuilder().Select("Id", "TotalMsgCount").From("Channels").Join("ChannelMembers as cm on cm.ChannelId = Channels.Id").
Where(sq.And{
sq.Expr("Channels.Type = 'D'"),
sq.Eq{"cm.UserId": userID},
})
var aggregator string
if s.DriverName() == model.DatabaseDriverMysql {
aggregator = "group_concat(distinct cm.UserId) as Participants"
} else {
aggregator = "string_agg(distinct cm.UserId, ',') as Participants"
}
topDMsBuilder := s.getQueryBuilder().Select("count(p.id) as MessageCount", aggregator).FromSelect(channelSelector, "vch").
Join("ChannelMembers as cm on cm.ChannelId = vch.Id").
Join("Posts as p on p.ChannelId = vch.Id").
Where(sq.Gt{
"p.UpdateAt": since,
}).GroupBy("vch.id").
Limit(uint64(limit)).
Offset(uint64(offset))
topDMsBuilder = topDMsBuilder.OrderBy("MessageCount DESC").Limit(uint64(limit)).Offset(uint64(offset))
topDMs := make([]*model.TopDM, 0)
sql, args, err := topDMsBuilder.ToSql()
if err != nil {
return nil, errors.Wrap(err, "GetTopDMsForUserSince_ToSql")
}
err = s.GetReplicaX().Select(&topDMs, sql, args...)
if err != nil {
return nil, errors.Wrapf(err, "failed to find top DMs for user-id: %s", userID)
}
// fill SecondParticipant column
topDMs = postProcessTopDMs(userID, topDMs)
return model.GetTopDMListWithPagination(topDMs, limit), nil
}
func postProcessTopDMs(userID string, topDMs []*model.TopDM) []*model.TopDM {
for _, topDM := range topDMs {
participants := strings.Split(topDM.Participants, ",")
if participants[0] == userID {
topDM.SecondParticipant = participants[1]
} else {
topDM.SecondParticipant = participants[0]
}
}
return topDMs
}