From 0f1f545b90c10c61d548651c1367645c2d8dbdf7 Mon Sep 17 00:00:00 2001 From: Denis Arh Date: Wed, 14 Nov 2018 05:57:55 +0100 Subject: [PATCH] Add thread participants to msg struct --- internal/payload/outgoing.go | 6 ++++-- internal/payload/outgoing/message.go | 6 ++++-- sam/repository/message.go | 23 +++++++++++++++++++++++ sam/service/message.go | 4 ++++ sam/types/message.go | 4 +++- 5 files changed, 38 insertions(+), 5 deletions(-) diff --git a/internal/payload/outgoing.go b/internal/payload/outgoing.go index 06ede7918..7d4475555 100644 --- a/internal/payload/outgoing.go +++ b/internal/payload/outgoing.go @@ -26,8 +26,10 @@ func Message(ctx context.Context, msg *samTypes.Message) *outgoing.Message { ChannelID: Uint64toa(msg.ChannelID), Message: msg.Message, Type: string(msg.Type), - ReplyTo: msg.ReplyTo, - Replies: msg.Replies, + + ReplyTo: msg.ReplyTo, + Replies: msg.Replies, + RepliesFrom: Uint64stoa(msg.RepliesFrom), User: User(msg.User), Attachment: Attachment(msg.Attachment), diff --git a/internal/payload/outgoing/message.go b/internal/payload/outgoing/message.go index 7b940663e..8e82b761f 100644 --- a/internal/payload/outgoing/message.go +++ b/internal/payload/outgoing/message.go @@ -11,8 +11,10 @@ type ( Type string `json:"type"` Message string `json:"message"` ChannelID string `json:"channelID"` - ReplyTo uint64 `json:"replyTo,omitempty,string"` - Replies uint `json:"replies,omitempty"` + + ReplyTo uint64 `json:"replyTo,omitempty,string"` + Replies uint `json:"replies,omitempty"` + RepliesFrom []string `json:"repliesFrom,omitempty"` User *User `json:"user"` Attachment *Attachment `json:"att,omitempty"` diff --git a/sam/repository/message.go b/sam/repository/message.go index db609cca8..3c268b2a6 100644 --- a/sam/repository/message.go +++ b/sam/repository/message.go @@ -4,6 +4,7 @@ import ( "context" "time" + "github.com/jmoiron/sqlx" "github.com/titpetric/factory" "github.com/crusttech/crust/sam/types" @@ -16,6 +17,7 @@ type ( FindMessageByID(id uint64) (*types.Message, error) FindMessages(filter *types.MessageFilter) (types.MessageSet, error) FindThreads(filter *types.MessageFilter) (types.MessageSet, error) + PrefillThreadParticipants(mm types.MessageSet) error CreateMessage(mod *types.Message) (*types.Message, error) UpdateMessage(mod *types.Message) (*types.Message, error) DeleteMessageByID(ID uint64) error @@ -62,6 +64,8 @@ const ( " WHERE " + sqlMessageScope + " AND original_id IN (id, reply_to)" + sqlThreadParticipantsByMessageID = "SELECT DISTINCT reply_to, rel_user FROM messages WHERE reply_to IN (?)" + sqlMessageRepliesIncCount = `UPDATE messages SET replies = replies + 1 WHERE id = ? AND reply_to = 0` sqlMessageRepliesDecCount = `UPDATE messages SET replies = replies - 1 WHERE id = ? AND reply_to = 0` @@ -181,6 +185,25 @@ func (r *message) FindThreads(filter *types.MessageFilter) (types.MessageSet, er return rval, r.db().Select(&rval, sql, params...) } +func (r *message) PrefillThreadParticipants(mm types.MessageSet) error { + var rval = []struct { + ReplyTo uint64 `db:"reply_to"` + UserID uint64 `db:"rel_user"` + }{} + + if sql, args, err := sqlx.In(sqlThreadParticipantsByMessageID, mm.IDs()); err != nil { + return err + } else if err = r.db().Select(&rval, sql, args...); err != nil { + return err + } else { + for _, p := range rval { + mm.FindById(p.ReplyTo).RepliesFrom = append(mm.FindById(p.ReplyTo).RepliesFrom, p.UserID) + } + } + + return nil +} + func (r *message) sanitizeFilter(filter *types.MessageFilter) { if filter == nil { filter = &types.MessageFilter{} diff --git a/sam/service/message.go b/sam/service/message.go index a03a5a61a..676be81ca 100644 --- a/sam/service/message.go +++ b/sam/service/message.go @@ -422,6 +422,10 @@ func (svc *message) preload(mm types.MessageSet) (err error) { return } + if err = svc.message.PrefillThreadParticipants(mm); err != nil { + return + } + return } diff --git a/sam/types/message.go b/sam/types/message.go index acb8e8328..516308a53 100644 --- a/sam/types/message.go +++ b/sam/types/message.go @@ -22,7 +22,9 @@ type ( Attachment *Attachment `json:"attachment,omitempty"` User *systemTypes.User `json:"user,omitempty"` Flags MessageFlagSet `json:"flags,omitempty"` - Mentions MentionSet + + Mentions MentionSet + RepliesFrom []uint64 } MessageSet []*Message