diff --git a/server/channels/api4/user_test.go b/server/channels/api4/user_test.go index c5d6cc7589..9c1e724a5e 100644 --- a/server/channels/api4/user_test.go +++ b/server/channels/api4/user_test.go @@ -2419,17 +2419,17 @@ func TestUpdateUserRoles(t *testing.T) { }) } -func assertExpectedWebsocketEvent(t *testing.T, client *model.WebSocketClient, event string, test func(*model.WebSocketEvent)) { +func assertExpectedWebsocketEvent(t *testing.T, client *model.WebSocketClient, event model.WebsocketEventType, test func(*model.WebSocketEvent)) { for { select { case resp, ok := <-client.EventChannel: - require.Truef(t, ok, "channel closed before receiving expected event %s", event) + require.Truef(t, ok, "channel closed before receiving expected event %s", string(event)) if resp.EventType() == event { test(resp) return } case <-time.After(5 * time.Second): - require.Failf(t, "failed to receive expected event %s", event) + require.Failf(t, "failed to receive expected event %s", string(event)) } } } diff --git a/server/channels/app/group.go b/server/channels/app/group.go index d777490256..2290130993 100644 --- a/server/channels/app/group.go +++ b/server/channels/app/group.go @@ -853,7 +853,7 @@ func (a *App) DeleteGroupMembers(groupID string, userIDs []string) ([]*model.Gro return members, nil } -func (a *App) publishGroupMemberEvent(eventName string, groupMember *model.GroupMember) *model.AppError { +func (a *App) publishGroupMemberEvent(eventName model.WebsocketEventType, groupMember *model.GroupMember) *model.AppError { messageWs := model.NewWebSocketEvent(eventName, "", "", groupMember.UserId, nil, "") groupMemberJSON, jsonErr := json.Marshal(groupMember) if jsonErr != nil { diff --git a/server/channels/app/notification_test.go b/server/channels/app/notification_test.go index e41c3cfed6..40ee2abd1c 100644 --- a/server/channels/app/notification_test.go +++ b/server/channels/app/notification_test.go @@ -504,7 +504,7 @@ func TestConnectFakeWebSocket(t *testing.T) { msg := model.NewWebSocketEvent(model.WebsocketEventPosted, teamID, "", "", nil, "") th.App.Publish(msg) - msg = model.NewWebSocketEvent("test_event_with_data", "", "", userID, nil, "") + msg = model.NewWebSocketEvent(model.WebsocketEventPostEdited, "", "", userID, nil, "") msg.Add("key1", "value1") msg.Add("key2", 2) msg.Add("key3", []string{"three", "trois"}) @@ -515,7 +515,7 @@ func TestConnectFakeWebSocket(t *testing.T) { assert.Equal(t, teamID, received.GetBroadcast().TeamId) received = <-messages - require.Equal(t, "test_event_with_data", received.EventType()) + require.Equal(t, model.WebsocketEventPostEdited, received.EventType()) assert.Equal(t, userID, received.GetBroadcast().UserId) // These type changes are annoying but unavoidable because event data is untyped assert.Equal(t, map[string]any{ diff --git a/server/channels/app/platform/cluster.go b/server/channels/app/platform/cluster.go index 20ffe41fd8..8c43e97dc8 100644 --- a/server/channels/app/platform/cluster.go +++ b/server/channels/app/platform/cluster.go @@ -76,7 +76,7 @@ func (ps *PlatformService) PublishPluginClusterEvent(productID string, ev model. } func (ps *PlatformService) PublishWebSocketEvent(productID string, event string, payload map[string]any, broadcast *model.WebsocketBroadcast) { - ev := model.NewWebSocketEvent(fmt.Sprintf("custom_%v_%v", productID, event), "", "", "", nil, "") + ev := model.NewWebSocketEvent(model.WebsocketEventType(fmt.Sprintf("custom_%v_%v", productID, event)), "", "", "", nil, "") ev = ev.SetBroadcast(broadcast).SetData(payload) ps.Publish(ev) } diff --git a/server/channels/app/platform/config_test.go b/server/channels/app/platform/config_test.go index 61c2c3aca8..b0987e8125 100644 --- a/server/channels/app/platform/config_test.go +++ b/server/channels/app/platform/config_test.go @@ -79,7 +79,7 @@ func TestConfigSave(t *testing.T) { defer th.TearDown() metricsMock := &mocks.MetricsInterface{} - metricsMock.On("IncrementWebsocketEvent", mock.AnythingOfType("string")).Return() + metricsMock.On("IncrementWebsocketEvent", model.WebsocketEventConfigChanged).Return() metricsMock.On("IncrementWebSocketBroadcastBufferSize", mock.AnythingOfType("string"), mock.AnythingOfType("float64")).Return() metricsMock.On("DecrementWebSocketBroadcastBufferSize", mock.AnythingOfType("string"), mock.AnythingOfType("float64")).Return() metricsMock.On("Register").Return() diff --git a/server/channels/app/platform/shared_channel_notifier.go b/server/channels/app/platform/shared_channel_notifier.go index 0591b3c5ed..7655f5d7e5 100644 --- a/server/channels/app/platform/shared_channel_notifier.go +++ b/server/channels/app/platform/shared_channel_notifier.go @@ -11,10 +11,11 @@ import ( "github.com/mattermost/mattermost/server/public/model" "github.com/mattermost/mattermost/server/public/shared/mlog" + "github.com/mattermost/mattermost/server/public/utils" "github.com/mattermost/mattermost/server/v8/platform/services/sharedchannel" ) -var sharedChannelEventsForSync model.StringArray = []string{ +var sharedChannelEventsForSync = []model.WebsocketEventType{ model.WebsocketEventPosted, model.WebsocketEventPostEdited, model.WebsocketEventPostDeleted, @@ -22,7 +23,7 @@ var sharedChannelEventsForSync model.StringArray = []string{ model.WebsocketEventReactionRemoved, } -var sharedChannelEventsForInvitation model.StringArray = []string{ +var sharedChannelEventsForInvitation = []model.WebsocketEventType{ model.WebsocketEventDirectAdded, } @@ -39,7 +40,7 @@ func (ps *PlatformService) SharedChannelSyncHandler(event *model.WebSocketEvent) if err != nil { mlog.Warn( err.Error(), - mlog.String("event", event.EventType()), + mlog.String("event", string(event.EventType())), mlog.String("action", "content_sync"), ) } @@ -48,17 +49,17 @@ func (ps *PlatformService) SharedChannelSyncHandler(event *model.WebSocketEvent) if err != nil { mlog.Warn( err.Error(), - mlog.String("event", event.EventType()), + mlog.String("event", string(event.EventType())), mlog.String("action", "invitation"), ) } } } -func isEligibleForEvents(syncService SharedChannelServiceIFace, event *model.WebSocketEvent, events model.StringArray) bool { +func isEligibleForEvents(syncService SharedChannelServiceIFace, event *model.WebSocketEvent, events []model.WebsocketEventType) bool { return syncServiceEnabled(syncService) && eventHasChannel(event) && - events.Contains(event.EventType()) + utils.Contains(events, event.EventType()) } func eventHasChannel(event *model.WebSocketEvent) bool { diff --git a/server/channels/app/platform/web_broadcast_hook.go b/server/channels/app/platform/web_broadcast_hook.go index 0cff77a196..063e655cdd 100644 --- a/server/channels/app/platform/web_broadcast_hook.go +++ b/server/channels/app/platform/web_broadcast_hook.go @@ -54,7 +54,7 @@ func (he *HookedWebSocketEvent) Add(key string, value any) { he.copy.Add(key, value) } -func (he *HookedWebSocketEvent) EventType() string { +func (he *HookedWebSocketEvent) EventType() model.WebsocketEventType { if he.copy == nil { return he.original.EventType() } diff --git a/server/channels/app/platform/web_conn.go b/server/channels/app/platform/web_conn.go index cce589989f..938a08f2b0 100644 --- a/server/channels/app/platform/web_conn.go +++ b/server/channels/app/platform/web_conn.go @@ -477,7 +477,7 @@ func (wc *WebConn) writePump() { logData := []mlog.Field{ mlog.String("user_id", wc.UserId), mlog.String("conn_id", wc.GetConnectionID()), - mlog.String("type", msg.EventType()), + mlog.String("type", string(msg.EventType())), mlog.Int("size", buf.Len()), } if evtOk { @@ -735,7 +735,7 @@ func (wc *WebConn) ShouldSendEvent(msg *model.WebSocketEvent) bool { "websocket.slow: dropping message", mlog.String("user_id", wc.UserId), mlog.String("conn_id", wc.GetConnectionID()), - mlog.String("type", msg.EventType()), + mlog.String("type", string(msg.EventType())), ) // Reset timer to now. wc.lastLogTimeSlow = time.Now() diff --git a/server/channels/app/platform/websocket_router.go b/server/channels/app/platform/websocket_router.go index fdc45d5b9e..6d359e6091 100644 --- a/server/channels/app/platform/websocket_router.go +++ b/server/channels/app/platform/websocket_router.go @@ -36,7 +36,7 @@ func (wr *WebSocketRouter) ServeWebSocket(conn *WebConn, r *model.WebSocketReque return } - if r.Action == model.WebsocketAuthenticationChallenge { + if r.Action == string(model.WebsocketAuthenticationChallenge) { if conn.GetSessionToken() != "" { return } diff --git a/server/channels/app/plugin_api.go b/server/channels/app/plugin_api.go index 950e96aca6..c759318e40 100644 --- a/server/channels/app/plugin_api.go +++ b/server/channels/app/plugin_api.go @@ -957,7 +957,7 @@ func (api *PluginAPI) KVList(page, perPage int) ([]string, *model.AppError) { } func (api *PluginAPI) PublishWebSocketEvent(event string, payload map[string]any, broadcast *model.WebsocketBroadcast) { - ev := model.NewWebSocketEvent(fmt.Sprintf("custom_%v_%v", api.id, event), "", "", "", nil, "") + ev := model.NewWebSocketEvent(model.WebsocketEventType(fmt.Sprintf("custom_%v_%v", api.id, event)), "", "", "", nil, "") ev = ev.SetBroadcast(broadcast).SetData(payload) api.app.Publish(ev) } diff --git a/server/channels/app/post_acknowledgements.go b/server/channels/app/post_acknowledgements.go index 121529b5c2..0ca509ef9d 100644 --- a/server/channels/app/post_acknowledgements.go +++ b/server/channels/app/post_acknowledgements.go @@ -126,7 +126,7 @@ func (a *App) GetAcknowledgementsForPostList(postList *model.PostList) (map[stri return acknowledgementsMap, nil } -func (a *App) sendAcknowledgementEvent(event string, acknowledgement *model.PostAcknowledgement, post *model.Post) { +func (a *App) sendAcknowledgementEvent(event model.WebsocketEventType, acknowledgement *model.PostAcknowledgement, post *model.Post) { // send out that a acknowledgement has been added/removed message := model.NewWebSocketEvent(event, "", post.ChannelId, "", nil, "") diff --git a/server/channels/app/reaction.go b/server/channels/app/reaction.go index da9b59cb27..8adbe16784 100644 --- a/server/channels/app/reaction.go +++ b/server/channels/app/reaction.go @@ -137,7 +137,7 @@ func (a *App) DeleteReactionForPost(c request.CTX, reaction *model.Reaction) *mo return nil } -func (a *App) sendReactionEvent(event string, reaction *model.Reaction, post *model.Post) { +func (a *App) sendReactionEvent(event model.WebsocketEventType, reaction *model.Reaction, post *model.Post) { // send out that a reaction has been added/removed message := model.NewWebSocketEvent(event, "", post.ChannelId, "", nil, "") reactionJSON, err := json.Marshal(reaction) diff --git a/server/channels/app/team.go b/server/channels/app/team.go index a066fb666c..b3b6f1119b 100644 --- a/server/channels/app/team.go +++ b/server/channels/app/team.go @@ -388,7 +388,7 @@ func (a *App) RegenerateTeamInviteId(teamID string) (*model.Team, *model.AppErro return updatedTeam, nil } -func (a *App) sendTeamEvent(team *model.Team, event string) *model.AppError { +func (a *App) sendTeamEvent(team *model.Team, event model.WebsocketEventType) *model.AppError { sanitizedTeam := &model.Team{} *sanitizedTeam = *team sanitizedTeam.Sanitize() diff --git a/server/channels/app/team_test.go b/server/channels/app/team_test.go index aa0c48dc46..30ec6fc477 100644 --- a/server/channels/app/team_test.go +++ b/server/channels/app/team_test.go @@ -1633,7 +1633,7 @@ func TestTeamSendEvents(t *testing.T) { testCluster.ClearMessages() - wsEvents := []string{model.WebsocketEventUpdateTeam, model.WebsocketEventRestoreTeam, model.WebsocketEventDeleteTeam} + wsEvents := []model.WebsocketEventType{model.WebsocketEventUpdateTeam, model.WebsocketEventRestoreTeam, model.WebsocketEventDeleteTeam} for _, wsEvent := range wsEvents { appErr := th.App.sendTeamEvent(team, wsEvent) require.Nil(t, appErr) diff --git a/server/einterfaces/metrics.go b/server/einterfaces/metrics.go index 3c347a650d..99b6a98552 100644 --- a/server/einterfaces/metrics.go +++ b/server/einterfaces/metrics.go @@ -42,8 +42,8 @@ type MetricsInterface interface { IncrementMemCacheHitCounterSession() IncrementMemCacheInvalidationCounterSession() - IncrementWebsocketEvent(eventType string) - IncrementWebSocketBroadcast(eventType string) + IncrementWebsocketEvent(eventType model.WebsocketEventType) + IncrementWebSocketBroadcast(eventType model.WebsocketEventType) IncrementWebSocketBroadcastBufferSize(hub string, amount float64) DecrementWebSocketBroadcastBufferSize(hub string, amount float64) IncrementWebSocketBroadcastUsersRegistered(hub string, amount float64) diff --git a/server/einterfaces/mocks/MetricsInterface.go b/server/einterfaces/mocks/MetricsInterface.go index 2ee3b89ac4..a512115e40 100644 --- a/server/einterfaces/mocks/MetricsInterface.go +++ b/server/einterfaces/mocks/MetricsInterface.go @@ -210,7 +210,7 @@ func (_m *MetricsInterface) IncrementUserIndexCounter() { } // IncrementWebSocketBroadcast provides a mock function with given fields: eventType -func (_m *MetricsInterface) IncrementWebSocketBroadcast(eventType string) { +func (_m *MetricsInterface) IncrementWebSocketBroadcast(eventType model.WebsocketEventType) { _m.Called(eventType) } @@ -230,7 +230,7 @@ func (_m *MetricsInterface) IncrementWebhookPost() { } // IncrementWebsocketEvent provides a mock function with given fields: eventType -func (_m *MetricsInterface) IncrementWebsocketEvent(eventType string) { +func (_m *MetricsInterface) IncrementWebsocketEvent(eventType model.WebsocketEventType) { _m.Called(eventType) } diff --git a/server/public/model/websocket_client.go b/server/public/model/websocket_client.go index 1f599f7da0..7ba82c17d1 100644 --- a/server/public/model/websocket_client.go +++ b/server/public/model/websocket_client.go @@ -111,7 +111,7 @@ func makeClient(dialer *websocket.Dialer, url, connectURL, authToken string, hea client.configurePingHandling() go client.writer() - client.SendMessage(WebsocketAuthenticationChallenge, map[string]any{"token": authToken}) + client.SendMessage(string(WebsocketAuthenticationChallenge), map[string]any{"token": authToken}) return client, nil } @@ -157,7 +157,7 @@ func (wsc *WebSocketClient) ConnectWithDialer(dialer *websocket.Dialer) *AppErro wsc.EventChannel = make(chan *WebSocketEvent, 100) wsc.ResponseChannel = make(chan *WebSocketResponse, 100) - wsc.SendMessage(WebsocketAuthenticationChallenge, map[string]any{"token": wsc.AuthToken}) + wsc.SendMessage(string(WebsocketAuthenticationChallenge), map[string]any{"token": wsc.AuthToken}) return nil } diff --git a/server/public/model/websocket_message.go b/server/public/model/websocket_message.go index 0f5ee4a7cf..c15ed4fb2a 100644 --- a/server/public/model/websocket_message.go +++ b/server/public/model/websocket_message.go @@ -9,87 +9,89 @@ import ( "strconv" ) +type WebsocketEventType string + const ( - WebsocketEventTyping = "typing" - WebsocketEventPosted = "posted" - WebsocketEventPostEdited = "post_edited" - WebsocketEventPostDeleted = "post_deleted" - WebsocketEventPostUnread = "post_unread" - WebsocketEventChannelConverted = "channel_converted" - WebsocketEventChannelCreated = "channel_created" - WebsocketEventChannelDeleted = "channel_deleted" - WebsocketEventChannelRestored = "channel_restored" - WebsocketEventChannelUpdated = "channel_updated" - WebsocketEventChannelMemberUpdated = "channel_member_updated" - WebsocketEventChannelSchemeUpdated = "channel_scheme_updated" - WebsocketEventDirectAdded = "direct_added" - WebsocketEventGroupAdded = "group_added" - WebsocketEventNewUser = "new_user" - WebsocketEventAddedToTeam = "added_to_team" - WebsocketEventLeaveTeam = "leave_team" - WebsocketEventUpdateTeam = "update_team" - WebsocketEventDeleteTeam = "delete_team" - WebsocketEventRestoreTeam = "restore_team" - WebsocketEventUpdateTeamScheme = "update_team_scheme" - WebsocketEventUserAdded = "user_added" - WebsocketEventUserUpdated = "user_updated" - WebsocketEventUserRoleUpdated = "user_role_updated" - WebsocketEventMemberroleUpdated = "memberrole_updated" - WebsocketEventUserRemoved = "user_removed" - WebsocketEventPreferenceChanged = "preference_changed" - WebsocketEventPreferencesChanged = "preferences_changed" - WebsocketEventPreferencesDeleted = "preferences_deleted" - WebsocketEventEphemeralMessage = "ephemeral_message" - WebsocketEventStatusChange = "status_change" - WebsocketEventHello = "hello" - WebsocketAuthenticationChallenge = "authentication_challenge" - WebsocketEventReactionAdded = "reaction_added" - WebsocketEventReactionRemoved = "reaction_removed" - WebsocketEventResponse = "response" - WebsocketEventEmojiAdded = "emoji_added" - WebsocketEventChannelViewed = "channel_viewed" - WebsocketEventMultipleChannelsViewed = "multiple_channels_viewed" - WebsocketEventPluginStatusesChanged = "plugin_statuses_changed" - WebsocketEventPluginEnabled = "plugin_enabled" - WebsocketEventPluginDisabled = "plugin_disabled" - WebsocketEventRoleUpdated = "role_updated" - WebsocketEventLicenseChanged = "license_changed" - WebsocketEventConfigChanged = "config_changed" - WebsocketEventOpenDialog = "open_dialog" - WebsocketEventGuestsDeactivated = "guests_deactivated" - WebsocketEventUserActivationStatusChange = "user_activation_status_change" - WebsocketEventReceivedGroup = "received_group" - WebsocketEventReceivedGroupAssociatedToTeam = "received_group_associated_to_team" - WebsocketEventReceivedGroupNotAssociatedToTeam = "received_group_not_associated_to_team" - WebsocketEventReceivedGroupAssociatedToChannel = "received_group_associated_to_channel" - WebsocketEventReceivedGroupNotAssociatedToChannel = "received_group_not_associated_to_channel" - WebsocketEventGroupMemberDelete = "group_member_deleted" - WebsocketEventGroupMemberAdd = "group_member_add" - WebsocketEventSidebarCategoryCreated = "sidebar_category_created" - WebsocketEventSidebarCategoryUpdated = "sidebar_category_updated" - WebsocketEventSidebarCategoryDeleted = "sidebar_category_deleted" - WebsocketEventSidebarCategoryOrderUpdated = "sidebar_category_order_updated" - WebsocketWarnMetricStatusReceived = "warn_metric_status_received" - WebsocketWarnMetricStatusRemoved = "warn_metric_status_removed" - WebsocketEventCloudPaymentStatusUpdated = "cloud_payment_status_updated" - WebsocketEventCloudSubscriptionChanged = "cloud_subscription_changed" - WebsocketEventThreadUpdated = "thread_updated" - WebsocketEventThreadFollowChanged = "thread_follow_changed" - WebsocketEventThreadReadChanged = "thread_read_changed" - WebsocketFirstAdminVisitMarketplaceStatusReceived = "first_admin_visit_marketplace_status_received" - WebsocketEventDraftCreated = "draft_created" - WebsocketEventDraftUpdated = "draft_updated" - WebsocketEventDraftDeleted = "draft_deleted" - WebsocketEventAcknowledgementAdded = "post_acknowledgement_added" - WebsocketEventAcknowledgementRemoved = "post_acknowledgement_removed" - WebsocketEventPersistentNotificationTriggered = "persistent_notification_triggered" - WebsocketEventHostedCustomerSignupProgressUpdated = "hosted_customer_signup_progress_updated" + WebsocketEventTyping WebsocketEventType = "typing" + WebsocketEventPosted WebsocketEventType = "posted" + WebsocketEventPostEdited WebsocketEventType = "post_edited" + WebsocketEventPostDeleted WebsocketEventType = "post_deleted" + WebsocketEventPostUnread WebsocketEventType = "post_unread" + WebsocketEventChannelConverted WebsocketEventType = "channel_converted" + WebsocketEventChannelCreated WebsocketEventType = "channel_created" + WebsocketEventChannelDeleted WebsocketEventType = "channel_deleted" + WebsocketEventChannelRestored WebsocketEventType = "channel_restored" + WebsocketEventChannelUpdated WebsocketEventType = "channel_updated" + WebsocketEventChannelMemberUpdated WebsocketEventType = "channel_member_updated" + WebsocketEventChannelSchemeUpdated WebsocketEventType = "channel_scheme_updated" + WebsocketEventDirectAdded WebsocketEventType = "direct_added" + WebsocketEventGroupAdded WebsocketEventType = "group_added" + WebsocketEventNewUser WebsocketEventType = "new_user" + WebsocketEventAddedToTeam WebsocketEventType = "added_to_team" + WebsocketEventLeaveTeam WebsocketEventType = "leave_team" + WebsocketEventUpdateTeam WebsocketEventType = "update_team" + WebsocketEventDeleteTeam WebsocketEventType = "delete_team" + WebsocketEventRestoreTeam WebsocketEventType = "restore_team" + WebsocketEventUpdateTeamScheme WebsocketEventType = "update_team_scheme" + WebsocketEventUserAdded WebsocketEventType = "user_added" + WebsocketEventUserUpdated WebsocketEventType = "user_updated" + WebsocketEventUserRoleUpdated WebsocketEventType = "user_role_updated" + WebsocketEventMemberroleUpdated WebsocketEventType = "memberrole_updated" + WebsocketEventUserRemoved WebsocketEventType = "user_removed" + WebsocketEventPreferenceChanged WebsocketEventType = "preference_changed" + WebsocketEventPreferencesChanged WebsocketEventType = "preferences_changed" + WebsocketEventPreferencesDeleted WebsocketEventType = "preferences_deleted" + WebsocketEventEphemeralMessage WebsocketEventType = "ephemeral_message" + WebsocketEventStatusChange WebsocketEventType = "status_change" + WebsocketEventHello WebsocketEventType = "hello" + WebsocketAuthenticationChallenge WebsocketEventType = "authentication_challenge" + WebsocketEventReactionAdded WebsocketEventType = "reaction_added" + WebsocketEventReactionRemoved WebsocketEventType = "reaction_removed" + WebsocketEventResponse WebsocketEventType = "response" + WebsocketEventEmojiAdded WebsocketEventType = "emoji_added" + WebsocketEventChannelViewed WebsocketEventType = "channel_viewed" + WebsocketEventMultipleChannelsViewed WebsocketEventType = "multiple_channels_viewed" + WebsocketEventPluginStatusesChanged WebsocketEventType = "plugin_statuses_changed" + WebsocketEventPluginEnabled WebsocketEventType = "plugin_enabled" + WebsocketEventPluginDisabled WebsocketEventType = "plugin_disabled" + WebsocketEventRoleUpdated WebsocketEventType = "role_updated" + WebsocketEventLicenseChanged WebsocketEventType = "license_changed" + WebsocketEventConfigChanged WebsocketEventType = "config_changed" + WebsocketEventOpenDialog WebsocketEventType = "open_dialog" + WebsocketEventGuestsDeactivated WebsocketEventType = "guests_deactivated" + WebsocketEventUserActivationStatusChange WebsocketEventType = "user_activation_status_change" + WebsocketEventReceivedGroup WebsocketEventType = "received_group" + WebsocketEventReceivedGroupAssociatedToTeam WebsocketEventType = "received_group_associated_to_team" + WebsocketEventReceivedGroupNotAssociatedToTeam WebsocketEventType = "received_group_not_associated_to_team" + WebsocketEventReceivedGroupAssociatedToChannel WebsocketEventType = "received_group_associated_to_channel" + WebsocketEventReceivedGroupNotAssociatedToChannel WebsocketEventType = "received_group_not_associated_to_channel" + WebsocketEventGroupMemberDelete WebsocketEventType = "group_member_deleted" + WebsocketEventGroupMemberAdd WebsocketEventType = "group_member_add" + WebsocketEventSidebarCategoryCreated WebsocketEventType = "sidebar_category_created" + WebsocketEventSidebarCategoryUpdated WebsocketEventType = "sidebar_category_updated" + WebsocketEventSidebarCategoryDeleted WebsocketEventType = "sidebar_category_deleted" + WebsocketEventSidebarCategoryOrderUpdated WebsocketEventType = "sidebar_category_order_updated" + WebsocketWarnMetricStatusReceived WebsocketEventType = "warn_metric_status_received" + WebsocketWarnMetricStatusRemoved WebsocketEventType = "warn_metric_status_removed" + WebsocketEventCloudPaymentStatusUpdated WebsocketEventType = "cloud_payment_status_updated" + WebsocketEventCloudSubscriptionChanged WebsocketEventType = "cloud_subscription_changed" + WebsocketEventThreadUpdated WebsocketEventType = "thread_updated" + WebsocketEventThreadFollowChanged WebsocketEventType = "thread_follow_changed" + WebsocketEventThreadReadChanged WebsocketEventType = "thread_read_changed" + WebsocketFirstAdminVisitMarketplaceStatusReceived WebsocketEventType = "first_admin_visit_marketplace_status_received" + WebsocketEventDraftCreated WebsocketEventType = "draft_created" + WebsocketEventDraftUpdated WebsocketEventType = "draft_updated" + WebsocketEventDraftDeleted WebsocketEventType = "draft_deleted" + WebsocketEventAcknowledgementAdded WebsocketEventType = "post_acknowledgement_added" + WebsocketEventAcknowledgementRemoved WebsocketEventType = "post_acknowledgement_removed" + WebsocketEventPersistentNotificationTriggered WebsocketEventType = "persistent_notification_triggered" + WebsocketEventHostedCustomerSignupProgressUpdated WebsocketEventType = "hosted_customer_signup_progress_updated" ) type WebSocketMessage interface { ToJSON() ([]byte, error) IsValid() bool - EventType() string + EventType() WebsocketEventType } type WebsocketBroadcast struct { @@ -179,14 +181,14 @@ func (p *precomputedWebSocketEventJSON) copy() *precomputedWebSocketEventJSON { // webSocketEventJSON mirrors WebSocketEvent to make some of its unexported fields serializable type webSocketEventJSON struct { - Event string `json:"event"` + Event WebsocketEventType `json:"event"` Data map[string]any `json:"data"` Broadcast *WebsocketBroadcast `json:"broadcast"` Sequence int64 `json:"seq"` } type WebSocketEvent struct { - event string + event WebsocketEventType data map[string]any broadcast *WebsocketBroadcast sequence int64 @@ -238,7 +240,7 @@ func (ev *WebSocketEvent) Add(key string, value any) { ev.data[key] = value } -func NewWebSocketEvent(event, teamId, channelId, userId string, omitUsers map[string]bool, omitConnectionId string) *WebSocketEvent { +func NewWebSocketEvent(event WebsocketEventType, teamId, channelId, userId string, omitUsers map[string]bool, omitConnectionId string) *WebSocketEvent { return &WebSocketEvent{ event: event, data: make(map[string]any), @@ -293,7 +295,7 @@ func (ev *WebSocketEvent) GetSequence() int64 { return ev.sequence } -func (ev *WebSocketEvent) SetEvent(event string) *WebSocketEvent { +func (ev *WebSocketEvent) SetEvent(event WebsocketEventType) *WebSocketEvent { evCopy := ev.Copy() evCopy.event = event return evCopy @@ -321,7 +323,7 @@ func (ev *WebSocketEvent) IsValid() bool { return ev.event != "" } -func (ev *WebSocketEvent) EventType() string { +func (ev *WebSocketEvent) EventType() WebsocketEventType { return ev.event } @@ -419,7 +421,7 @@ func (m *WebSocketResponse) IsValid() bool { return m.Status != "" } -func (m *WebSocketResponse) EventType() string { +func (m *WebSocketResponse) EventType() WebsocketEventType { return WebsocketEventResponse } diff --git a/server/public/model/websocket_message_test.go b/server/public/model/websocket_message_test.go index 3fa743bee0..aee6044916 100644 --- a/server/public/model/websocket_message_test.go +++ b/server/public/model/websocket_message_test.go @@ -34,14 +34,14 @@ func TestWebSocketEvent(t *testing.T) { } func TestWebSocketEventImmutable(t *testing.T) { - m := NewWebSocketEvent("some_event", NewId(), NewId(), NewId(), nil, "") + m := NewWebSocketEvent(WebsocketEventPostEdited, NewId(), NewId(), NewId(), nil, "") - newM := m.SetEvent("new_event") + newM := m.SetEvent(WebsocketEventPostDeleted) if newM == m { require.Fail(t, "pointers should not be the same") } require.NotEqual(t, m.EventType(), newM.EventType()) - require.Equal(t, newM.EventType(), "new_event") + require.Equal(t, newM.EventType(), WebsocketEventPostDeleted) newM = m.SetSequence(45) if newM == m { @@ -81,11 +81,11 @@ func TestWebSocketEventFromJSON(t *testing.T) { ev, err := WebSocketEventFromJSON(bytes.NewReader([]byte("junk"))) require.Error(t, err) require.Nil(t, ev, "should not have parsed") - data := []byte(`{"event": "test", "data": {"key": "val"}, "seq": 45, "broadcast": {"user_id": "userid"}}`) + data := []byte(`{"event": "typing", "data": {"key": "val"}, "seq": 45, "broadcast": {"user_id": "userid"}}`) ev, err = WebSocketEventFromJSON(bytes.NewReader(data)) require.NoError(t, err) require.NotNil(t, ev, "should have parsed") - require.Equal(t, ev.EventType(), "test") + require.Equal(t, ev.EventType(), WebsocketEventTyping) require.Equal(t, ev.GetSequence(), int64(45)) require.Equal(t, ev.data, map[string]any{"key": "val"}) require.Equal(t, ev.GetBroadcast(), &WebsocketBroadcast{UserId: "userid"})