[MM-40638] Type all of the websocket event names as a new type WebsocketEventType (#25454)

Co-authored-by: Sudheer Tripathi <sudheer@clearglass.com>
Co-authored-by: Sudheer Tripathi <31629433+sudheer121@users.noreply.github.com>
Co-authored-by: Sudheer Tripathi <tripathisudheer604@gmail.com>
Этот коммит содержится в:
Ben Schumacher
2023-11-22 11:09:48 +01:00
коммит произвёл GitHub
родитель e1f72576fb
Коммит 51e73b681b
19 изменённых файлов: 118 добавлений и 115 удалений

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

@@ -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 { for {
select { select {
case resp, ok := <-client.EventChannel: 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 { if resp.EventType() == event {
test(resp) test(resp)
return return
} }
case <-time.After(5 * time.Second): 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))
} }
} }
} }

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

@@ -853,7 +853,7 @@ func (a *App) DeleteGroupMembers(groupID string, userIDs []string) ([]*model.Gro
return members, nil 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, "") messageWs := model.NewWebSocketEvent(eventName, "", "", groupMember.UserId, nil, "")
groupMemberJSON, jsonErr := json.Marshal(groupMember) groupMemberJSON, jsonErr := json.Marshal(groupMember)
if jsonErr != nil { if jsonErr != nil {

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

@@ -504,7 +504,7 @@ func TestConnectFakeWebSocket(t *testing.T) {
msg := model.NewWebSocketEvent(model.WebsocketEventPosted, teamID, "", "", nil, "") msg := model.NewWebSocketEvent(model.WebsocketEventPosted, teamID, "", "", nil, "")
th.App.Publish(msg) 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("key1", "value1")
msg.Add("key2", 2) msg.Add("key2", 2)
msg.Add("key3", []string{"three", "trois"}) msg.Add("key3", []string{"three", "trois"})
@@ -515,7 +515,7 @@ func TestConnectFakeWebSocket(t *testing.T) {
assert.Equal(t, teamID, received.GetBroadcast().TeamId) assert.Equal(t, teamID, received.GetBroadcast().TeamId)
received = <-messages 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) assert.Equal(t, userID, received.GetBroadcast().UserId)
// These type changes are annoying but unavoidable because event data is untyped // These type changes are annoying but unavoidable because event data is untyped
assert.Equal(t, map[string]any{ assert.Equal(t, map[string]any{

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

@@ -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) { 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) ev = ev.SetBroadcast(broadcast).SetData(payload)
ps.Publish(ev) ps.Publish(ev)
} }

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

@@ -79,7 +79,7 @@ func TestConfigSave(t *testing.T) {
defer th.TearDown() defer th.TearDown()
metricsMock := &mocks.MetricsInterface{} 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("IncrementWebSocketBroadcastBufferSize", mock.AnythingOfType("string"), mock.AnythingOfType("float64")).Return()
metricsMock.On("DecrementWebSocketBroadcastBufferSize", mock.AnythingOfType("string"), mock.AnythingOfType("float64")).Return() metricsMock.On("DecrementWebSocketBroadcastBufferSize", mock.AnythingOfType("string"), mock.AnythingOfType("float64")).Return()
metricsMock.On("Register").Return() metricsMock.On("Register").Return()

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

@@ -11,10 +11,11 @@ import (
"github.com/mattermost/mattermost/server/public/model" "github.com/mattermost/mattermost/server/public/model"
"github.com/mattermost/mattermost/server/public/shared/mlog" "github.com/mattermost/mattermost/server/public/shared/mlog"
"github.com/mattermost/mattermost/server/public/utils"
"github.com/mattermost/mattermost/server/v8/platform/services/sharedchannel" "github.com/mattermost/mattermost/server/v8/platform/services/sharedchannel"
) )
var sharedChannelEventsForSync model.StringArray = []string{ var sharedChannelEventsForSync = []model.WebsocketEventType{
model.WebsocketEventPosted, model.WebsocketEventPosted,
model.WebsocketEventPostEdited, model.WebsocketEventPostEdited,
model.WebsocketEventPostDeleted, model.WebsocketEventPostDeleted,
@@ -22,7 +23,7 @@ var sharedChannelEventsForSync model.StringArray = []string{
model.WebsocketEventReactionRemoved, model.WebsocketEventReactionRemoved,
} }
var sharedChannelEventsForInvitation model.StringArray = []string{ var sharedChannelEventsForInvitation = []model.WebsocketEventType{
model.WebsocketEventDirectAdded, model.WebsocketEventDirectAdded,
} }
@@ -39,7 +40,7 @@ func (ps *PlatformService) SharedChannelSyncHandler(event *model.WebSocketEvent)
if err != nil { if err != nil {
mlog.Warn( mlog.Warn(
err.Error(), err.Error(),
mlog.String("event", event.EventType()), mlog.String("event", string(event.EventType())),
mlog.String("action", "content_sync"), mlog.String("action", "content_sync"),
) )
} }
@@ -48,17 +49,17 @@ func (ps *PlatformService) SharedChannelSyncHandler(event *model.WebSocketEvent)
if err != nil { if err != nil {
mlog.Warn( mlog.Warn(
err.Error(), err.Error(),
mlog.String("event", event.EventType()), mlog.String("event", string(event.EventType())),
mlog.String("action", "invitation"), 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) && return syncServiceEnabled(syncService) &&
eventHasChannel(event) && eventHasChannel(event) &&
events.Contains(event.EventType()) utils.Contains(events, event.EventType())
} }
func eventHasChannel(event *model.WebSocketEvent) bool { func eventHasChannel(event *model.WebSocketEvent) bool {

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

@@ -54,7 +54,7 @@ func (he *HookedWebSocketEvent) Add(key string, value any) {
he.copy.Add(key, value) he.copy.Add(key, value)
} }
func (he *HookedWebSocketEvent) EventType() string { func (he *HookedWebSocketEvent) EventType() model.WebsocketEventType {
if he.copy == nil { if he.copy == nil {
return he.original.EventType() return he.original.EventType()
} }

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

@@ -477,7 +477,7 @@ func (wc *WebConn) writePump() {
logData := []mlog.Field{ logData := []mlog.Field{
mlog.String("user_id", wc.UserId), mlog.String("user_id", wc.UserId),
mlog.String("conn_id", wc.GetConnectionID()), mlog.String("conn_id", wc.GetConnectionID()),
mlog.String("type", msg.EventType()), mlog.String("type", string(msg.EventType())),
mlog.Int("size", buf.Len()), mlog.Int("size", buf.Len()),
} }
if evtOk { if evtOk {
@@ -735,7 +735,7 @@ func (wc *WebConn) ShouldSendEvent(msg *model.WebSocketEvent) bool {
"websocket.slow: dropping message", "websocket.slow: dropping message",
mlog.String("user_id", wc.UserId), mlog.String("user_id", wc.UserId),
mlog.String("conn_id", wc.GetConnectionID()), mlog.String("conn_id", wc.GetConnectionID()),
mlog.String("type", msg.EventType()), mlog.String("type", string(msg.EventType())),
) )
// Reset timer to now. // Reset timer to now.
wc.lastLogTimeSlow = time.Now() wc.lastLogTimeSlow = time.Now()

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

@@ -36,7 +36,7 @@ func (wr *WebSocketRouter) ServeWebSocket(conn *WebConn, r *model.WebSocketReque
return return
} }
if r.Action == model.WebsocketAuthenticationChallenge { if r.Action == string(model.WebsocketAuthenticationChallenge) {
if conn.GetSessionToken() != "" { if conn.GetSessionToken() != "" {
return return
} }

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

@@ -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) { 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) ev = ev.SetBroadcast(broadcast).SetData(payload)
api.app.Publish(ev) api.app.Publish(ev)
} }

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

@@ -126,7 +126,7 @@ func (a *App) GetAcknowledgementsForPostList(postList *model.PostList) (map[stri
return acknowledgementsMap, nil 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 // send out that a acknowledgement has been added/removed
message := model.NewWebSocketEvent(event, "", post.ChannelId, "", nil, "") message := model.NewWebSocketEvent(event, "", post.ChannelId, "", nil, "")

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

@@ -137,7 +137,7 @@ func (a *App) DeleteReactionForPost(c request.CTX, reaction *model.Reaction) *mo
return nil 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 // send out that a reaction has been added/removed
message := model.NewWebSocketEvent(event, "", post.ChannelId, "", nil, "") message := model.NewWebSocketEvent(event, "", post.ChannelId, "", nil, "")
reactionJSON, err := json.Marshal(reaction) reactionJSON, err := json.Marshal(reaction)

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

@@ -388,7 +388,7 @@ func (a *App) RegenerateTeamInviteId(teamID string) (*model.Team, *model.AppErro
return updatedTeam, nil 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 := &model.Team{}
*sanitizedTeam = *team *sanitizedTeam = *team
sanitizedTeam.Sanitize() sanitizedTeam.Sanitize()

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

@@ -1633,7 +1633,7 @@ func TestTeamSendEvents(t *testing.T) {
testCluster.ClearMessages() testCluster.ClearMessages()
wsEvents := []string{model.WebsocketEventUpdateTeam, model.WebsocketEventRestoreTeam, model.WebsocketEventDeleteTeam} wsEvents := []model.WebsocketEventType{model.WebsocketEventUpdateTeam, model.WebsocketEventRestoreTeam, model.WebsocketEventDeleteTeam}
for _, wsEvent := range wsEvents { for _, wsEvent := range wsEvents {
appErr := th.App.sendTeamEvent(team, wsEvent) appErr := th.App.sendTeamEvent(team, wsEvent)
require.Nil(t, appErr) require.Nil(t, appErr)

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

@@ -42,8 +42,8 @@ type MetricsInterface interface {
IncrementMemCacheHitCounterSession() IncrementMemCacheHitCounterSession()
IncrementMemCacheInvalidationCounterSession() IncrementMemCacheInvalidationCounterSession()
IncrementWebsocketEvent(eventType string) IncrementWebsocketEvent(eventType model.WebsocketEventType)
IncrementWebSocketBroadcast(eventType string) IncrementWebSocketBroadcast(eventType model.WebsocketEventType)
IncrementWebSocketBroadcastBufferSize(hub string, amount float64) IncrementWebSocketBroadcastBufferSize(hub string, amount float64)
DecrementWebSocketBroadcastBufferSize(hub string, amount float64) DecrementWebSocketBroadcastBufferSize(hub string, amount float64)
IncrementWebSocketBroadcastUsersRegistered(hub string, amount float64) IncrementWebSocketBroadcastUsersRegistered(hub string, amount float64)

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

@@ -210,7 +210,7 @@ func (_m *MetricsInterface) IncrementUserIndexCounter() {
} }
// IncrementWebSocketBroadcast provides a mock function with given fields: eventType // 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) _m.Called(eventType)
} }
@@ -230,7 +230,7 @@ func (_m *MetricsInterface) IncrementWebhookPost() {
} }
// IncrementWebsocketEvent provides a mock function with given fields: eventType // 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) _m.Called(eventType)
} }

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

@@ -111,7 +111,7 @@ func makeClient(dialer *websocket.Dialer, url, connectURL, authToken string, hea
client.configurePingHandling() client.configurePingHandling()
go client.writer() go client.writer()
client.SendMessage(WebsocketAuthenticationChallenge, map[string]any{"token": authToken}) client.SendMessage(string(WebsocketAuthenticationChallenge), map[string]any{"token": authToken})
return client, nil return client, nil
} }
@@ -157,7 +157,7 @@ func (wsc *WebSocketClient) ConnectWithDialer(dialer *websocket.Dialer) *AppErro
wsc.EventChannel = make(chan *WebSocketEvent, 100) wsc.EventChannel = make(chan *WebSocketEvent, 100)
wsc.ResponseChannel = make(chan *WebSocketResponse, 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 return nil
} }

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

@@ -9,87 +9,89 @@ import (
"strconv" "strconv"
) )
type WebsocketEventType string
const ( const (
WebsocketEventTyping = "typing" WebsocketEventTyping WebsocketEventType = "typing"
WebsocketEventPosted = "posted" WebsocketEventPosted WebsocketEventType = "posted"
WebsocketEventPostEdited = "post_edited" WebsocketEventPostEdited WebsocketEventType = "post_edited"
WebsocketEventPostDeleted = "post_deleted" WebsocketEventPostDeleted WebsocketEventType = "post_deleted"
WebsocketEventPostUnread = "post_unread" WebsocketEventPostUnread WebsocketEventType = "post_unread"
WebsocketEventChannelConverted = "channel_converted" WebsocketEventChannelConverted WebsocketEventType = "channel_converted"
WebsocketEventChannelCreated = "channel_created" WebsocketEventChannelCreated WebsocketEventType = "channel_created"
WebsocketEventChannelDeleted = "channel_deleted" WebsocketEventChannelDeleted WebsocketEventType = "channel_deleted"
WebsocketEventChannelRestored = "channel_restored" WebsocketEventChannelRestored WebsocketEventType = "channel_restored"
WebsocketEventChannelUpdated = "channel_updated" WebsocketEventChannelUpdated WebsocketEventType = "channel_updated"
WebsocketEventChannelMemberUpdated = "channel_member_updated" WebsocketEventChannelMemberUpdated WebsocketEventType = "channel_member_updated"
WebsocketEventChannelSchemeUpdated = "channel_scheme_updated" WebsocketEventChannelSchemeUpdated WebsocketEventType = "channel_scheme_updated"
WebsocketEventDirectAdded = "direct_added" WebsocketEventDirectAdded WebsocketEventType = "direct_added"
WebsocketEventGroupAdded = "group_added" WebsocketEventGroupAdded WebsocketEventType = "group_added"
WebsocketEventNewUser = "new_user" WebsocketEventNewUser WebsocketEventType = "new_user"
WebsocketEventAddedToTeam = "added_to_team" WebsocketEventAddedToTeam WebsocketEventType = "added_to_team"
WebsocketEventLeaveTeam = "leave_team" WebsocketEventLeaveTeam WebsocketEventType = "leave_team"
WebsocketEventUpdateTeam = "update_team" WebsocketEventUpdateTeam WebsocketEventType = "update_team"
WebsocketEventDeleteTeam = "delete_team" WebsocketEventDeleteTeam WebsocketEventType = "delete_team"
WebsocketEventRestoreTeam = "restore_team" WebsocketEventRestoreTeam WebsocketEventType = "restore_team"
WebsocketEventUpdateTeamScheme = "update_team_scheme" WebsocketEventUpdateTeamScheme WebsocketEventType = "update_team_scheme"
WebsocketEventUserAdded = "user_added" WebsocketEventUserAdded WebsocketEventType = "user_added"
WebsocketEventUserUpdated = "user_updated" WebsocketEventUserUpdated WebsocketEventType = "user_updated"
WebsocketEventUserRoleUpdated = "user_role_updated" WebsocketEventUserRoleUpdated WebsocketEventType = "user_role_updated"
WebsocketEventMemberroleUpdated = "memberrole_updated" WebsocketEventMemberroleUpdated WebsocketEventType = "memberrole_updated"
WebsocketEventUserRemoved = "user_removed" WebsocketEventUserRemoved WebsocketEventType = "user_removed"
WebsocketEventPreferenceChanged = "preference_changed" WebsocketEventPreferenceChanged WebsocketEventType = "preference_changed"
WebsocketEventPreferencesChanged = "preferences_changed" WebsocketEventPreferencesChanged WebsocketEventType = "preferences_changed"
WebsocketEventPreferencesDeleted = "preferences_deleted" WebsocketEventPreferencesDeleted WebsocketEventType = "preferences_deleted"
WebsocketEventEphemeralMessage = "ephemeral_message" WebsocketEventEphemeralMessage WebsocketEventType = "ephemeral_message"
WebsocketEventStatusChange = "status_change" WebsocketEventStatusChange WebsocketEventType = "status_change"
WebsocketEventHello = "hello" WebsocketEventHello WebsocketEventType = "hello"
WebsocketAuthenticationChallenge = "authentication_challenge" WebsocketAuthenticationChallenge WebsocketEventType = "authentication_challenge"
WebsocketEventReactionAdded = "reaction_added" WebsocketEventReactionAdded WebsocketEventType = "reaction_added"
WebsocketEventReactionRemoved = "reaction_removed" WebsocketEventReactionRemoved WebsocketEventType = "reaction_removed"
WebsocketEventResponse = "response" WebsocketEventResponse WebsocketEventType = "response"
WebsocketEventEmojiAdded = "emoji_added" WebsocketEventEmojiAdded WebsocketEventType = "emoji_added"
WebsocketEventChannelViewed = "channel_viewed" WebsocketEventChannelViewed WebsocketEventType = "channel_viewed"
WebsocketEventMultipleChannelsViewed = "multiple_channels_viewed" WebsocketEventMultipleChannelsViewed WebsocketEventType = "multiple_channels_viewed"
WebsocketEventPluginStatusesChanged = "plugin_statuses_changed" WebsocketEventPluginStatusesChanged WebsocketEventType = "plugin_statuses_changed"
WebsocketEventPluginEnabled = "plugin_enabled" WebsocketEventPluginEnabled WebsocketEventType = "plugin_enabled"
WebsocketEventPluginDisabled = "plugin_disabled" WebsocketEventPluginDisabled WebsocketEventType = "plugin_disabled"
WebsocketEventRoleUpdated = "role_updated" WebsocketEventRoleUpdated WebsocketEventType = "role_updated"
WebsocketEventLicenseChanged = "license_changed" WebsocketEventLicenseChanged WebsocketEventType = "license_changed"
WebsocketEventConfigChanged = "config_changed" WebsocketEventConfigChanged WebsocketEventType = "config_changed"
WebsocketEventOpenDialog = "open_dialog" WebsocketEventOpenDialog WebsocketEventType = "open_dialog"
WebsocketEventGuestsDeactivated = "guests_deactivated" WebsocketEventGuestsDeactivated WebsocketEventType = "guests_deactivated"
WebsocketEventUserActivationStatusChange = "user_activation_status_change" WebsocketEventUserActivationStatusChange WebsocketEventType = "user_activation_status_change"
WebsocketEventReceivedGroup = "received_group" WebsocketEventReceivedGroup WebsocketEventType = "received_group"
WebsocketEventReceivedGroupAssociatedToTeam = "received_group_associated_to_team" WebsocketEventReceivedGroupAssociatedToTeam WebsocketEventType = "received_group_associated_to_team"
WebsocketEventReceivedGroupNotAssociatedToTeam = "received_group_not_associated_to_team" WebsocketEventReceivedGroupNotAssociatedToTeam WebsocketEventType = "received_group_not_associated_to_team"
WebsocketEventReceivedGroupAssociatedToChannel = "received_group_associated_to_channel" WebsocketEventReceivedGroupAssociatedToChannel WebsocketEventType = "received_group_associated_to_channel"
WebsocketEventReceivedGroupNotAssociatedToChannel = "received_group_not_associated_to_channel" WebsocketEventReceivedGroupNotAssociatedToChannel WebsocketEventType = "received_group_not_associated_to_channel"
WebsocketEventGroupMemberDelete = "group_member_deleted" WebsocketEventGroupMemberDelete WebsocketEventType = "group_member_deleted"
WebsocketEventGroupMemberAdd = "group_member_add" WebsocketEventGroupMemberAdd WebsocketEventType = "group_member_add"
WebsocketEventSidebarCategoryCreated = "sidebar_category_created" WebsocketEventSidebarCategoryCreated WebsocketEventType = "sidebar_category_created"
WebsocketEventSidebarCategoryUpdated = "sidebar_category_updated" WebsocketEventSidebarCategoryUpdated WebsocketEventType = "sidebar_category_updated"
WebsocketEventSidebarCategoryDeleted = "sidebar_category_deleted" WebsocketEventSidebarCategoryDeleted WebsocketEventType = "sidebar_category_deleted"
WebsocketEventSidebarCategoryOrderUpdated = "sidebar_category_order_updated" WebsocketEventSidebarCategoryOrderUpdated WebsocketEventType = "sidebar_category_order_updated"
WebsocketWarnMetricStatusReceived = "warn_metric_status_received" WebsocketWarnMetricStatusReceived WebsocketEventType = "warn_metric_status_received"
WebsocketWarnMetricStatusRemoved = "warn_metric_status_removed" WebsocketWarnMetricStatusRemoved WebsocketEventType = "warn_metric_status_removed"
WebsocketEventCloudPaymentStatusUpdated = "cloud_payment_status_updated" WebsocketEventCloudPaymentStatusUpdated WebsocketEventType = "cloud_payment_status_updated"
WebsocketEventCloudSubscriptionChanged = "cloud_subscription_changed" WebsocketEventCloudSubscriptionChanged WebsocketEventType = "cloud_subscription_changed"
WebsocketEventThreadUpdated = "thread_updated" WebsocketEventThreadUpdated WebsocketEventType = "thread_updated"
WebsocketEventThreadFollowChanged = "thread_follow_changed" WebsocketEventThreadFollowChanged WebsocketEventType = "thread_follow_changed"
WebsocketEventThreadReadChanged = "thread_read_changed" WebsocketEventThreadReadChanged WebsocketEventType = "thread_read_changed"
WebsocketFirstAdminVisitMarketplaceStatusReceived = "first_admin_visit_marketplace_status_received" WebsocketFirstAdminVisitMarketplaceStatusReceived WebsocketEventType = "first_admin_visit_marketplace_status_received"
WebsocketEventDraftCreated = "draft_created" WebsocketEventDraftCreated WebsocketEventType = "draft_created"
WebsocketEventDraftUpdated = "draft_updated" WebsocketEventDraftUpdated WebsocketEventType = "draft_updated"
WebsocketEventDraftDeleted = "draft_deleted" WebsocketEventDraftDeleted WebsocketEventType = "draft_deleted"
WebsocketEventAcknowledgementAdded = "post_acknowledgement_added" WebsocketEventAcknowledgementAdded WebsocketEventType = "post_acknowledgement_added"
WebsocketEventAcknowledgementRemoved = "post_acknowledgement_removed" WebsocketEventAcknowledgementRemoved WebsocketEventType = "post_acknowledgement_removed"
WebsocketEventPersistentNotificationTriggered = "persistent_notification_triggered" WebsocketEventPersistentNotificationTriggered WebsocketEventType = "persistent_notification_triggered"
WebsocketEventHostedCustomerSignupProgressUpdated = "hosted_customer_signup_progress_updated" WebsocketEventHostedCustomerSignupProgressUpdated WebsocketEventType = "hosted_customer_signup_progress_updated"
) )
type WebSocketMessage interface { type WebSocketMessage interface {
ToJSON() ([]byte, error) ToJSON() ([]byte, error)
IsValid() bool IsValid() bool
EventType() string EventType() WebsocketEventType
} }
type WebsocketBroadcast struct { type WebsocketBroadcast struct {
@@ -179,14 +181,14 @@ func (p *precomputedWebSocketEventJSON) copy() *precomputedWebSocketEventJSON {
// webSocketEventJSON mirrors WebSocketEvent to make some of its unexported fields serializable // webSocketEventJSON mirrors WebSocketEvent to make some of its unexported fields serializable
type webSocketEventJSON struct { type webSocketEventJSON struct {
Event string `json:"event"` Event WebsocketEventType `json:"event"`
Data map[string]any `json:"data"` Data map[string]any `json:"data"`
Broadcast *WebsocketBroadcast `json:"broadcast"` Broadcast *WebsocketBroadcast `json:"broadcast"`
Sequence int64 `json:"seq"` Sequence int64 `json:"seq"`
} }
type WebSocketEvent struct { type WebSocketEvent struct {
event string event WebsocketEventType
data map[string]any data map[string]any
broadcast *WebsocketBroadcast broadcast *WebsocketBroadcast
sequence int64 sequence int64
@@ -238,7 +240,7 @@ func (ev *WebSocketEvent) Add(key string, value any) {
ev.data[key] = value 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{ return &WebSocketEvent{
event: event, event: event,
data: make(map[string]any), data: make(map[string]any),
@@ -293,7 +295,7 @@ func (ev *WebSocketEvent) GetSequence() int64 {
return ev.sequence return ev.sequence
} }
func (ev *WebSocketEvent) SetEvent(event string) *WebSocketEvent { func (ev *WebSocketEvent) SetEvent(event WebsocketEventType) *WebSocketEvent {
evCopy := ev.Copy() evCopy := ev.Copy()
evCopy.event = event evCopy.event = event
return evCopy return evCopy
@@ -321,7 +323,7 @@ func (ev *WebSocketEvent) IsValid() bool {
return ev.event != "" return ev.event != ""
} }
func (ev *WebSocketEvent) EventType() string { func (ev *WebSocketEvent) EventType() WebsocketEventType {
return ev.event return ev.event
} }
@@ -419,7 +421,7 @@ func (m *WebSocketResponse) IsValid() bool {
return m.Status != "" return m.Status != ""
} }
func (m *WebSocketResponse) EventType() string { func (m *WebSocketResponse) EventType() WebsocketEventType {
return WebsocketEventResponse return WebsocketEventResponse
} }

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

@@ -34,14 +34,14 @@ func TestWebSocketEvent(t *testing.T) {
} }
func TestWebSocketEventImmutable(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 { if newM == m {
require.Fail(t, "pointers should not be the same") require.Fail(t, "pointers should not be the same")
} }
require.NotEqual(t, m.EventType(), newM.EventType()) require.NotEqual(t, m.EventType(), newM.EventType())
require.Equal(t, newM.EventType(), "new_event") require.Equal(t, newM.EventType(), WebsocketEventPostDeleted)
newM = m.SetSequence(45) newM = m.SetSequence(45)
if newM == m { if newM == m {
@@ -81,11 +81,11 @@ func TestWebSocketEventFromJSON(t *testing.T) {
ev, err := WebSocketEventFromJSON(bytes.NewReader([]byte("junk"))) ev, err := WebSocketEventFromJSON(bytes.NewReader([]byte("junk")))
require.Error(t, err) require.Error(t, err)
require.Nil(t, ev, "should not have parsed") 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)) ev, err = WebSocketEventFromJSON(bytes.NewReader(data))
require.NoError(t, err) require.NoError(t, err)
require.NotNil(t, ev, "should have parsed") 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.GetSequence(), int64(45))
require.Equal(t, ev.data, map[string]any{"key": "val"}) require.Equal(t, ev.data, map[string]any{"key": "val"})
require.Equal(t, ev.GetBroadcast(), &WebsocketBroadcast{UserId: "userid"}) require.Equal(t, ev.GetBroadcast(), &WebsocketBroadcast{UserId: "userid"})