diff --git a/cmd/messages.go b/cmd/messages.go index b0568b95..10d98695 100644 --- a/cmd/messages.go +++ b/cmd/messages.go @@ -28,14 +28,27 @@ type messageReq struct { // handleGetMessages returns messages for a conversation. func handleGetMessages(r *fastglue.Request) error { var ( - app = r.Context.(*App) - uuid = r.RequestCtx.UserValue("uuid").(string) - auser = r.RequestCtx.UserValue("user").(amodels.User) - page, _ = strconv.Atoi(string(r.RequestCtx.QueryArgs().Peek("page"))) - pageSize, _ = strconv.Atoi(string(r.RequestCtx.QueryArgs().Peek("page_size"))) - total = 0 + app = r.Context.(*App) + uuid = r.RequestCtx.UserValue("uuid").(string) + auser = r.RequestCtx.UserValue("user").(amodels.User) + page, _ = strconv.Atoi(string(r.RequestCtx.QueryArgs().Peek("page"))) + pageSize = r.RequestCtx.QueryArgs().GetUintOrZero("page_size") + total = 0 + private *bool ) + // Parse optional private filter (null = no filter) + if r.RequestCtx.QueryArgs().Has("private") { + p := r.RequestCtx.QueryArgs().GetBool("private") + private = &p + } + + // Parse repeated type params: ?type=incoming&type=outgoing + var msgTypes []string + for _, v := range r.RequestCtx.QueryArgs().PeekMulti("type") { + msgTypes = append(msgTypes, string(v)) + } + user, err := app.user.GetAgent(auser.ID, "") if err != nil { return sendErrorEnvelope(r, err) @@ -47,7 +60,7 @@ func handleGetMessages(r *fastglue.Request) error { return sendErrorEnvelope(r, err) } - messages, pageSize, err := app.conversation.GetConversationMessages(uuid, page, pageSize) + messages, pageSize, err := app.conversation.GetConversationMessages(uuid, page, pageSize, private, msgTypes) if err != nil { return sendErrorEnvelope(r, err) } diff --git a/internal/conversation/message.go b/internal/conversation/message.go index 22de6397..95bf7071 100644 --- a/internal/conversation/message.go +++ b/internal/conversation/message.go @@ -286,13 +286,19 @@ func (m *Manager) RenderMessageInTemplate(channel string, message *models.Messag } // GetConversationMessages retrieves messages for a specific conversation. -func (m *Manager) GetConversationMessages(conversationUUID string, page, pageSize int) ([]models.Message, int, error) { +func (m *Manager) GetConversationMessages(conversationUUID string, page, pageSize int, private *bool, msgTypes []string) ([]models.Message, int, error) { var ( messages = make([]models.Message, 0) - qArgs []interface{} + qArgs []any ) - qArgs = append(qArgs, conversationUUID) + // Convert msgTypes slice to pq.StringArray for PostgreSQL + var typesArg any + if len(msgTypes) > 0 { + typesArg = pq.StringArray(msgTypes) + } + + qArgs = append(qArgs, conversationUUID, private, typesArg) query, pageSize, qArgs, err := m.generateMessagesQuery(m.q.GetMessages, qArgs, page, pageSize) if err != nil { m.lo.Error("error generating messages query", "error", err) diff --git a/internal/conversation/queries.sql b/internal/conversation/queries.sql index 94ccc9a7..40bff0b3 100644 --- a/internal/conversation/queries.sql +++ b/internal/conversation/queries.sql @@ -547,6 +547,8 @@ JOIN users u ON m.sender_id = u.id WHERE m.conversation_id = ( SELECT id FROM conversations WHERE uuid = $1 LIMIT 1 ) +AND ($2::boolean IS NULL OR m.private = $2) +AND ($3::text[] IS NULL OR m.type::text = ANY($3)) ORDER BY m.created_at DESC %s -- name: insert-message