v.0.0.4.4 Добавлено шифрование сообщения
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
madipo2611 2025-08-21 00:11:24 +03:00
parent ca1771d761
commit fe9f706e1b

View File

@ -276,7 +276,7 @@ func (s *server) GetChat(ctx context.Context, req *proto.GetChatRequest) (*proto
var chat proto.Chat
var createdAt, updatedAt time.Time
var lastMessageID sql.NullInt32
var lastMessageContent sql.NullString
var lastMessageContent, lastMessageEncryptedKey, lastMessageNonce []byte
var lastMessageStatus sql.NullString
var lastMessageCreatedAt sql.NullTime
@ -287,17 +287,18 @@ func (s *server) GetChat(ctx context.Context, req *proto.GetChatRequest) (*proto
s.logger.Printf("Querying chat between users %d and %d", user1, user2)
err := s.db.QueryRow(ctx, `
SELECT c.id, c.user1_id, c.user2_id, c.created_at, c.updated_at,
m.id, m.content, m.status, m.created_at
FROM chats c
LEFT JOIN messages m ON m.id = (
SELECT id FROM messages WHERE chat_id = c.id
ORDER BY created_at DESC LIMIT 1
)
WHERE c.user1_id = $1 AND c.user2_id = $2
`, user1, user2).Scan(
SELECT c.id, c.user1_id, c.user2_id, c.created_at, c.updated_at,
m.id, m.content, m.encrypted_key, m.nonce, m.status, m.created_at
FROM chats c
LEFT JOIN messages m ON m.id = (
SELECT id FROM messages WHERE chat_id = c.id
ORDER BY created_at DESC LIMIT 1
)
WHERE c.user1_id = $1 AND c.user2_id = $2
`, user1, user2).Scan(
&chat.Id, &chat.User1Id, &chat.User2Id, &createdAt, &updatedAt,
&lastMessageID, &lastMessageContent, &lastMessageStatus, &lastMessageCreatedAt,
&lastMessageID, &lastMessageContent, &lastMessageEncryptedKey,
&lastMessageNonce, &lastMessageStatus, &lastMessageCreatedAt,
)
if err != nil {
s.logger.Printf("Failed to get chat: %v", err)
@ -308,14 +309,28 @@ func (s *server) GetChat(ctx context.Context, req *proto.GetChatRequest) (*proto
chat.UpdatedAt = timestamppb.New(updatedAt)
if lastMessageID.Valid {
// Расшифровываем последнее сообщение
var decryptedContent string
if len(lastMessageContent) > 0 && len(lastMessageEncryptedKey) > 0 && len(lastMessageNonce) > 0 {
decrypted, err := s.crypto.DecryptMessage(lastMessageContent, lastMessageEncryptedKey, lastMessageNonce)
if err != nil {
s.logger.Printf("Failed to decrypt last message %d: %v", lastMessageID.Int32, err)
decryptedContent = "[encrypted message]"
} else {
decryptedContent = decrypted
}
} else {
decryptedContent = "[no message]"
}
chat.LastMessage = &proto.Message{
Id: lastMessageID.Int32,
ChatId: chat.Id,
Content: lastMessageContent.String,
Content: decryptedContent,
Status: lastMessageStatus.String,
CreatedAt: timestamppb.New(lastMessageCreatedAt.Time),
}
s.logger.Printf("Found last message for chat %d: message_id=%d", chat.Id, lastMessageID.Int32)
s.logger.Printf("Found and decrypted last message for chat %d: message_id=%d", chat.Id, lastMessageID.Int32)
}
resp := &proto.ChatResponse{Chat: &chat}
@ -390,16 +405,16 @@ func (s *server) GetUserChats(ctx context.Context, req *proto.GetUserChatsReques
s.logger.Printf("Querying chats for user_id=%d", req.UserId)
rows, err := s.db.Query(ctx, `
SELECT c.id, c.user1_id, c.user2_id, c.created_at, c.updated_at,
m.id, m.content, m.status, m.created_at
FROM chats c
LEFT JOIN messages m ON m.id = (
SELECT id FROM messages WHERE chat_id = c.id
ORDER BY created_at DESC LIMIT 1
)
WHERE c.user1_id = $1 OR c.user2_id = $1
ORDER BY c.updated_at DESC
`, req.UserId)
SELECT c.id, c.user1_id, c.user2_id, c.created_at, c.updated_at,
m.id, m.content, m.encrypted_key, m.nonce, m.status, m.created_at
FROM chats c
LEFT JOIN messages m ON m.id = (
SELECT id FROM messages WHERE chat_id = c.id
ORDER BY created_at DESC LIMIT 1
)
WHERE c.user1_id = $1 OR c.user2_id = $1
ORDER BY c.updated_at DESC
`, req.UserId)
if err != nil {
s.logger.Printf("Failed to query user chats: %v", err)
return nil, err
@ -411,13 +426,14 @@ func (s *server) GetUserChats(ctx context.Context, req *proto.GetUserChatsReques
var chat proto.Chat
var createdAt, updatedAt time.Time
var lastMessageID sql.NullInt32
var lastMessageContent sql.NullString
var lastMessageContent, lastMessageEncryptedKey, lastMessageNonce []byte
var lastMessageStatus sql.NullString
var lastMessageCreatedAt sql.NullTime
err := rows.Scan(
&chat.Id, &chat.User1Id, &chat.User2Id, &createdAt, &updatedAt,
&lastMessageID, &lastMessageContent, &lastMessageStatus, &lastMessageCreatedAt,
&lastMessageID, &lastMessageContent, &lastMessageEncryptedKey,
&lastMessageNonce, &lastMessageStatus, &lastMessageCreatedAt,
)
if err != nil {
s.logger.Printf("Failed to scan chat row: %v", err)
@ -428,14 +444,28 @@ func (s *server) GetUserChats(ctx context.Context, req *proto.GetUserChatsReques
chat.UpdatedAt = timestamppb.New(updatedAt)
if lastMessageID.Valid {
// Расшифровываем последнее сообщение
var decryptedContent string
if len(lastMessageContent) > 0 && len(lastMessageEncryptedKey) > 0 && len(lastMessageNonce) > 0 {
decrypted, err := s.crypto.DecryptMessage(lastMessageContent, lastMessageEncryptedKey, lastMessageNonce)
if err != nil {
s.logger.Printf("Failed to decrypt last message %d: %v", lastMessageID.Int32, err)
decryptedContent = "[encrypted message]"
} else {
decryptedContent = decrypted
}
} else {
decryptedContent = "[no message]"
}
chat.LastMessage = &proto.Message{
Id: lastMessageID.Int32,
ChatId: chat.Id,
Content: lastMessageContent.String,
Content: decryptedContent,
Status: lastMessageStatus.String,
CreatedAt: timestamppb.New(lastMessageCreatedAt.Time),
}
s.logger.Printf("Found last message for chat %d: message_id=%d", chat.Id, lastMessageID.Int32)
s.logger.Printf("Found and decrypted last message for chat %d: message_id=%d", chat.Id, lastMessageID.Int32)
}
chats = append(chats, &chat)