[MM-22133] Allow exporting and importing archived channels (#23724)
Этот коммит содержится в:
@@ -1468,7 +1468,15 @@ func (s SqlChannelStore) GetByName(teamId string, name string, allowFromCache bo
|
||||
return s.getByName(teamId, name, false, allowFromCache)
|
||||
}
|
||||
|
||||
func (s SqlChannelStore) GetByNamesIncludeDeleted(teamId string, names []string, allowFromCache bool) ([]*model.Channel, error) {
|
||||
return s.getByNames(teamId, names, allowFromCache, true)
|
||||
}
|
||||
|
||||
func (s SqlChannelStore) GetByNames(teamId string, names []string, allowFromCache bool) ([]*model.Channel, error) {
|
||||
return s.getByNames(teamId, names, allowFromCache, false)
|
||||
}
|
||||
|
||||
func (s SqlChannelStore) getByNames(teamId string, names []string, allowFromCache, includeArchivedChannels bool) ([]*model.Channel, error) {
|
||||
var channels []*model.Channel
|
||||
|
||||
if allowFromCache {
|
||||
@@ -1481,7 +1489,9 @@ func (s SqlChannelStore) GetByNames(teamId string, names []string, allowFromCach
|
||||
visited[name] = struct{}{}
|
||||
var cacheItem *model.Channel
|
||||
if err := channelByNameCache.Get(teamId+name, &cacheItem); err == nil {
|
||||
channels = append(channels, cacheItem)
|
||||
if includeArchivedChannels || cacheItem.DeleteAt == 0 {
|
||||
channels = append(channels, cacheItem)
|
||||
}
|
||||
} else {
|
||||
misses = append(misses, name)
|
||||
}
|
||||
@@ -1490,15 +1500,17 @@ func (s SqlChannelStore) GetByNames(teamId string, names []string, allowFromCach
|
||||
}
|
||||
|
||||
if len(names) > 0 {
|
||||
cond := sq.And{
|
||||
sq.Eq{"Name": names},
|
||||
}
|
||||
if !includeArchivedChannels {
|
||||
cond = append(cond, sq.Eq{"DeleteAt": 0})
|
||||
}
|
||||
|
||||
builder := s.getQueryBuilder().
|
||||
Select("*").
|
||||
From("Channels").
|
||||
Where(
|
||||
sq.And{
|
||||
sq.Eq{"Name": names},
|
||||
sq.Eq{"DeleteAt": 0},
|
||||
},
|
||||
)
|
||||
Where(cond)
|
||||
|
||||
if teamId != "" {
|
||||
builder = builder.Where(sq.Eq{"TeamId": teamId})
|
||||
@@ -4191,34 +4203,36 @@ func (s SqlChannelStore) GetAllChannelsForExportAfter(limit int, afterId string)
|
||||
return channels, nil
|
||||
}
|
||||
|
||||
func (s SqlChannelStore) GetChannelMembersForExport(userId string, teamId string) ([]*model.ChannelMemberForExport, error) {
|
||||
func (s SqlChannelStore) GetChannelMembersForExport(userId string, teamId string, includeArchivedChannel bool) ([]*model.ChannelMemberForExport, error) {
|
||||
members := []*model.ChannelMemberForExport{}
|
||||
err := s.GetReplicaX().Select(&members, `
|
||||
SELECT
|
||||
ChannelMembers.ChannelId,
|
||||
ChannelMembers.UserId,
|
||||
ChannelMembers.Roles,
|
||||
ChannelMembers.LastViewedAt,
|
||||
ChannelMembers.MsgCount,
|
||||
ChannelMembers.MentionCount,
|
||||
ChannelMembers.MentionCountRoot,
|
||||
COALESCE(ChannelMembers.UrgentMentionCount, 0) AS UrgentMentionCount,
|
||||
ChannelMembers.MsgCountRoot,
|
||||
ChannelMembers.NotifyProps,
|
||||
ChannelMembers.LastUpdateAt,
|
||||
ChannelMembers.SchemeUser,
|
||||
ChannelMembers.SchemeAdmin,
|
||||
(ChannelMembers.SchemeGuest IS NOT NULL AND ChannelMembers.SchemeGuest) as SchemeGuest,
|
||||
Channels.Name as ChannelName
|
||||
FROM
|
||||
ChannelMembers
|
||||
INNER JOIN
|
||||
Channels ON ChannelMembers.ChannelId = Channels.Id
|
||||
WHERE
|
||||
ChannelMembers.UserId = ?
|
||||
AND Channels.TeamId = ?
|
||||
AND Channels.DeleteAt = 0`,
|
||||
userId, teamId)
|
||||
q := `
|
||||
SELECT
|
||||
ChannelMembers.ChannelId,
|
||||
ChannelMembers.UserId,
|
||||
ChannelMembers.Roles,
|
||||
ChannelMembers.LastViewedAt,
|
||||
ChannelMembers.MsgCount,
|
||||
ChannelMembers.MentionCount,
|
||||
ChannelMembers.MentionCountRoot,
|
||||
COALESCE(ChannelMembers.UrgentMentionCount, 0) AS UrgentMentionCount,
|
||||
ChannelMembers.MsgCountRoot,
|
||||
ChannelMembers.NotifyProps,
|
||||
ChannelMembers.LastUpdateAt,
|
||||
ChannelMembers.SchemeUser,
|
||||
ChannelMembers.SchemeAdmin,
|
||||
(ChannelMembers.SchemeGuest IS NOT NULL AND ChannelMembers.SchemeGuest) as SchemeGuest,
|
||||
Channels.Name as ChannelName
|
||||
FROM
|
||||
ChannelMembers
|
||||
INNER JOIN
|
||||
Channels ON ChannelMembers.ChannelId = Channels.Id
|
||||
WHERE
|
||||
ChannelMembers.UserId = ?
|
||||
AND Channels.TeamId = ?`
|
||||
if !includeArchivedChannel {
|
||||
q += " AND Channels.DeleteAt = 0"
|
||||
}
|
||||
err := s.GetReplicaX().Select(&members, q, userId, teamId)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to find Channels for export")
|
||||
}
|
||||
|
||||
@@ -2556,7 +2556,7 @@ func (s *SqlPostStore) GetMaxPostSize() int {
|
||||
return s.maxPostSizeCached
|
||||
}
|
||||
|
||||
func (s *SqlPostStore) GetParentsForExportAfter(limit int, afterId string) ([]*model.PostForExport, error) {
|
||||
func (s *SqlPostStore) GetParentsForExportAfter(limit int, afterId string, includeArchivedChannel bool) ([]*model.PostForExport, error) {
|
||||
for {
|
||||
rootIds := []string{}
|
||||
err := s.GetReplicaX().Select(&rootIds,
|
||||
@@ -2580,16 +2580,20 @@ func (s *SqlPostStore) GetParentsForExportAfter(limit int, afterId string) ([]*m
|
||||
return postsForExport, nil
|
||||
}
|
||||
|
||||
excludeDeletedCond := sq.And{
|
||||
sq.Eq{"Teams.DeleteAt": 0},
|
||||
}
|
||||
if !includeArchivedChannel {
|
||||
excludeDeletedCond = append(excludeDeletedCond, sq.Eq{"Channels.DeleteAt": 0})
|
||||
}
|
||||
|
||||
builder := s.getQueryBuilder().
|
||||
Select("p1.*, Users.Username as Username, Teams.Name as TeamName, Channels.Name as ChannelName").
|
||||
FromSelect(sq.Select("*").From("Posts").Where(sq.Eq{"Posts.Id": rootIds}), "p1").
|
||||
InnerJoin("Channels ON p1.ChannelId = Channels.Id").
|
||||
InnerJoin("Teams ON Channels.TeamId = Teams.Id").
|
||||
InnerJoin("Users ON p1.UserId = Users.Id").
|
||||
Where(sq.And{
|
||||
sq.Eq{"Channels.DeleteAt": 0},
|
||||
sq.Eq{"Teams.DeleteAt": 0},
|
||||
}).
|
||||
Where(excludeDeletedCond).
|
||||
OrderBy("p1.Id")
|
||||
|
||||
query, args, err := builder.ToSql()
|
||||
|
||||
Ссылка в новой задаче
Block a user