From 636d2c05c73a82a2d4690abe7af6f20d445e7535 Mon Sep 17 00:00:00 2001 From: Denis Arh Date: Tue, 7 Aug 2018 21:11:42 +0200 Subject: [PATCH] Support for channel add through WS --- sam/websocket/incoming/channel.go | 9 ++++++ sam/websocket/incoming/payload.go | 2 ++ sam/websocket/outgoing/channel.go | 12 ++++++++ sam/websocket/outgoing/payload.go | 9 +++--- sam/websocket/session_incoming.go | 4 +++ sam/websocket/session_incoming_channel.go | 35 +++++++++++++++++++++++ 6 files changed, 67 insertions(+), 4 deletions(-) diff --git a/sam/websocket/incoming/channel.go b/sam/websocket/incoming/channel.go index a06511846..2ac51d88c 100644 --- a/sam/websocket/incoming/channel.go +++ b/sam/websocket/incoming/channel.go @@ -11,6 +11,11 @@ type ( ChannelID string `json:"cid"` } + ChannelCreate struct { + Name string `json:"name"` + Topic string `json:"topic"` + } + ChannelRename struct { ChannelID string `json:"cid"` Name string `json:"name"` @@ -20,4 +25,8 @@ type ( ChannelID string `json:"cid"` Topic string `json:"topic"` } + + ChannelDelete struct { + ChannelID string `json:"cid"` + } ) diff --git a/sam/websocket/incoming/payload.go b/sam/websocket/incoming/payload.go index b978f0f91..112d17e5d 100644 --- a/sam/websocket/incoming/payload.go +++ b/sam/websocket/incoming/payload.go @@ -8,6 +8,8 @@ type Payload struct { *ChannelChangeTopic `json:"chct"` *ChannelRename `json:"chrn"` + *ChannelCreate `json:"chcr"` + *ChannelDelete `json:"chdel"` // Get channel message history *MessageHistory `json:"chopen"` diff --git a/sam/websocket/outgoing/channel.go b/sam/websocket/outgoing/channel.go index b3df122f1..c026e5e9a 100644 --- a/sam/websocket/outgoing/channel.go +++ b/sam/websocket/outgoing/channel.go @@ -21,6 +21,14 @@ type ( UserID string `json:"uid"` } + ChannelDeleted struct { + // Channel that was deleted + ID string `json:"id"` + + // Who deleted it + UserID string `json:"uid"` + } + Channel struct { // Channel to part (nil) for ALL channels ID string `json:"id"` @@ -40,6 +48,10 @@ func (p *ChannelPart) EncodeMessage() ([]byte, error) { return json.Marshal(Payload{ChannelPart: p}) } +func (p *ChannelDeleted) EncodeMessage() ([]byte, error) { + return json.Marshal(Payload{ChannelDeleted: p}) +} + func (p *Channel) EncodeMessage() ([]byte, error) { return json.Marshal(Payload{Channel: p}) } diff --git a/sam/websocket/outgoing/payload.go b/sam/websocket/outgoing/payload.go index a98c78aae..4da6cd292 100644 --- a/sam/websocket/outgoing/payload.go +++ b/sam/websocket/outgoing/payload.go @@ -12,10 +12,11 @@ type ( *MessageUpdate `json:"messageUpdated,omitempty"` *Messages `json:"messages,omitempty"` - *ChannelJoin `json:"channelJoin,omitempty"` - *ChannelPart `json:"channelPart,omitempty"` - *Channel `json:"channel,omitempty"` - *Channels `json:"channels,omitempty"` + *ChannelJoin `json:"channelJoin,omitempty"` + *ChannelPart `json:"channelPart,omitempty"` + *ChannelDeleted `json:"channelDeleted,omitempty"` + *Channel `json:"channel,omitempty"` + *Channels `json:"channels,omitempty"` *User `json:"user,omitempty"` *Users `json:"users,omitempty"` diff --git a/sam/websocket/session_incoming.go b/sam/websocket/session_incoming.go index 97d2b4427..5d733fc01 100644 --- a/sam/websocket/session_incoming.go +++ b/sam/websocket/session_incoming.go @@ -32,6 +32,10 @@ func (s *Session) dispatch(raw []byte) (err error) { return s.channelPart(ctx, p.ChannelPart) case p.ChannelList != nil: return s.channelList(ctx, p.ChannelList) + case p.ChannelCreate != nil: + return s.channelCreate(ctx, p.ChannelCreate) + case p.ChannelDelete != nil: + return s.channelDelete(ctx, p.ChannelDelete) case p.ChannelRename != nil: return s.channelRename(ctx, p.ChannelRename) case p.ChannelChangeTopic != nil: diff --git a/sam/websocket/session_incoming_channel.go b/sam/websocket/session_incoming_channel.go index 00c5eae5e..51c876e8c 100644 --- a/sam/websocket/session_incoming_channel.go +++ b/sam/websocket/session_incoming_channel.go @@ -4,6 +4,7 @@ import ( "context" "github.com/crusttech/crust/auth" "github.com/crusttech/crust/sam/service" + "github.com/crusttech/crust/sam/types" "github.com/crusttech/crust/sam/websocket/incoming" "github.com/crusttech/crust/sam/websocket/outgoing" ) @@ -51,6 +52,40 @@ func (s *Session) channelList(ctx context.Context, p *incoming.ChannelList) erro return s.sendReply(payloadFromChannels(channels)) } +func (s *Session) channelCreate(ctx context.Context, p *incoming.ChannelCreate) (err error) { + ch := &types.Channel{ + Type: types.ChannelTypePublic, + Name: p.Name, + Topic: p.Topic, + } + + ch, err = service.Channel().Create(ctx, ch) + if err != nil { + return err + } + + pl := payloadFromChannel(ch) + + if ch.Type == types.ChannelTypePublic { + return s.sendToAll(pl) + } + + // By default, just send reply to user + return s.sendReply(pl) +} + +func (s *Session) channelDelete(ctx context.Context, p *incoming.ChannelDelete) (err error) { + err = service.Channel().Delete(ctx, parseUInt64(p.ChannelID)) + if err != nil { + return err + } + + return s.sendToAllSubscribers(&outgoing.ChannelDeleted{ + ID: p.ChannelID, + UserID: uint64toa(auth.GetIdentityFromContext(ctx).Identity()), + }, p.ChannelID) +} + func (s *Session) channelRename(ctx context.Context, p *incoming.ChannelRename) error { ch, err := service.Channel().FindByID(ctx, parseUInt64(p.ChannelID)) if err != nil {