[MM-63196] Channel sql store migrate select * to specific columns (#30255)
* Adde MySQL and Postgres migrations * Replaced select * with column names * removed all * from channel SQL store * cleanup * Fixed a duplicate column * cleanup * used channelname slice in a missed place * WIP * converted to query builder * cleanupo * Review fixes
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
fa9af97727
Коммит
920b3301e5
@@ -105,6 +105,39 @@ func channelMemberSliceColumns() []string {
|
|||||||
return []string{"ChannelId", "UserId", "Roles", "LastViewedAt", "MsgCount", "MsgCountRoot", "MentionCount", "MentionCountRoot", "UrgentMentionCount", "NotifyProps", "LastUpdateAt", "SchemeUser", "SchemeAdmin", "SchemeGuest"}
|
return []string{"ChannelId", "UserId", "Roles", "LastViewedAt", "MsgCount", "MsgCountRoot", "MentionCount", "MentionCountRoot", "UrgentMentionCount", "NotifyProps", "LastUpdateAt", "SchemeUser", "SchemeAdmin", "SchemeGuest"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// channelSliceColumns returns fields of the channel as a string slice.
|
||||||
|
// Optionally, you can add a prefix (accepts only 1 value) to the fields.
|
||||||
|
func channelSliceColumns(prefix ...string) []string {
|
||||||
|
var p string
|
||||||
|
if len(prefix) == 1 {
|
||||||
|
p = prefix[0] + "."
|
||||||
|
} else if len(prefix) > 1 {
|
||||||
|
panic("cannot accept multiple prefixes")
|
||||||
|
}
|
||||||
|
|
||||||
|
return []string{
|
||||||
|
p + "Id",
|
||||||
|
p + "CreateAt",
|
||||||
|
p + "UpdateAt",
|
||||||
|
p + "DeleteAt",
|
||||||
|
p + "TeamId",
|
||||||
|
p + "Type",
|
||||||
|
p + "DisplayName",
|
||||||
|
p + "Name",
|
||||||
|
p + "Header",
|
||||||
|
p + "Purpose",
|
||||||
|
p + "LastPostAt",
|
||||||
|
p + "TotalMsgCount",
|
||||||
|
p + "ExtraUpdateAt",
|
||||||
|
p + "CreatorId",
|
||||||
|
p + "SchemeId",
|
||||||
|
p + "GroupConstrained",
|
||||||
|
p + "Shared",
|
||||||
|
p + "TotalMsgCountRoot",
|
||||||
|
p + "LastRootPostAt",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func channelMemberToSlice(member *model.ChannelMember) []any {
|
func channelMemberToSlice(member *model.ChannelMember) []any {
|
||||||
resultSlice := []any{}
|
resultSlice := []any{}
|
||||||
resultSlice = append(resultSlice, member.ChannelId)
|
resultSlice = append(resultSlice, member.ChannelId)
|
||||||
@@ -124,6 +157,30 @@ func channelMemberToSlice(member *model.ChannelMember) []any {
|
|||||||
return resultSlice
|
return resultSlice
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func channelToSlice(channel *model.Channel) []interface{} {
|
||||||
|
return []interface{}{
|
||||||
|
channel.Id,
|
||||||
|
channel.CreateAt,
|
||||||
|
channel.UpdateAt,
|
||||||
|
channel.DeleteAt,
|
||||||
|
channel.TeamId,
|
||||||
|
channel.Type,
|
||||||
|
channel.DisplayName,
|
||||||
|
channel.Name,
|
||||||
|
channel.Header,
|
||||||
|
channel.Purpose,
|
||||||
|
channel.LastPostAt,
|
||||||
|
channel.TotalMsgCount,
|
||||||
|
channel.ExtraUpdateAt,
|
||||||
|
channel.CreatorId,
|
||||||
|
channel.SchemeId,
|
||||||
|
channel.GroupConstrained,
|
||||||
|
channel.Shared,
|
||||||
|
channel.TotalMsgCountRoot,
|
||||||
|
channel.LastRootPostAt,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type channelMemberWithSchemeRolesList []channelMemberWithSchemeRoles
|
type channelMemberWithSchemeRolesList []channelMemberWithSchemeRoles
|
||||||
|
|
||||||
func getChannelRoles(schemeGuest, schemeUser, schemeAdmin bool, defaultTeamGuestRole, defaultTeamUserRole, defaultTeamAdminRole, defaultChannelGuestRole, defaultChannelUserRole, defaultChannelAdminRole string,
|
func getChannelRoles(schemeGuest, schemeUser, schemeAdmin bool, defaultTeamGuestRole, defaultTeamUserRole, defaultTeamAdminRole, defaultChannelGuestRole, defaultChannelUserRole, defaultChannelAdminRole string,
|
||||||
@@ -446,10 +503,7 @@ func newSqlChannelStore(sqlStore *SqlStore, metrics einterfaces.MetricsInterface
|
|||||||
metrics: metrics,
|
metrics: metrics,
|
||||||
}
|
}
|
||||||
|
|
||||||
s.tableSelectQuery = s.getQueryBuilder().Select("Id", "CreateAt", "UpdateAt", "DeleteAt", "TeamId", "Type", "DisplayName",
|
s.tableSelectQuery = s.getQueryBuilder().Select(channelSliceColumns()...).From("Channels")
|
||||||
"Name", "Header", "Purpose", "LastPostAt", "TotalMsgCount", "ExtraUpdateAt", "CreatorId", "SchemeId", "GroupConstrained",
|
|
||||||
"Shared", "TotalMsgCountRoot", "LastRootPostAt",
|
|
||||||
).From("Channels")
|
|
||||||
|
|
||||||
s.initializeQueries()
|
s.initializeQueries()
|
||||||
|
|
||||||
@@ -681,21 +735,27 @@ func (s SqlChannelStore) saveChannelT(transaction *sqlxTxWrapper, channel *model
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var insert string
|
var insert sq.InsertBuilder
|
||||||
if s.DriverName() == model.DatabaseDriverMysql {
|
if s.DriverName() == model.DatabaseDriverMysql {
|
||||||
insert = `INSERT IGNORE INTO Channels
|
insert = s.getQueryBuilder().
|
||||||
(Id, CreateAt, UpdateAt, DeleteAt, TeamId, Type, DisplayName, Name, Header, Purpose, LastPostAt, TotalMsgCount, ExtraUpdateAt, CreatorId, SchemeId, GroupConstrained, Shared, TotalMsgCountRoot, LastRootPostAt)
|
Insert("Channels").
|
||||||
VALUES
|
Options("IGNORE").
|
||||||
(:Id, :CreateAt, :UpdateAt, :DeleteAt, :TeamId, :Type, :DisplayName, :Name, :Header, :Purpose, :LastPostAt, :TotalMsgCount, :ExtraUpdateAt, :CreatorId, :SchemeId, :GroupConstrained, :Shared, :TotalMsgCountRoot, :LastRootPostAt)`
|
Columns(channelSliceColumns()...).
|
||||||
|
Values(channelToSlice(channel)...)
|
||||||
} else {
|
} else {
|
||||||
insert = `INSERT INTO Channels
|
insert = s.getQueryBuilder().
|
||||||
(Id, CreateAt, UpdateAt, DeleteAt, TeamId, Type, DisplayName, Name, Header, Purpose, LastPostAt, TotalMsgCount, ExtraUpdateAt, CreatorId, SchemeId, GroupConstrained, Shared, TotalMsgCountRoot, LastRootPostAt)
|
Insert("Channels").
|
||||||
VALUES
|
Columns(channelSliceColumns()...).
|
||||||
(:Id, :CreateAt, :UpdateAt, :DeleteAt, :TeamId, :Type, :DisplayName, :Name, :Header, :Purpose, :LastPostAt, :TotalMsgCount, :ExtraUpdateAt, :CreatorId, :SchemeId, :GroupConstrained, :Shared, :TotalMsgCountRoot, :LastRootPostAt)
|
Values(channelToSlice(channel)...).
|
||||||
ON CONFLICT (TeamId, Name) DO NOTHING`
|
SuffixExpr(sq.Expr("ON CONFLICT (TeamId, Name) DO NOTHING"))
|
||||||
}
|
}
|
||||||
|
|
||||||
insertResult, err := transaction.NamedExec(insert, channel)
|
query, params, err := insert.ToSql()
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Wrapf(err, "save_channel: id=%s", channel.Id)
|
||||||
|
}
|
||||||
|
|
||||||
|
insertResult, err := transaction.Exec(query, params...)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrapf(err, "save_channel: id=%s", channel.Id)
|
return nil, errors.Wrapf(err, "save_channel: id=%s", channel.Id)
|
||||||
@@ -858,7 +918,7 @@ func (s SqlChannelStore) Get(id string, allowFromCache bool) (*model.Channel, er
|
|||||||
//nolint:unparam
|
//nolint:unparam
|
||||||
func (s SqlChannelStore) GetMany(ids []string, allowFromCache bool) (model.ChannelList, error) {
|
func (s SqlChannelStore) GetMany(ids []string, allowFromCache bool) (model.ChannelList, error) {
|
||||||
query := s.getQueryBuilder().
|
query := s.getQueryBuilder().
|
||||||
Select("*").
|
Select(channelSliceColumns()...).
|
||||||
From("Channels").
|
From("Channels").
|
||||||
Where(sq.Eq{"Id": ids})
|
Where(sq.Eq{"Id": ids})
|
||||||
sql, args, err := query.ToSql()
|
sql, args, err := query.ToSql()
|
||||||
@@ -1020,7 +1080,7 @@ func (s SqlChannelStore) PermanentDeleteMembersByChannel(rctx request.CTX, chann
|
|||||||
|
|
||||||
func (s SqlChannelStore) GetChannels(teamId string, userId string, opts *model.ChannelSearchOpts) (model.ChannelList, error) {
|
func (s SqlChannelStore) GetChannels(teamId string, userId string, opts *model.ChannelSearchOpts) (model.ChannelList, error) {
|
||||||
query := s.getQueryBuilder().
|
query := s.getQueryBuilder().
|
||||||
Select("ch.*").
|
Select(channelSliceColumns("ch")...).
|
||||||
From("Channels ch, ChannelMembers cm").
|
From("Channels ch, ChannelMembers cm").
|
||||||
Where(
|
Where(
|
||||||
sq.And{
|
sq.And{
|
||||||
@@ -1075,7 +1135,7 @@ func (s SqlChannelStore) GetChannels(teamId string, userId string, opts *model.C
|
|||||||
|
|
||||||
func (s SqlChannelStore) GetChannelsByUser(userId string, includeDeleted bool, lastDeleteAt, pageSize int, fromChannelID string) (model.ChannelList, error) {
|
func (s SqlChannelStore) GetChannelsByUser(userId string, includeDeleted bool, lastDeleteAt, pageSize int, fromChannelID string) (model.ChannelList, error) {
|
||||||
query := s.getQueryBuilder().
|
query := s.getQueryBuilder().
|
||||||
Select("Channels.*").
|
Select(channelSliceColumns("Channels")...).
|
||||||
From("Channels, ChannelMembers").
|
From("Channels, ChannelMembers").
|
||||||
Where(
|
Where(
|
||||||
sq.And{
|
sq.And{
|
||||||
@@ -1177,18 +1237,25 @@ func (s SqlChannelStore) GetAllChannelsCount(opts store.ChannelSearchOpts) (int6
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s SqlChannelStore) getAllChannelsQuery(opts store.ChannelSearchOpts, forCount bool) sq.SelectBuilder {
|
func (s SqlChannelStore) getAllChannelsQuery(opts store.ChannelSearchOpts, forCount bool) sq.SelectBuilder {
|
||||||
var selectStr string
|
var selectQuery sq.SelectBuilder
|
||||||
if forCount {
|
if forCount {
|
||||||
selectStr = "count(c.Id)"
|
selectQuery = s.getQueryBuilder().
|
||||||
|
Select("count(c.Id)")
|
||||||
} else {
|
} else {
|
||||||
selectStr = "c.*, Teams.DisplayName AS TeamDisplayName, Teams.Name AS TeamName, Teams.UpdateAt AS TeamUpdateAt"
|
selectQuery = s.getQueryBuilder().
|
||||||
|
Select(channelSliceColumns("c")...).
|
||||||
|
Columns(
|
||||||
|
"Teams.DisplayName AS TeamDisplayName",
|
||||||
|
"Teams.Name AS TeamName",
|
||||||
|
"Teams.UpdateAt AS TeamUpdateAt",
|
||||||
|
)
|
||||||
|
|
||||||
if opts.IncludePolicyID {
|
if opts.IncludePolicyID {
|
||||||
selectStr += ", RetentionPoliciesChannels.PolicyId AS PolicyID"
|
selectQuery = selectQuery.Columns("RetentionPoliciesChannels.PolicyId AS PolicyID")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
query := s.getQueryBuilder().
|
query := selectQuery.
|
||||||
Select(selectStr).
|
|
||||||
From("Channels AS c").
|
From("Channels AS c").
|
||||||
Where(sq.Eq{"c.Type": []model.ChannelType{model.ChannelTypePrivate, model.ChannelTypeOpen}})
|
Where(sq.Eq{"c.Type": []model.ChannelType{model.ChannelTypePrivate, model.ChannelTypeOpen}})
|
||||||
|
|
||||||
@@ -1228,35 +1295,31 @@ func (s SqlChannelStore) getAllChannelsQuery(opts store.ChannelSearchOpts, forCo
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s SqlChannelStore) GetMoreChannels(teamId string, userId string, offset int, limit int) (model.ChannelList, error) {
|
func (s SqlChannelStore) GetMoreChannels(teamId string, userId string, offset int, limit int) (model.ChannelList, error) {
|
||||||
channels := model.ChannelList{}
|
subQuery := s.getSubQueryBuilder().
|
||||||
err := s.GetReplica().Select(&channels, `
|
Select("c.Id").
|
||||||
SELECT
|
From("PublicChannels c").
|
||||||
Channels.*
|
Join("ChannelMembers cm ON (cm.ChannelId = c.Id)").
|
||||||
FROM
|
Where(sq.Eq{
|
||||||
Channels
|
"c.TeamId": teamId,
|
||||||
JOIN
|
"cm.UserId": userId,
|
||||||
PublicChannels c ON (c.Id = Channels.Id)
|
"c.DeleteAt": 0,
|
||||||
WHERE
|
})
|
||||||
c.TeamId = ?
|
|
||||||
AND c.DeleteAt = 0
|
|
||||||
AND c.Id NOT IN (
|
|
||||||
SELECT
|
|
||||||
c.Id
|
|
||||||
FROM
|
|
||||||
PublicChannels c
|
|
||||||
JOIN
|
|
||||||
ChannelMembers cm ON (cm.ChannelId = c.Id)
|
|
||||||
WHERE
|
|
||||||
c.TeamId = ?
|
|
||||||
AND cm.UserId = ?
|
|
||||||
AND c.DeleteAt = 0
|
|
||||||
)
|
|
||||||
ORDER BY
|
|
||||||
c.DisplayName
|
|
||||||
LIMIT ?
|
|
||||||
OFFSET ?
|
|
||||||
`, teamId, teamId, userId, limit, offset)
|
|
||||||
|
|
||||||
|
query := s.getQueryBuilder().
|
||||||
|
Select(channelSliceColumns("Channels")...).
|
||||||
|
From("Channels").
|
||||||
|
Join("PublicChannels c ON (c.Id = Channels.Id)").
|
||||||
|
Where(sq.Eq{
|
||||||
|
"c.TeamId": teamId,
|
||||||
|
"c.DeleteAt": 0,
|
||||||
|
}).
|
||||||
|
Where(sq.Expr("c.Id NOT IN (?)", subQuery)).
|
||||||
|
OrderBy("c.DisplayName").
|
||||||
|
Limit(uint64(limit)).
|
||||||
|
Offset(uint64(offset))
|
||||||
|
|
||||||
|
channels := model.ChannelList{}
|
||||||
|
err := s.GetReplica().SelectBuilder(&channels, query)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrapf(err, "failed getting channels with teamId=%s and userId=%s", teamId, userId)
|
return nil, errors.Wrapf(err, "failed getting channels with teamId=%s and userId=%s", teamId, userId)
|
||||||
}
|
}
|
||||||
@@ -1268,7 +1331,7 @@ func (s SqlChannelStore) GetPrivateChannelsForTeam(teamId string, offset int, li
|
|||||||
channels := model.ChannelList{}
|
channels := model.ChannelList{}
|
||||||
|
|
||||||
builder := s.getQueryBuilder().
|
builder := s.getQueryBuilder().
|
||||||
Select("*").
|
Select(channelSliceColumns()...).
|
||||||
From("Channels").
|
From("Channels").
|
||||||
Where(sq.Eq{"Type": model.ChannelTypePrivate, "TeamId": teamId, "DeleteAt": 0}).
|
Where(sq.Eq{"Type": model.ChannelTypePrivate, "TeamId": teamId, "DeleteAt": 0}).
|
||||||
OrderBy("DisplayName").
|
OrderBy("DisplayName").
|
||||||
@@ -1288,22 +1351,26 @@ func (s SqlChannelStore) GetPrivateChannelsForTeam(teamId string, offset int, li
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s SqlChannelStore) GetPublicChannelsForTeam(teamId string, offset int, limit int) (model.ChannelList, error) {
|
func (s SqlChannelStore) GetPublicChannelsForTeam(teamId string, offset int, limit int) (model.ChannelList, error) {
|
||||||
channels := model.ChannelList{}
|
query := s.getQueryBuilder().
|
||||||
err := s.GetReplica().Select(&channels, `
|
Select(channelSliceColumns("Channels")...).
|
||||||
SELECT
|
From("Channels").
|
||||||
Channels.*
|
Join("PublicChannels pc ON (pc.Id = Channels.Id)").
|
||||||
FROM
|
Where(sq.Eq{
|
||||||
Channels
|
"pc.TeamId": teamId,
|
||||||
JOIN
|
"pc.DeleteAt": 0,
|
||||||
PublicChannels pc ON (pc.Id = Channels.Id)
|
}).
|
||||||
WHERE
|
OrderBy("pc.DisplayName").
|
||||||
pc.TeamId = ?
|
Limit(uint64(limit)).
|
||||||
AND pc.DeleteAt = 0
|
Offset(uint64(offset))
|
||||||
ORDER BY pc.DisplayName
|
|
||||||
LIMIT ?
|
|
||||||
OFFSET ?
|
|
||||||
`, teamId, limit, offset)
|
|
||||||
|
|
||||||
|
channels := model.ChannelList{}
|
||||||
|
|
||||||
|
queryString, args, err := query.ToSql()
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Wrap(err, "failed to convert query to string")
|
||||||
|
}
|
||||||
|
|
||||||
|
err = s.GetReplica().Select(&channels, queryString, args...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrapf(err, "failed to find channel with teamId=%s", teamId)
|
return nil, errors.Wrapf(err, "failed to find channel with teamId=%s", teamId)
|
||||||
}
|
}
|
||||||
@@ -1329,7 +1396,7 @@ func (s SqlChannelStore) GetPublicChannelsByIdsForTeam(teamId string, channelIds
|
|||||||
var data model.ChannelList
|
var data model.ChannelList
|
||||||
|
|
||||||
builder := s.getQueryBuilder().
|
builder := s.getQueryBuilder().
|
||||||
Select("Channels.*").
|
Select(channelSliceColumns("Channels")...).
|
||||||
From("Channels").
|
From("Channels").
|
||||||
Join("PublicChannels pc ON (pc.Id = Channels.Id)").
|
Join("PublicChannels pc ON (pc.Id = Channels.Id)").
|
||||||
Where(sq.And{
|
Where(sq.And{
|
||||||
@@ -1424,7 +1491,7 @@ func (s SqlChannelStore) getByNames(teamId string, names []string, allowFromCach
|
|||||||
}
|
}
|
||||||
|
|
||||||
builder := s.getQueryBuilder().
|
builder := s.getQueryBuilder().
|
||||||
Select("*").
|
Select(channelSliceColumns()...).
|
||||||
From("Channels").
|
From("Channels").
|
||||||
Where(cond)
|
Where(cond)
|
||||||
|
|
||||||
@@ -1459,7 +1526,7 @@ func (s SqlChannelStore) GetByName(teamId string, name string, allowFromCache bo
|
|||||||
|
|
||||||
func (s SqlChannelStore) getByName(teamId string, name string, includeDeleted bool, allowFromCache bool) (*model.Channel, error) {
|
func (s SqlChannelStore) getByName(teamId string, name string, includeDeleted bool, allowFromCache bool) (*model.Channel, error) {
|
||||||
query := s.getQueryBuilder().
|
query := s.getQueryBuilder().
|
||||||
Select("*").
|
Select(channelSliceColumns()...).
|
||||||
From("Channels").
|
From("Channels").
|
||||||
Where(sq.Eq{"Name": name}).
|
Where(sq.Eq{"Name": name}).
|
||||||
Where(sq.Or{
|
Where(sq.Or{
|
||||||
@@ -1510,7 +1577,7 @@ func (s SqlChannelStore) GetDeleted(teamId string, offset int, limit int, userId
|
|||||||
channels := model.ChannelList{}
|
channels := model.ChannelList{}
|
||||||
|
|
||||||
builder := s.getQueryBuilder().
|
builder := s.getQueryBuilder().
|
||||||
Select("*").
|
Select(channelSliceColumns()...).
|
||||||
From("Channels").
|
From("Channels").
|
||||||
Where(sq.Or{
|
Where(sq.Or{
|
||||||
sq.Eq{"TeamId": teamId},
|
sq.Eq{"TeamId": teamId},
|
||||||
@@ -2841,7 +2908,7 @@ func (s SqlChannelStore) GetAll(teamId string) ([]*model.Channel, error) {
|
|||||||
|
|
||||||
func (s SqlChannelStore) GetChannelsByIds(channelIds []string, includeDeleted bool) ([]*model.Channel, error) {
|
func (s SqlChannelStore) GetChannelsByIds(channelIds []string, includeDeleted bool) ([]*model.Channel, error) {
|
||||||
query := s.getQueryBuilder().
|
query := s.getQueryBuilder().
|
||||||
Select("*").
|
Select(channelSliceColumns()...).
|
||||||
From("Channels").
|
From("Channels").
|
||||||
Where(sq.Eq{"Id": channelIds}).
|
Where(sq.Eq{"Id": channelIds}).
|
||||||
OrderBy("Name")
|
OrderBy("Name")
|
||||||
@@ -2865,10 +2932,12 @@ func (s SqlChannelStore) GetChannelsByIds(channelIds []string, includeDeleted bo
|
|||||||
|
|
||||||
func (s SqlChannelStore) GetChannelsWithTeamDataByIds(channelIDs []string, includeDeleted bool) ([]*model.ChannelWithTeamData, error) {
|
func (s SqlChannelStore) GetChannelsWithTeamDataByIds(channelIDs []string, includeDeleted bool) ([]*model.ChannelWithTeamData, error) {
|
||||||
query := s.getQueryBuilder().
|
query := s.getQueryBuilder().
|
||||||
Select("c.*",
|
Select(channelSliceColumns("c")...).
|
||||||
|
Columns(
|
||||||
"COALESCE(t.DisplayName, '') As TeamDisplayName",
|
"COALESCE(t.DisplayName, '') As TeamDisplayName",
|
||||||
"COALESCE(t.Name, '') AS TeamName",
|
"COALESCE(t.Name, '') AS TeamName",
|
||||||
"COALESCE(t.UpdateAt, 0) AS TeamUpdateAt").
|
"COALESCE(t.UpdateAt, 0) AS TeamUpdateAt",
|
||||||
|
).
|
||||||
From("Channels c").
|
From("Channels c").
|
||||||
LeftJoin("Teams t ON c.TeamId = t.Id").
|
LeftJoin("Teams t ON c.TeamId = t.Id").
|
||||||
Where(sq.Eq{"c.Id": channelIDs}).
|
Where(sq.Eq{"c.Id": channelIDs}).
|
||||||
@@ -2892,19 +2961,26 @@ func (s SqlChannelStore) GetChannelsWithTeamDataByIds(channelIDs []string, inclu
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s SqlChannelStore) GetForPost(postId string) (*model.Channel, error) {
|
func (s SqlChannelStore) GetForPost(postId string) (*model.Channel, error) {
|
||||||
|
query := s.getQueryBuilder().
|
||||||
|
Select(channelSliceColumns("Channels")...).
|
||||||
|
From("Channels").
|
||||||
|
Join("Posts ON Channels.Id = Posts.ChannelId").
|
||||||
|
Where(sq.Eq{
|
||||||
|
"Posts.Id": postId,
|
||||||
|
})
|
||||||
|
|
||||||
|
queryString, argss, err := query.ToSql()
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Wrap(err, "GetForPost: failed to convert query to string")
|
||||||
|
}
|
||||||
|
|
||||||
channel := model.Channel{}
|
channel := model.Channel{}
|
||||||
if err := s.GetReplica().Get(
|
|
||||||
&channel,
|
err = s.GetReplica().Get(&channel, queryString, argss...)
|
||||||
`SELECT
|
if err != nil {
|
||||||
Channels.*
|
|
||||||
FROM
|
|
||||||
Channels,
|
|
||||||
Posts
|
|
||||||
WHERE
|
|
||||||
Channels.Id = Posts.ChannelId
|
|
||||||
AND Posts.Id = ?`, postId); err != nil {
|
|
||||||
return nil, errors.Wrapf(err, "failed to get Channel with postId=%s", postId)
|
return nil, errors.Wrapf(err, "failed to get Channel with postId=%s", postId)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &channel, nil
|
return &channel, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3047,10 +3123,13 @@ func (s SqlChannelStore) GetTeamMembersForChannel(channelID string) ([]string, e
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s SqlChannelStore) Autocomplete(rctx request.CTX, userID, term string, includeDeleted, isGuest bool) (model.ChannelListWithTeamData, error) {
|
func (s SqlChannelStore) Autocomplete(rctx request.CTX, userID, term string, includeDeleted, isGuest bool) (model.ChannelListWithTeamData, error) {
|
||||||
query := s.getQueryBuilder().Select("c.*",
|
query := s.getQueryBuilder().
|
||||||
|
Select(channelSliceColumns("c")...).
|
||||||
|
Columns(
|
||||||
"t.DisplayName AS TeamDisplayName",
|
"t.DisplayName AS TeamDisplayName",
|
||||||
"t.Name AS TeamName",
|
"t.Name AS TeamName",
|
||||||
"t.UpdateAt AS TeamUpdateAt").
|
"t.UpdateAt AS TeamUpdateAt",
|
||||||
|
).
|
||||||
From("Channels c, Teams t, TeamMembers tm").
|
From("Channels c, Teams t, TeamMembers tm").
|
||||||
Where(sq.And{
|
Where(sq.And{
|
||||||
sq.Expr("c.TeamId = t.id"),
|
sq.Expr("c.TeamId = t.id"),
|
||||||
@@ -3102,7 +3181,7 @@ func (s SqlChannelStore) Autocomplete(rctx request.CTX, userID, term string, inc
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s SqlChannelStore) AutocompleteInTeam(rctx request.CTX, teamID, userID, term string, includeDeleted, isGuest bool) (model.ChannelList, error) {
|
func (s SqlChannelStore) AutocompleteInTeam(rctx request.CTX, teamID, userID, term string, includeDeleted, isGuest bool) (model.ChannelList, error) {
|
||||||
query := s.getQueryBuilder().Select("*").
|
query := s.getQueryBuilder().Select(channelSliceColumns()...).
|
||||||
From("Channels c").
|
From("Channels c").
|
||||||
Where(sq.Eq{"c.TeamId": teamID}).
|
Where(sq.Eq{"c.TeamId": teamID}).
|
||||||
OrderBy("c.DisplayName").
|
OrderBy("c.DisplayName").
|
||||||
@@ -3138,7 +3217,7 @@ func (s SqlChannelStore) AutocompleteInTeam(rctx request.CTX, teamID, userID, te
|
|||||||
|
|
||||||
func (s SqlChannelStore) AutocompleteInTeamForSearch(teamID string, userID string, term string, includeDeleted bool) (model.ChannelList, error) {
|
func (s SqlChannelStore) AutocompleteInTeamForSearch(teamID string, userID string, term string, includeDeleted bool) (model.ChannelList, error) {
|
||||||
// shared query
|
// shared query
|
||||||
query := s.getSubQueryBuilder().Select("C.*").
|
query := s.getSubQueryBuilder().Select(channelSliceColumns("C")...).
|
||||||
From("Channels AS C").
|
From("Channels AS C").
|
||||||
Join("ChannelMembers AS CM ON CM.ChannelId = C.Id").
|
Join("ChannelMembers AS CM ON CM.ChannelId = C.Id").
|
||||||
Limit(50).
|
Limit(50).
|
||||||
@@ -3228,7 +3307,9 @@ func (s SqlChannelStore) AutocompleteInTeamForSearch(teamID string, userID strin
|
|||||||
|
|
||||||
func (s SqlChannelStore) autocompleteInTeamForSearchDirectMessages(userID string, term string) ([]*model.Channel, error) {
|
func (s SqlChannelStore) autocompleteInTeamForSearchDirectMessages(userID string, term string) ([]*model.Channel, error) {
|
||||||
// create the main query
|
// create the main query
|
||||||
query := s.getQueryBuilder().Select("C.*", "OtherUsers.Username as DisplayName").
|
query := s.getQueryBuilder().
|
||||||
|
Select(channelSliceColumns("C")...).
|
||||||
|
Columns("OtherUsers.Username AS DisplayName").
|
||||||
From("Channels AS C").
|
From("Channels AS C").
|
||||||
Join("ChannelMembers AS CM ON CM.ChannelId = C.Id").
|
Join("ChannelMembers AS CM ON CM.ChannelId = C.Id").
|
||||||
Where(sq.Eq{
|
Where(sq.Eq{
|
||||||
@@ -3272,7 +3353,7 @@ func (s SqlChannelStore) autocompleteInTeamForSearchDirectMessages(userID string
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s SqlChannelStore) SearchInTeam(teamId string, term string, includeDeleted bool) (model.ChannelList, error) {
|
func (s SqlChannelStore) SearchInTeam(teamId string, term string, includeDeleted bool) (model.ChannelList, error) {
|
||||||
query := s.getQueryBuilder().Select("Channels.*").
|
query := s.getQueryBuilder().Select(channelSliceColumns("Channels")...).
|
||||||
From("Channels").
|
From("Channels").
|
||||||
Join("PublicChannels c ON (c.Id = Channels.Id)").
|
Join("PublicChannels c ON (c.Id = Channels.Id)").
|
||||||
Where(sq.Eq{"c.TeamId": teamId}).
|
Where(sq.Eq{"c.TeamId": teamId}).
|
||||||
@@ -3294,7 +3375,7 @@ func (s SqlChannelStore) SearchInTeam(teamId string, term string, includeDeleted
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s SqlChannelStore) SearchArchivedInTeam(teamId string, term string, userId string) (model.ChannelList, error) {
|
func (s SqlChannelStore) SearchArchivedInTeam(teamId string, term string, userId string) (model.ChannelList, error) {
|
||||||
queryBase := s.getQueryBuilder().Select("Channels.*").
|
queryBase := s.getQueryBuilder().Select(channelSliceColumns("Channels")...).
|
||||||
From("Channels").
|
From("Channels").
|
||||||
Join("Channels c ON (c.Id = Channels.Id)").
|
Join("Channels c ON (c.Id = Channels.Id)").
|
||||||
Where(sq.And{
|
Where(sq.And{
|
||||||
@@ -3338,7 +3419,7 @@ func (s SqlChannelStore) SearchArchivedInTeam(teamId string, term string, userId
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s SqlChannelStore) SearchForUserInTeam(userId string, teamId string, term string, includeDeleted bool) (model.ChannelList, error) {
|
func (s SqlChannelStore) SearchForUserInTeam(userId string, teamId string, term string, includeDeleted bool) (model.ChannelList, error) {
|
||||||
query := s.getQueryBuilder().Select("Channels.*").
|
query := s.getQueryBuilder().Select(channelSliceColumns("Channels")...).
|
||||||
From("Channels").
|
From("Channels").
|
||||||
Join("PublicChannels c ON (c.Id = Channels.Id)").
|
Join("PublicChannels c ON (c.Id = Channels.Id)").
|
||||||
Join("ChannelMembers cm ON (c.Id = cm.ChannelId)").
|
Join("ChannelMembers cm ON (c.Id = cm.ChannelId)").
|
||||||
@@ -3369,21 +3450,25 @@ func (s SqlChannelStore) channelSearchQuery(opts *store.ChannelSearchOpts) sq.Se
|
|||||||
limit = 100
|
limit = 100
|
||||||
}
|
}
|
||||||
|
|
||||||
var selectStr string
|
var selectQuery sq.SelectBuilder
|
||||||
if opts.CountOnly {
|
if opts.CountOnly {
|
||||||
selectStr = "count(*)"
|
selectQuery = s.getQueryBuilder().Select("count(*)")
|
||||||
} else {
|
} else {
|
||||||
selectStr = "c.*"
|
selectQuery = s.getQueryBuilder().
|
||||||
|
Select(channelSliceColumns("c")...)
|
||||||
if opts.IncludeTeamInfo {
|
if opts.IncludeTeamInfo {
|
||||||
selectStr += ", t.DisplayName AS TeamDisplayName, t.Name AS TeamName, t.UpdateAt as TeamUpdateAt"
|
selectQuery = selectQuery.Columns(
|
||||||
|
"t.DisplayName AS TeamDisplayName",
|
||||||
|
"t.Name AS TeamName",
|
||||||
|
"t.UpdateAt as TeamUpdateAt",
|
||||||
|
)
|
||||||
}
|
}
|
||||||
if opts.IncludePolicyID {
|
if opts.IncludePolicyID {
|
||||||
selectStr += ", RetentionPoliciesChannels.PolicyId AS PolicyID"
|
selectQuery = selectQuery.Columns("RetentionPoliciesChannels.PolicyId AS PolicyID")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
query := s.getQueryBuilder().
|
query := selectQuery.
|
||||||
Select(selectStr).
|
|
||||||
From("Channels AS c").
|
From("Channels AS c").
|
||||||
Join("Teams AS t ON t.Id = c.TeamId")
|
Join("Teams AS t ON t.Id = c.TeamId")
|
||||||
|
|
||||||
@@ -3530,7 +3615,7 @@ func (s SqlChannelStore) SearchMore(userId string, teamId string, term string) (
|
|||||||
"c.DeleteAt": 0,
|
"c.DeleteAt": 0,
|
||||||
})
|
})
|
||||||
|
|
||||||
query := s.getQueryBuilder().Select("Channels.*").
|
query := s.getQueryBuilder().Select(channelSliceColumns("Channels")...).
|
||||||
From("Channels").
|
From("Channels").
|
||||||
Join("PublicChannels c ON (c.Id=Channels.Id)").
|
Join("PublicChannels c ON (c.Id=Channels.Id)").
|
||||||
Where(sq.And{
|
Where(sq.And{
|
||||||
@@ -3737,7 +3822,7 @@ func (s SqlChannelStore) searchGroupChannelsQuery(userId, term string, isPostgre
|
|||||||
Having(having).
|
Having(having).
|
||||||
Limit(model.ChannelSearchDefaultLimit)
|
Limit(model.ChannelSearchDefaultLimit)
|
||||||
|
|
||||||
return s.getQueryBuilder().Select("*").
|
return s.getQueryBuilder().Select(channelSliceColumns()...).
|
||||||
From("Channels").
|
From("Channels").
|
||||||
Where(sq.Expr("Id IN (?)", subq))
|
Where(sq.Expr("Id IN (?)", subq))
|
||||||
}
|
}
|
||||||
@@ -3749,7 +3834,7 @@ func (s SqlChannelStore) searchGroupChannelsQuery(userId, term string, isPostgre
|
|||||||
having = append(having, sq.Expr(baseLikeTerm, "%"+term+"%"))
|
having = append(having, sq.Expr(baseLikeTerm, "%"+term+"%"))
|
||||||
}
|
}
|
||||||
|
|
||||||
cc := s.getSubQueryBuilder().Select("c.*").
|
cc := s.getSubQueryBuilder().Select(channelSliceColumns("c")...).
|
||||||
From("Channels c").
|
From("Channels c").
|
||||||
Join("ChannelMembers cm ON c.Id=cm.ChannelId").
|
Join("ChannelMembers cm ON c.Id=cm.ChannelId").
|
||||||
Join("Users u on u.Id = cm.UserId").
|
Join("Users u on u.Id = cm.UserId").
|
||||||
@@ -4082,24 +4167,29 @@ func (s SqlChannelStore) ClearAllCustomRoleAssignments() (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s SqlChannelStore) GetAllChannelsForExportAfter(limit int, afterId string) ([]*model.ChannelForExport, error) {
|
func (s SqlChannelStore) GetAllChannelsForExportAfter(limit int, afterId string) ([]*model.ChannelForExport, error) {
|
||||||
|
query := s.getQueryBuilder().
|
||||||
|
Select(channelSliceColumns("Channels")...).
|
||||||
|
Columns(
|
||||||
|
"Teams.Name as TeamName",
|
||||||
|
"Schemes.Name as SchemeName",
|
||||||
|
).
|
||||||
|
From("Channels").
|
||||||
|
InnerJoin("Teams ON Channels.TeamId = Teams.Id").
|
||||||
|
LeftJoin("Schemes ON Channels.SchemeId = Schemes.Id").
|
||||||
|
Where(sq.And{
|
||||||
|
sq.Gt{"Channels.Id": afterId},
|
||||||
|
sq.Eq{"Channels.Type": []model.ChannelType{model.ChannelTypeOpen, model.ChannelTypePrivate}},
|
||||||
|
}).
|
||||||
|
OrderBy("Id").
|
||||||
|
Limit(uint64(limit))
|
||||||
|
|
||||||
channels := []*model.ChannelForExport{}
|
channels := []*model.ChannelForExport{}
|
||||||
if err := s.GetReplica().Select(&channels, `
|
queryString, args, err := query.ToSql()
|
||||||
SELECT
|
if err != nil {
|
||||||
Channels.*,
|
return nil, errors.Wrap(err, "failed to convert SQL query to string")
|
||||||
Teams.Name as TeamName,
|
}
|
||||||
Schemes.Name as SchemeName
|
|
||||||
FROM Channels
|
if err := s.GetReplica().Select(&channels, queryString, args...); err != nil {
|
||||||
INNER JOIN
|
|
||||||
Teams ON Channels.TeamId = Teams.Id
|
|
||||||
LEFT JOIN
|
|
||||||
Schemes ON Channels.SchemeId = Schemes.Id
|
|
||||||
WHERE
|
|
||||||
Channels.Id > ?
|
|
||||||
AND Channels.Type IN (?, ?)
|
|
||||||
ORDER BY
|
|
||||||
Id
|
|
||||||
LIMIT ?`,
|
|
||||||
afterId, model.ChannelTypeOpen, model.ChannelTypePrivate, limit); err != nil {
|
|
||||||
return nil, errors.Wrap(err, "failed to find Channels for export")
|
return nil, errors.Wrap(err, "failed to find Channels for export")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4146,7 +4236,7 @@ func (s SqlChannelStore) GetChannelMembersForExport(userId string, teamId string
|
|||||||
func (s SqlChannelStore) GetAllDirectChannelsForExportAfter(limit int, afterId string, includeArchivedChannels bool) ([]*model.DirectChannelForExport, error) {
|
func (s SqlChannelStore) GetAllDirectChannelsForExportAfter(limit int, afterId string, includeArchivedChannels bool) ([]*model.DirectChannelForExport, error) {
|
||||||
directChannelsForExport := []*model.DirectChannelForExport{}
|
directChannelsForExport := []*model.DirectChannelForExport{}
|
||||||
query := s.getQueryBuilder().
|
query := s.getQueryBuilder().
|
||||||
Select("Channels.*").
|
Select(channelSliceColumns("Channels")...).
|
||||||
From("Channels").
|
From("Channels").
|
||||||
Where(sq.And{
|
Where(sq.And{
|
||||||
sq.Gt{"Channels.Id": afterId},
|
sq.Gt{"Channels.Id": afterId},
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user