* Add interface for PreferencesHaveChanged hook
* Add context to preference-related methods of App
* Implement PreferencesHaveChanged
* Re-add missing "fmt" import
* Update minimum server version for the new hook
* Remove pointers to be consistent with other preference APIs
* Improves validation in getRolesByName endpoint
* Updates the max constant and fixes linter
* Adds a mechanism to split roles in chunks in the webapp client
---------
Co-authored-by: Mattermost Build <build@mattermost.com>
We can have 2 types of threads open at the same time. One from
the thread view, and another from RHS.
We add another variable to distinguish between the 2 states.
In future, if we have the ability for more than 2 threads, then
we would need to track by threadID.
https://mattermost.atlassian.net/browse/MM-56071
```release-note
NONE
```
* updated go mod and sum files
* fixed var-naming errors in channels/app and channels/api4 dir
* Revert "updated go mod and sum files"
This reverts commit 088dd00a848c2c31952c29f0a2a28a9fb47fc3f7.
* renamed a cost .
* [MM-55299] Make use of GenericStoreResult
Make use of GenericStoreResult in server/channels/app/notification.go
Introduce new result variables to workaround the IncompatibleAssign
error.
* [MM-55299] Make use of GenericStoreResult
Use GenericStoreResult for profiles, cmn properties, groups map.
Introduce new result variables for them to workaround IncompatibleAssign
error.
* Resolve merge conflict. Accept incoming master's change
---------
Co-authored-by: Mattermost Build <build@mattermost.com>
Make use of Generic store result in channels/app/webhook.go.
Introduce new variable resultU (result user) to workaround incompatible
assign error (since generics have been introduced).
* Added materialized view migration
* Renamed mat view
* Added channel membership mat view and indexes
* Added channel membership mat view and indexes
* Added new index
* WIP
* Simplifying user reporting code
* Created app and API layer for cahnnel reporting, reporting refactoring in general
* New router
* Remobved channel reporting meanwhile
* Upodated autogenerated stuff
* Lint fix
* Fixed typo
* api vet
* i18n fix
* Fixed API vetting and removed channel reporting constants
* yaml
* removed app pagination tests
While loading a thread, we were unnecessarily re-counting the replies
for all posts in a thread even if they would be the same number.
While this is needed in other queries where the posts can be from different
threads or they can be random ids, but to load a single post thread, there
is no need to recompute it again and again.
Therefore, we use a CTE to precompute the replycount and then just plug in
the value in the subsequent query. This gives an improvement in the query
plan as well:
OLD:
```
explain (analyze, buffers) SELECT p.id, p.rootid, p.createat, (SELECT count(*) FROM Posts WHERE Posts.RootId = (CASE WHEN p.RootId = '' THEN p.Id ELSE p.RootId END) AND Posts.DeleteAt = 0) as ReplyC
ount FROM Posts p WHERE (p.Id = 'h3cer597jb8abbcbitpghpomua' OR p.RootId = 'h3cer597jb8abbcbitpghpomua') AND p.DeleteAt = 0;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------------------
Bitmap Heap Scan on posts p (cost=45.39..1042149.61 rows=2748 width=49) (actual time=3.156..7906.215 rows=5353 loops=1)
Recheck Cond: (((id)::text = 'h3cer597jb8abbcbitpghpomua'::text) OR (((rootid)::text = 'h3cer597jb8abbcbitpghpomua'::text) AND (deleteat = 0)))
Filter: (deleteat = 0)
Heap Blocks: exact=5308
Buffers: shared hit=610244
-> BitmapOr (cost=45.39..45.39 rows=2748 width=0) (actual time=0.918..0.920 rows=0 loops=1)
Buffers: shared hit=47
-> Bitmap Index Scan on posts_pkey (cost=0.00..1.68 rows=1 width=0) (actual time=0.028..0.028 rows=1 loops=1)
Index Cond: ((id)::text = 'h3cer597jb8abbcbitpghpomua'::text)
Buffers: shared hit=4
-> Bitmap Index Scan on idx_posts_root_id_delete_at (cost=0.00..42.34 rows=2747 width=0) (actual time=0.889..0.890 rows=5352 loops=1)
Index Cond: (((rootid)::text = 'h3cer597jb8abbcbitpghpomua'::text) AND (deleteat = 0))
Buffers: shared hit=43
SubPlan 1
-> Aggregate (cost=378.10..378.11 rows=1 width=8) (actual time=1.474..1.474 rows=1 loops=5353)
Buffers: shared hit=604889
-> Index Only Scan using idx_posts_root_id_delete_at on posts (cost=0.57..343.85 rows=13699 width=0) (actual time=0.016..1.039 rows=5352 loops=5353)
Index Cond: ((rootid = (CASE WHEN ((p.rootid)::text = ''::text) THEN p.id ELSE p.rootid END)::text) AND (deleteat = 0))
Heap Fetches: 0
Buffers: shared hit=604889
Planning Time: 0.194 ms
Execution Time: 7906.846 ms
```
NEW:
```
explain analyze with replycount as (select count(*) as num from posts where rootid='h3cer597jb8abbcbitpghpomua' and deleteat=0)
select id, rootid, createat, replycount.num from posts, replycount where id='h3cer597jb8abbcbitpghpomua' or rootid='h3cer597jb8abbcbitpghpomua' and deleteat=0;
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
Nested Loop (cost=123.16..3215.48 rows=2748 width=49) (actual time=2.960..9.775 rows=5353 loops=1)
-> Aggregate (cost=77.78..77.79 rows=1 width=8) (actual time=1.455..1.456 rows=1 loops=1)
-> Index Only Scan using idx_posts_root_id_delete_at on posts posts_1 (cost=0.57..70.91 rows=2747 width=0) (actual time=0.056..1.145 rows=5352 loops=1)
Index Cond: ((rootid = 'h3cer597jb8abbcbitpghpomua'::text) AND (deleteat = 0))
Heap Fetches: 0
-> Bitmap Heap Scan on posts (cost=45.39..3110.20 rows=2748 width=41) (actual time=1.501..7.747 rows=5353 loops=1)
Recheck Cond: (((id)::text = 'h3cer597jb8abbcbitpghpomua'::text) OR (((rootid)::text = 'h3cer597jb8abbcbitpghpomua'::text) AND (deleteat = 0)))
Heap Blocks: exact=5308
-> BitmapOr (cost=45.39..45.39 rows=2748 width=0) (actual time=0.797..0.798 rows=0 loops=1)
-> Bitmap Index Scan on posts_pkey (cost=0.00..1.68 rows=1 width=0) (actual time=0.014..0.014 rows=1 loops=1)
Index Cond: ((id)::text = 'h3cer597jb8abbcbitpghpomua'::text)
-> Bitmap Index Scan on idx_posts_root_id_delete_at (cost=0.00..42.34 rows=2747 width=0) (actual time=0.782..0.782 rows=5352 loops=1)
Index Cond: (((rootid)::text = 'h3cer597jb8abbcbitpghpomua'::text) AND (deleteat = 0))
Planning Time: 0.220 ms
Execution Time: 10.052 ms
(15 rows)
```
Observe the `loops=5353` in the first query, and `loops=1` in the next.
https://mattermost.atlassian.net/browse/MM-55476
```release-note
Optimize createPost performance
```
Co-authored-by: Mattermost Build <build@mattermost.com>
We also track the channelID of the thread opened.
Additionally on every connection create or re-connect
with an existing queue, we reset the active state to empty
to avoid any edge-cases.
https://mattermost.atlassian.net/browse/MM-56071
```release-note
NONE
```
We were simply spawning goroutines within goroutines.
For each post, we would spawn one goroutine per hook,
and then one goroutine per callback URL within that hook.
And to top it off, this whole thing was itself within
a goroutine.
To fix it, we remove the goroutine spawning at a per
hook level. And then use a waitgroup to wait
until all hooks from each callback URL is complete.
While here, some other optimizations that we do:
1. We already had the channel object, but inspite of
that, we were calling channel.get again in CreatePostMissingChannel.
We just use CreatePost now and pass the channel.
2. We pre-compile the regex.
3. We store the http.Client in the server to reuse TCP connections.
https://mattermost.atlassian.net/browse/MM-55655
```release-note
NONE
```
We directly instruct the server to read from the local filesystem
in case the local_mode key is set.
There is now no need to upload the file in --local mode and a warning
is thrown accordingly.
https://mattermost.atlassian.net/browse/MM-55987
```release-note
Now the mmctl bulk import process command in local mode supports processing an import file without actually uploading it to the server. Simply pass the file path to the import file and the server will directly read from it, and pass the --bypass-upload flag. There is no need to use the import upload command. NOTE: all of this is applicable only in local mode.
```
Co-authored-by: Mattermost Build <build@mattermost.com>
We create a new websocket action called "presence" which
can contain the active_channel and the active_team for a given
client connection.
On the client side, for every channel or team switch, we send
out this message.
https://mattermost.atlassian.net/browse/MM-56060
```release-note
NONE
```
* Migrate feature/wrangler to mono-repo
* Add wrangler files
* Fix linters, types, etc
* Fix snapshots
* Fix playwright
* Fix pipelines
* Fix more pipeline
* Fixes for pipelines
* More changes for pipeline
* Fix types
* Add support for a feature flag, but leave it defaulted on for spinwick usage for now
* Update snapshot
* fix js error when removing last value of multiselect, support CSV marshaling to string array for textsetting
* Fix linter
* Remove TODO
* Remove another TODO
* fix tests
* Fix i18n
* Add server tests
* Fix linter
* Fix linter
* Use proper icon for dot menu
* Update snapshot
* Add Cypress UI tests for various entrypoints to move thread modal, split SCSS out from forward post into its own thing
* clean up
* fix linter
* More cleanup
* Revert files to master
* Fix linter for e2e tests
* Make ForwardPostChannelSelect channel types configurable with a prop
* Add missing return
* Fixes from PR feedback
* First batch of PR Feedback
* Another batch of PR changes
* Fix linter
* Update snapshots
* Wrangler system messages are translated to each user's locale
* Initially translate Wrangler into system locale rather than initiating user
* More fixes for PR Feedback
* Fix some server tests
* More updates with master. Fixes around pipelines. Enforce Enterprise license on front/back end
* Add tests for dot_menu
* More pipeline fixes
* Fix e2etests prettier
* Update cypress tests, change occurrences of 'Wrangler' with 'Move Thread'
* Fix linter
* Remove enterprise lock
* A couple more occurrences of wrangler strings, and one more enterprise lock
* Fix server tests
* Fix i18n
* Fix e2e linter
* Feature flag shouldn't be on by default
* Enable move threads feature in smoke tests (#25657)
* enable move threads feature
* add @prod tag
* Fix move_thread_from_public_channel e2e test
* Fix e2e style
---------
Co-authored-by: Mattermost Build <build@mattermost.com>
Co-authored-by: yasserfaraazkhan <attitude3cena.yf@gmail.com>