@@ -14,18 +14,19 @@ func NewMessageRepository() *MessageRepository {
1414 return & MessageRepository {}
1515}
1616
17- func (r * MessageRepository ) CreateMessage (ctx context.Context , senderID , receiverID , content string ) (* models.Message , error ) {
17+ func (r * MessageRepository ) CreateMessage (ctx context.Context , senderID , receiverID , content , replyToID string ) (* models.Message , error ) {
1818 query := `
19- INSERT INTO messages (sender_id, receiver_id, content)
20- VALUES ($1, $2, $3)
21- RETURNING id, sender_id, receiver_id, content, created_at;
19+ INSERT INTO messages (sender_id, receiver_id, content, reply_to_message_id )
20+ VALUES ($1, $2, $3, NULLIF($4, '')::uuid )
21+ RETURNING id, sender_id, receiver_id, content, reply_to_message_id, created_at;
2222 `
2323 var msg models.Message
24- err := config .DB .QueryRow (ctx , query , senderID , receiverID , content ).Scan (
24+ err := config .DB .QueryRow (ctx , query , senderID , receiverID , content , replyToID ).Scan (
2525 & msg .ID ,
2626 & msg .SenderID ,
2727 & msg .ReceiverID ,
2828 & msg .Content ,
29+ & msg .ReplyToMessageID ,
2930 & msg .CreatedAt ,
3031 )
3132 if err != nil {
@@ -36,11 +37,14 @@ func (r *MessageRepository) CreateMessage(ctx context.Context, senderID, receive
3637
3738func (r * MessageRepository ) GetChatHistory (ctx context.Context , userA , userB string , before time.Time , limit int ) ([]models.Message , error ) {
3839 query := `
39- SELECT id, sender_id, receiver_id, content, created_at, is_read
40- FROM messages
41- WHERE ((sender_id = $1 AND receiver_id = $2) OR (sender_id = $2 AND receiver_id = $1))
42- AND created_at < $3
43- ORDER BY created_at DESC
40+ SELECT
41+ m.id, m.sender_id, m.receiver_id, m.content, m.created_at, m.is_read, m.reply_to_message_id,
42+ q.sender_id AS quoted_sender_id, q.content AS quoted_content
43+ FROM messages m
44+ LEFT JOIN messages q ON m.reply_to_message_id = q.id
45+ WHERE ((m.sender_id = $1 AND m.receiver_id = $2) OR (m.sender_id = $2 AND m.receiver_id = $1))
46+ AND m.group_id IS NULL AND m.created_at < $3
47+ ORDER BY m.created_at DESC
4448 LIMIT $4;
4549 `
4650 rows , err := config .DB .Query (ctx , query , userA , userB , before , limit )
@@ -52,15 +56,35 @@ func (r *MessageRepository) GetChatHistory(ctx context.Context, userA, userB str
5256 var history []models.Message = []models.Message {}
5357 for rows .Next () {
5458 var m models.Message
55- err := rows .Scan (& m .ID , & m .SenderID , & m .ReceiverID , & m .Content , & m .CreatedAt , & m .IsRead )
59+ var qSender , qContent * string
60+
61+ err := rows .Scan (& m .ID , & m .SenderID , & m .ReceiverID , & m .Content , & m .CreatedAt , & m .IsRead , & m .ReplyToMessageID , & qSender , & qContent )
5662 if err != nil {
5763 return nil , err
5864 }
65+
66+ if m .ReplyToMessageID != nil && qSender != nil && qContent != nil {
67+ m .QuotedMessage = & models.QuotedMessage {
68+ ID : * m .ReplyToMessageID ,
69+ SenderID : * qSender ,
70+ Content : * qContent ,
71+ }
72+ }
5973 history = append (history , m )
6074 }
6175 return history , nil
6276}
6377
78+ func (r * MessageRepository ) GetMessagePreview (ctx context.Context , messageID string ) (* models.QuotedMessage , error ) {
79+ query := `SELECT id, sender_id, content FROM messages WHERE id = $1::uuid;`
80+ var q models.QuotedMessage
81+ err := config .DB .QueryRow (ctx , query , messageID ).Scan (& q .ID , & q .SenderID , & q .Content )
82+ if err != nil {
83+ return nil , err
84+ }
85+ return & q , nil
86+ }
87+
6488func (r * MessageRepository ) GetConversations (ctx context.Context , userID string ) ([]models.Conversation , error ) {
6589 query := `
6690 WITH raw_conversations AS (
0 commit comments